diff options
Diffstat (limited to 'resources/libraries/python')
-rw-r--r-- | resources/libraries/python/DMM/DMMConstants.py | 32 | ||||
-rw-r--r-- | resources/libraries/python/DMM/SetupDMMTest.py | 184 | ||||
-rw-r--r-- | resources/libraries/python/DMM/SingleCliSer.py | 298 | ||||
-rw-r--r-- | resources/libraries/python/DMM/__init__.py | 16 |
4 files changed, 0 insertions, 530 deletions
diff --git a/resources/libraries/python/DMM/DMMConstants.py b/resources/libraries/python/DMM/DMMConstants.py deleted file mode 100644 index c4899df84a..0000000000 --- a/resources/libraries/python/DMM/DMMConstants.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (c) 2018 Huawei Technologies Co.,Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""This file defines the constants variables for the DMM test.""" - -class DMMConstants: - """Define the directory path for the DMM test.""" - - # DMM testing directory location at topology nodes - REMOTE_FW_DIR = '/tmp/DMM-testing' - - # Shell scripts location - DMM_SCRIPTS = 'dmm/scripts/csit/' - - # Run scripts location - DMM_RUN_SCRIPTS = 'dmm/scripts/csit/run' - - # Libraries location - DMM_DEPLIBS = 'tests/dmm/dmm_deplibs' - - # Config files location for the DMM test - DMM_TESTCONFIG = 'tests/dmm/dmm_testconfig' diff --git a/resources/libraries/python/DMM/SetupDMMTest.py b/resources/libraries/python/DMM/SetupDMMTest.py deleted file mode 100644 index d84cbd544f..0000000000 --- a/resources/libraries/python/DMM/SetupDMMTest.py +++ /dev/null @@ -1,184 +0,0 @@ -# Copyright (c) 2018 Huawei Technologies Co.,Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""This module exists to provide setup utilities for the framework on topology -nodes. All tasks required to be run before the actual tests are started is -supposed to end up here. -""" - -from shlex import split -from subprocess import Popen, PIPE -from multiprocessing import Pool -from tempfile import NamedTemporaryFile -from os.path import basename - -from robot.api import logger -from robot.libraries.BuiltIn import BuiltIn - -from resources.libraries.python.ssh import SSH -from resources.libraries.python.DMM.DMMConstants import DMMConstants as con -from resources.libraries.python.topology import NodeType, Topology -from resources.libraries.python.TLDK.SetupTLDKTest import copy_tarball_to_node,\ - delete_local_tarball - -__all__ = ["SetupDMMTest"] - - -def pack_framework_dir(): - """Pack the testing WS into temp file, return its name. - :returns: file_name - :rtype: str - :raises RuntimeError: If pack the testing framework failed. - """ - tmpfile = NamedTemporaryFile(suffix=".tgz", prefix="DMM-testing-") - file_name = tmpfile.name - tmpfile.close() - - proc = Popen( - split("tar --exclude-vcs --exclude=./tmp --exclude=dmm_depends.tar.gz" - " -zcf {0} .".format(file_name)), stdout=PIPE, stderr=PIPE) - (stdout, stderr) = proc.communicate() - - logger.debug(stdout) - logger.debug(stderr) - - return_code = proc.wait() - if return_code != 0: - raise RuntimeError("Could not pack testing framework.") - - return file_name - -def extract_tarball_at_node(tarball, node): - """Extract tarball at given node. - - Extracts tarball using tar on given node to specific CSIT location. - Raise runtime errors when failed. - - :param tarball: Path to tarball to upload. - :param node: Dictionary created from topology. - :type tarball: str - :type node: dict - :return: nothing - :raises RuntimeError: If extract tarball failed. - """ - logger.console('Extracting tarball to {0} on {1}'.format( - con.REMOTE_FW_DIR, node['host'])) - ssh = SSH() - ssh.connect(node) - - cmd = 'sudo rm -rf {1}; mkdir {1} ; tar -zxf {0} -C {1}; ' \ - 'rm -f {0};'.format(tarball, con.REMOTE_FW_DIR) - (ret_code, _, stderr) = ssh.exec_command(cmd, timeout=30) - if ret_code != 0: - logger.error('Unpack error: {0}'.format(stderr)) - raise RuntimeError('Failed to unpack {0} at node {1}'.format( - tarball, node['host'])) - -def install_dmm_test(node): - """Prepare the DMM test envrionment. - Raise errors when failed. - - :param node: Dictionary created from topology. - :type node: dict - :returns: nothing. - :raises RuntimeError: If install dmm failed. - """ - - arch = Topology.get_node_arch(node) - logger.console('Install DMM on {0} ({1})'.format(node['host'], arch)) - - ssh = SSH() - ssh.connect(node) - (ret_code, _, stderr) = ssh.exec_command( - 'cd {0}/{1} && ./install_prereq.sh {2} 2>&1 | tee ' - 'log_install_prereq.txt' - .format(con.REMOTE_FW_DIR, con.DMM_SCRIPTS, arch), timeout=600) - - if ret_code != 0: - logger.error('Install DMM error: {0}'.format(stderr)) - raise RuntimeError('Install prereq failed') - else: - logger.console('Install DMM on {0} success!'.format(node['host'])) - -def setup_node(args): - """Run all set-up methods for a node. - - This method is used as map_async parameter. It receives tuple with all - parameters as passed to map_async function. - - :param args: All parameters needed to setup one node. - :type args: tuple - :returns: True - success, False - error - :rtype: bool - :raises RuntimeError: If node setup failed. - """ - tarball, remote_tarball, node = args - - # if unset, arch defaults to x86_64 - Topology.get_node_arch(node) - - try: - if node['type'] == NodeType.DUT: - copy_tarball_to_node(tarball, node) - extract_tarball_at_node(remote_tarball, node) - install_dmm_test(node) - except RuntimeError as exc: - logger.error("Node setup failed, error:'{0}'".format(exc.message)) - return False - else: - logger.console('Setup of node {0} done'.format(node['host'])) - return True - -class SetupDMMTest: - """Setup suite run on topology nodes. - - Many VAT/CLI based tests need the scripts at remote hosts before executing - them. This class packs the whole testing directory and copies it over - to all nodes in topology under /tmp/ - """ - - @staticmethod - def setup_dmm_test(nodes): - """Pack the whole directory and extract in temp on each node.""" - - tarball = pack_framework_dir() - msg = 'Framework packed to {0}'.format(tarball) - logger.console(msg) - logger.trace(msg) - remote_tarball = "/tmp/{0}".format(basename(tarball)) - - # Turn off logging since we use multiprocessing. - log_level = BuiltIn().set_log_level('NONE') - params = ((tarball, remote_tarball, node) for node in nodes.values()) - pool = Pool(processes=len(nodes)) - result = pool.map_async(setup_node, params) - pool.close() - pool.join() - - # Turn on logging. - BuiltIn().set_log_level(log_level) - - logger.info( - 'Executed node setups in parallel, waiting for processes to end') - result.wait() - - results = result.get() - node_setup_success = all(results) - logger.info('Results: {0}'.format(results)) - - logger.trace('Test framework copied to all topology nodes') - delete_local_tarball(tarball) - if node_setup_success: - logger.console('All nodes are ready') - else: - logger.console('Failed to setup dpdk on all the nodes') diff --git a/resources/libraries/python/DMM/SingleCliSer.py b/resources/libraries/python/DMM/SingleCliSer.py deleted file mode 100644 index aa77eaa445..0000000000 --- a/resources/libraries/python/DMM/SingleCliSer.py +++ /dev/null @@ -1,298 +0,0 @@ -# Copyright (c) 2018 Huawei Technologies Co.,Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -""" -This module exists to provide single client-server test for DMM -on topology nodes. -""" -import time -import os -import glob - -from resources.libraries.python.ssh import SSH -from resources.libraries.python.ssh import exec_cmd, exec_cmd_no_error -from resources.libraries.python.DMM.DMMConstants import DMMConstants as con -from resources.libraries.python.topology import Topology - -class SingleCliSer: - """Test DMM with single client-server topology.""" - - @staticmethod - def set_dmm_interface_address(dut_node, ifname, ip_addr, ip4_prefix): - """ - Flush ip, set ip, set interface up. - - :param dut_node: Node to set the interface address on. - :param ifname: Interface name. - :param ip_addr: IP address to configure. - :param ip4_prefix: Prefix length. - :type dut_node: dict - :type ifname: str - :type ip_addr: str - :type ip4_prefix: int - """ - cmd = 'sudo ip -4 addr flush dev {}'.format(ifname) - exec_cmd_no_error(dut_node, cmd) - cmd = 'sudo ip addr add {}/{} dev {}'\ - .format(ip_addr, ip4_prefix, ifname) - exec_cmd_no_error(dut_node, cmd) - cmd = 'sudo ip link set {0} up'.format(ifname) - exec_cmd_no_error(dut_node, cmd) - - @staticmethod - def setup_dmm_dut(dut1_node, dut2_node, dut1_if_name, dut2_if_name, - script_name, dut1_ip, dut2_ip, prefix_len): - """ - Setup DMM on DUT nodes. - - :param dut1_node: Node to setup DMM on. - :param dut2_node: Node to setup DMM on. - :param dut1_if_name: DUT1 to DUT2 interface name. - :param dut2_if_name: DUT2 to DUT1 interface name. - :param script_name: Name of the script to run. - :param dut1_ip: IP address to configure on DUT1. - :param dut2_ip: IP address to configure on DUT2. - :param prefix_len: Prefix length. - :type dut1_node: dict - :type dut2_node: dict - :type dut1_if_name: str - :type dut2_if_name: str - :type script_name: str - :type dut1_ip: str - :type dut2_ip: str - :type prefix_len: int - """ - SingleCliSer.set_dmm_interface_address(dut1_node, dut1_if_name, - dut1_ip, prefix_len) - SingleCliSer.set_dmm_interface_address(dut2_node, dut2_if_name, - dut2_ip, prefix_len) - cmd = 'cd {0}/{1} && ./{2} setup 0 {3} {4} {5}'\ - .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name, - dut1_if_name, dut1_ip, dut2_ip) - exec_cmd(dut1_node, cmd) - - cmd = 'cd {0}/{1} && ./{2} setup 1 {3} {4} {5}'\ - .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name, - dut2_if_name, dut1_ip, dut2_ip) - exec_cmd(dut2_node, cmd) - - @staticmethod - def execute_test(dut1_node, dut2_node, dut1_if_name, dut2_if_name, - script_name, dut1_ip, dut2_ip): - """ - Run the given test case. - - :param dut1_node: Node to run an app with DMM on. - :param dut2_node: Node to run an app with DMM on. - :param dut1_if_name: DUT1 to DUT2 interface name. - :param dut2_if_name: DUT2 to DUT1 interface name. - :param script_name: Name of the script to run. - :param dut1_ip: DUT1 IP address. - :param dut2_ip: DUT2 IP address. - :type dut1_node: dict - :type dut2_node: dict - :type dut1_if_name: str - :type dut2_if_name: str - :type script_name: str - :type dut1_ip: str - :type dut2_ip: str - """ - cmd = 'cd {0}/{1} && ./{2} run 0 {3} {4} {5} ' \ - .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name, - dut1_if_name, dut1_ip, dut2_ip) - cmd += '2>&1 | tee log_{0}.txt &'.format(script_name) - exec_cmd(dut1_node, cmd) - time.sleep(10) - - cmd = 'cd {0}/{1} && ./{2} run 1 {3} {4} {5} ' \ - .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name, - dut2_if_name, dut1_ip, dut2_ip) - cmd += '2>&1 | tee log_{0}.txt'.format(script_name) - exec_cmd(dut2_node, cmd) - - @staticmethod - def verify_test_result(dut1_node, dut2_node, script_name): - """ - Verify the test and return result. - - :param dut1_node: Node to verify test result on. - :param dut2_node: Node to verify test result on. - :param script_name: Name of the script to run. - :type dut1_node: dict - :type dut2_node: dict - :type script_name: str - :returns: test result PASS/FAIL. - :rtype: str - """ - cmd = 'cd {0}/{1} && ./{2} verify 0' \ - .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name) - (_, stdout_ser, _) = exec_cmd(dut1_node, cmd) - - cmd = 'cd {0}/{1} && ./{2} verify 1' \ - .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name) - (_, stdout_cli, _) = exec_cmd(dut2_node, cmd) - - if stdout_ser.find('DMM_CSIT_TEST_PASSED') != -1 \ - and stdout_cli.find('DMM_CSIT_TEST_PASSED') != -1: - return "PASS" - else: - return "FAIL" - - @staticmethod - def print_dmm_log(dut1_node, dut2_node, script_name): - """ - Print DMM logs. - - :param dut1_node: Node to print DMM logs of. - :param dut2_node: Node to print DMM logs of. - :param script_name: Name of the script to run. - :type dut1_node: dict - :type dut2_node: dict - :type script_name: str - """ - cmd = 'cd {0}/{1} && ./{2} log 0'\ - .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name) - exec_cmd(dut1_node, cmd) - - cmd = 'cd {0}/{1} && ./{2} log 1'\ - .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name) - exec_cmd(dut2_node, cmd) - cmd = 'mv /var/log/nStack/running.log /var/log/nStack/{0}_ser.log'\ - .format(script_name) - exec_cmd(dut1_node, cmd, sudo=True) - cmd = 'mv /var/log/nStack/running.log /var/log/nStack/{0}_cli.log'\ - .format(script_name) - exec_cmd(dut2_node, cmd, sudo=True) - - @staticmethod - def cleanup_dmm_dut(dut1_node, dut2_node, script_name): - """ - Cleanup DMM DUT node. - - :param dut1_node: DMM node to be cleaned up. - :param dut2_node: DMM node to be cleaned up. - :param script_name: Name of the script to run. - :type dut1_node: dict - :type dut2_node: dict - :type script_name: str - """ - cmd = 'cd {0}/{1} && ./{2} cleanup 0'\ - .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name) - exec_cmd(dut1_node, cmd) - exec_cmd(dut2_node, cmd) - time.sleep(5) - - @staticmethod - def run_dmm_func_test_cases(dut1_node, dut2_node, dut1_if_name, - dut2_if_name, dut1_ip, dut2_ip, prefix_len): - """ - Execute all the functional test cases and return result. - - :param dut1_node: Node to run an app with DMM on. - :param dut2_node: Node to run an app with DMM on. - :param dut1_if_name: DUT1 to DUT2 interface name. - :param dut2_if_name: DUT2 to DUT1 interface name. - :param dut1_ip: IP address to configure on DUT1. - :param dut2_ip: IP address to configure on DUT2. - :param prefix_len: Prefix length. - :type dut1_node: dict - :type dut2_node: dict - :type dut1_if_name: str - :type dut2_if_name: str - :type dut1_ip: str - :type dut2_ip: str - :type prefix_len: int - :returns: Total testcase count, Passed testcase count. - :rtype: tuple(int, int) - """ - passed = 0 - total = 0 - failed = 0 - path = '{0}/*'.format(con.DMM_RUN_SCRIPTS) - files = [os.path.basename(x) for x in glob.glob(path)] - print "list of files : {0}".format(files) - - for name in files: - print("file name : {}").format(name) - total += 1 - SingleCliSer.setup_dmm_dut(dut1_node, dut2_node, dut1_if_name, - dut2_if_name, name, dut1_ip, dut2_ip, - prefix_len) - SingleCliSer.execute_test(dut1_node, dut2_node, dut1_if_name, - dut2_if_name, name, dut1_ip, dut2_ip) - result = SingleCliSer.verify_test_result(dut1_node, dut2_node, - '{0}'.format(name)) - if result == "PASS": - passed += 1 - elif result == "FAIL": - failed += 1 - - SingleCliSer.print_dmm_log(dut1_node, dut2_node, name) - SingleCliSer.cleanup_dmm_dut(dut1_node, dut2_node, name) - print("TOTAL :{} PASSED : {} FAILED: {}").format\ - (total, passed, failed) - - return total, passed - - @staticmethod - def dmm_get_interface_name(dut_node, dut_interface): - """ - Get the interface name. - - :param dut_node: Node to get the interface name on. - :param dut_interface: Interface key. - :type dut_node: dict - :type dut_interface: str - :returns: Interface name. - :rtype: str - """ - mac = Topology.get_interface_mac(dut_node, dut_interface) - cmd = 'ifconfig -a | grep {0}'.format(mac) - (stdout, _) = exec_cmd_no_error(dut_node, cmd) - interface_name = stdout.split(' ', 1)[0] - return interface_name - - @staticmethod - def get_logs_from_node(dut_node): - """ - Get logs from node to the test executor machine. - - :param dut_node: Node to artifact the logs of. - :type dut_node: dict - """ - ssh = SSH() - ssh.connect(dut_node) - ssh.scp(".", '/var/log/nStack/*.log', - get=True, timeout=60, wildcard=True) - - (ret, _, _) = exec_cmd(dut_node, 'ls -l /var/log/app*.log') - if ret == 0: - ssh.scp(".", '/var/log/app*.log', - get=True, timeout=60, wildcard=True) - - exec_cmd(dut_node, 'rm -rf /var/log/nStack/*.log', sudo=True) - exec_cmd(dut_node, 'rm -rf /var/log/app*.log', sudo=True) - - @staticmethod - def archive_dmm_logs(dut1_node, dut2_node): - """ - Get logs from both DUT's to the test executor machine. - - :param dut1_node: DUT1 node. - :param dut2_node: DUT2 node. - :type dut1_node: dict - :type dut2_node: dict - """ - SingleCliSer.get_logs_from_node(dut1_node) - SingleCliSer.get_logs_from_node(dut2_node) diff --git a/resources/libraries/python/DMM/__init__.py b/resources/libraries/python/DMM/__init__.py deleted file mode 100644 index d7abcb27b1..0000000000 --- a/resources/libraries/python/DMM/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2018 Huawei Technologies Co.,Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -__init__ file for directory resources/libraries/python/DMM -""" |