diff options
Diffstat (limited to 'testcases')
-rwxr-xr-x | testcases/Controllers/ODL/OpenDaylightTesting.py | 173 | ||||
-rwxr-xr-x | testcases/Controllers/ODL/OpenDaylightUnitTesting.py | 341 | ||||
-rw-r--r-- | testcases/OpenStack/rally/blacklist.txt | 26 | ||||
-rwxr-xr-x | testcases/OpenStack/rally/run_rally-cert.py | 92 | ||||
-rw-r--r-- | testcases/OpenStack/rally/scenario/full/opnfv-nova.yaml | 4 | ||||
-rw-r--r-- | testcases/OpenStack/rally/scenario/sanity/opnfv-nova.yaml | 4 | ||||
-rwxr-xr-x | testcases/features/copper.py | 1 | ||||
-rwxr-xr-x | testcases/features/doctor.py | 1 | ||||
-rwxr-xr-x | testcases/features/domino.py | 1 | ||||
-rwxr-xr-x | testcases/features/sfc/compute_presetup_CI.bash | 9 | ||||
-rwxr-xr-x | testcases/features/sfc/delete.sh | 9 | ||||
-rwxr-xr-x | testcases/features/sfc/prepare_odl_sfc.py | 96 | ||||
-rwxr-xr-x | testcases/features/sfc/sfc.py | 37 | ||||
-rwxr-xr-x | testcases/features/sfc/sfc_colorado1.py | 46 | ||||
-rwxr-xr-x | testcases/vnf/vRNC/parser.py | 1 |
15 files changed, 638 insertions, 203 deletions
diff --git a/testcases/Controllers/ODL/OpenDaylightTesting.py b/testcases/Controllers/ODL/OpenDaylightTesting.py index 173de87f9..e302b569e 100755 --- a/testcases/Controllers/ODL/OpenDaylightTesting.py +++ b/testcases/Controllers/ODL/OpenDaylightTesting.py @@ -1,6 +1,7 @@ #!/usr/bin/python import argparse +import errno import fileinput import os import re @@ -8,13 +9,13 @@ import shutil import sys import urlparse -from robot import run from robot.api import ExecutionResult, ResultVisitor from robot.errors import RobotError +import robot.run from robot.utils.robottime import timestamp_to_secs +from functest.core import TestCasesBase import functest.utils.functest_logger as ft_logger -import functest.utils.functest_utils as ft_utils import functest.utils.openstack_utils as op_utils @@ -39,7 +40,7 @@ class ODLResultVisitor(ResultVisitor): return self._data -class ODLTestCases: +class ODLTestCases(TestCasesBase.TestCasesBase): repos = "/home/opnfv/repos/" odl_test_repo = repos + "odl_test/" @@ -48,22 +49,20 @@ class ODLTestCases: res_dir = '/home/opnfv/functest/results/odl/' logger = ft_logger.Logger("opendaylight").getLogger() + def __init__(self): + self.case_name = "odl" + @classmethod def copy_opnf_testcases(cls): opnfv_testcases_dir = (os.path.dirname(os.path.abspath(__file__)) + "/custom_tests/neutron/") - files = [opnfv_testcases_dir + "001__reachability.robot", - opnfv_testcases_dir + "040__delete_ports.robot", - opnfv_testcases_dir + "050__delete_subnets.robot", - opnfv_testcases_dir + "060__delete_networks.robot"] - for f in files: - try: - shutil.copy(f, cls.neutron_suite_dir) - except IOError as e: - cls.logger.error( - "Cannot copy OPNFV's testcases to ODL directory: " - "%s" % str(e)) - return False + f = opnfv_testcases_dir + "001__reachability.robot" + try: + shutil.copy(f, cls.neutron_suite_dir) + except IOError as e: + cls.logger.error( + "Cannot copy OPNFV's testcase to ODL directory: %s" % str(e)) + return False return True @classmethod @@ -81,9 +80,19 @@ class ODLTestCases: cls.logger.error("Cannot set ODL creds: %s" % str(e)) return False - @classmethod - def run(cls, **kwargs): - dirs = [cls.basic_suite_dir, cls.neutron_suite_dir] + def parse_results(self): + result = ExecutionResult(self.res_dir + 'output.xml') + visitor = ODLResultVisitor() + result.visit(visitor) + self.criteria = result.suite.status + self.start_time = timestamp_to_secs(result.suite.starttime) + self.stop_time = timestamp_to_secs(result.suite.endtime) + self.details = {} + self.details['description'] = result.suite.name + self.details['tests'] = visitor.get_data() + + def main(self, **kwargs): + dirs = [self.basic_suite_dir, self.neutron_suite_dir] try: odlusername = kwargs['odlusername'] odlpassword = kwargs['odlpassword'] @@ -96,49 +105,60 @@ class ODLTestCases: 'PORT:' + kwargs['odlwebport'], 'RESTCONFPORT:' + kwargs['odlrestconfport']] except KeyError as e: - cls.logger.error("Cannot run ODL testcases. Please check " - "%s" % str(e)) - return False - if (cls.copy_opnf_testcases() and - cls.set_robotframework_vars(odlusername, odlpassword)): + self.logger.error("Cannot run ODL testcases. Please check " + "%s" % str(e)) + return self.EX_RUN_ERROR + if (self.copy_opnf_testcases() and + self.set_robotframework_vars(odlusername, odlpassword)): try: - os.makedirs(cls.res_dir) - except OSError: - pass - stdout_file = cls.res_dir + 'stdout.txt' + os.makedirs(self.res_dir) + except OSError as e: + if e.errno != errno.EEXIST: + self.logger.exception( + "Cannot create {}".format(self.res_dir)) + return self.EX_RUN_ERROR + stdout_file = self.res_dir + 'stdout.txt' with open(stdout_file, 'w+') as stdout: - run(*dirs, variable=variables, - output=cls.res_dir + 'output.xml', - log='NONE', - report='NONE', - stdout=stdout) + robot.run(*dirs, variable=variables, + output=self.res_dir + 'output.xml', + log='NONE', + report='NONE', + stdout=stdout) stdout.seek(0, 0) - cls.logger.info("\n" + stdout.read()) - cls.logger.info("ODL results were successfully generated") + self.logger.info("\n" + stdout.read()) + self.logger.info("ODL results were successfully generated") + try: + self.parse_results() + self.logger.info("ODL results were successfully parsed") + except RobotError as e: + self.logger.error("Run tests before publishing: %s" % + e.message) + return self.EX_RUN_ERROR try: os.remove(stdout_file) except OSError: - pass - return True + self.logger.warning("Cannot remove {}".format(stdout_file)) + return self.EX_OK else: - return False + return self.EX_RUN_ERROR - @classmethod - def functest_run(cls): - kclient = op_utils.get_keystone_client() - keystone_url = kclient.service_catalog.url_for( - service_type='identity', endpoint_type='publicURL') - neutron_url = kclient.service_catalog.url_for( - service_type='network', endpoint_type='publicURL') - kwargs = {'keystoneip': urlparse.urlparse(keystone_url).hostname} - kwargs['neutronip'] = urlparse.urlparse(neutron_url).hostname - kwargs['odlip'] = kwargs['neutronip'] - kwargs['odlwebport'] = '8080' - kwargs['odlrestconfport'] = '8181' - kwargs['odlusername'] = 'admin' - kwargs['odlpassword'] = 'admin' + def run(self): try: - installer_type = os.environ['INSTALLER_TYPE'] + kclient = op_utils.get_keystone_client() + keystone_url = kclient.service_catalog.url_for( + service_type='identity', endpoint_type='publicURL') + neutron_url = kclient.service_catalog.url_for( + service_type='network', endpoint_type='publicURL') + kwargs = {'keystoneip': urlparse.urlparse(keystone_url).hostname} + kwargs['neutronip'] = urlparse.urlparse(neutron_url).hostname + kwargs['odlip'] = kwargs['neutronip'] + kwargs['odlwebport'] = '8080' + kwargs['odlrestconfport'] = '8181' + kwargs['odlusername'] = 'admin' + kwargs['odlpassword'] = 'admin' + installer_type = None + if 'INSTALLER_TYPE' in os.environ: + installer_type = os.environ['INSTALLER_TYPE'] kwargs['osusername'] = os.environ['OS_USERNAME'] kwargs['ostenantname'] = os.environ['OS_TENANT_NAME'] kwargs['ospassword'] = os.environ['OS_PASSWORD'] @@ -154,34 +174,15 @@ class ODLTestCases: else: kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP'] except KeyError as e: - cls.logger.error("Cannot run ODL testcases. Please check env var: " - "%s" % str(e)) - return False - - return cls.run(**kwargs) - - @classmethod - def push_to_db(cls): - try: - result = ExecutionResult(cls.res_dir + 'output.xml') - visitor = ODLResultVisitor() - result.visit(visitor) - start_time = timestamp_to_secs(result.suite.starttime) - stop_time = timestamp_to_secs(result.suite.endtime) - details = {} - details['description'] = result.suite.name - details['tests'] = visitor.get_data() - if not ft_utils.push_results_to_db( - "functest", "odl", start_time, stop_time, - result.suite.status, details): - cls.logger.error("Cannot push ODL results to DB") - return False - else: - cls.logger.info("ODL results were successfully pushed to DB") - return True - except RobotError as e: - cls.logger.error("Run tests before publishing: %s" % e.message) + self.logger.error("Cannot run ODL testcases. " + "Please check env var: " + "%s" % str(e)) + return self.EX_RUN_ERROR + except Exception: + self.logger.exception("Cannot run ODL testcases.") + return self.EX_RUN_ERROR + return self.main(**kwargs) if __name__ == '__main__': parser = argparse.ArgumentParser() @@ -220,8 +221,12 @@ if __name__ == '__main__': action='store_true') args = vars(parser.parse_args()) - if not ODLTestCases.run(**args): - sys.exit(os.EX_SOFTWARE) - if args['pushtodb']: - sys.exit(not ODLTestCases.push_to_db()) - sys.exit(os.EX_OK) + odl = ODLTestCases() + try: + result = odl.main(**args) + if result != TestCasesBase.TestCasesBase.EX_OK: + sys.exit(result) + if args['pushtodb']: + sys.exit(odl.push_to_db()) + except Exception: + sys.exit(TestCasesBase.TestCasesBase.EX_RUN_ERROR) diff --git a/testcases/Controllers/ODL/OpenDaylightUnitTesting.py b/testcases/Controllers/ODL/OpenDaylightUnitTesting.py new file mode 100755 index 000000000..500888b22 --- /dev/null +++ b/testcases/Controllers/ODL/OpenDaylightUnitTesting.py @@ -0,0 +1,341 @@ +#!/usr/bin/env python + +import errno +import logging +import mock +import os +import unittest + +from robot.errors import RobotError + +from functest.core import TestCasesBase +from functest.testcases.Controllers.ODL import OpenDaylightTesting + + +class ODLTestCasesTesting(unittest.TestCase): + + logging.disable(logging.CRITICAL) + + _keystone_ip = "127.0.0.1" + _neutron_ip = "127.0.0.2" + _sdn_controller_ip = "127.0.0.3" + _os_tenantname = "admin" + _os_username = "admin" + _os_password = "admin" + _odl_webport = "8080" + _odl_restconfport = "8181" + _odl_username = "admin" + _odl_password = "admin" + + def setUp(self): + if "INSTALLER_TYPE" in os.environ: + del os.environ["INSTALLER_TYPE"] + os.environ["OS_USERNAME"] = self._os_username + os.environ["OS_PASSWORD"] = self._os_password + os.environ["OS_TENANT_NAME"] = self._os_tenantname + self.test = OpenDaylightTesting.ODLTestCases() + + @mock.patch('shutil.copy', side_effect=Exception()) + def test_copy_opnf_testcases_exception(self, *args): + with self.assertRaises(Exception): + self.test.copy_opnf_testcases() + + @mock.patch('shutil.copy', side_effect=IOError()) + def test_copy_opnf_testcases_ioerror(self, *args): + self.assertFalse(self.test.copy_opnf_testcases()) + + @mock.patch('shutil.copy') + def test_copy_opnf_testcases(self, *args): + self.assertTrue(self.test.copy_opnf_testcases()) + + @mock.patch('fileinput.input', side_effect=Exception()) + def test_set_robotframework_vars_failed(self, *args): + self.assertFalse(self.test.set_robotframework_vars()) + + @mock.patch('fileinput.input', return_value=[]) + def test_set_robotframework_vars(self, args): + self.assertTrue(self.test.set_robotframework_vars()) + + def _test_run_missing_env_var(self, var): + del os.environ[var] + self.assertEqual(self.test.run(), + TestCasesBase.TestCasesBase.EX_RUN_ERROR) + + @classmethod + def _fake_url_for(cls, service_type='identity', **kwargs): + if service_type == 'identity': + return "http://{}:5000/v2.0".format( + ODLTestCasesTesting._keystone_ip) + elif service_type == 'network': + return "http://{}:9696".format(ODLTestCasesTesting._neutron_ip) + else: + return None + + @classmethod + def _get_fake_keystone_client(cls): + kclient = mock.Mock() + kclient.service_catalog = mock.Mock() + kclient.service_catalog.url_for = mock.Mock( + side_effect=cls._fake_url_for) + return kclient + + def _get_main_kwargs(self, key=None): + kwargs = {'odlusername': self._odl_username, + 'odlpassword': self._odl_password, + 'keystoneip': self._keystone_ip, + 'neutronip': self._neutron_ip, + 'osusername': self._os_username, + 'ostenantname': self._os_tenantname, + 'ospassword': self._os_password, + 'odlip': self._sdn_controller_ip, + 'odlwebport': self._odl_webport, + 'odlrestconfport': self._odl_restconfport} + if key: + del kwargs[key] + return kwargs + + def _test_main(self, status, *args): + kwargs = self._get_main_kwargs() + self.assertEqual(self.test.main(**kwargs), status) + if len(args) > 0: + args[0].assert_called_once_with( + OpenDaylightTesting.ODLTestCases.res_dir) + if len(args) > 1: + variable = ['KEYSTONE:{}'.format(self._keystone_ip), + 'NEUTRON:{}'.format(self._neutron_ip), + 'OSUSERNAME:"{}"'.format(self._os_username), + 'OSTENANTNAME:"{}"'.format(self._os_tenantname), + 'OSPASSWORD:"{}"'.format(self._os_password), + 'ODL_SYSTEM_IP:{}'.format(self._sdn_controller_ip), + 'PORT:{}'.format(self._odl_webport), + 'RESTCONFPORT:{}'.format(self._odl_restconfport)] + args[1].assert_called_once_with( + OpenDaylightTesting.ODLTestCases.basic_suite_dir, + OpenDaylightTesting.ODLTestCases.neutron_suite_dir, + log='NONE', + output=OpenDaylightTesting.ODLTestCases.res_dir + 'output.xml', + report='NONE', + stdout=mock.ANY, + variable=variable) + if len(args) > 2: + args[2].assert_called_with( + OpenDaylightTesting.ODLTestCases.res_dir + 'stdout.txt') + + def _test_main_missing_keyword(self, key): + kwargs = self._get_main_kwargs(key) + self.assertEqual(self.test.main(**kwargs), + TestCasesBase.TestCasesBase.EX_RUN_ERROR) + + def test_main_missing_odlusername(self): + self._test_main_missing_keyword('odlusername') + + def test_main_missing_odlpassword(self): + self._test_main_missing_keyword('odlpassword') + + def test_main_missing_keystoneip(self): + self._test_main_missing_keyword('keystoneip') + + def test_main_missing_neutronip(self): + self._test_main_missing_keyword('neutronip') + + def test_main_missing_osusername(self): + self._test_main_missing_keyword('osusername') + + def test_main_missing_ostenantname(self): + self._test_main_missing_keyword('ostenantname') + + def test_main_missing_ospassword(self): + self._test_main_missing_keyword('ospassword') + + def test_main_missing_odlip(self): + self._test_main_missing_keyword('odlip') + + def test_main_missing_odlwebport(self): + self._test_main_missing_keyword('odlwebport') + + def test_main_missing_odlrestconfport(self): + self._test_main_missing_keyword('odlrestconfport') + + def test_main_copy_opnf_testcases_failed(self): + with mock.patch.object(self.test, 'copy_opnf_testcases', + return_value=False): + self._test_main(TestCasesBase.TestCasesBase.EX_RUN_ERROR) + self.test.copy_opnf_testcases.assert_called_once_with() + + def test_main_set_robotframework_vars_failed(self): + with mock.patch.object(self.test, 'copy_opnf_testcases', + return_value=True), \ + mock.patch.object(self.test, 'set_robotframework_vars', + return_value=False): + self._test_main(TestCasesBase.TestCasesBase.EX_RUN_ERROR) + self.test.set_robotframework_vars.assert_called_once_with( + self._odl_username, self._odl_password) + + @mock.patch('os.makedirs', side_effect=Exception) + def test_main_makedirs_exception(self, mock_method): + with mock.patch.object(self.test, + 'copy_opnf_testcases', return_value=True), \ + mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True), \ + self.assertRaises(Exception): + self._test_main(TestCasesBase.TestCasesBase.EX_RUN_ERROR, + mock_method) + + @mock.patch('os.makedirs', side_effect=OSError) + def test_main_makedirs_oserror(self, mock_method): + with mock.patch.object(self.test, + 'copy_opnf_testcases', return_value=True), \ + mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True): + self._test_main(TestCasesBase.TestCasesBase.EX_RUN_ERROR, + mock_method) + + @mock.patch('robot.run', side_effect=RobotError) + @mock.patch('os.makedirs') + def test_main_robot_run_failed(self, *args): + with mock.patch.object(self.test, 'copy_opnf_testcases', + return_value=True), \ + mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True), \ + self.assertRaises(RobotError): + self._test_main(TestCasesBase.TestCasesBase.EX_RUN_ERROR, *args) + + @mock.patch('robot.run') + @mock.patch('os.makedirs') + def test_main_parse_results_failed(self, *args): + with mock.patch.object(self.test, 'copy_opnf_testcases', + return_value=True), \ + mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True), \ + mock.patch.object(self.test, 'parse_results', + side_effect=RobotError): + self._test_main(TestCasesBase.TestCasesBase.EX_RUN_ERROR, *args) + + @mock.patch('os.remove', side_effect=Exception) + @mock.patch('robot.run') + @mock.patch('os.makedirs') + def test_main_remove_exception(self, *args): + with mock.patch.object(self.test, 'copy_opnf_testcases', + return_value=True), \ + mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True), \ + mock.patch.object(self.test, 'parse_results'), \ + self.assertRaises(Exception): + self._test_main(TestCasesBase.TestCasesBase.EX_OK, *args) + + @mock.patch('os.remove') + @mock.patch('robot.run') + @mock.patch('os.makedirs') + def test_main(self, *args): + with mock.patch.object(self.test, 'copy_opnf_testcases', + return_value=True), \ + mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True), \ + mock.patch.object(self.test, 'parse_results'): + self._test_main(TestCasesBase.TestCasesBase.EX_OK, *args) + + @mock.patch('os.remove') + @mock.patch('robot.run') + @mock.patch('os.makedirs', side_effect=OSError(errno.EEXIST, '')) + def test_main_makedirs_oserror17(self, *args): + with mock.patch.object(self.test, 'copy_opnf_testcases', + return_value=True), \ + mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True), \ + mock.patch.object(self.test, 'parse_results'): + self._test_main(TestCasesBase.TestCasesBase.EX_OK, *args) + + @mock.patch('os.remove') + @mock.patch('robot.run', return_value=1) + @mock.patch('os.makedirs') + def test_main_testcases_in_failure(self, *args): + with mock.patch.object(self.test, 'copy_opnf_testcases', + return_value=True), \ + mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True), \ + mock.patch.object(self.test, 'parse_results'): + self._test_main(TestCasesBase.TestCasesBase.EX_OK, *args) + + @mock.patch('os.remove', side_effect=OSError) + @mock.patch('robot.run') + @mock.patch('os.makedirs') + def test_main_remove_oserror(self, *args): + with mock.patch.object(self.test, 'copy_opnf_testcases', + return_value=True), \ + mock.patch.object(self.test, 'set_robotframework_vars', + return_value=True), \ + mock.patch.object(self.test, 'parse_results'): + self._test_main(TestCasesBase.TestCasesBase.EX_OK, *args) + + def _test_run(self, status=TestCasesBase.TestCasesBase.EX_OK, + exception=None, odlip="127.0.0.3", odlwebport="8080"): + with mock.patch('functest.utils.openstack_utils.get_keystone_client', + return_value=self._get_fake_keystone_client()): + if exception: + self.test.main = mock.Mock(side_effect=exception) + else: + self.test.main = mock.Mock(return_value=status) + self.assertEqual(self.test.run(), status) + self.test.main.assert_called_once_with( + keystoneip=self._keystone_ip, neutronip=self._neutron_ip, + odlip=odlip, odlpassword=self._odl_password, + odlrestconfport=self._odl_restconfport, + odlusername=self._odl_username, odlwebport=odlwebport, + ospassword=self._os_password, ostenantname=self._os_tenantname, + osusername=self._os_username) + + def test_run_missing_os_username(self): + self._test_run_missing_env_var("OS_USERNAME") + + def test_run_missing_os_password(self): + self._test_run_missing_env_var("OS_PASSWORD") + + def test_run_missing_os_tenant_name(self): + self._test_run_missing_env_var("OS_TENANT_NAME") + + def test_run_main_false(self): + os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip + self._test_run(TestCasesBase.TestCasesBase.EX_RUN_ERROR, + odlip=self._sdn_controller_ip, + odlwebport=self._odl_webport) + + def test_run_main_exception(self): + os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip + with self.assertRaises(Exception): + self._test_run(status=TestCasesBase.TestCasesBase.EX_RUN_ERROR, + exception=Exception(), + odlip=self._sdn_controller_ip, + odlwebport=self._odl_webport) + + def test_run_without_installer_type(self): + os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip + self._test_run(TestCasesBase.TestCasesBase.EX_OK, + odlip=self._sdn_controller_ip, + odlwebport=self._odl_webport) + + def test_run_fuel(self): + os.environ["INSTALLER_TYPE"] = "fuel" + self._test_run(TestCasesBase.TestCasesBase.EX_OK, + odlip=self._neutron_ip, odlwebport='8282') + + def test_run_apex(self): + os.environ["SDN_CONTROLLER_IP"] = self._sdn_controller_ip + os.environ["INSTALLER_TYPE"] = "apex" + self._test_run(TestCasesBase.TestCasesBase.EX_OK, + odlip=self._sdn_controller_ip, odlwebport='8181') + + def test_run_joid(self): + os.environ["SDN_CONTROLLER"] = self._sdn_controller_ip + os.environ["INSTALLER_TYPE"] = "joid" + self._test_run(TestCasesBase.TestCasesBase.EX_OK, + odlip=self._sdn_controller_ip, + odlwebport=self._odl_webport) + + def test_run_compass(self, *args): + os.environ["INSTALLER_TYPE"] = "compass" + self._test_run(TestCasesBase.TestCasesBase.EX_OK, + odlip=self._neutron_ip, odlwebport='8181') + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/testcases/OpenStack/rally/blacklist.txt b/testcases/OpenStack/rally/blacklist.txt index 02d85f4d8..3a17fa616 100644 --- a/testcases/OpenStack/rally/blacklist.txt +++ b/testcases/OpenStack/rally/blacklist.txt @@ -1,8 +1,18 @@ -- - scenarios: - - os-nosdn-lxd-ha - - os-nosdn-lxd-noha - installers: - - joid - tests: - - NovaServers.boot_server_from_volume_and_delete +scenario: + - + scenarios: + - os-nosdn-lxd-ha + - os-nosdn-lxd-noha + installers: + - joid + tests: + - NovaServers.boot_server_from_volume_and_delete + +functionality: + - + functions: + - no_live_migration + tests: + - NovaServers.boot_and_live_migrate_server + - NovaServers.boot_server_attach_created_volume_and_live_migrate + - NovaServers.boot_server_from_volume_and_live_migrate diff --git a/testcases/OpenStack/rally/run_rally-cert.py b/testcases/OpenStack/rally/run_rally-cert.py index d35639cc8..8b8adce40 100755 --- a/testcases/OpenStack/rally/run_rally-cert.py +++ b/testcases/OpenStack/rally/run_rally-cert.py @@ -187,7 +187,6 @@ def build_task_args(test_file_name): net_id = network_dict['net_id'] task_args['netid'] = str(net_id) - task_args['live_migration'] = live_migration_supported() auth_url = os.getenv('OS_AUTH_URL') if auth_url is not None: @@ -273,36 +272,66 @@ def get_cmd_output(proc): return result -def apply_blacklist(case_file_name, result_file_name): - logger.debug("Applying blacklist...") - cases_file = open(case_file_name, 'r') - result_file = open(result_file_name, 'w') +def excl_scenario(): black_tests = [] try: + with open(BLACKLIST_FILE, 'r') as black_list_file: + black_list_yaml = yaml.safe_load(black_list_file) + installer_type = os.getenv('INSTALLER_TYPE') deploy_scenario = os.getenv('DEPLOY_SCENARIO') if (bool(installer_type) * bool(deploy_scenario)): - # if INSTALLER_TYPE and DEPLOY_SCENARIO are set we read the file - with open(BLACKLIST_FILE, 'r') as black_list_file: - black_list_yaml = yaml.safe_load(black_list_file) - - for item in black_list_yaml: - scenarios = item['scenarios'] - installers = item['installers'] - if (deploy_scenario in scenarios and - installer_type in installers): - tests = item['tests'] - black_tests.extend(tests) + if 'scenario' in black_list_yaml.keys(): + for item in black_list_yaml['scenario']: + scenarios = item['scenarios'] + installers = item['installers'] + if (deploy_scenario in scenarios and + installer_type in installers): + tests = item['tests'] + black_tests.extend(tests) except: - black_tests = [] - logger.debug("Blacklisting not applied.") + logger.debug("Scenario exclusion not applied.") + + return black_tests + + +def excl_func(): + black_tests = [] + func_list = [] + + try: + with open(BLACKLIST_FILE, 'r') as black_list_file: + black_list_yaml = yaml.safe_load(black_list_file) + + if not live_migration_supported(): + func_list.append("no_live_migration") + + if 'functionality' in black_list_yaml.keys(): + for item in black_list_yaml['functionality']: + functions = item['functions'] + for func in func_list: + if func in functions: + tests = item['tests'] + black_tests.extend(tests) + except: + logger.debug("Functionality exclusion not applied.") + + return black_tests + + +def apply_blacklist(case_file_name, result_file_name): + logger.debug("Applying blacklist...") + cases_file = open(case_file_name, 'r') + result_file = open(result_file_name, 'w') + + black_tests = list(set(excl_func() + excl_scenario())) include = True for cases_line in cases_file: if include: for black_tests_line in black_tests: - if black_tests_line == cases_line.strip().rstrip(':'): + if re.search(black_tests_line, cases_line.strip().rstrip(':')): include = False break else: @@ -337,6 +366,17 @@ def prepare_test_list(test_name): os.makedirs(TEMP_DIR) apply_blacklist(scenario_file_name, test_file_name) + return test_file_name + + +def file_is_empty(file_name): + try: + if os.stat(file_name).st_size > 0: + return False + except: + pass + + return True def run_task(test_name): @@ -354,7 +394,10 @@ def run_task(test_name): logger.error("Task file '%s' does not exist." % task_file) exit(-1) - prepare_test_list(test_name) + file_name = prepare_test_list(test_name) + if file_is_empty(file_name): + logger.info('No tests for scenario "{}"'.format(test_name)) + return cmd_line = ("rally task start --abort-on-sla-failure " + "--task {} ".format(task_file) + @@ -381,7 +424,7 @@ def run_task(test_name): # check for result directory and create it otherwise if not os.path.exists(RESULTS_DIR): - logger.debug('%s does not exist, we create it.'.format(RESULTS_DIR)) + logger.debug('{} does not exist, we create it.'.format(RESULTS_DIR)) os.makedirs(RESULTS_DIR) # write html report file @@ -521,7 +564,12 @@ def main(): total_duration_str = time.strftime("%H:%M:%S", time.gmtime(total_duration)) total_duration_str2 = "{0:<10}".format(total_duration_str) total_nb_tests_str = "{0:<13}".format(total_nb_tests) - success_rate = "{:0.2f}".format(total_success / len(SUMMARY)) + + if len(SUMMARY): + success_rate = total_success / len(SUMMARY) + else: + success_rate = 100 + success_rate = "{:0.2f}".format(success_rate) success_rate_str = "{0:<10}".format(str(success_rate) + '%') report += "+===================+============+===============+===========+" report += "\n" diff --git a/testcases/OpenStack/rally/scenario/full/opnfv-nova.yaml b/testcases/OpenStack/rally/scenario/full/opnfv-nova.yaml index 077850f53..d7622093d 100644 --- a/testcases/OpenStack/rally/scenario/full/opnfv-nova.yaml +++ b/testcases/OpenStack/rally/scenario/full/opnfv-nova.yaml @@ -227,8 +227,6 @@ sla: {{ no_failures_sla() }} -{% if live_migration %} - NovaServers.boot_and_live_migrate_server: - args: {{ vm_params(image_name, flavor_name) }} @@ -273,8 +271,6 @@ sla: {{ no_failures_sla() }} -{% endif %} - NovaKeypair.boot_and_delete_server_with_keypair: - args: diff --git a/testcases/OpenStack/rally/scenario/sanity/opnfv-nova.yaml b/testcases/OpenStack/rally/scenario/sanity/opnfv-nova.yaml index 947819dc7..e2795cf71 100644 --- a/testcases/OpenStack/rally/scenario/sanity/opnfv-nova.yaml +++ b/testcases/OpenStack/rally/scenario/sanity/opnfv-nova.yaml @@ -1,5 +1,3 @@ -{% if live_migration %} - NovaServers.boot_and_live_migrate_server: - args: {{ vm_params(image_name, flavor_name) }} @@ -44,8 +42,6 @@ sla: {{ no_failures_sla() }} -{% endif %} - NovaKeypair.boot_and_delete_server_with_keypair: - args: diff --git a/testcases/features/copper.py b/testcases/features/copper.py index be6744a95..ab0162626 100755 --- a/testcases/features/copper.py +++ b/testcases/features/copper.py @@ -43,7 +43,6 @@ def main(): log_file = RESULTS_DIR + "/copper.log" ret_val = functest_utils.execute_command(cmd, - exit_on_error=False, output_file=log_file) stop_time = time.time() diff --git a/testcases/features/doctor.py b/testcases/features/doctor.py index 6c26875d3..00e5c1d6b 100755 --- a/testcases/features/doctor.py +++ b/testcases/features/doctor.py @@ -52,7 +52,6 @@ def main(): ret = functest_utils.execute_command(cmd, info=True, - exit_on_error=False, output_file=log_file) stop_time = time.time() diff --git a/testcases/features/domino.py b/testcases/features/domino.py index 75351a56e..7705c07bd 100755 --- a/testcases/features/domino.py +++ b/testcases/features/domino.py @@ -42,7 +42,6 @@ def main(): start_time = time.time() ret = ft_utils.execute_command(cmd, - exit_on_error=False, output_file=log_file) stop_time = time.time() diff --git a/testcases/features/sfc/compute_presetup_CI.bash b/testcases/features/sfc/compute_presetup_CI.bash index c776c2f8c..36148aa15 100755 --- a/testcases/features/sfc/compute_presetup_CI.bash +++ b/testcases/features/sfc/compute_presetup_CI.bash @@ -9,12 +9,13 @@ BASEDIR=`dirname $0` INSTALLER_IP=${INSTALLER_IP:-10.20.0.2} pushd $BASEDIR -ip=`sshpass -p r00tme ssh $ssh_options root@${INSTALLER_IP} 'fuel node'|grep compute|\ -awk '{print $10}' | head -1` +#ip=`sshpass -p r00tme ssh $ssh_options root@${INSTALLER_IP} 'fuel node'|grep compute|\ +#awk '{print $10}' | head -1` +ip=$1 echo $ip -sshpass -p r00tme scp $ssh_options correct_classifier.bash ${INSTALLER_IP}:/root -sshpass -p r00tme ssh $ssh_options root@${INSTALLER_IP} 'scp correct_classifier.bash '"$ip"':/root' +#sshpass -p r00tme scp $ssh_options correct_classifier.bash ${INSTALLER_IP}:/root +#sshpass -p r00tme ssh $ssh_options root@${INSTALLER_IP} 'scp correct_classifier.bash '"$ip"':/root' sshpass -p r00tme ssh $ssh_options root@${INSTALLER_IP} 'ssh root@'"$ip"' ifconfig br-int up' output=$(sshpass -p r00tme ssh $ssh_options root@${INSTALLER_IP} 'ssh root@'"$ip"' ip route | \ diff --git a/testcases/features/sfc/delete.sh b/testcases/features/sfc/delete.sh index b8d1fde1c..c04ae6375 100755 --- a/testcases/features/sfc/delete.sh +++ b/testcases/features/sfc/delete.sh @@ -8,11 +8,8 @@ tacker vnf-delete testVNF1 tacker vnf-delete testVNF2 tacker vnfd-delete test-vnfd1 tacker vnfd-delete test-vnfd2 -#openstack stack delete sfc --y -heat stack-delete sfc --y -#openstack stack delete sfc_test1 --y -heat stack-delete sfc_test1 --y -#openstack stack delete sfc_test2 --y -heat stack-delete sfc_test2 --y +openstack stack delete sfc --y +openstack stack delete sfc_test1 --y +openstack stack delete sfc_test2 --y nova delete client nova delete server diff --git a/testcases/features/sfc/prepare_odl_sfc.py b/testcases/features/sfc/prepare_odl_sfc.py new file mode 100755 index 000000000..78f4d7646 --- /dev/null +++ b/testcases/features/sfc/prepare_odl_sfc.py @@ -0,0 +1,96 @@ +# +# Author: George Paraskevopoulos (geopar@intracom-telecom.com) +# Manuel Buil (manuel.buil@ericsson.com) +# Prepares the controller and the compute nodes for the odl-sfc testcase +# +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +# + +import os +import sys +import subprocess +import paramiko +import functest.utils.functest_logger as ft_logger + +logger = ft_logger.Logger("ODL_SFC").getLogger() + +try: + FUNCTEST_REPO_DIR = os.environ['FUNCTEST_REPO_DIR'] +except: + logger.debug("FUNCTEST_REPO_DIR does not exist!!!!!") + +FUNCTEST_REPO_DIR = "/home/opnfv/repos/functest" + +try: + INSTALLER_IP = os.environ['INSTALLER_IP'] + +except: + logger.debug("INSTALLER_IP does not exist. We create 10.20.0.2") + INSTALLER_IP = "10.20.0.2" + +os.environ['ODL_SFC_LOG'] = "/home/opnfv/functest/results/odl-sfc.log" +os.environ['ODL_SFC_DIR'] = FUNCTEST_REPO_DIR + "/testcases/features/sfc" + +command = os.environ['ODL_SFC_DIR'] + ("/server_presetup_CI.bash | " + "tee -a ${ODL_SFC_LOG} " + "1>/dev/null 2>&1") + +output = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + +# This code is for debugging purposes +# for line in iter(output.stdout.readline, ''): +# i = line.rstrip() +# print(i) + +# Make sure the process is finished before checking the returncode +if not output.poll(): + output.wait() + +# Get return value +if output.returncode: + print("The presetup of the server did not work") + sys.exit(output.returncode) + +logger.info("The presetup of the server worked ") + +ssh_options = "-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" +ssh = paramiko.SSHClient() +ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + +try: + ssh.connect(INSTALLER_IP, username="root", + password="r00tme", timeout=2) + command = "fuel node | grep compute | awk '{print $10}'" + logger.info("Executing ssh to collect the compute IPs") + (stdin, stdout, stderr) = ssh.exec_command(command) +except: + logger.debug("Something went wrong in the ssh to collect the computes IP") + +output = stdout.readlines() +for ip in output: + command = os.environ['ODL_SFC_DIR'] + ("/compute_presetup_CI.bash " + "" + ip.rstrip() + "| tee -a " + "${ODL_SFC_LOG} 1>/dev/null 2>&1") + + output = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) + +# This code is for debugging purposes +# for line in iter(output.stdout.readline, ''): +# print(line) +# sys.stdout.flush() + + output.stdout.close() + + if not (output.poll()): + output.wait() + + # Get return value + if output.returncode: + print("The compute config did not work on compute %s" % ip) + sys.exit(output.returncode) + +sys.exit(0) diff --git a/testcases/features/sfc/sfc.py b/testcases/features/sfc/sfc.py index 478b59782..72b4e00cb 100755 --- a/testcases/features/sfc/sfc.py +++ b/testcases/features/sfc/sfc.py @@ -82,15 +82,6 @@ def main(): stderr=subprocess.PIPE) ip_server = process.stdout.readline().rstrip() - contr_cmd2 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" - " 'fuel node'|grep compute|awk '{print $10}'") - logger.info("Executing script to get ip_compute: '%s'" % contr_cmd2) - process = subprocess.Popen(contr_cmd2, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - ip_compute = process.stdout.readline().rstrip() - iptable_cmd1 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" " ssh " + ip_server + " iptables -P INPUT ACCEPT ") iptable_cmd2 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" @@ -183,7 +174,8 @@ def main(): instance = os_utils.create_instance_and_wait_for_active(FLAVOR, image_id, network_id, - INSTANCE_NAME) + INSTANCE_NAME, + av_zone='nova') if instance is None: logger.error("Error while booting instance.") @@ -219,11 +211,12 @@ def main(): logger.info("Creating instance '%s'..." % INSTANCE_NAME) logger.debug( "Configuration:\n name=%s \n flavor=%s \n image=%s \n " - "network=%s \n" % (INSTANCE_NAME, FLAVOR, image_id, network_id)) + "network=%s \n" % (INSTANCE_NAME_2, FLAVOR, image_id, network_id)) instance_2 = os_utils.create_instance_and_wait_for_active(FLAVOR, image_id, network_id, - INSTANCE_NAME_2) + INSTANCE_NAME_2, + av_zone='nova') if instance_2 is None: logger.error("Error while booting instance.") @@ -372,15 +365,6 @@ def main(): except Exception: logger.exception("vxlan_tool not started in SF2") - # SSH to modify the classification flows in compute - - contr_cmd3 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" - " 'ssh " + ip_compute + " 'bash correct_classifier.bash''") - logger.info("Executing script to modify the classi: '%s'" % contr_cmd3) - process = subprocess.Popen(contr_cmd3, - shell=True, - stdout=subprocess.PIPE) - i = 0 # SSH TO EXECUTE cmd_client @@ -438,16 +422,7 @@ def main(): subprocess.call(tacker_classi, shell=True) logger.info("Wait for ODL to update the classification rules in OVS") - time.sleep(10) - - # SSH to modify the classification flows in compute - - contr_cmd4 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" - " 'ssh " + ip_compute + " 'bash correct_classifier.bash''") - logger.info("Executing script to modify the classi: '%s'" % contr_cmd4) - process = subprocess.Popen(contr_cmd4, - shell=True, - stdout=subprocess.PIPE) + time.sleep(100) # SSH TO EXECUTE cmd_client diff --git a/testcases/features/sfc/sfc_colorado1.py b/testcases/features/sfc/sfc_colorado1.py index 5580d9ed5..ef3a489cf 100755 --- a/testcases/features/sfc/sfc_colorado1.py +++ b/testcases/features/sfc/sfc_colorado1.py @@ -81,15 +81,6 @@ def main(): stderr=subprocess.PIPE) ip_server = process.stdout.readline().rstrip() - contr_cmd2 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" - " 'fuel node'|grep compute|awk '{print $10}'") - logger.info("Executing script to get ip_compute: '%s'" % contr_cmd2) - process = subprocess.Popen(contr_cmd2, - shell=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - ip_compute = process.stdout.readline().rstrip() - iptable_cmd1 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" " ssh " + ip_server + " iptables -P INPUT ACCEPT ") iptable_cmd2 = ("sshpass -p r00tme ssh " + ssh_options + " root@10.20.0.2" @@ -181,10 +172,12 @@ def main(): logger.debug( "Configuration:\n name=%s \n flavor=%s \n image=%s \n " "network=%s \n" % (INSTANCE_NAME, FLAVOR, image_id, network_id)) - instance = os_utils.create_instance_and_wait_for_active(FLAVOR, - image_id, - network_id, - INSTANCE_NAME) + instance = os_utils.create_instance_and_wait_for_active( + FLAVOR, + image_id, + network_id, + INSTANCE_NAME, + av_zone='nova') if instance is None: logger.error("Error while booting instance.") @@ -225,12 +218,13 @@ def main(): logger.info("Creating instance '%s'..." % INSTANCE_NAME) logger.debug( "Configuration:\n name=%s \n flavor=%s \n image=%s \n " - "network=%s \n" % (INSTANCE_NAME, FLAVOR, image_id, network_id)) + "network=%s \n" % (INSTANCE_NAME_2, FLAVOR, image_id, network_id)) instance_2 = os_utils.create_instance_and_wait_for_active( FLAVOR, image_id, network_id, - INSTANCE_NAME_2) + INSTANCE_NAME_2, + av_zone='nova') if instance_2 is None: logger.error("Error while booting instance.") @@ -393,16 +387,6 @@ def main(): except Exception: logger.exception("vxlan_tool not started in SF2") - # SSH to modify the classification flows in compute - - contr_cmd3 = ("sshpass -p r00tme ssh " + ssh_options + " " - "root@10.20.0.2 'ssh " + ip_compute + " " - "'bash correct_classifier.bash''") - logger.info("Executing script to modify the classi: '%s'" % contr_cmd3) - process = subprocess.Popen(contr_cmd3, - shell=True, - stdout=subprocess.PIPE) - i = 0 # SSH TO EXECUTE cmd_client @@ -460,17 +444,7 @@ def main(): subprocess.call(tacker_classi, shell=True) logger.info("Wait for ODL to update the classification rules in OVS") - time.sleep(10) - - # SSH to modify the classification flows in compute - - contr_cmd4 = ("sshpass -p r00tme ssh " + ssh_options + " " - "root@10.20.0.2 'ssh " + ip_compute + " " - "'bash correct_classifier.bash''") - logger.info("Executing script to modify the classi: '%s'" % contr_cmd4) - process = subprocess.Popen(contr_cmd4, - shell=True, - stdout=subprocess.PIPE) + time.sleep(100) # SSH TO EXECUTE cmd_client diff --git a/testcases/vnf/vRNC/parser.py b/testcases/vnf/vRNC/parser.py index 0320b104d..0381fd648 100755 --- a/testcases/vnf/vRNC/parser.py +++ b/testcases/vnf/vRNC/parser.py @@ -44,7 +44,6 @@ def main(): log_file = RESULTS_DIR + "/parser.log" ret = functest_utils.execute_command(cmd, info=True, - exit_on_error=False, output_file=log_file) stop_time = time.time() |