12 from robot.api import ExecutionResult, ResultVisitor
13 from robot.errors import RobotError
14 from robot.utils.robottime import timestamp_to_secs
16 import functest.utils.functest_logger as ft_logger
17 import functest.utils.functest_utils as ft_utils
18 import functest.utils.openstack_utils as op_utils
21 class ODLResultVisitor(ResultVisitor):
26 def visit_test(self, test):
28 output['name'] = test.name
29 output['parent'] = test.parent.name
30 output['status'] = test.status
31 output['startime'] = test.starttime
32 output['endtime'] = test.endtime
33 output['critical'] = test.critical
34 output['text'] = test.message
35 output['elapsedtime'] = test.elapsedtime
36 self._data.append(output)
44 repos = "/home/opnfv/repos/"
45 odl_test_repo = repos + "odl_test/"
46 neutron_suite_dir = odl_test_repo + "csit/suites/openstack/neutron/"
47 basic_suite_dir = odl_test_repo + "csit/suites/integration/basic/"
48 res_dir = '/home/opnfv/functest/results/odl/'
49 logger = ft_logger.Logger("opendaylight").getLogger()
52 def copy_opnf_testcases(cls):
53 opnfv_testcases_dir = (os.path.dirname(os.path.abspath(__file__)) +
54 "/custom_tests/neutron/")
55 files = [opnfv_testcases_dir + "001__reachability.robot",
56 opnfv_testcases_dir + "040__delete_ports.robot",
57 opnfv_testcases_dir + "050__delete_subnets.robot",
58 opnfv_testcases_dir + "060__delete_networks.robot"]
61 shutil.copy(f, cls.neutron_suite_dir)
64 "Cannot copy OPNFV's testcases to ODL directory: "
70 def set_robotframework_vars(cls, odlusername="admin", odlpassword="admin"):
71 odl_variables_files = cls.odl_test_repo + 'csit/variables/Variables.py'
73 for line in fileinput.input(odl_variables_files,
75 print re.sub("AUTH = .*",
76 ("AUTH = [u'" + odlusername + "', u'" +
80 except Exception as e:
81 cls.logger.error("Cannot set ODL creds: %s" % str(e))
85 def run(cls, **kwargs):
86 dirs = [cls.basic_suite_dir, cls.neutron_suite_dir]
88 odlusername = kwargs['odlusername']
89 odlpassword = kwargs['odlpassword']
90 variables = ['KEYSTONE:' + kwargs['keystoneip'],
91 'NEUTRON:' + kwargs['neutronip'],
92 'OSUSERNAME:"' + kwargs['osusername'] + '"',
93 'OSTENANTNAME:"' + kwargs['ostenantname'] + '"',
94 'OSPASSWORD:"' + kwargs['ospassword'] + '"',
95 'ODL_SYSTEM_IP:' + kwargs['odlip'],
96 'PORT:' + kwargs['odlwebport'],
97 'RESTCONFPORT:' + kwargs['odlrestconfport']]
99 cls.logger.error("Cannot run ODL testcases. Please check "
102 if (cls.copy_opnf_testcases() and
103 cls.set_robotframework_vars(odlusername, odlpassword)):
105 os.makedirs(cls.res_dir)
108 stdout_file = cls.res_dir + 'stdout.txt'
109 with open(stdout_file, 'w+') as stdout:
110 run(*dirs, variable=variables,
111 output=cls.res_dir + 'output.xml',
116 cls.logger.info("\n" + stdout.read())
117 cls.logger.info("ODL results were successfully generated")
119 os.remove(stdout_file)
127 def functest_run(cls):
128 kclient = op_utils.get_keystone_client()
129 keystone_url = kclient.service_catalog.url_for(
130 service_type='identity', endpoint_type='publicURL')
131 neutron_url = kclient.service_catalog.url_for(
132 service_type='network', endpoint_type='publicURL')
133 kwargs = {'keystoneip': urlparse.urlparse(keystone_url).hostname}
134 kwargs['neutronip'] = urlparse.urlparse(neutron_url).hostname
135 kwargs['odlip'] = kwargs['neutronip']
136 kwargs['odlwebport'] = '8080'
137 kwargs['odlrestconfport'] = '8181'
138 kwargs['odlusername'] = 'admin'
139 kwargs['odlpassword'] = 'admin'
141 installer_type = os.environ['INSTALLER_TYPE']
142 kwargs['osusername'] = os.environ['OS_USERNAME']
143 kwargs['ostenantname'] = os.environ['OS_TENANT_NAME']
144 kwargs['ospassword'] = os.environ['OS_PASSWORD']
145 if installer_type == 'fuel':
146 kwargs['odlwebport'] = '8282'
147 elif installer_type == 'apex':
148 kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
149 kwargs['odlwebport'] = '8181'
150 elif installer_type == 'joid':
151 kwargs['odlip'] = os.environ['SDN_CONTROLLER']
152 elif installer_type == 'compass':
153 kwargs['odlwebport'] = '8181'
155 kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
156 except KeyError as e:
157 cls.logger.error("Cannot run ODL testcases. Please check env var: "
161 return cls.run(**kwargs)
166 result = ExecutionResult(cls.res_dir + 'output.xml')
167 visitor = ODLResultVisitor()
168 result.visit(visitor)
169 start_time = timestamp_to_secs(result.suite.starttime)
170 stop_time = timestamp_to_secs(result.suite.endtime)
172 details['description'] = result.suite.name
173 details['tests'] = visitor.get_data()
174 if not ft_utils.push_results_to_db(
175 "functest", "odl", start_time, stop_time,
176 result.suite.status, details):
177 cls.logger.error("Cannot push ODL results to DB")
180 cls.logger.info("ODL results were successfully pushed to DB")
182 except RobotError as e:
183 cls.logger.error("Run tests before publishing: %s" % e.message)
186 if __name__ == '__main__':
187 parser = argparse.ArgumentParser()
188 parser.add_argument('-k', '--keystoneip',
191 parser.add_argument('-n', '--neutronip',
194 parser.add_argument('-a', '--osusername',
195 help='Username for OpenStack',
197 parser.add_argument('-b', '--ostenantname',
198 help='Tenantname for OpenStack',
200 parser.add_argument('-c', '--ospassword',
201 help='Password for OpenStack',
203 parser.add_argument('-o', '--odlip',
204 help='OpenDaylight IP',
206 parser.add_argument('-w', '--odlwebport',
207 help='OpenDaylight Web Portal Port',
209 parser.add_argument('-r', '--odlrestconfport',
210 help='OpenDaylight RESTConf Port',
212 parser.add_argument('-d', '--odlusername',
213 help='Username for ODL',
215 parser.add_argument('-e', '--odlpassword',
216 help='Password for ODL',
218 parser.add_argument('-p', '--pushtodb',
219 help='Push results to DB',
222 args = vars(parser.parse_args())
223 if not ODLTestCases.run(**args):
224 sys.exit(os.EX_SOFTWARE)
226 sys.exit(not ODLTestCases.push_to_db())