3 # Copyright (c) 2017 HUAWEI TECHNOLOGIES CO.,LTD 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
17 from functest.core import testcase_base
18 from functest.utils.constants import CONST
19 import functest.utils.functest_logger as ft_logger
20 import functest.utils.functest_utils as ft_utils
21 import functest.utils.openstack_utils as openstack_utils
24 logger = ft_logger.Logger(__name__).getLogger()
27 class OnosBase(testcase_base.TestcaseBase):
28 onos_repo_path = CONST.dir_repo_onos
29 onos_sfc_image_name = CONST.onos_sfc_image_name
30 onos_sfc_image_path = os.path.join(CONST.dir_functest_data,
31 CONST.onos_sfc_image_file_name)
32 onos_sfc_path = os.path.join(CONST.dir_repo_functest,
36 super(OnosBase, self).__init__()
39 self.start_time = time.time()
42 res = testcase_base.TestcaseBase.EX_OK
43 except Exception as e:
44 logger.error('Error with run: %s', e)
45 res = testcase_base.TestcaseBase.EX_RUN_ERROR
47 self.stop_time = time.time()
51 raise NotImplementedError('_run is not implemented')
56 super(Onos, self).__init__()
57 self.case_name = 'onos'
58 self.log_path = os.path.join(self.onos_repo_path, 'TestON/logs')
60 def set_onos_ip(self):
61 if (CONST.INSTALLER_TYPE and
62 CONST.INSTALLER_TYPE.lower() == 'joid'):
63 sdn_controller_env = os.getenv('SDN_CONTROLLER')
64 OC1 = re.search(r"\d+\.\d+\.\d+\.\d+", sdn_controller_env).group()
66 neutron_url = openstack_utils.get_endpoint(service_type='network')
67 OC1 = urlparse.urlparse(neutron_url).hostname
68 os.environ['OC1'] = OC1
69 logger.debug("ONOS IP is %s" % OC1)
71 def run_onos_script(self, testname):
72 cli_dir = os.path.join(self.onos_repo_path, 'TestON/bin/cli.py')
73 cmd = '{0} run {1}'.format(cli_dir, testname)
74 logger.debug("Run script: %s" % testname)
75 ft_utils.execute_command_raise(
77 error_msg=('Error when running ONOS script: %s'
80 def clean_existing_logs(self):
81 log_dir = [f for f in os.listdir(self.log_path)]
84 if os.path.isdir(log):
86 elif os.path.isfile(log):
89 logger.error('Error with deleting file %s: %s',
93 cmd = 'grep -rnh Fail {0}'.format(self.log_path)
94 p = subprocess.Popen(cmd,
96 stdout=subprocess.PIPE,
97 stderr=subprocess.STDOUT)
101 if re.search("\s+[1-9]+\s+", line):
102 logger.debug("Testcase Fails\n" + line)
104 cmd = "grep -rnh 'Execution Time' {0}".format(self.log_path)
105 result_buffer = os.popen(cmd).read()
106 time1 = result_buffer[114:128]
107 time2 = result_buffer[28:42]
108 cmd = "grep -rnh 'Success Percentage' {0}".format(
109 os.path.join(self.log_path, "FUNCvirNetNB_*"))
110 result_buffer = os.popen(cmd).read()
111 if result_buffer.find('100%') >= 0:
115 cmd = "grep -rnh 'Success Percentage' {0}".format(
116 os.path.join(self.log_path, "FUNCvirNetNBL3*"))
117 result_buffer = os.popen(cmd).read()
118 if result_buffer.find('100%') >= 0:
124 cmd = "grep -rnh 'h3' {0}".format(
125 os.path.join(self.log_path, "FUNCvirNetNB_*"))
126 result_buffer = os.popen(cmd).read()
127 pattern = re.compile("<h3>([^-]+) - ([^-]+) - (\S*)</h3>")
128 # res = pattern.search(result_buffer).groups()
129 res = pattern.findall(result_buffer)
131 for index in range(len(res)):
132 status1.append({'Case name:': res[i][0] + res[i][1],
133 'Case result': res[i][2]})
135 cmd = "grep -rnh 'h3' {0}".format(
136 os.path.join(self.log_path, "FUNCvirNetNBL3*"))
137 result_buffer = os.popen(cmd).read()
138 pattern = re.compile("<h3>([^-]+) - ([^-]+) - (\S*)</h3>")
139 res = pattern.findall(result_buffer)
141 for index in range(len(res)):
142 status2.append({'Case name:': res[i][0] + res[i][1],
143 'Case result': res[i][2]})
145 payload = {'FUNCvirNet': {'duration': time1,
148 'FUNCvirNetL3': {'duration': time2,
153 def parse_result(self):
154 result = self.get_result()
157 if (result['FUNCvirNet']['result'] == "Success" and
158 result['FUNCvirNetL3']['result'] == "Success"):
161 logger.error("Unable to set ONOS criteria")
163 self.criteria = status
164 self.details = result
167 self.clean_existing_logs()
169 self.run_onos_script('FUNCvirNetNB')
170 self.run_onos_script('FUNCvirNetNBL3')
174 class OnosSfc(OnosBase):
176 super(OnosSfc, self).__init__()
177 self.case_name = 'onos_sfc'
180 url = openstack_utils.get_endpoint(service_type=type)
181 logger.debug('get_ip for %s: %s' % (type, url))
182 return urlparse.urlparse(url).hostname
184 def update_sfc_onos_file(self, before, after):
185 file_dir = os.path.join(self.onos_sfc_path, "sfc_onos.py")
186 cmd = "sed -i 's/{0}/{1}/g' {2}".format(before,
189 ft_utils.execute_command_raise(
191 error_msg=('Error with replacing %s with %s'
194 def create_image(self):
195 glance_client = openstack_utils.get_glance_client()
196 image_id = openstack_utils.create_glance_image(
198 self.onos_sfc_image_name,
199 self.onos_sfc_image_path)
201 raise Exception('Failed to create image')
203 logger.debug("Image '%s' with ID=%s is created successfully."
204 % (self.onos_sfc_image_name, image_id))
206 def set_sfc_conf(self):
207 self.update_sfc_onos_file("keystone_ip", self.get_ip("keystone"))
208 self.update_sfc_onos_file("neutron_ip", self.get_ip("neutron"))
209 self.update_sfc_onos_file("nova_ip", self.get_ip("nova"))
210 self.update_sfc_onos_file("glance_ip", self.get_ip("glance"))
211 self.update_sfc_onos_file("console", CONST.OS_PASSWORD)
212 neutron_client = openstack_utils.get_neutron_client()
213 ext_net = openstack_utils.get_external_net(neutron_client)
214 self.update_sfc_onos_file("admin_floating_net", ext_net)
215 logger.debug("SFC configuration is modified")
218 cmd = 'python {0}'.format(os.path.join(self.onos_sfc_path, 'sfc.py'))
219 ft_utils.execute_command_raise(cmd,
220 error_msg='Error with testing SFC')