summaryrefslogtreecommitdiffstats
path: root/testcases
diff options
context:
space:
mode:
Diffstat (limited to 'testcases')
-rwxr-xr-xtestcases/Controllers/ODL/OpenDaylightTesting.py173
-rwxr-xr-xtestcases/Controllers/ODL/OpenDaylightUnitTesting.py341
-rw-r--r--testcases/OpenStack/rally/blacklist.txt26
-rwxr-xr-xtestcases/OpenStack/rally/run_rally-cert.py92
-rw-r--r--testcases/OpenStack/rally/scenario/full/opnfv-nova.yaml4
-rw-r--r--testcases/OpenStack/rally/scenario/sanity/opnfv-nova.yaml4
-rwxr-xr-xtestcases/features/copper.py1
-rwxr-xr-xtestcases/features/doctor.py1
-rwxr-xr-xtestcases/features/domino.py1
-rwxr-xr-xtestcases/features/sfc/compute_presetup_CI.bash9
-rwxr-xr-xtestcases/features/sfc/delete.sh9
-rwxr-xr-xtestcases/features/sfc/prepare_odl_sfc.py96
-rwxr-xr-xtestcases/features/sfc/sfc.py37
-rwxr-xr-xtestcases/features/sfc/sfc_colorado1.py46
-rwxr-xr-xtestcases/vnf/vRNC/parser.py1
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()