[Promise test case] Use proper way to get parameters from yaml
[functest.git] / testcases / Controllers / ODL / OpenDaylightTesting.py
1 #!/usr/bin/python
2
3 import argparse
4 import fileinput
5 import os
6 import re
7 import shutil
8 import sys
9 import urlparse
10
11 from robot import run
12 from robot.api import ExecutionResult, ResultVisitor
13 from robot.errors import RobotError
14 from robot.utils.robottime import timestamp_to_secs
15
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
19
20
21 class ODLResultVisitor(ResultVisitor):
22
23     def __init__(self):
24         self._data = []
25
26     def visit_test(self, test):
27         output = {}
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)
37
38     def get_data(self):
39         return self._data
40
41
42 class ODLTestCases:
43
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()
50
51     @classmethod
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"]
59         for f in files:
60             try:
61                 shutil.copy(f, cls.neutron_suite_dir)
62             except IOError as e:
63                 cls.logger.error(
64                     "Cannot copy OPNFV's testcases to ODL directory: "
65                     "%s" % str(e))
66                 return False
67         return True
68
69     @classmethod
70     def set_robotframework_vars(cls, odlusername="admin", odlpassword="admin"):
71         odl_variables_files = cls.odl_test_repo + 'csit/variables/Variables.py'
72         try:
73             for line in fileinput.input(odl_variables_files,
74                                         inplace=True):
75                 print re.sub("AUTH = .*",
76                              ("AUTH = [u'" + odlusername + "', u'" +
77                               odlpassword + "']"),
78                              line.rstrip())
79             return True
80         except Exception as e:
81             cls.logger.error("Cannot set ODL creds: %s" % str(e))
82             return False
83
84     @classmethod
85     def run(cls, **kwargs):
86         dirs = [cls.basic_suite_dir, cls.neutron_suite_dir]
87         try:
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']]
98         except KeyError as e:
99             cls.logger.error("Cannot run ODL testcases. Please check "
100                              "%s" % str(e))
101             return False
102         if (cls.copy_opnf_testcases() and
103                 cls.set_robotframework_vars(odlusername, odlpassword)):
104             try:
105                 os.makedirs(cls.res_dir)
106             except OSError:
107                 pass
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',
112                     log='NONE',
113                     report='NONE',
114                     stdout=stdout)
115                 stdout.seek(0, 0)
116                 cls.logger.info("\n" + stdout.read())
117             cls.logger.info("ODL results were successfully generated")
118             try:
119                 os.remove(stdout_file)
120             except OSError:
121                 pass
122             return True
123         else:
124             return False
125
126     @classmethod
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'
140         try:
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'
154             else:
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: "
158                              "%s" % str(e))
159             return False
160
161         return cls.run(**kwargs)
162
163     @classmethod
164     def push_to_db(cls):
165         try:
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)
171             details = {}
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")
178                 return False
179             else:
180                 cls.logger.info("ODL results were successfully pushed to DB")
181                 return True
182         except RobotError as e:
183             cls.logger.error("Run tests before publishing: %s" % e.message)
184
185
186 if __name__ == '__main__':
187     parser = argparse.ArgumentParser()
188     parser.add_argument('-k', '--keystoneip',
189                         help='Keystone IP',
190                         default='127.0.0.1')
191     parser.add_argument('-n', '--neutronip',
192                         help='Neutron IP',
193                         default='127.0.0.1')
194     parser.add_argument('-a', '--osusername',
195                         help='Username for OpenStack',
196                         default='admin')
197     parser.add_argument('-b', '--ostenantname',
198                         help='Tenantname for OpenStack',
199                         default='admin')
200     parser.add_argument('-c', '--ospassword',
201                         help='Password for OpenStack',
202                         default='admin')
203     parser.add_argument('-o', '--odlip',
204                         help='OpenDaylight IP',
205                         default='127.0.0.1')
206     parser.add_argument('-w', '--odlwebport',
207                         help='OpenDaylight Web Portal Port',
208                         default='8080')
209     parser.add_argument('-r', '--odlrestconfport',
210                         help='OpenDaylight RESTConf Port',
211                         default='8181')
212     parser.add_argument('-d', '--odlusername',
213                         help='Username for ODL',
214                         default='admin')
215     parser.add_argument('-e', '--odlpassword',
216                         help='Password for ODL',
217                         default='admin')
218     parser.add_argument('-p', '--pushtodb',
219                         help='Push results to DB',
220                         action='store_true')
221
222     args = vars(parser.parse_args())
223     if not ODLTestCases.run(**args):
224         sys.exit(os.EX_SOFTWARE)
225     if args['pushtodb']:
226         sys.exit(not ODLTestCases.push_to_db())
227     sys.exit(os.EX_OK)