X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FDUTSetup.py;h=9c78cfe6aa73e5245d812163109251197d5d8156;hp=5b70bd6b5a669534d05dd3cbd4fea62d5661d630;hb=4c6fe5602edcbd9857a846e5b13a21d5c671a2c8;hpb=3818230e5c3fc1308d31ccf33c98b554a3a39b0a diff --git a/resources/libraries/python/DUTSetup.py b/resources/libraries/python/DUTSetup.py index 5b70bd6b5a..9c78cfe6aa 100644 --- a/resources/libraries/python/DUTSetup.py +++ b/resources/libraries/python/DUTSetup.py @@ -13,8 +13,6 @@ """DUT setup library.""" -import os - from robot.api import logger from resources.libraries.python.topology import NodeType, Topology @@ -26,6 +24,63 @@ from resources.libraries.python.VPPUtil import VPPUtil class DUTSetup(object): """Contains methods for setting up DUTs.""" + + @staticmethod + def get_service_logs(node, service): + """Get specific service unit logs by journalctl from node. + + :param node: Node in the topology. + :param service: Service unit name. + :type node: dict + :type service: str + """ + ssh = SSH() + ssh.connect(node) + ret_code, _, _ = \ + ssh.exec_command_sudo('journalctl --no-pager --unit={name} ' + '--since="$(echo `systemctl show -p ' + 'ActiveEnterTimestamp {name}` | ' + 'awk \'{{print $2 $3}}\')"'. + format(name=service)) + if int(ret_code) != 0: + raise RuntimeError('DUT {host} failed to get logs from unit {name}'. + format(host=node['host'], name=service)) + + @staticmethod + def get_service_logs_on_all_duts(nodes, service): + """Get specific service unit logs by journalctl from all DUTs. + + :param nodes: Nodes in the topology. + :param service: Service unit name. + :type nodes: dict + :type service: str + """ + for node in nodes.values(): + if node['type'] == NodeType.DUT: + DUTSetup.get_service_logs(node, service) + + @staticmethod + def start_service(node, service): + """Start up the named service on node. + + :param node: Node in the topology. + :param service: Service unit name. + :type node: dict + :type service: str + """ + ssh = SSH() + ssh.connect(node) + # We are doing restart. With this we do not care if service + # was running or not. + ret_code, _, _ = \ + ssh.exec_command_sudo('service {name} restart'. + format(name=service), timeout=120) + if int(ret_code) != 0: + raise RuntimeError('DUT {host} failed to start service {name}'. + format(host=node['host'], name=service)) + + DUTSetup.get_service_logs(node, service) + @staticmethod def start_vpp_service_on_all_duts(nodes): """Start up the VPP service on all nodes. @@ -33,15 +88,9 @@ class DUTSetup(object): :param nodes: Nodes in the topology. :type nodes: dict """ - 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', timeout=120) - if int(ret_code) != 0: - raise Exception('DUT {0} failed to start VPP service'. - format(node['host'])) + DUTSetup.start_service(node, Constants.VPP_UNIT) @staticmethod def vpp_show_version_verbose(node): @@ -56,8 +105,8 @@ class DUTSetup(object): try: vat.script_should_have_passed() except AssertionError: - raise RuntimeError('Failed to get VPP version on host: {}'. - format(node['host'])) + raise RuntimeError('Failed to get VPP version on host: {name}'. + format(name=node['host'])) @staticmethod def show_vpp_version_on_all_duts(nodes): @@ -83,8 +132,8 @@ class DUTSetup(object): try: vat.script_should_have_passed() except AssertionError: - raise RuntimeError('Failed to get VPP interfaces on host: {}'. - format(node['host'])) + raise RuntimeError('Failed to get VPP interfaces on host: {name}'. + format(name=node['host'])) @staticmethod def vpp_api_trace_save(node): @@ -125,15 +174,13 @@ class DUTSetup(object): ssh = SSH() ssh.connect(node) - (ret_code, stdout, stderr) = \ + ret_code, _, _ = \ ssh.exec_command('sudo -Sn bash {0}/{1}/dut_setup.sh'. format(Constants.REMOTE_FW_DIR, Constants.RESOURCES_LIB_SH), timeout=120) if int(ret_code) != 0: - 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'])) + raise RuntimeError('DUT test setup script failed at node {name}'. + format(name=node['host'])) @staticmethod def get_vpp_pid(node): @@ -143,7 +190,7 @@ class DUTSetup(object): :type node: dict :returns: PID :rtype: int - :raises RuntimeError if it is not possible to get the PID. + :raises RuntimeError: If it is not possible to get the PID. """ ssh = SSH() @@ -449,6 +496,7 @@ class DUTSetup(object): vat = VatExecutor() vat.execute_script("enable_dpdk_traces.vat", node, json_out=False) vat.execute_script("enable_vhost_user_traces.vat", node, json_out=False) + vat.execute_script("enable_memif_traces.vat", node, json_out=False) @staticmethod def install_vpp_on_all_duts(nodes, vpp_pkg_dir, vpp_rpm_pkgs, vpp_deb_pkgs): @@ -462,7 +510,7 @@ class DUTSetup(object): :type vpp_pkg_dir: str :type vpp_rpm_pkgs: list :type vpp_deb_pkgs: list - :raises: RuntimeError if failed to remove or install VPP + :raises RuntimeError: If failed to remove or install VPP. """ logger.debug("Installing VPP") @@ -485,7 +533,7 @@ class DUTSetup(object): if int(r_rcode) != 0: raise RuntimeError('Failed to remove previous VPP' 'installation on host {0}:\n{1}' - .format(node['host']), r_err) + .format(node['host'], r_err)) rpm_pkgs = "*.rpm ".join(str(vpp_pkg_dir + pkg) for pkg in vpp_rpm_pkgs) + "*.rpm" @@ -493,7 +541,7 @@ class DUTSetup(object): ret_code, _, err = ssh.exec_command_sudo(cmd_i, timeout=90) if int(ret_code) != 0: raise RuntimeError('Failed to install VPP on host {0}:' - '\n{1}'.format(node['host']), err) + '\n{1}'.format(node['host'], err)) else: ssh.exec_command_sudo("rpm -qai vpp*") logger.info("VPP installed on node {0}". @@ -507,14 +555,14 @@ class DUTSetup(object): if int(r_rcode) != 0: raise RuntimeError('Failed to remove previous VPP' 'installation on host {0}:\n{1}' - .format(node['host']), r_err) + .format(node['host'], r_err)) deb_pkgs = "*.deb ".join(str(vpp_pkg_dir + pkg) for pkg in vpp_deb_pkgs) + "*.deb" cmd_i = "dpkg -i --force-all {0}".format(deb_pkgs) ret_code, _, err = ssh.exec_command_sudo(cmd_i, timeout=90) if int(ret_code) != 0: raise RuntimeError('Failed to install VPP on host {0}:' - '\n{1}'.format(node['host']), err) + '\n{1}'.format(node['host'], err)) else: ssh.exec_command_sudo("dpkg -l | grep vpp") logger.info("VPP installed on node {0}". @@ -544,8 +592,8 @@ class DUTSetup(object): :param node: DUT node. :type node: dict - :raises: RuntimeError if failed to restart VPP, get VPP version or - get VPP interfaces + :raises RuntimeError: If failed to restart VPP, get VPP version + or get VPP interfaces. """ logger.debug("Verify VPP on node {0}".format(node['host']))