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
10 """Define classes required to run ODL suites.
12 It has been designed for any context. But helpers are given for
13 running test suites in OPNFV environment.
19 from __future__ import division
28 from six.moves import urllib
30 from functest.core import robotframework
31 from functest.utils import constants
32 import functest.utils.openstack_utils as op_utils
34 __author__ = "Cedric Ollivier <cedric.ollivier@orange.com>"
37 class ODLTests(robotframework.RobotFramework):
38 """ODL test runner."""
40 odl_test_repo = constants.CONST.__getattribute__('dir_repo_odl_test')
41 neutron_suite_dir = os.path.join(
42 odl_test_repo, "csit/suites/openstack/neutron")
43 basic_suite_dir = os.path.join(
44 odl_test_repo, "csit/suites/integration/basic")
45 default_suites = [basic_suite_dir, neutron_suite_dir]
46 odl_variables_file = os.path.join(
47 odl_test_repo, 'csit/variables/Variables.robot')
48 __logger = logging.getLogger(__name__)
50 def __init__(self, **kwargs):
51 super(ODLTests, self).__init__(**kwargs)
52 self.res_dir = os.path.join(
53 constants.CONST.__getattribute__('dir_results'), 'odl')
54 self.xml_file = os.path.join(self.res_dir, 'output.xml')
57 def set_robotframework_vars(cls, odlusername="admin", odlpassword="admin"):
58 """Set credentials in csit/variables/Variables.robot.
61 True if credentials are set.
66 for line in fileinput.input(cls.odl_variables_file,
68 print(re.sub("@{AUTH}.*",
69 "@{{AUTH}} {} {}".format(
70 odlusername, odlpassword),
73 except Exception: # pylint: disable=broad-except
74 cls.__logger.exception("Cannot set ODL creds:")
77 def run_suites(self, suites=None, **kwargs):
78 """Run the test suites
80 It has been designed to be called in any context.
81 It requires the following keyword arguments:
95 * set all RobotFramework_variables,
96 * create the output directories if required,
97 * get the results in output.xml,
98 * delete temporary files.
101 kwargs: Arbitrary keyword arguments.
104 EX_OK if all suites ran well.
105 EX_RUN_ERROR otherwise.
109 suites = self.default_suites
110 odlusername = kwargs['odlusername']
111 odlpassword = kwargs['odlpassword']
112 osauthurl = kwargs['osauthurl']
113 keystoneurl = "{}://{}".format(
114 urllib.parse.urlparse(osauthurl).scheme,
115 urllib.parse.urlparse(osauthurl).netloc)
116 variable = ['KEYSTONEURL:' + keystoneurl,
117 'NEUTRONURL:' + kwargs['neutronurl'],
118 'OS_AUTH_URL:"' + osauthurl + '"',
119 'OSUSERNAME:"' + kwargs['osusername'] + '"',
120 ('OSUSERDOMAINNAME:"' +
121 kwargs['osuserdomainname'] + '"'),
122 'OSTENANTNAME:"' + kwargs['osprojectname'] + '"',
123 ('OSPROJECTDOMAINNAME:"' +
124 kwargs['osprojectdomainname'] + '"'),
125 'OSPASSWORD:"' + kwargs['ospassword'] + '"',
126 'ODL_SYSTEM_IP:' + kwargs['odlip'],
127 'PORT:' + kwargs['odlwebport'],
128 'RESTCONFPORT:' + kwargs['odlrestconfport']]
130 self.__logger.exception("Cannot run ODL testcases. Please check")
131 return self.EX_RUN_ERROR
132 if not os.path.isfile(self.odl_variables_file):
133 self.__logger.info("Skip writting ODL creds")
135 if not self.set_robotframework_vars(odlusername, odlpassword):
136 return self.EX_RUN_ERROR
137 return super(ODLTests, self).run(variable=variable, suites=suites)
139 def run(self, **kwargs):
140 """Run suites in OPNFV environment
142 It basically check env vars to call main() with the keywords
146 kwargs: Arbitrary keyword arguments.
149 EX_OK if all suites ran well.
150 EX_RUN_ERROR otherwise.
153 suites = self.default_suites
155 suites = kwargs["suites"]
158 kwargs = {'neutronurl': op_utils.get_endpoint(
159 service_type='network')}
160 kwargs['odlip'] = urllib.parse.urlparse(
161 kwargs['neutronurl']).hostname
162 kwargs['odlwebport'] = '8080'
163 kwargs['odlrestconfport'] = '8181'
164 kwargs['odlusername'] = 'admin'
165 kwargs['odlpassword'] = 'admin'
166 installer_type = None
167 if 'INSTALLER_TYPE' in os.environ:
168 installer_type = os.environ['INSTALLER_TYPE']
169 kwargs['osusername'] = os.environ['OS_USERNAME']
170 kwargs['osuserdomainname'] = os.environ.get(
171 'OS_USER_DOMAIN_NAME', 'Default')
172 kwargs['osprojectname'] = os.environ['OS_PROJECT_NAME']
173 kwargs['osprojectdomainname'] = os.environ.get(
174 'OS_PROJECT_DOMAIN_NAME', 'Default')
175 kwargs['osauthurl'] = os.environ['OS_AUTH_URL']
176 kwargs['ospassword'] = os.environ['OS_PASSWORD']
177 if installer_type == 'fuel':
178 kwargs['odlwebport'] = '8181'
179 kwargs['odlrestconfport'] = '8282'
180 elif installer_type == 'apex' or installer_type == 'netvirt':
181 kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
182 kwargs['odlwebport'] = '8081'
183 kwargs['odlrestconfport'] = '8081'
184 elif installer_type == 'joid':
185 kwargs['odlip'] = os.environ['SDN_CONTROLLER']
186 elif installer_type == 'compass':
187 kwargs['odlrestconfport'] = '8080'
188 elif installer_type == 'daisy':
189 kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
190 kwargs['odlwebport'] = '8181'
191 kwargs['odlrestconfport'] = '8087'
193 kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
194 except KeyError as ex:
195 self.__logger.error("Cannot run ODL testcases. "
196 "Please check env var: "
198 return self.EX_RUN_ERROR
199 except Exception: # pylint: disable=broad-except
200 self.__logger.exception("Cannot run ODL testcases.")
201 return self.EX_RUN_ERROR
203 return self.run_suites(suites, **kwargs)
206 class ODLParser(object): # pylint: disable=too-few-public-methods
207 """Parser to run ODL test suites."""
210 self.parser = argparse.ArgumentParser()
211 self.parser.add_argument(
212 '-n', '--neutronurl', help='Neutron Endpoint',
213 default='http://127.0.0.1:9696')
214 self.parser.add_argument(
215 '-k', '--osauthurl', help='OS_AUTH_URL as defined by OpenStack',
216 default='http://127.0.0.1:5000/v3')
217 self.parser.add_argument(
218 '-a', '--osusername', help='Username for OpenStack',
220 self.parser.add_argument(
221 '-f', '--osuserdomainname', help='User domain name for OpenStack',
223 self.parser.add_argument(
224 '-b', '--osprojectname', help='Projet name for OpenStack',
226 self.parser.add_argument(
227 '-g', '--osprojectdomainname',
228 help='Project domain name for OpenStack',
230 self.parser.add_argument(
231 '-c', '--ospassword', help='Password for OpenStack',
233 self.parser.add_argument(
234 '-o', '--odlip', help='OpenDaylight IP',
236 self.parser.add_argument(
237 '-w', '--odlwebport', help='OpenDaylight Web Portal Port',
239 self.parser.add_argument(
240 '-r', '--odlrestconfport', help='OpenDaylight RESTConf Port',
242 self.parser.add_argument(
243 '-d', '--odlusername', help='Username for ODL',
245 self.parser.add_argument(
246 '-e', '--odlpassword', help='Password for ODL',
248 self.parser.add_argument(
249 '-p', '--pushtodb', help='Push results to DB',
252 def parse_args(self, argv=None):
255 It can call sys.exit if arguments are incorrect.
258 the arguments from cmdline
262 return vars(self.parser.parse_args(argv))
267 logging.basicConfig()
270 args = parser.parse_args(sys.argv[1:])
272 result = odl.run_suites(ODLTests.default_suites, **args)
273 if result != robotframework.RobotFramework.EX_OK:
276 return odl.push_to_db()
279 except Exception: # pylint: disable=broad-except
280 return robotframework.RobotFramework.EX_RUN_ERROR