X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=functest%2Fopnfv_tests%2Fsdn%2Fodl%2Fodl.py;h=6c05c0181f0262af78354f2eff7f547e0ffcc902;hb=refs%2Fchanges%2F29%2F48029%2F5;hp=6f4acf6dd35a8a10b31f4b1ff7a031d6c2d03319;hpb=9b228735d14cd91e31206bcde6d15f85b9d3e026;p=functest.git diff --git a/functest/opnfv_tests/sdn/odl/odl.py b/functest/opnfv_tests/sdn/odl/odl.py old mode 100755 new mode 100644 index 6f4acf6dd..6c05c0181 --- a/functest/opnfv_tests/sdn/odl/odl.py +++ b/functest/opnfv_tests/sdn/odl/odl.py @@ -16,98 +16,65 @@ Example: $ python odl.py """ +from __future__ import division + import argparse -import errno import fileinput +import logging import os import re import sys -import urlparse -import robot.api -from robot.errors import RobotError -import robot.run -from robot.utils.robottime import timestamp_to_secs +from six.moves import urllib -from functest.core import testcase -import functest.utils.functest_logger as ft_logger +from functest.core import robotframework +from functest.utils import constants import functest.utils.openstack_utils as op_utils __author__ = "Cedric Ollivier " -class ODLResultVisitor(robot.api.ResultVisitor): - """Visitor to get result details.""" - - def __init__(self): - self._data = [] - - def visit_test(self, test): - output = {} - output['name'] = test.name - output['parent'] = test.parent.name - output['status'] = test.status - output['starttime'] = test.starttime - output['endtime'] = test.endtime - output['critical'] = test.critical - output['text'] = test.message - output['elapsedtime'] = test.elapsedtime - self._data.append(output) - - def get_data(self): - """Get the details of the result.""" - return self._data - - -class ODLTests(testcase.TestCase): +class ODLTests(robotframework.RobotFramework): """ODL test runner.""" - repos = "/home/opnfv/repos/" - odl_test_repo = os.path.join(repos, "odl_test") - neutron_suite_dir = os.path.join(odl_test_repo, - "csit/suites/openstack/neutron") - basic_suite_dir = os.path.join(odl_test_repo, - "csit/suites/integration/basic") + odl_test_repo = constants.CONST.__getattribute__('dir_repo_odl_test') + neutron_suite_dir = os.path.join( + odl_test_repo, "csit/suites/openstack/neutron") + basic_suite_dir = os.path.join( + odl_test_repo, "csit/suites/integration/basic") default_suites = [basic_suite_dir, neutron_suite_dir] - res_dir = '/home/opnfv/functest/results/odl/' - logger = ft_logger.Logger("opendaylight").getLogger() + odl_variables_file = os.path.join( + odl_test_repo, 'csit/variables/Variables.robot') + __logger = logging.getLogger(__name__) + + def __init__(self, **kwargs): + super(ODLTests, self).__init__(**kwargs) + self.res_dir = os.path.join( + constants.CONST.__getattribute__('dir_results'), 'odl') + self.xml_file = os.path.join(self.res_dir, 'output.xml') @classmethod def set_robotframework_vars(cls, odlusername="admin", odlpassword="admin"): - """Set credentials in csit/variables/Variables.py. + """Set credentials in csit/variables/Variables.robot. Returns: True if credentials are set. False otherwise. """ - odl_variables_files = os.path.join(cls.odl_test_repo, - 'csit/variables/Variables.py') + try: - for line in fileinput.input(odl_variables_files, + for line in fileinput.input(cls.odl_variables_file, inplace=True): - print re.sub("AUTH = .*", - ("AUTH = [u'" + odlusername + "', u'" + - odlpassword + "']"), - line.rstrip()) + print(re.sub("@{AUTH}.*", + "@{{AUTH}} {} {}".format( + odlusername, odlpassword), + line.rstrip())) return True - except Exception as ex: # pylint: disable=broad-except - cls.logger.error("Cannot set ODL creds: %s", str(ex)) + except Exception: # pylint: disable=broad-except + cls.__logger.exception("Cannot set ODL creds:") return False - def parse_results(self): - """Parse output.xml and get the details in it.""" - xml_file = os.path.join(self.res_dir, 'output.xml') - result = robot.api.ExecutionResult(xml_file) - visitor = ODLResultVisitor() - result.visit(visitor) - self.result = 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, suites=None, **kwargs): + def run_suites(self, suites=None, **kwargs): """Run the test suites It has been designed to be called in any context. @@ -116,9 +83,9 @@ class ODLTests(testcase.TestCase): * odlusername, * odlpassword, * osauthurl, - * neutronip, + * neutronurl, * osusername, - * ostenantname, + * osprojectname, * ospassword, * odlip, * odlwebport, @@ -143,53 +110,31 @@ class ODLTests(testcase.TestCase): odlusername = kwargs['odlusername'] odlpassword = kwargs['odlpassword'] osauthurl = kwargs['osauthurl'] - keystoneip = urlparse.urlparse(osauthurl).hostname - variables = ['KEYSTONE:' + keystoneip, - 'NEUTRON:' + kwargs['neutronip'], - 'OS_AUTH_URL:"' + osauthurl + '"', - 'OSUSERNAME:"' + kwargs['osusername'] + '"', - 'OSTENANTNAME:"' + kwargs['ostenantname'] + '"', - 'OSPASSWORD:"' + kwargs['ospassword'] + '"', - 'ODL_SYSTEM_IP:' + kwargs['odlip'], - 'PORT:' + kwargs['odlwebport'], - 'RESTCONFPORT:' + kwargs['odlrestconfport']] - except KeyError as ex: - self.logger.error("Cannot run ODL testcases. Please check " - "%s", str(ex)) + keystoneurl = "{}://{}".format( + urllib.parse.urlparse(osauthurl).scheme, + urllib.parse.urlparse(osauthurl).netloc) + variable = ['KEYSTONEURL:' + keystoneurl, + 'NEUTRONURL:' + kwargs['neutronurl'], + 'OS_AUTH_URL:"' + osauthurl + '"', + 'OSUSERNAME:"' + kwargs['osusername'] + '"', + ('OSUSERDOMAINNAME:"' + + kwargs['osuserdomainname'] + '"'), + 'OSTENANTNAME:"' + kwargs['osprojectname'] + '"', + ('OSPROJECTDOMAINNAME:"' + + kwargs['osprojectdomainname'] + '"'), + 'OSPASSWORD:"' + kwargs['ospassword'] + '"', + 'ODL_SYSTEM_IP:' + kwargs['odlip'], + 'PORT:' + kwargs['odlwebport'], + 'RESTCONFPORT:' + kwargs['odlrestconfport']] + except KeyError: + self.__logger.exception("Cannot run ODL testcases. Please check") return self.EX_RUN_ERROR - if self.set_robotframework_vars(odlusername, odlpassword): - try: - os.makedirs(self.res_dir) - except OSError as ex: - if ex.errno != errno.EEXIST: - self.logger.exception( - "Cannot create %s", self.res_dir) - return self.EX_RUN_ERROR - stdout_file = os.path.join(self.res_dir, 'stdout.txt') - output_dir = os.path.join(self.res_dir, 'output.xml') - with open(stdout_file, 'w+') as stdout: - robot.run(*suites, variable=variables, - output=output_dir, - log='NONE', - report='NONE', - stdout=stdout) - stdout.seek(0, 0) - 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 ex: - self.logger.error("Run tests before publishing: %s", - ex.message) - return self.EX_RUN_ERROR - try: - os.remove(stdout_file) - except OSError: - self.logger.warning("Cannot remove %s", stdout_file) - return self.EX_OK + if not os.path.isfile(self.odl_variables_file): + self.__logger.info("Skip writting ODL creds") else: - return self.EX_RUN_ERROR + if not self.set_robotframework_vars(odlusername, odlpassword): + return self.EX_RUN_ERROR + return super(ODLTests, self).run(variable=variable, suites=suites) def run(self, **kwargs): """Run suites in OPNFV environment @@ -210,9 +155,10 @@ class ODLTests(testcase.TestCase): suites = kwargs["suites"] except KeyError: pass - neutron_url = op_utils.get_endpoint(service_type='network') - kwargs = {'neutronip': urlparse.urlparse(neutron_url).hostname} - kwargs['odlip'] = kwargs['neutronip'] + kwargs = {'neutronurl': op_utils.get_endpoint( + service_type='network')} + kwargs['odlip'] = urllib.parse.urlparse( + kwargs['neutronurl']).hostname kwargs['odlwebport'] = '8080' kwargs['odlrestconfport'] = '8181' kwargs['odlusername'] = 'admin' @@ -221,11 +167,16 @@ class ODLTests(testcase.TestCase): 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['osuserdomainname'] = os.environ.get( + 'OS_USER_DOMAIN_NAME', 'Default') + kwargs['osprojectname'] = os.environ['OS_PROJECT_NAME'] + kwargs['osprojectdomainname'] = os.environ.get( + 'OS_PROJECT_DOMAIN_NAME', 'Default') kwargs['osauthurl'] = os.environ['OS_AUTH_URL'] kwargs['ospassword'] = os.environ['OS_PASSWORD'] if installer_type == 'fuel': - kwargs['odlwebport'] = '8282' + kwargs['odlwebport'] = '8181' + kwargs['odlrestconfport'] = '8282' elif installer_type == 'apex' or installer_type == 'netvirt': kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP'] kwargs['odlwebport'] = '8081' @@ -233,19 +184,23 @@ class ODLTests(testcase.TestCase): elif installer_type == 'joid': kwargs['odlip'] = os.environ['SDN_CONTROLLER'] elif installer_type == 'compass': + kwargs['odlrestconfport'] = '8080' + elif installer_type == 'daisy': + kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP'] kwargs['odlwebport'] = '8181' + kwargs['odlrestconfport'] = '8087' else: kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP'] except KeyError as ex: - self.logger.error("Cannot run ODL testcases. " - "Please check env var: " - "%s", str(ex)) + self.__logger.error("Cannot run ODL testcases. " + "Please check env var: " + "%s", str(ex)) return self.EX_RUN_ERROR except Exception: # pylint: disable=broad-except - self.logger.exception("Cannot run ODL testcases.") + self.__logger.exception("Cannot run ODL testcases.") return self.EX_RUN_ERROR - return self.main(suites, **kwargs) + return self.run_suites(suites, **kwargs) class ODLParser(object): # pylint: disable=too-few-public-methods @@ -254,17 +209,24 @@ class ODLParser(object): # pylint: disable=too-few-public-methods def __init__(self): self.parser = argparse.ArgumentParser() self.parser.add_argument( - '-n', '--neutronip', help='Neutron IP', - default='127.0.0.1') + '-n', '--neutronurl', help='Neutron Endpoint', + default='http://127.0.0.1:9696') self.parser.add_argument( '-k', '--osauthurl', help='OS_AUTH_URL as defined by OpenStack', - default='http://127.0.0.1:5000/v2.0') + default='http://127.0.0.1:5000/v3') self.parser.add_argument( '-a', '--osusername', help='Username for OpenStack', default='admin') self.parser.add_argument( - '-b', '--ostenantname', help='Tenantname for OpenStack', + '-f', '--osuserdomainname', help='User domain name for OpenStack', + default='Default') + self.parser.add_argument( + '-b', '--osprojectname', help='Projet name for OpenStack', default='admin') + self.parser.add_argument( + '-g', '--osprojectdomainname', + help='Project domain name for OpenStack', + default='Default') self.parser.add_argument( '-c', '--ospassword', help='Password for OpenStack', default='admin') @@ -300,15 +262,19 @@ class ODLParser(object): # pylint: disable=too-few-public-methods return vars(self.parser.parse_args(argv)) -if __name__ == '__main__': - ODL = ODLTests() - PARSER = ODLParser() - ARGS = PARSER.parse_args(sys.argv[1:]) +def main(): + """Entry point""" + logging.basicConfig() + odl = ODLTests() + parser = ODLParser() + args = parser.parse_args(sys.argv[1:]) try: - RESULT = ODL.main(ODLTests.default_suites, **ARGS) - if RESULT != testcase.TestCase.EX_OK: - sys.exit(RESULT) - if ARGS['pushtodb']: - sys.exit(ODL.push_to_db()) + result = odl.run_suites(ODLTests.default_suites, **args) + if result != robotframework.RobotFramework.EX_OK: + return result + if args['pushtodb']: + return odl.push_to_db() + else: + return result except Exception: # pylint: disable=broad-except - sys.exit(testcase.TestCase.EX_RUN_ERROR) + return robotframework.RobotFramework.EX_RUN_ERROR