From 107e61635c2ab1feb5263380ea63e21cf2e6e65b Mon Sep 17 00:00:00 2001 From: Morgan Richomme Date: Tue, 8 Nov 2016 14:18:12 +0100 Subject: Repo structure modification - create functest subdirectory - rename unit tests - adapt path in exec and config files JIRA: FUNCTEST-525 Change-Id: Ifd5c6edfb5bda1b09f82848e2269ad5fbeb84d0a Signed-off-by: Morgan Richomme --- .../Controllers/ODL/OpenDaylightTesting.py | 224 +++++++++++++++++++++ functest/opnfv_tests/Controllers/ODL/__init__.py | 0 2 files changed, 224 insertions(+) create mode 100755 functest/opnfv_tests/Controllers/ODL/OpenDaylightTesting.py create mode 100644 functest/opnfv_tests/Controllers/ODL/__init__.py (limited to 'functest/opnfv_tests/Controllers/ODL') diff --git a/functest/opnfv_tests/Controllers/ODL/OpenDaylightTesting.py b/functest/opnfv_tests/Controllers/ODL/OpenDaylightTesting.py new file mode 100755 index 00000000..8c003abf --- /dev/null +++ b/functest/opnfv_tests/Controllers/ODL/OpenDaylightTesting.py @@ -0,0 +1,224 @@ +#!/usr/bin/env python + +# Copyright (c) 2016 Orange and others. +# +# 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 argparse +import errno +import fileinput +import os +import re +import sys +import urlparse + +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.openstack_utils as op_utils + + +class ODLResultVisitor(ResultVisitor): + + 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['startime'] = 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): + return self._data + + +class ODLTestCases(TestCasesBase.TestCasesBase): + + repos = "/home/opnfv/repos/" + odl_test_repo = repos + "odl_test/" + neutron_suite_dir = odl_test_repo + "csit/suites/openstack/neutron/" + basic_suite_dir = odl_test_repo + "csit/suites/integration/basic/" + res_dir = '/home/opnfv/functest/results/odl/' + logger = ft_logger.Logger("opendaylight").getLogger() + + def __init__(self): + self.case_name = "odl" + + @classmethod + def set_robotframework_vars(cls, odlusername="admin", odlpassword="admin"): + odl_variables_files = cls.odl_test_repo + 'csit/variables/Variables.py' + try: + for line in fileinput.input(odl_variables_files, + inplace=True): + print re.sub("AUTH = .*", + ("AUTH = [u'" + odlusername + "', u'" + + odlpassword + "']"), + line.rstrip()) + return True + except Exception as e: + cls.logger.error("Cannot set ODL creds: %s" % str(e)) + return False + + 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'] + variables = ['KEYSTONE:' + kwargs['keystoneip'], + 'NEUTRON:' + kwargs['neutronip'], + 'OSUSERNAME:"' + kwargs['osusername'] + '"', + 'OSTENANTNAME:"' + kwargs['ostenantname'] + '"', + 'OSPASSWORD:"' + kwargs['ospassword'] + '"', + 'ODL_SYSTEM_IP:' + kwargs['odlip'], + 'PORT:' + kwargs['odlwebport'], + 'RESTCONFPORT:' + kwargs['odlrestconfport']] + except KeyError as e: + self.logger.error("Cannot run ODL testcases. Please check " + "%s" % str(e)) + return self.EX_RUN_ERROR + if self.set_robotframework_vars(odlusername, odlpassword): + try: + 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: + robot.run(*dirs, variable=variables, + output=self.res_dir + 'output.xml', + 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 e: + self.logger.error("Run tests before publishing: %s" % + e.message) + return self.EX_RUN_ERROR + try: + os.remove(stdout_file) + except OSError: + self.logger.warning("Cannot remove {}".format(stdout_file)) + return self.EX_OK + else: + return self.EX_RUN_ERROR + + def run(self): + try: + 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'] + if installer_type == 'fuel': + kwargs['odlwebport'] = '8282' + elif installer_type == 'apex': + kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP'] + kwargs['odlwebport'] = '8181' + elif installer_type == 'joid': + kwargs['odlip'] = os.environ['SDN_CONTROLLER'] + elif installer_type == 'compass': + kwargs['odlwebport'] = '8181' + else: + kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP'] + except KeyError as e: + 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() + parser.add_argument('-k', '--keystoneip', + help='Keystone IP', + default='127.0.0.1') + parser.add_argument('-n', '--neutronip', + help='Neutron IP', + default='127.0.0.1') + parser.add_argument('-a', '--osusername', + help='Username for OpenStack', + default='admin') + parser.add_argument('-b', '--ostenantname', + help='Tenantname for OpenStack', + default='admin') + parser.add_argument('-c', '--ospassword', + help='Password for OpenStack', + default='admin') + parser.add_argument('-o', '--odlip', + help='OpenDaylight IP', + default='127.0.0.1') + parser.add_argument('-w', '--odlwebport', + help='OpenDaylight Web Portal Port', + default='8080') + parser.add_argument('-r', '--odlrestconfport', + help='OpenDaylight RESTConf Port', + default='8181') + parser.add_argument('-d', '--odlusername', + help='Username for ODL', + default='admin') + parser.add_argument('-e', '--odlpassword', + help='Password for ODL', + default='admin') + parser.add_argument('-p', '--pushtodb', + help='Push results to DB', + action='store_true') + + args = vars(parser.parse_args()) + 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/functest/opnfv_tests/Controllers/ODL/__init__.py b/functest/opnfv_tests/Controllers/ODL/__init__.py new file mode 100644 index 00000000..e69de29b -- cgit 1.2.3-korg