diff options
author | Stefan Kobza <skobza@cisco.com> | 2016-02-10 19:41:09 +0100 |
---|---|---|
committer | Gerrit Code Review <gerrit@fd.io> | 2016-02-17 16:29:03 +0000 |
commit | 8f285166faf13156a4f7c70adac9a7e20549268f (patch) | |
tree | 29a4adb583dcf7feaba301fccedeaaef5d572674 /resources/libraries/python | |
parent | da15035461569ea175aabbac1df735cd5598b0b3 (diff) |
Test VIRL connection.
Change-Id: I812ff9c8c9669b63907469c643c839e8bd3b419a
Signed-off-by: Stefan Kobza <skobza@cisco.com>
Diffstat (limited to 'resources/libraries/python')
-rw-r--r-- | resources/libraries/python/DUTSetup.py | 16 | ||||
-rw-r--r-- | resources/libraries/python/IPv6Setup.py | 7 | ||||
-rw-r--r-- | resources/libraries/python/PacketVerifier.py | 3 | ||||
-rw-r--r-- | resources/libraries/python/ssh.py | 46 | ||||
-rw-r--r-- | resources/libraries/python/topology.py | 5 |
5 files changed, 59 insertions, 18 deletions
diff --git a/resources/libraries/python/DUTSetup.py b/resources/libraries/python/DUTSetup.py index 76f76aef7e..e5e56784d5 100644 --- a/resources/libraries/python/DUTSetup.py +++ b/resources/libraries/python/DUTSetup.py @@ -20,6 +20,20 @@ class DUTSetup(object): def __init__(self): pass + def start_vpp_service_on_all_duts(self, nodes): + """Start up the VPP service on all nodes.""" + ssh = SSH() + for node in nodes.values(): + if node['type'] == NodeType.DUT: + ssh.connect(node) + (ret_code, stdout, stderr) = \ + ssh.exec_command_sudo('service vpp restart') + if 0 != int(ret_code): + logger.debug('stdout: {0}'.format(stdout)) + logger.debug('stderr: {0}'.format(stderr)) + raise Exception('DUT {0} failed to start VPP service'. + format(node['host'])) + def setup_all_duts(self, nodes): """Prepare all DUTs in given topology for test execution.""" for node in nodes.values(): @@ -35,7 +49,7 @@ class DUTSetup(object): Constants.REMOTE_FW_DIR, Constants.RESOURCES_LIB_SH)) logger.trace(stdout) if 0 != int(ret_code): - logger.error('DUT {0} setup script failed: "{1}"'. + logger.debug('DUT {0} setup script failed: "{1}"'. format(node['host'], stdout + stderr)) raise Exception('DUT test setup script failed at node {}'. format(node['host'])) diff --git a/resources/libraries/python/IPv6Setup.py b/resources/libraries/python/IPv6Setup.py index db497757bc..edd5d2cc6e 100644 --- a/resources/libraries/python/IPv6Setup.py +++ b/resources/libraries/python/IPv6Setup.py @@ -18,6 +18,7 @@ from ipaddress import IPv6Network from topology import NodeType from topology import Topology from constants import Constants +from robot.api import logger class IPv6Networks(object): @@ -177,6 +178,12 @@ class IPv6Setup(object): raise Exception('VPP sw_interface_set_flags failed on {h}'.format( h=node['host'])) + cmd_input = 'exec show int' + (ret_code, stdout, stderr) = ssh.exec_command_sudo(cmd, cmd_input) + logger.debug('ret: {0}'.format(ret_code)) + logger.debug('stdout: {0}'.format(stdout)) + logger.debug('stderr: {0}'.format(stderr)) + @staticmethod def vpp_del_if_ipv6_addr(node, interface, addr, prefix): """Delete IPv6 address on VPP. diff --git a/resources/libraries/python/PacketVerifier.py b/resources/libraries/python/PacketVerifier.py index 566ea95c25..19d6aaf53f 100644 --- a/resources/libraries/python/PacketVerifier.py +++ b/resources/libraries/python/PacketVerifier.py @@ -232,6 +232,7 @@ class RxQueue(PacketVerifier): return None pkt = self._sock.recv(0x7fff) + pkt_pad = auto_pad(pkt) print 'Received packet on {0} of len {1}'.format(self._ifname, len(pkt)) Ether(pkt).show2() print @@ -241,7 +242,7 @@ class RxQueue(PacketVerifier): # Auto pad all packets in ignore list ignore[i] = auto_pad(ig_pkt) for ig_pkt in ignore: - if ig_pkt == pkt: + if ig_pkt == pkt_pad: # Found the packet in ignore list, get another one # TODO: subtract timeout - time_spent in here ignore.remove(ig_pkt) diff --git a/resources/libraries/python/ssh.py b/resources/libraries/python/ssh.py index 385619ce42..a2bb9b1dc4 100644 --- a/resources/libraries/python/ssh.py +++ b/resources/libraries/python/ssh.py @@ -11,6 +11,8 @@ # See the License for the specific language governing permissions and # limitations under the License. import paramiko +from paramiko import RSAKey +import StringIO from scp import SCPClient from time import time from robot.api import logger @@ -28,9 +30,7 @@ class SSH(object): __existing_connections = {} def __init__(self): - self._ssh = paramiko.SSHClient() - self._ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - self._hostname = None + pass def _node_hash(self, node): return hash(frozenset([node['host'], node['port']])) @@ -40,31 +40,47 @@ class SSH(object): If there already is a connection to the node, this method reuses it. """ - self._hostname = node['host'] node_hash = self._node_hash(node) - if node_hash in self.__existing_connections: - self._ssh = self.__existing_connections[node_hash] + if node_hash in SSH.__existing_connections: + self._ssh = SSH.__existing_connections[node_hash] + logger.debug('reusing ssh: {0}'.format(self._ssh)) else: start = time() + pkey = None + if 'priv_key' in node: + pkey = RSAKey.from_private_key( + StringIO.StringIO(node['priv_key'])) + + self._ssh = paramiko.SSHClient() + self._ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + self._ssh.connect(node['host'], username=node['username'], - password=node['password']) - self.__existing_connections[node_hash] = self._ssh + password=node.get('password'), pkey=pkey) + + SSH.__existing_connections[node_hash] = self._ssh + logger.trace('connect took {} seconds'.format(time() - start)) + logger.debug('new ssh: {0}'.format(self._ssh)) + + logger.debug('Connect peer: {0}'. + format(self._ssh.get_transport().getpeername())) + logger.debug('Connections: {0}'.format(str(SSH.__existing_connections))) def exec_command(self, cmd, timeout=10): """Execute SSH command on a new channel on the connected Node. Returns (return_code, stdout, stderr). """ - logger.trace('exec_command on {0}: {1}'.format(self._hostname, cmd)) + logger.trace('exec_command on {0}: {1}' + .format(self._ssh.get_transport().getpeername(), cmd)) start = time() chan = self._ssh.get_transport().open_session() if timeout is not None: chan.settimeout(int(timeout)) chan.exec_command(cmd) end = time() - logger.trace('exec_command "{0}" on {1} took {2} seconds'.format( - cmd, self._hostname, end-start)) + logger.trace('exec_command on {0} took {1} seconds'.format( + self._ssh.get_transport().getpeername(), end-start)) stdout = "" while True: @@ -99,9 +115,9 @@ class SSH(object): >>> ssh = SSH() >>> ssh.connect(node) >>> #Execute command without input (sudo -S cmd) - >>> ssh.exex_command_sudo("ifconfig eth0 down") + >>> ssh.exec_command_sudo("ifconfig eth0 down") >>> #Execute command with input (sudo -S cmd <<< "input") - >>> ssh.exex_command_sudo("vpp_api_test", "dump_interface_table") + >>> ssh.exec_command_sudo("vpp_api_test", "dump_interface_table") """ if cmd_input is None: command = 'sudo -S {c}'.format(c=cmd) @@ -182,7 +198,7 @@ class SSH(object): connect() method has to be called first! """ logger.trace('SCP {0} to {1}:{2}'.format( - local_path, self._hostname, remote_path)) + local_path, self._ssh.get_transport().getpeername(), remote_path)) # SCPCLient takes a paramiko transport as its only argument scp = SCPClient(self._ssh.get_transport()) start = time() @@ -229,7 +245,7 @@ def exec_cmd_no_error(node, cmd, timeout=None, sudo=False): Returns (stdout, stderr). """ - (rc, stdout, stderr) = exec_cmd(node,cmd, timeout=timeout, sudo=sudo) + (rc, stdout, stderr) = exec_cmd(node, cmd, timeout=timeout, sudo=sudo) assert_equal(rc, 0, 'Command execution failed: "{}"\n{}'. format(cmd, stderr)) return (stdout, stderr) diff --git a/resources/libraries/python/topology.py b/resources/libraries/python/topology.py index 8b6905d7e1..103416078a 100644 --- a/resources/libraries/python/topology.py +++ b/resources/libraries/python/topology.py @@ -195,7 +195,7 @@ class Topology(object): interface_dict = {} list_mac_address = self.convert_mac_to_number_list(mac_address) - logger.trace(list_mac_address.__str__()) + logger.trace(str(list_mac_address)) for interface in interfaces_list: # TODO: create vat json integrity checking and move there if "l2_address" not in interface: @@ -254,6 +254,9 @@ class Topology(object): if_mac = ifc['mac_address'] interface_dict = self._extract_vpp_interface_by_mac(interface_list, if_mac) + if not interface_dict: + raise Exception('Interface {0} not found by MAC {1}'. + format(ifc, if_mac)) ifc['name'] = interface_dict["interface_name"] ifc['vpp_sw_index'] = interface_dict["sw_if_index"] |