Merge "Remove shell Healtcheck test case"
[functest-xtesting.git] / functest / opnfv_tests / sdn / odl / odl.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 import robot.api
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 testcase_base
24 import functest.utils.functest_logger as ft_logger
25 import functest.utils.openstack_utils as op_utils
26
27
28 class ODLResultVisitor(robot.api.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['starttime'] = 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 ODLTests(testcase_base.TestcaseBase):
50
51     repos = "/home/opnfv/repos/"
52     odl_test_repo = os.path.join(repos, "odl_test")
53     neutron_suite_dir = os.path.join(odl_test_repo,
54                                      "csit/suites/openstack/neutron")
55     basic_suite_dir = os.path.join(odl_test_repo,
56                                    "csit/suites/integration/basic")
57     default_suites = [basic_suite_dir, neutron_suite_dir]
58     res_dir = '/home/opnfv/functest/results/odl/'
59     logger = ft_logger.Logger("opendaylight").getLogger()
60
61     def __init__(self):
62         testcase_base.TestcaseBase.__init__(self)
63         self.case_name = "odl"
64
65     @classmethod
66     def set_robotframework_vars(cls, odlusername="admin", odlpassword="admin"):
67         odl_variables_files = os.path.join(cls.odl_test_repo,
68                                            'csit/variables/Variables.py')
69         try:
70             for line in fileinput.input(odl_variables_files,
71                                         inplace=True):
72                 print re.sub("AUTH = .*",
73                              ("AUTH = [u'" + odlusername + "', u'" +
74                               odlpassword + "']"),
75                              line.rstrip())
76             return True
77         except Exception as e:
78             cls.logger.error("Cannot set ODL creds: %s" % str(e))
79             return False
80
81     def parse_results(self):
82         xml_file = os.path.join(self.res_dir, 'output.xml')
83         result = robot.api.ExecutionResult(xml_file)
84         visitor = ODLResultVisitor()
85         result.visit(visitor)
86         self.criteria = result.suite.status
87         self.start_time = timestamp_to_secs(result.suite.starttime)
88         self.stop_time = timestamp_to_secs(result.suite.endtime)
89         self.details = {}
90         self.details['description'] = result.suite.name
91         self.details['tests'] = visitor.get_data()
92
93     def main(self, suites=default_suites, **kwargs):
94         try:
95             odlusername = kwargs['odlusername']
96             odlpassword = kwargs['odlpassword']
97             variables = ['KEYSTONE:' + kwargs['keystoneip'],
98                          'NEUTRON:' + kwargs['neutronip'],
99                          'OSUSERNAME:"' + kwargs['osusername'] + '"',
100                          'OSTENANTNAME:"' + kwargs['ostenantname'] + '"',
101                          'OSPASSWORD:"' + kwargs['ospassword'] + '"',
102                          'ODL_SYSTEM_IP:' + kwargs['odlip'],
103                          'PORT:' + kwargs['odlwebport'],
104                          'RESTCONFPORT:' + kwargs['odlrestconfport']]
105         except KeyError as e:
106             self.logger.error("Cannot run ODL testcases. Please check "
107                               "%s" % str(e))
108             return self.EX_RUN_ERROR
109         if self.set_robotframework_vars(odlusername, odlpassword):
110             try:
111                 os.makedirs(self.res_dir)
112             except OSError as e:
113                 if e.errno != errno.EEXIST:
114                     self.logger.exception(
115                         "Cannot create {}".format(self.res_dir))
116                     return self.EX_RUN_ERROR
117             stdout_file = os.path.join(self.res_dir, 'stdout.txt')
118             output_dir = os.path.join(self.res_dir, 'output.xml')
119             with open(stdout_file, 'w+') as stdout:
120                 robot.run(*suites, variable=variables,
121                           output=output_dir,
122                           log='NONE',
123                           report='NONE',
124                           stdout=stdout)
125                 stdout.seek(0, 0)
126                 self.logger.info("\n" + stdout.read())
127             self.logger.info("ODL results were successfully generated")
128             try:
129                 self.parse_results()
130                 self.logger.info("ODL results were successfully parsed")
131             except RobotError as e:
132                 self.logger.error("Run tests before publishing: %s" %
133                                   e.message)
134                 return self.EX_RUN_ERROR
135             try:
136                 os.remove(stdout_file)
137             except OSError:
138                 self.logger.warning("Cannot remove {}".format(stdout_file))
139             return self.EX_OK
140         else:
141             return self.EX_RUN_ERROR
142
143     def run(self, **kwargs):
144         try:
145             suites = self.default_suites
146             try:
147                 suites = kwargs["suites"]
148             except KeyError:
149                 pass
150             keystone_url = op_utils.get_endpoint(service_type='identity')
151             neutron_url = op_utils.get_endpoint(service_type='network')
152             kwargs = {'keystoneip': urlparse.urlparse(keystone_url).hostname}
153             kwargs['neutronip'] = urlparse.urlparse(neutron_url).hostname
154             kwargs['odlip'] = kwargs['neutronip']
155             kwargs['odlwebport'] = '8080'
156             kwargs['odlrestconfport'] = '8181'
157             kwargs['odlusername'] = 'admin'
158             kwargs['odlpassword'] = 'admin'
159             installer_type = None
160             if 'INSTALLER_TYPE' in os.environ:
161                 installer_type = os.environ['INSTALLER_TYPE']
162             kwargs['osusername'] = os.environ['OS_USERNAME']
163             kwargs['ostenantname'] = os.environ['OS_TENANT_NAME']
164             kwargs['ospassword'] = os.environ['OS_PASSWORD']
165             if installer_type == 'fuel':
166                 kwargs['odlwebport'] = '8282'
167             elif installer_type == 'apex' or installer_type == 'netvirt':
168                 kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
169                 kwargs['odlwebport'] = '8081'
170                 kwargs['odlrestconfport'] = '8081'
171             elif installer_type == 'joid':
172                 kwargs['odlip'] = os.environ['SDN_CONTROLLER']
173             elif installer_type == 'compass':
174                 kwargs['odlwebport'] = '8181'
175             else:
176                 kwargs['odlip'] = os.environ['SDN_CONTROLLER_IP']
177         except KeyError as e:
178             self.logger.error("Cannot run ODL testcases. "
179                               "Please check env var: "
180                               "%s" % str(e))
181             return self.EX_RUN_ERROR
182         except Exception:
183             self.logger.exception("Cannot run ODL testcases.")
184             return self.EX_RUN_ERROR
185
186         return self.main(suites, **kwargs)
187
188
189 class ODLParser(object):
190
191     def __init__(self):
192         self.parser = argparse.ArgumentParser()
193         self.parser.add_argument(
194             '-k', '--keystoneip', help='Keystone IP',
195             default='127.0.0.1')
196         self.parser.add_argument(
197             '-n', '--neutronip', help='Neutron IP',
198             default='127.0.0.1')
199         self.parser.add_argument(
200             '-a', '--osusername', help='Username for OpenStack',
201             default='admin')
202         self.parser.add_argument(
203             '-b', '--ostenantname', help='Tenantname for OpenStack',
204             default='admin')
205         self.parser.add_argument(
206             '-c', '--ospassword', help='Password for OpenStack',
207             default='admin')
208         self.parser.add_argument(
209             '-o', '--odlip', help='OpenDaylight IP',
210             default='127.0.0.1')
211         self.parser.add_argument(
212             '-w', '--odlwebport', help='OpenDaylight Web Portal Port',
213             default='8080')
214         self.parser.add_argument(
215             '-r', '--odlrestconfport', help='OpenDaylight RESTConf Port',
216             default='8181')
217         self.parser.add_argument(
218             '-d', '--odlusername', help='Username for ODL',
219             default='admin')
220         self.parser.add_argument(
221             '-e', '--odlpassword', help='Password for ODL',
222             default='admin')
223         self.parser.add_argument(
224             '-p', '--pushtodb', help='Push results to DB',
225             action='store_true')
226
227     def parse_args(self, argv=[]):
228         return vars(self.parser.parse_args(argv))
229
230
231 if __name__ == '__main__':
232     odl = ODLTests()
233     parser = ODLParser()
234     args = parser.parse_args(sys.argv[1:])
235     try:
236         result = odl.main(ODLTests.default_suites, **args)
237         if result != testcase_base.TestcaseBase.EX_OK:
238             sys.exit(result)
239         if args['pushtodb']:
240             sys.exit(odl.push_to_db())
241     except Exception:
242         sys.exit(testcase_base.TestcaseBase.EX_RUN_ERROR)