8c003abfd8c431ff554762a9d4036a7fe9514048
[functest.git] / testcases / Controllers / ODL / OpenDaylightTesting.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2016 Orange and others.
4 #
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
9
10 import argparse
11 import errno
12 import fileinput
13 import os
14 import re
15 import sys
16 import urlparse
17
18 from robot.api import ExecutionResult, ResultVisitor
19 from robot.errors import RobotError
20 import robot.run
21 from robot.utils.robottime import timestamp_to_secs
22
23 from functest.core import TestCasesBase
24 import functest.utils.functest_logger as ft_logger
25 import functest.utils.openstack_utils as op_utils
26
27
28 class ODLResultVisitor(ResultVisitor):
29
30     def __init__(self):
31         self._data = []
32
33     def visit_test(self, test):
34         output = {}
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)
44
45     def get_data(self):
46         return self._data
47
48
49 class ODLTestCases(TestCasesBase.TestCasesBase):
50
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()
57
58     def __init__(self):
59         self.case_name = "odl"
60
61     @classmethod
62     def set_robotframework_vars(cls, odlusername="admin", odlpassword="admin"):
63         odl_variables_files = cls.odl_test_repo + 'csit/variables/Variables.py'
64         try:
65             for line in fileinput.input(odl_variables_files,
66                                         inplace=True):
67                 print re.sub("AUTH = .*",
68                              ("AUTH = [u'" + odlusername + "', u'" +
69                               odlpassword + "']"),
70                              line.rstrip())
71             return True
72         except Exception as e:
73             cls.logger.error("Cannot set ODL creds: %s" % str(e))
74             return False
75
76     def parse_results(self):
77         result = ExecutionResult(self.res_dir + 'output.xml')
78         visitor = ODLResultVisitor()
79         result.visit(visitor)
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)
83         self.details = {}
84         self.details['description'] = result.suite.name
85         self.details['tests'] = visitor.get_data()
86
87     def main(self, **kwargs):
88         dirs = [self.basic_suite_dir, self.neutron_suite_dir]
89         try:
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 "
102                               "%s" % str(e))
103             return self.EX_RUN_ERROR
104         if self.set_robotframework_vars(odlusername, odlpassword):
105             try:
106                 os.makedirs(self.res_dir)
107             except OSError as e:
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',
116                           log='NONE',
117                           report='NONE',
118                           stdout=stdout)
119                 stdout.seek(0, 0)
120                 self.logger.info("\n" + stdout.read())
121             self.logger.info("ODL results were successfully generated")
122             try:
123                 self.parse_results()
124                 self.logger.info("ODL results were successfully parsed")
125             except RobotError as e:
126                 self.logger.error("Run tests before publishing: %s" %
127                                   e.message)
128                 return self.EX_RUN_ERROR
129             try:
130                 os.remove(stdout_file)
131             except OSError:
132                 self.logger.warning("Cannot remove {}".format(stdout_file))
133             return self.EX_OK
134         else:
135             return self.EX_RUN_ERROR
136
137     def run(self):
138         try:
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'
166             else:
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: "
171                               "%s" % str(e))
172             return self.EX_RUN_ERROR
173         except Exception:
174             self.logger.exception("Cannot run ODL testcases.")
175             return self.EX_RUN_ERROR
176
177         return self.main(**kwargs)
178
179 if __name__ == '__main__':
180     parser = argparse.ArgumentParser()
181     parser.add_argument('-k', '--keystoneip',
182                         help='Keystone IP',
183                         default='127.0.0.1')
184     parser.add_argument('-n', '--neutronip',
185                         help='Neutron IP',
186                         default='127.0.0.1')
187     parser.add_argument('-a', '--osusername',
188                         help='Username for OpenStack',
189                         default='admin')
190     parser.add_argument('-b', '--ostenantname',
191                         help='Tenantname for OpenStack',
192                         default='admin')
193     parser.add_argument('-c', '--ospassword',
194                         help='Password for OpenStack',
195                         default='admin')
196     parser.add_argument('-o', '--odlip',
197                         help='OpenDaylight IP',
198                         default='127.0.0.1')
199     parser.add_argument('-w', '--odlwebport',
200                         help='OpenDaylight Web Portal Port',
201                         default='8080')
202     parser.add_argument('-r', '--odlrestconfport',
203                         help='OpenDaylight RESTConf Port',
204                         default='8181')
205     parser.add_argument('-d', '--odlusername',
206                         help='Username for ODL',
207                         default='admin')
208     parser.add_argument('-e', '--odlpassword',
209                         help='Password for ODL',
210                         default='admin')
211     parser.add_argument('-p', '--pushtodb',
212                         help='Push results to DB',
213                         action='store_true')
214
215     args = vars(parser.parse_args())
216     odl = ODLTestCases()
217     try:
218         result = odl.main(**args)
219         if result != TestCasesBase.TestCasesBase.EX_OK:
220             sys.exit(result)
221         if args['pushtodb']:
222             sys.exit(odl.push_to_db())
223     except Exception:
224         sys.exit(TestCasesBase.TestCasesBase.EX_RUN_ERROR)