3 # Copyright (c) 2016 Orange and others.
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
18 from robot.api import ExecutionResult, ResultVisitor
19 from robot.errors import RobotError
21 from robot.utils.robottime import timestamp_to_secs
23 from functest.core import TestCasesBase
24 import functest.utils.functest_logger as ft_logger
25 import functest.utils.openstack_utils as op_utils
28 class ODLResultVisitor(ResultVisitor):
33 def visit_test(self, test):
35 output['name'] = test.name
36 output['parent'] = test.parent.name
37 output['status'] = test.status
38 output['startime'] = test.starttime
39 output['endtime'] = test.endtime
40 output['critical'] = test.critical
41 output['text'] = test.message
42 output['elapsedtime'] = test.elapsedtime
43 self._data.append(output)
49 class ODLTestCases(TestCasesBase.TestCasesBase):
51 repos = "/home/opnfv/repos/"
52 odl_test_repo = repos + "odl_test/"
53 neutron_suite_dir = odl_test_repo + "csit/suites/openstack/neutron/"
54 basic_suite_dir = odl_test_repo + "csit/suites/integration/basic/"
55 res_dir = '/home/opnfv/functest/results/odl/'
56 logger = ft_logger.Logger("opendaylight").getLogger()
59 self.case_name = "odl"
62 def set_robotframework_vars(cls, odlusername="admin", odlpassword="admin"):
63 odl_variables_files = cls.odl_test_repo + 'csit/variables/Variables.py'
65 for line in fileinput.input(odl_variables_files,
67 print re.sub("AUTH = .*",
68 ("AUTH = [u'" + odlusername + "', u'" +
72 except Exception as e:
73 cls.logger.error("Cannot set ODL creds: %s" % str(e))
76 def parse_results(self):
77 result = ExecutionResult(self.res_dir + 'output.xml')
78 visitor = ODLResultVisitor()
80 self.criteria = result.suite.status
81 self.start_time = timestamp_to_secs(result.suite.starttime)
82 self.stop_time = timestamp_to_secs(result.suite.endtime)
84 self.details['description'] = result.suite.name
85 self.details['tests'] = visitor.get_data()
87 def main(self, **kwargs):
88 dirs = [self.basic_suite_dir, self.neutron_suite_dir]
90 odlusername = kwargs['odlusername']
91 odlpassword = kwargs['odlpassword']
92 variables = ['KEYSTONE:' + kwargs['keystoneip'],
93 'NEUTRON:' + kwargs['neutronip'],
94 'OSUSERNAME:"' + kwargs['osusername'] + '"',
95 'OSTENANTNAME:"' + kwargs['ostenantname'] + '"',
96 'OSPASSWORD:"' + kwargs['ospassword'] + '"',
97 'ODL_SYSTEM_IP:' + kwargs['odlip'],
98 'PORT:' + kwargs['odlwebport'],
99 'RESTCONFPORT:' + kwargs['odlrestconfport']]
100 except KeyError as e:
101 self.logger.error("Cannot run ODL testcases. Please check "
103 return self.EX_RUN_ERROR
104 if self.set_robotframework_vars(odlusername, odlpassword):
106 os.makedirs(self.res_dir)
108 if e.errno != errno.EEXIST:
109 self.logger.exception(
110 "Cannot create {}".format(self.res_dir))
111 return self.EX_RUN_ERROR
112 stdout_file = self.res_dir + 'stdout.txt'
113 with open(stdout_file, 'w+') as stdout:
114 robot.run(*dirs, variable=variables,
115 output=self.res_dir + 'output.xml',
120 self.logger.info("\n" + stdout.read())
121 self.logger.info("ODL results were successfully generated")
124 self.logger.info("ODL results were successfully parsed")
125 except RobotError as e:
126 self.logger.error("Run tests before publishing: %s" %
128 return self.EX_RUN_ERROR
130 os.remove(stdout_file)
132 self.logger.warning("Cannot remove {}".format(stdout_file))
135 return self.EX_RUN_ERROR
139 kclient = op_utils.get_keystone_client()
140 keystone_url = kclient.service_catalog.url_for(
141 service_type='identity', endpoint_type='publicURL')
142 neutron_url = kclient.service_catalog.url_for(
143 service_type='network', endpoint_type='publicURL')
144 kwargs = {'keystoneip': urlparse.urlparse(keystone_url).hostname}
145 kwargs['neutronip'] = urlparse.urlparse(neutron_url).hostname
146 kwargs['odlip'] = kwargs['neutronip']
147 kwargs['odlwebport'] = '8080'
148 kwargs['odlrestconfport'] = '8181'
149 kwargs['odlusername'] = 'admin'
150 kwargs['odlpassword'] = 'admin'
151 installer_type = None
152 if 'INSTALLER_TYPE' in os.environ:
153 installer_type = os.environ['INSTALLER_TYPE']
154 kwargs['osusername'] = os.environ['OS_USERNAME']
155 kwargs['ostenantname'] = os.environ['OS_TENANT_NAME']
156 kwargs['ospassword'] = os.environ['OS_PASSWORD']
157 if installer_type == 'fuel':
158 kwargs['odlwebport'] = '8282'
159 elif installer_type == 'apex':
160 kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
161 kwargs['odlwebport'] = '8181'
162 elif installer_type == 'joid':
163 kwargs['odlip'] = os.environ['SDN_CONTROLLER']
164 elif installer_type == 'compass':
165 kwargs['odlwebport'] = '8181'
167 kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
168 except KeyError as e:
169 self.logger.error("Cannot run ODL testcases. "
170 "Please check env var: "
172 return self.EX_RUN_ERROR
174 self.logger.exception("Cannot run ODL testcases.")
175 return self.EX_RUN_ERROR
177 return self.main(**kwargs)
179 if __name__ == '__main__':
180 parser = argparse.ArgumentParser()
181 parser.add_argument('-k', '--keystoneip',
184 parser.add_argument('-n', '--neutronip',
187 parser.add_argument('-a', '--osusername',
188 help='Username for OpenStack',
190 parser.add_argument('-b', '--ostenantname',
191 help='Tenantname for OpenStack',
193 parser.add_argument('-c', '--ospassword',
194 help='Password for OpenStack',
196 parser.add_argument('-o', '--odlip',
197 help='OpenDaylight IP',
199 parser.add_argument('-w', '--odlwebport',
200 help='OpenDaylight Web Portal Port',
202 parser.add_argument('-r', '--odlrestconfport',
203 help='OpenDaylight RESTConf Port',
205 parser.add_argument('-d', '--odlusername',
206 help='Username for ODL',
208 parser.add_argument('-e', '--odlpassword',
209 help='Password for ODL',
211 parser.add_argument('-p', '--pushtodb',
212 help='Push results to DB',
215 args = vars(parser.parse_args())
218 result = odl.main(**args)
219 if result != TestCasesBase.TestCasesBase.EX_OK:
222 sys.exit(odl.push_to_db())
224 sys.exit(TestCasesBase.TestCasesBase.EX_RUN_ERROR)