blob: ad708bd6226896f9f6d0b71c3e0b05bdc89d7893 [file] [log] [blame]
andrewonlab2a6c9342014-10-16 13:40:15 -04001#TopoPerfNext
2#
3#Topology Performance test for ONOS-next
4#
5#andrew@onlab.us
6
7import time
8import sys
9import os
10import re
11
12class TopoPerfNext:
13 def __init__(self):
14 self.default = ''
15
16 def CASE1(self, main):
17 '''
18 ONOS startup sequence
19 '''
andrewonlabe9fb6722014-10-24 12:20:35 -040020 import time
21
andrewonlab2a6c9342014-10-16 13:40:15 -040022 cell_name = main.params['ENV']['cellName']
23
24 git_pull = main.params['GIT']['autoPull']
25 checkout_branch = main.params['GIT']['checkout']
26
27 ONOS1_ip = main.params['CTRL']['ip1']
andrewonlabba44bcf2014-10-16 16:54:41 -040028 ONOS2_ip = main.params['CTRL']['ip2']
29 ONOS3_ip = main.params['CTRL']['ip3']
andrewonlab2a6c9342014-10-16 13:40:15 -040030 MN1_ip = main.params['MN']['ip1']
31 BENCH_ip = main.params['BENCH']['ip']
32
33 main.case("Setting up test environment")
andrewonlabf9828f02014-11-10 14:50:27 -050034 main.log.report("Setting up test environment")
andrewonlab2a6c9342014-10-16 13:40:15 -040035
36 main.step("Creating cell file")
37 cell_file_result = main.ONOSbench.create_cell_file(
andrewonlabe6745342014-10-17 14:29:13 -040038 BENCH_ip, cell_name, MN1_ip, "onos-core",
andrewonlabba44bcf2014-10-16 16:54:41 -040039 ONOS1_ip, ONOS2_ip, ONOS3_ip)
andrewonlab2a6c9342014-10-16 13:40:15 -040040
41 main.step("Applying cell file to environment")
42 cell_apply_result = main.ONOSbench.set_cell(cell_name)
43 verify_cell_result = main.ONOSbench.verify_cell()
44
45 main.step("Git checkout and pull "+checkout_branch)
46 if git_pull == 'on':
47 checkout_result = \
48 main.ONOSbench.git_checkout(checkout_branch)
49 pull_result = main.ONOSbench.git_pull()
50 else:
51 checkout_result = main.TRUE
52 pull_result = main.TRUE
53 main.log.info("Skipped git checkout and pull")
54
55 main.step("Using mvn clean & install")
andrewonlab8d29f122014-10-22 17:15:04 -040056 #mvn_result = main.ONOSbench.clean_install()
57 mvn_result = main.TRUE
andrewonlab2a6c9342014-10-16 13:40:15 -040058
andrewonlabb1998c52014-11-10 13:31:43 -050059 main.step("Set cell for ONOS cli env")
60 main.ONOS1cli.set_cell(cell_name)
61 main.ONOS2cli.set_cell(cell_name)
62 main.ONOS3cli.set_cell(cell_name)
63
andrewonlab2a6c9342014-10-16 13:40:15 -040064 main.step("Creating ONOS package")
65 package_result = main.ONOSbench.onos_package()
66
67 main.step("Installing ONOS package")
andrewonlabe9fb6722014-10-24 12:20:35 -040068 install1_result = main.ONOSbench.onos_install(node=ONOS1_ip)
69 install2_result = main.ONOSbench.onos_install(node=ONOS2_ip)
70 install3_result = main.ONOSbench.onos_install(node=ONOS3_ip)
andrewonlab2a6c9342014-10-16 13:40:15 -040071
andrewonlabe9fb6722014-10-24 12:20:35 -040072 time.sleep(10)
73
andrewonlab867212a2014-10-22 20:13:38 -040074 main.step("Start onos cli")
andrewonlabe9fb6722014-10-24 12:20:35 -040075 cli1 = main.ONOS1cli.start_onos_cli(ONOS1_ip)
76 cli2 = main.ONOS2cli.start_onos_cli(ONOS2_ip)
77 cli3 = main.ONOS3cli.start_onos_cli(ONOS3_ip)
78
andrewonlab867212a2014-10-22 20:13:38 -040079 main.step("Enable metrics feature")
andrewonlabb1998c52014-11-10 13:31:43 -050080 main.ONOS1cli.feature_install("onos-app-metrics")
81 main.ONOS2cli.feature_install("onos-app-metrics")
82 main.ONOS3cli.feature_install("onos-app-metrics")
andrewonlab867212a2014-10-22 20:13:38 -040083
andrewonlab2a6c9342014-10-16 13:40:15 -040084 utilities.assert_equals(expect=main.TRUE,
85 actual= cell_file_result and cell_apply_result and\
86 verify_cell_result and checkout_result and\
87 pull_result and mvn_result and\
andrewonlabe9fb6722014-10-24 12:20:35 -040088 install1_result and install2_result and\
89 install3_result,
andrewonlabf9828f02014-11-10 14:50:27 -050090 onpass="Test Environment setup successful",
91 onfail="Failed to setup test environment")
andrewonlab2a6c9342014-10-16 13:40:15 -040092
andrewonlabba44bcf2014-10-16 16:54:41 -040093 def CASE2(self, main):
94 '''
95 Assign s1 to ONOS1 and measure latency
andrewonlab3a7c3c72014-10-24 17:21:03 -040096
97 There are 4 levels of latency measurements to this test:
98 1) End-to-end measurement: Complete end-to-end measurement
99 from TCP (SYN/ACK) handshake to Graph change
100 2) OFP-to-graph measurement: 'ONOS processing' snippet of
101 measurement from OFP Vendor message to Graph change
102 3) OFP-to-device measurement: 'ONOS processing without
103 graph change' snippet of measurement from OFP vendor
104 message to Device change timestamp
105 4) T0-to-device measurement: Measurement that includes
106 the switch handshake to devices timestamp without
107 the graph view change. (TCP handshake -> Device
108 change)
andrewonlabba44bcf2014-10-16 16:54:41 -0400109 '''
110 import time
andrewonlabe6745342014-10-17 14:29:13 -0400111 import subprocess
112 import json
113 import requests
114 import os
andrewonlabba44bcf2014-10-16 16:54:41 -0400115
116 ONOS1_ip = main.params['CTRL']['ip1']
117 ONOS2_ip = main.params['CTRL']['ip2']
118 ONOS3_ip = main.params['CTRL']['ip3']
andrewonlabe6745342014-10-17 14:29:13 -0400119 ONOS_user = main.params['CTRL']['user']
120
andrewonlabba44bcf2014-10-16 16:54:41 -0400121 default_sw_port = main.params['CTRL']['port1']
122
123 #Number of iterations of case
124 num_iter = main.params['TEST']['numIter']
andrewonlab4b5c8b92014-11-10 16:04:33 -0500125 #Number of first 'x' iterations to ignore:
126 iter_ignore = int(main.params['TEST']['iterIgnore'])
127
andrewonlab226024e2014-10-24 16:01:32 -0400128 #Timestamp 'keys' for json metrics output.
129 #These are subject to change, hence moved into params
130 deviceTimestamp = main.params['JSON']['deviceTimestamp']
131 graphTimestamp = main.params['JSON']['graphTimestamp']
132
andrewonlab58f7d702014-11-07 13:21:19 -0500133 debug_mode = main.params['TEST']['debugMode']
andrewonlabb1998c52014-11-10 13:31:43 -0500134 onos_log = main.params['TEST']['onosLogFile']
andrewonlab58f7d702014-11-07 13:21:19 -0500135
andrewonlabe5bcef92014-11-06 17:53:20 -0500136 #Threshold for the test
137 threshold_str = main.params['TEST']['singleSwThreshold']
138 threshold_obj = threshold_str.split(",")
139 threshold_min = int(threshold_obj[0])
140 threshold_max = int(threshold_obj[1])
141
andrewonlab226024e2014-10-24 16:01:32 -0400142 #List of switch add latency collected from
143 #all iterations
144 latency_end_to_end_list = []
145 latency_ofp_to_graph_list = []
146 latency_ofp_to_device_list = []
147 latency_t0_to_device_list = []
148
andrewonlabba44bcf2014-10-16 16:54:41 -0400149 #Directory/file to store tshark results
150 tshark_of_output = "/tmp/tshark_of_topo.txt"
151 tshark_tcp_output = "/tmp/tshark_tcp_topo.txt"
152
153 #String to grep in tshark output
154 tshark_tcp_string = "TCP 74 "+default_sw_port
155 tshark_of_string = "OFP 86 Vendor"
andrewonlabe6745342014-10-17 14:29:13 -0400156
157 #Initialize assertion to TRUE
158 assertion = main.TRUE
andrewonlab58f7d702014-11-07 13:21:19 -0500159
160 local_time = time.strftime('%x %X')
andrewonlabb1998c52014-11-10 13:31:43 -0500161 local_time = local_time.replace("/","")
162 local_time = local_time.replace(" ","_")
163 local_time = local_time.replace(":","")
andrewonlab58f7d702014-11-07 13:21:19 -0500164 if debug_mode == 'on':
165 main.ONOS1.tshark_pcap("eth0",
andrewonlabb1998c52014-11-10 13:31:43 -0500166 "/tmp/single_sw_lat_pcap_"+local_time)
167
168 main.log.info("TEST")
andrewonlab58f7d702014-11-07 13:21:19 -0500169
andrewonlab4b5c8b92014-11-10 16:04:33 -0500170 main.log.report("Latency of adding one switch to controller")
171 main.log.report("First "+str(iter_ignore)+" iterations ignored"+
172 " for jvm warmup time")
173 main.log.report("Total iterations of test: "+str(num_iter))
andrewonlabba44bcf2014-10-16 16:54:41 -0400174
175 for i in range(0, int(num_iter)):
176 main.log.info("Starting tshark capture")
177
178 #* TCP [ACK, SYN] is used as t0_a, the
179 # very first "exchange" between ONOS and
180 # the switch for end-to-end measurement
181 #* OFP [Stats Reply] is used for t0_b
182 # the very last OFP message between ONOS
183 # and the switch for ONOS measurement
184 main.ONOS1.tshark_grep(tshark_tcp_string,
185 tshark_tcp_output)
186 main.ONOS1.tshark_grep(tshark_of_string,
187 tshark_of_output)
188
189 #Wait and ensure tshark is started and
190 #capturing
191 time.sleep(10)
192
193 main.log.info("Assigning s1 to controller")
194
195 main.Mininet1.assign_sw_controller(sw="1",
196 ip1=ONOS1_ip, port1=default_sw_port)
197
198 #Wait and ensure switch is assigned
199 #before stopping tshark
andrewonlab867212a2014-10-22 20:13:38 -0400200 time.sleep(30)
andrewonlab226024e2014-10-24 16:01:32 -0400201
202 main.log.info("Stopping all Tshark processes")
andrewonlabba44bcf2014-10-16 16:54:41 -0400203 main.ONOS1.stop_tshark()
204
andrewonlabe6745342014-10-17 14:29:13 -0400205 #tshark output is saved in ONOS. Use subprocess
206 #to copy over files to TestON for parsing
207 main.log.info("Copying over tshark files")
208
209 #TCP CAPTURE ****
andrewonlab8d29f122014-10-22 17:15:04 -0400210 #Copy the tshark output from ONOS machine to
211 #TestON machine in tshark_tcp_output directory>file
212 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
213 tshark_tcp_output+" /tmp/")
214 tcp_file = open(tshark_tcp_output, 'r')
215 temp_text = tcp_file.readline()
andrewonlabe6745342014-10-17 14:29:13 -0400216 temp_text = temp_text.split(" ")
andrewonlabba44bcf2014-10-16 16:54:41 -0400217
andrewonlabe6745342014-10-17 14:29:13 -0400218 main.log.info("Object read in from TCP capture: "+
219 str(temp_text))
andrewonlab867212a2014-10-22 20:13:38 -0400220 if len(temp_text) > 1:
andrewonlab3a7c3c72014-10-24 17:21:03 -0400221 t0_tcp = float(temp_text[1])*1000.0
andrewonlabe6745342014-10-17 14:29:13 -0400222 else:
223 main.log.error("Tshark output file for TCP"+
224 " returned unexpected results")
225 t0_tcp = 0
226 assertion = main.FALSE
andrewonlab8d29f122014-10-22 17:15:04 -0400227
228 tcp_file.close()
andrewonlabe6745342014-10-17 14:29:13 -0400229 #****************
andrewonlabba44bcf2014-10-16 16:54:41 -0400230
andrewonlabe6745342014-10-17 14:29:13 -0400231 #OF CAPTURE ****
andrewonlab8d29f122014-10-22 17:15:04 -0400232 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
233 tshark_of_output+" /tmp/")
234 of_file = open(tshark_of_output, 'r')
235
236 line_ofp = ""
andrewonlab226024e2014-10-24 16:01:32 -0400237 #Read until last line of file
andrewonlabe6745342014-10-17 14:29:13 -0400238 while True:
andrewonlab8d29f122014-10-22 17:15:04 -0400239 temp_text = of_file.readline()
240 if temp_text !='':
andrewonlabe6745342014-10-17 14:29:13 -0400241 line_ofp = temp_text
242 else:
243 break
244 obj = line_ofp.split(" ")
245
246 main.log.info("Object read in from OFP capture: "+
247 str(line_ofp))
248
andrewonlab867212a2014-10-22 20:13:38 -0400249 if len(line_ofp) > 1:
andrewonlab3a7c3c72014-10-24 17:21:03 -0400250 t0_ofp = float(obj[1])*1000.0
andrewonlabe6745342014-10-17 14:29:13 -0400251 else:
252 main.log.error("Tshark output file for OFP"+
253 " returned unexpected results")
254 t0_ofp = 0
255 assertion = main.FALSE
andrewonlab8d29f122014-10-22 17:15:04 -0400256
257 of_file.close()
andrewonlabe6745342014-10-17 14:29:13 -0400258 #****************
259
andrewonlab867212a2014-10-22 20:13:38 -0400260 json_str_1 = main.ONOS1cli.topology_events_metrics()
261 json_str_2 = main.ONOS2cli.topology_events_metrics()
262 json_str_3 = main.ONOS3cli.topology_events_metrics()
andrewonlab867212a2014-10-22 20:13:38 -0400263
264 json_obj_1 = json.loads(json_str_1)
265 json_obj_2 = json.loads(json_str_2)
266 json_obj_3 = json.loads(json_str_3)
267
andrewonlab226024e2014-10-24 16:01:32 -0400268 #Obtain graph timestamp. This timestsamp captures
269 #the epoch time at which the topology graph was updated.
270 graph_timestamp_1 = \
271 json_obj_1[graphTimestamp]['value']
272 graph_timestamp_2 = \
273 json_obj_2[graphTimestamp]['value']
274 graph_timestamp_3 = \
275 json_obj_3[graphTimestamp]['value']
andrewonlab867212a2014-10-22 20:13:38 -0400276
andrewonlab226024e2014-10-24 16:01:32 -0400277 #Obtain device timestamp. This timestamp captures
278 #the epoch time at which the device event happened
279 device_timestamp_1 = \
280 json_obj_1[deviceTimestamp]['value']
281 device_timestamp_2 = \
282 json_obj_2[deviceTimestamp]['value']
283 device_timestamp_3 = \
284 json_obj_3[deviceTimestamp]['value']
andrewonlabe9fb6722014-10-24 12:20:35 -0400285
andrewonlab226024e2014-10-24 16:01:32 -0400286 #t0 to device processing latency
287 delta_device_1 = int(device_timestamp_1) - int(t0_tcp)
288 delta_device_2 = int(device_timestamp_2) - int(t0_tcp)
289 delta_device_3 = int(device_timestamp_3) - int(t0_tcp)
290
291 #Get average of delta from all instances
292 avg_delta_device = \
293 (int(delta_device_1)+\
294 int(delta_device_2)+\
295 int(delta_device_3)) / 3
andrewonlabba44bcf2014-10-16 16:54:41 -0400296
andrewonlab226024e2014-10-24 16:01:32 -0400297 #Ensure avg delta meets the threshold before appending
andrewonlab4b5c8b92014-11-10 16:04:33 -0500298 if avg_delta_device > 0.0 and avg_delta_device < 10000\
299 and int(num_iter) > iter_ignore:
andrewonlab226024e2014-10-24 16:01:32 -0400300 latency_t0_to_device_list.append(avg_delta_device)
andrewonlabee4efeb2014-10-24 16:44:51 -0400301 else:
andrewonlab09d973e2014-10-24 18:56:58 -0400302 main.log.info("Results for t0-to-device ignored"+\
andrewonlab4b5c8b92014-11-10 16:04:33 -0500303 "due to excess in threshold / warmup iteration.")
andrewonlabee4efeb2014-10-24 16:44:51 -0400304
andrewonlab226024e2014-10-24 16:01:32 -0400305 #t0 to graph processing latency (end-to-end)
306 delta_graph_1 = int(graph_timestamp_1) - int(t0_tcp)
307 delta_graph_2 = int(graph_timestamp_2) - int(t0_tcp)
308 delta_graph_3 = int(graph_timestamp_3) - int(t0_tcp)
309
310 #Get average of delta from all instances
311 avg_delta_graph = \
312 (int(delta_graph_1)+\
313 int(delta_graph_2)+\
314 int(delta_graph_3)) / 3
315
andrewonlab226024e2014-10-24 16:01:32 -0400316 #Ensure avg delta meets the threshold before appending
andrewonlab4b5c8b92014-11-10 16:04:33 -0500317 if avg_delta_graph > 0.0 and avg_delta_graph < 10000\
318 and int(num_iter) > iter_ignore:
andrewonlab09d973e2014-10-24 18:56:58 -0400319 latency_end_to_end_list.append(avg_delta_graph)
andrewonlabee4efeb2014-10-24 16:44:51 -0400320 else:
andrewonlab09d973e2014-10-24 18:56:58 -0400321 main.log.info("Results for end-to-end ignored"+\
322 "due to excess in threshold")
andrewonlab226024e2014-10-24 16:01:32 -0400323
324 #ofp to graph processing latency (ONOS processing)
325 delta_ofp_graph_1 = int(graph_timestamp_1) - int(t0_ofp)
326 delta_ofp_graph_2 = int(graph_timestamp_2) - int(t0_ofp)
327 delta_ofp_graph_3 = int(graph_timestamp_3) - int(t0_ofp)
328
329 avg_delta_ofp_graph = \
330 (int(delta_ofp_graph_1)+\
331 int(delta_ofp_graph_2)+\
332 int(delta_ofp_graph_3)) / 3
333
andrewonlabe5bcef92014-11-06 17:53:20 -0500334 if avg_delta_ofp_graph > threshold_min \
andrewonlab4b5c8b92014-11-10 16:04:33 -0500335 and avg_delta_ofp_graph < threshold_max\
336 and int(num_iter) > iter_ignore:
andrewonlab226024e2014-10-24 16:01:32 -0400337 latency_ofp_to_graph_list.append(avg_delta_ofp_graph)
andrewonlabee4efeb2014-10-24 16:44:51 -0400338 else:
andrewonlab09d973e2014-10-24 18:56:58 -0400339 main.log.info("Results for ofp-to-graph "+\
340 "ignored due to excess in threshold")
andrewonlabee4efeb2014-10-24 16:44:51 -0400341
andrewonlab226024e2014-10-24 16:01:32 -0400342 #ofp to device processing latency (ONOS processing)
andrewonlabee4efeb2014-10-24 16:44:51 -0400343 delta_ofp_device_1 = float(device_timestamp_1) - float(t0_ofp)
344 delta_ofp_device_2 = float(device_timestamp_2) - float(t0_ofp)
345 delta_ofp_device_3 = float(device_timestamp_3) - float(t0_ofp)
andrewonlab226024e2014-10-24 16:01:32 -0400346
347 avg_delta_ofp_device = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400348 (float(delta_ofp_device_1)+\
349 float(delta_ofp_device_2)+\
andrewonlab4b5c8b92014-11-10 16:04:33 -0500350 float(delta_ofp_device_3)) / 3
andrewonlab226024e2014-10-24 16:01:32 -0400351
andrewonlabf47993a2014-10-24 17:56:01 -0400352 #NOTE: ofp - delta measurements are occasionally negative
353 # due to system time misalignment.
andrewonlabf47993a2014-10-24 17:56:01 -0400354 latency_ofp_to_device_list.append(avg_delta_ofp_device)
andrewonlabba44bcf2014-10-16 16:54:41 -0400355
andrewonlabe6745342014-10-17 14:29:13 -0400356 #TODO:
357 #Fetch logs upon threshold excess
andrewonlabba44bcf2014-10-16 16:54:41 -0400358
andrewonlab226024e2014-10-24 16:01:32 -0400359 main.log.info("ONOS1 delta end-to-end: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400360 str(delta_graph_1) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400361 main.log.info("ONOS2 delta end-to-end: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400362 str(delta_graph_2) + " ms")
363 main.log.info("ONOS3 delta end-to-end: "+
364 str(delta_graph_3) + " ms")
andrewonlabba44bcf2014-10-16 16:54:41 -0400365
andrewonlab226024e2014-10-24 16:01:32 -0400366 main.log.info("ONOS1 delta OFP - graph: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400367 str(delta_ofp_graph_1) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400368 main.log.info("ONOS2 delta OFP - graph: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400369 str(delta_ofp_graph_2) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400370 main.log.info("ONOS3 delta OFP - graph: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400371 str(delta_ofp_graph_3) + " ms")
andrewonlabe6745342014-10-17 14:29:13 -0400372
andrewonlab226024e2014-10-24 16:01:32 -0400373 main.log.info("ONOS1 delta device - t0: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400374 str(delta_device_1) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400375 main.log.info("ONOS2 delta device - t0: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400376 str(delta_device_2) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400377 main.log.info("ONOS3 delta device - t0: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400378 str(delta_device_3) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400379
andrewonlab8790abb2014-11-06 13:51:54 -0500380 #main.log.info("ONOS1 delta OFP - device: "+
381 # str(delta_ofp_device_1) + " ms")
382 #main.log.info("ONOS2 delta OFP - device: "+
383 # str(delta_ofp_device_2) + " ms")
384 #main.log.info("ONOS3 delta OFP - device: "+
385 # str(delta_ofp_device_3) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400386
andrewonlab8d29f122014-10-22 17:15:04 -0400387 main.step("Remove switch from controller")
388 main.Mininet1.delete_sw_controller("s1")
andrewonlabba44bcf2014-10-16 16:54:41 -0400389
andrewonlab8d29f122014-10-22 17:15:04 -0400390 time.sleep(5)
andrewonlabba44bcf2014-10-16 16:54:41 -0400391
andrewonlab09d973e2014-10-24 18:56:58 -0400392 #END of for loop iteration
andrewonlabf47993a2014-10-24 17:56:01 -0400393
andrewonlabee4efeb2014-10-24 16:44:51 -0400394 #If there is at least 1 element in each list,
andrewonlabc15c9582014-10-24 16:35:52 -0400395 #pass the test case
396 if len(latency_end_to_end_list) > 0 and\
397 len(latency_ofp_to_graph_list) > 0 and\
398 len(latency_ofp_to_device_list) > 0 and\
399 len(latency_t0_to_device_list) > 0:
400 assertion = main.TRUE
andrewonlabf47993a2014-10-24 17:56:01 -0400401 elif len(latency_end_to_end_list) == 0:
402 #The appending of 0 here is to prevent
403 #the min,max,sum functions from failing
404 #below
405 latency_end_to_end_list.append(0)
406 assertion = main.FALSE
407 elif len(latency_ofp_to_graph_list) == 0:
408 latency_ofp_to_graph_list.append(0)
409 assertion = main.FALSE
410 elif len(latency_ofp_to_device_list) == 0:
411 latency_ofp_to_device_list.append(0)
412 assertion = main.FALSE
413 elif len(latency_t0_to_device_list) == 0:
414 latency_t0_to_device_list.append(0)
415 assertion = main.FALSE
andrewonlabc15c9582014-10-24 16:35:52 -0400416
417 #Calculate min, max, avg of latency lists
418 latency_end_to_end_max = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400419 int(max(latency_end_to_end_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400420 latency_end_to_end_min = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400421 int(min(latency_end_to_end_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400422 latency_end_to_end_avg = \
andrewonlabc90667c2014-10-24 16:48:28 -0400423 (int(sum(latency_end_to_end_list)) / \
andrewonlabc15c9582014-10-24 16:35:52 -0400424 len(latency_end_to_end_list))
425
426 latency_ofp_to_graph_max = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400427 int(max(latency_ofp_to_graph_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400428 latency_ofp_to_graph_min = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400429 int(min(latency_ofp_to_graph_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400430 latency_ofp_to_graph_avg = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400431 (int(sum(latency_ofp_to_graph_list)) / \
andrewonlabc15c9582014-10-24 16:35:52 -0400432 len(latency_ofp_to_graph_list))
433
434 latency_ofp_to_device_max = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400435 int(max(latency_ofp_to_device_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400436 latency_ofp_to_device_min = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400437 int(min(latency_ofp_to_device_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400438 latency_ofp_to_device_avg = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400439 (int(sum(latency_ofp_to_device_list)) / \
andrewonlabc15c9582014-10-24 16:35:52 -0400440 len(latency_ofp_to_device_list))
441
442 latency_t0_to_device_max = \
andrewonlab4b5c8b92014-11-10 16:04:33 -0500443 int(max(latency_t0_to_device_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400444 latency_t0_to_device_min = \
andrewonlab4b5c8b92014-11-10 16:04:33 -0500445 int(min(latency_t0_to_device_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400446 latency_t0_to_device_avg = \
andrewonlab4b5c8b92014-11-10 16:04:33 -0500447 (int(sum(latency_t0_to_device_list)) / \
andrewonlabc15c9582014-10-24 16:35:52 -0400448 len(latency_ofp_to_device_list))
449
andrewonlabf9828f02014-11-10 14:50:27 -0500450 main.log.report("Switch add - End-to-end latency: "+\
andrewonlab4b5c8b92014-11-10 16:04:33 -0500451 "Min: "+str(latency_end_to_end_min)+" ms "+\
andrewonlabf9828f02014-11-10 14:50:27 -0500452 "Max: "+str(latency_end_to_end_max)+" ms "+\
andrewonlab58f7d702014-11-07 13:21:19 -0500453 "Avg: "+str(latency_end_to_end_avg)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -0500454 main.log.report("Switch add - OFP-to-Graph latency: "+\
455 "Min: "+str(latency_ofp_to_graph_min)+" ms "+\
456 "Max: "+str(latency_ofp_to_graph_max)+" ms "+\
andrewonlab58f7d702014-11-07 13:21:19 -0500457 "Avg: "+str(latency_ofp_to_graph_avg)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -0500458 main.log.report("Switch add - t0-to-Device latency: "+\
459 "Min: "+str(latency_t0_to_device_min)+" ms"+\
460 "Max: "+str(latency_t0_to_device_max)+" ms"+\
andrewonlab58f7d702014-11-07 13:21:19 -0500461 "Avg: "+str(latency_t0_to_device_avg)+" ms")
andrewonlab226024e2014-10-24 16:01:32 -0400462
andrewonlabb1998c52014-11-10 13:31:43 -0500463 if debug_mode == 'on':
464 main.ONOS1.cp_logs_to_dir("/opt/onos/log/karaf.log",
465 "/tmp/", copy_file_name="sw_lat_karaf")
466
andrewonlab8d29f122014-10-22 17:15:04 -0400467 utilities.assert_equals(expect=main.TRUE, actual=assertion,
468 onpass="Switch latency test successful",
469 onfail="Switch latency test failed")
andrewonlabba44bcf2014-10-16 16:54:41 -0400470
andrewonlab8d29f122014-10-22 17:15:04 -0400471 def CASE3(self, main):
472 '''
473 Bring port up / down and measure latency.
474 Port enable / disable is simulated by ifconfig up / down
andrewonlab393531a2014-10-27 18:36:26 -0400475
476 In ONOS-next, we must ensure that the port we are
477 manipulating is connected to another switch with a valid
478 connection. Otherwise, graph view will not be updated.
andrewonlab8d29f122014-10-22 17:15:04 -0400479 '''
480 import time
481 import subprocess
482 import os
483 import requests
484 import json
andrewonlab2a6c9342014-10-16 13:40:15 -0400485
andrewonlab8d29f122014-10-22 17:15:04 -0400486 ONOS1_ip = main.params['CTRL']['ip1']
andrewonlab393531a2014-10-27 18:36:26 -0400487 ONOS2_ip = main.params['CTRL']['ip2']
488 ONOS3_ip = main.params['CTRL']['ip3']
andrewonlab8d29f122014-10-22 17:15:04 -0400489 ONOS_user = main.params['CTRL']['user']
andrewonlab8d29f122014-10-22 17:15:04 -0400490
andrewonlab393531a2014-10-27 18:36:26 -0400491 default_sw_port = main.params['CTRL']['port1']
andrewonlab8790abb2014-11-06 13:51:54 -0500492
493 assertion = main.TRUE
andrewonlab393531a2014-10-27 18:36:26 -0400494 #Number of iterations of case
495 num_iter = main.params['TEST']['numIter']
496
497 #Timestamp 'keys' for json metrics output.
498 #These are subject to change, hence moved into params
499 deviceTimestamp = main.params['JSON']['deviceTimestamp']
500 graphTimestamp = main.params['JSON']['graphTimestamp']
andrewonlab58f7d702014-11-07 13:21:19 -0500501
502 debug_mode = main.params['TEST']['debugMode']
503
504 local_time = time.strftime('%x %X')
andrewonlabb1998c52014-11-10 13:31:43 -0500505 local_time = local_time.replace("/","")
506 local_time = local_time.replace(" ","_")
507 local_time = local_time.replace(":","")
andrewonlab58f7d702014-11-07 13:21:19 -0500508 if debug_mode == 'on':
509 main.ONOS1.tshark_pcap("eth0",
andrewonlabb1998c52014-11-10 13:31:43 -0500510 "/tmp/port_lat_pcap_"+local_time)
andrewonlab393531a2014-10-27 18:36:26 -0400511
andrewonlabe5bcef92014-11-06 17:53:20 -0500512 #Threshold for this test case
513 up_threshold_str = main.params['TEST']['portUpThreshold']
514 down_threshold_str = main.params['TEST']['portDownThreshold']
andrewonlabb1998c52014-11-10 13:31:43 -0500515
andrewonlabe5bcef92014-11-06 17:53:20 -0500516 up_threshold_obj = up_threshold_str.split(",")
517 down_threshold_obj = down_threshold_str.split(",")
518
519 up_threshold_min = int(up_threshold_obj[0])
520 up_threshold_max = int(up_threshold_obj[1])
521
522 down_threshold_min = int(down_threshold_obj[0])
523 down_threshold_max = int(down_threshold_obj[1])
524
andrewonlab393531a2014-10-27 18:36:26 -0400525 #NOTE: Some hardcoded variables you may need to configure
526 # besides the params
527
andrewonlab8d29f122014-10-22 17:15:04 -0400528 tshark_port_status = "OFP 130 Port Status"
529
530 tshark_port_up = "/tmp/tshark_port_up.txt"
531 tshark_port_down = "/tmp/tshark_port_down.txt"
andrewonlab393531a2014-10-27 18:36:26 -0400532 interface_config = "s1-eth1"
andrewonlab8d29f122014-10-22 17:15:04 -0400533
534 main.log.report("Port enable / disable latency")
andrewonlab4b5c8b92014-11-10 16:04:33 -0500535 main.log.report("Simulated by ifconfig up / down")
536 main.log.report("Total iterations of test: "+str(num_iter))
andrewonlab8d29f122014-10-22 17:15:04 -0400537
andrewonlab393531a2014-10-27 18:36:26 -0400538 main.step("Assign switches s1 and s2 to controller 1")
andrewonlab8d29f122014-10-22 17:15:04 -0400539 main.Mininet1.assign_sw_controller(sw="1",ip1=ONOS1_ip,
540 port1=default_sw_port)
andrewonlab393531a2014-10-27 18:36:26 -0400541 main.Mininet1.assign_sw_controller(sw="2",ip1=ONOS1_ip,
542 port1=default_sw_port)
andrewonlab8d29f122014-10-22 17:15:04 -0400543
andrewonlab8790abb2014-11-06 13:51:54 -0500544 #Give enough time for metrics to propagate the
545 #assign controller event. Otherwise, these events may
546 #carry over to our measurements
andrewonlabb1998c52014-11-10 13:31:43 -0500547 time.sleep(15)
andrewonlab8d29f122014-10-22 17:15:04 -0400548
andrewonlab393531a2014-10-27 18:36:26 -0400549 port_up_device_to_ofp_list = []
550 port_up_graph_to_ofp_list = []
551 port_down_device_to_ofp_list = []
552 port_down_graph_to_ofp_list = []
553
andrewonlab8d29f122014-10-22 17:15:04 -0400554 for i in range(0, int(num_iter)):
555 main.step("Starting wireshark capture for port status down")
556 main.ONOS1.tshark_grep(tshark_port_status,
557 tshark_port_down)
558
andrewonlabb1998c52014-11-10 13:31:43 -0500559 time.sleep(5)
andrewonlab8d29f122014-10-22 17:15:04 -0400560
andrewonlab393531a2014-10-27 18:36:26 -0400561 #Disable interface that is connected to switch 2
562 main.step("Disable port: "+interface_config)
andrewonlabb1998c52014-11-10 13:31:43 -0500563 main.Mininet1.handle.sendline("sh ifconfig "+
andrewonlab393531a2014-10-27 18:36:26 -0400564 interface_config+" down")
andrewonlabb1998c52014-11-10 13:31:43 -0500565 main.Mininet1.handle.expect("mininet>")
andrewonlab8d29f122014-10-22 17:15:04 -0400566
andrewonlabb1998c52014-11-10 13:31:43 -0500567 time.sleep(3)
andrewonlab8d29f122014-10-22 17:15:04 -0400568 main.ONOS1.tshark_stop()
andrewonlabb1998c52014-11-10 13:31:43 -0500569
570 main.step("Obtain t1 by metrics call")
571 json_str_up_1 = main.ONOS1cli.topology_events_metrics()
572 json_str_up_2 = main.ONOS2cli.topology_events_metrics()
573 json_str_up_3 = main.ONOS3cli.topology_events_metrics()
574
575 json_obj_1 = json.loads(json_str_up_1)
576 json_obj_2 = json.loads(json_str_up_2)
577 json_obj_3 = json.loads(json_str_up_3)
andrewonlab8d29f122014-10-22 17:15:04 -0400578
579 #Copy tshark output file from ONOS to TestON instance
580 #/tmp directory
581 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
582 tshark_port_down+" /tmp/")
583
584 f_port_down = open(tshark_port_down, 'r')
andrewonlab393531a2014-10-27 18:36:26 -0400585 #Get first line of port down event from tshark
andrewonlab8d29f122014-10-22 17:15:04 -0400586 f_line = f_port_down.readline()
587 obj_down = f_line.split(" ")
588 if len(f_line) > 0:
andrewonlabb1998c52014-11-10 13:31:43 -0500589 timestamp_begin_pt_down = int(float(obj_down[1])*1000)
andrewonlab393531a2014-10-27 18:36:26 -0400590 main.log.info("Port down begin timestamp: "+
591 str(timestamp_begin_pt_down))
andrewonlab8d29f122014-10-22 17:15:04 -0400592 else:
593 main.log.info("Tshark output file returned unexpected"+
andrewonlab393531a2014-10-27 18:36:26 -0400594 " results: "+str(obj_down))
andrewonlab8d29f122014-10-22 17:15:04 -0400595 timestamp_begin_pt_down = 0
andrewonlab393531a2014-10-27 18:36:26 -0400596
597 f_port_down.close()
andrewonlab8d29f122014-10-22 17:15:04 -0400598
andrewonlab4e124482014-11-04 13:37:25 -0500599 main.log.info("TEST tshark obj: "+str(obj_down))
600
andrewonlabb1998c52014-11-10 13:31:43 -0500601 time.sleep(3)
andrewonlab393531a2014-10-27 18:36:26 -0400602
603 #Obtain graph timestamp. This timestsamp captures
604 #the epoch time at which the topology graph was updated.
605 graph_timestamp_1 = \
606 json_obj_1[graphTimestamp]['value']
607 graph_timestamp_2 = \
608 json_obj_2[graphTimestamp]['value']
609 graph_timestamp_3 = \
610 json_obj_3[graphTimestamp]['value']
611
andrewonlabb1998c52014-11-10 13:31:43 -0500612 main.log.info("TEST graph timestamp ONOS1: "+
613 str(graph_timestamp_1))
614
andrewonlab393531a2014-10-27 18:36:26 -0400615 #Obtain device timestamp. This timestamp captures
616 #the epoch time at which the device event happened
617 device_timestamp_1 = \
618 json_obj_1[deviceTimestamp]['value']
619 device_timestamp_2 = \
620 json_obj_2[deviceTimestamp]['value']
621 device_timestamp_3 = \
622 json_obj_3[deviceTimestamp]['value']
andrewonlab393531a2014-10-27 18:36:26 -0400623
624 #Get delta between graph event and OFP
625 pt_down_graph_to_ofp_1 = int(graph_timestamp_1) -\
626 int(timestamp_begin_pt_down)
627 pt_down_graph_to_ofp_2 = int(graph_timestamp_2) -\
628 int(timestamp_begin_pt_down)
629 pt_down_graph_to_ofp_3 = int(graph_timestamp_3) -\
630 int(timestamp_begin_pt_down)
631
632 #Get delta between device event and OFP
633 pt_down_device_to_ofp_1 = int(device_timestamp_1) -\
634 int(timestamp_begin_pt_down)
635 pt_down_device_to_ofp_2 = int(device_timestamp_2) -\
636 int(timestamp_begin_pt_down)
637 pt_down_device_to_ofp_3 = int(device_timestamp_3) -\
638 int(timestamp_begin_pt_down)
639
640 #Caluclate average across clusters
641 pt_down_graph_to_ofp_avg =\
642 (int(pt_down_graph_to_ofp_1) +
643 int(pt_down_graph_to_ofp_2) +
andrewonlabf9828f02014-11-10 14:50:27 -0500644 int(pt_down_graph_to_ofp_3)) / 3
andrewonlab393531a2014-10-27 18:36:26 -0400645 pt_down_device_to_ofp_avg = \
646 (int(pt_down_device_to_ofp_1) +
647 int(pt_down_device_to_ofp_2) +
andrewonlabf9828f02014-11-10 14:50:27 -0500648 int(pt_down_device_to_ofp_3)) / 3
andrewonlab393531a2014-10-27 18:36:26 -0400649
andrewonlabb1998c52014-11-10 13:31:43 -0500650 if pt_down_graph_to_ofp_avg > down_threshold_min and \
651 pt_down_graph_to_ofp_avg < down_threshold_max:
andrewonlab393531a2014-10-27 18:36:26 -0400652 port_down_graph_to_ofp_list.append(
andrewonlababb11c32014-11-04 15:03:24 -0500653 pt_down_graph_to_ofp_avg)
654 main.log.info("Port down: graph to ofp avg: "+
655 str(pt_down_graph_to_ofp_avg) + " ms")
andrewonlab393531a2014-10-27 18:36:26 -0400656 else:
657 main.log.info("Average port down graph-to-ofp result" +
658 " exceeded the threshold: "+
659 str(pt_down_graph_to_ofp_avg))
660
andrewonlab3622beb2014-10-28 16:07:56 -0400661 if pt_down_device_to_ofp_avg > 0 and \
662 pt_down_device_to_ofp_avg < 1000:
663 port_down_device_to_ofp_list.append(
andrewonlababb11c32014-11-04 15:03:24 -0500664 pt_down_device_to_ofp_avg)
665 main.log.info("Port down: device to ofp avg: "+
666 str(pt_down_device_to_ofp_avg) + " ms")
andrewonlab3622beb2014-10-28 16:07:56 -0400667 else:
668 main.log.info("Average port down device-to-ofp result" +
669 " exceeded the threshold: "+
670 str(pt_down_device_to_ofp_avg))
671
andrewonlab8d29f122014-10-22 17:15:04 -0400672 #Port up events
673 main.step("Enable port and obtain timestamp")
674 main.step("Starting wireshark capture for port status up")
andrewonlabb1998c52014-11-10 13:31:43 -0500675 main.ONOS1.tshark_grep(tshark_port_status, tshark_port_up)
andrewonlab8790abb2014-11-06 13:51:54 -0500676 time.sleep(5)
andrewonlab8d29f122014-10-22 17:15:04 -0400677
andrewonlabb1998c52014-11-10 13:31:43 -0500678 main.Mininet1.handle.sendline("sh ifconfig "+
andrewonlab393531a2014-10-27 18:36:26 -0400679 interface_config+" up")
andrewonlabb1998c52014-11-10 13:31:43 -0500680 main.Mininet1.handle.expect("mininet>")
andrewonlab8790abb2014-11-06 13:51:54 -0500681
andrewonlabb1998c52014-11-10 13:31:43 -0500682 #Allow time for tshark to capture event
683 time.sleep(3)
andrewonlab8790abb2014-11-06 13:51:54 -0500684 main.ONOS1.tshark_stop()
andrewonlab8d29f122014-10-22 17:15:04 -0400685
andrewonlabb1998c52014-11-10 13:31:43 -0500686 #Obtain metrics shortly afterwards
687 #This timestsamp captures
688 #the epoch time at which the topology graph was updated.
689 main.step("Obtain t1 by REST call")
690 json_str_up_1 = main.ONOS1cli.topology_events_metrics()
691 json_str_up_2 = main.ONOS2cli.topology_events_metrics()
692 json_str_up_3 = main.ONOS3cli.topology_events_metrics()
693
694 json_obj_1 = json.loads(json_str_up_1)
695 json_obj_2 = json.loads(json_str_up_2)
696 json_obj_3 = json.loads(json_str_up_3)
697
andrewonlab8d29f122014-10-22 17:15:04 -0400698 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
699 tshark_port_up+" /tmp/")
700
701 f_port_up = open(tshark_port_up, 'r')
andrewonlab393531a2014-10-27 18:36:26 -0400702 f_line = f_port_up.readline()
andrewonlab8d29f122014-10-22 17:15:04 -0400703 obj_up = f_line.split(" ")
704 if len(f_line) > 0:
andrewonlabb1998c52014-11-10 13:31:43 -0500705 timestamp_begin_pt_up = int(float(obj_up[1])*1000)
andrewonlab393531a2014-10-27 18:36:26 -0400706 main.log.info("Port up begin timestamp: "+
707 str(timestamp_begin_pt_up))
andrewonlab8d29f122014-10-22 17:15:04 -0400708 else:
709 main.log.info("Tshark output file returned unexpected"+
710 " results.")
711 timestamp_begin_pt_up = 0
712
andrewonlab393531a2014-10-27 18:36:26 -0400713 f_port_up.close()
714
andrewonlab393531a2014-10-27 18:36:26 -0400715 graph_timestamp_1 = \
716 json_obj_1[graphTimestamp]['value']
717 graph_timestamp_2 = \
718 json_obj_2[graphTimestamp]['value']
719 graph_timestamp_3 = \
720 json_obj_3[graphTimestamp]['value']
721
722 #Obtain device timestamp. This timestamp captures
723 #the epoch time at which the device event happened
724 device_timestamp_1 = \
725 json_obj_1[deviceTimestamp]['value']
726 device_timestamp_2 = \
727 json_obj_2[deviceTimestamp]['value']
728 device_timestamp_3 = \
729 json_obj_3[deviceTimestamp]['value']
730
731 #Get delta between graph event and OFP
732 pt_up_graph_to_ofp_1 = int(graph_timestamp_1) -\
andrewonlab8d29f122014-10-22 17:15:04 -0400733 int(timestamp_begin_pt_up)
andrewonlab393531a2014-10-27 18:36:26 -0400734 pt_up_graph_to_ofp_2 = int(graph_timestamp_2) -\
andrewonlab8d29f122014-10-22 17:15:04 -0400735 int(timestamp_begin_pt_up)
andrewonlab393531a2014-10-27 18:36:26 -0400736 pt_up_graph_to_ofp_3 = int(graph_timestamp_3) -\
737 int(timestamp_begin_pt_up)
738
739 #Get delta between device event and OFP
740 pt_up_device_to_ofp_1 = int(device_timestamp_1) -\
741 int(timestamp_begin_pt_up)
742 pt_up_device_to_ofp_2 = int(device_timestamp_2) -\
743 int(timestamp_begin_pt_up)
744 pt_up_device_to_ofp_3 = int(device_timestamp_3) -\
andrewonlab8d29f122014-10-22 17:15:04 -0400745 int(timestamp_begin_pt_up)
andrewonlab3622beb2014-10-28 16:07:56 -0400746
andrewonlabb1998c52014-11-10 13:31:43 -0500747 main.log.info("ONOS1 delta G2O: "+str(pt_up_graph_to_ofp_1))
748 main.log.info("ONOS2 delta G2O: "+str(pt_up_graph_to_ofp_2))
749 main.log.info("ONOS3 delta G2O: "+str(pt_up_graph_to_ofp_3))
750
751 main.log.info("ONOS1 delta D2O: "+str(pt_up_device_to_ofp_1))
752 main.log.info("ONOS2 delta D2O: "+str(pt_up_device_to_ofp_2))
753 main.log.info("ONOS3 delta D2O: "+str(pt_up_device_to_ofp_3))
754
andrewonlab3622beb2014-10-28 16:07:56 -0400755 pt_up_graph_to_ofp_avg = \
andrewonlabf9828f02014-11-10 14:50:27 -0500756 (int(pt_up_graph_to_ofp_1) +
757 int(pt_up_graph_to_ofp_2) +
758 int(pt_up_graph_to_ofp_3)) / 3
andrewonlab3622beb2014-10-28 16:07:56 -0400759
760 pt_up_device_to_ofp_avg = \
andrewonlabf9828f02014-11-10 14:50:27 -0500761 (int(pt_up_device_to_ofp_1) +
762 int(pt_up_device_to_ofp_2) +
763 int(pt_up_device_to_ofp_3)) / 3
andrewonlab3622beb2014-10-28 16:07:56 -0400764
andrewonlabe5bcef92014-11-06 17:53:20 -0500765 if pt_up_graph_to_ofp_avg > up_threshold_min and \
766 pt_up_graph_to_ofp_avg < up_threshold_max:
andrewonlab3622beb2014-10-28 16:07:56 -0400767 port_up_graph_to_ofp_list.append(
768 pt_up_graph_to_ofp_avg)
andrewonlababb11c32014-11-04 15:03:24 -0500769 main.log.info("Port down: graph to ofp avg: "+
770 str(pt_up_graph_to_ofp_avg) + " ms")
andrewonlab3622beb2014-10-28 16:07:56 -0400771 else:
772 main.log.info("Average port up graph-to-ofp result"+
773 " exceeded the threshold: "+
774 str(pt_up_graph_to_ofp_avg))
775
andrewonlabe5bcef92014-11-06 17:53:20 -0500776 if pt_up_device_to_ofp_avg > up_threshold_min and \
777 pt_up_device_to_ofp_avg < up_threshold_max:
andrewonlab3622beb2014-10-28 16:07:56 -0400778 port_up_device_to_ofp_list.append(
779 pt_up_device_to_ofp_avg)
andrewonlababb11c32014-11-04 15:03:24 -0500780 main.log.info("Port up: device to ofp avg: "+
781 str(pt_up_device_to_ofp_avg) + " ms")
andrewonlab3622beb2014-10-28 16:07:56 -0400782 else:
andrewonlababb11c32014-11-04 15:03:24 -0500783 main.log.info("Average port up device-to-ofp result"+
andrewonlab3622beb2014-10-28 16:07:56 -0400784 " exceeded the threshold: "+
785 str(pt_up_device_to_ofp_avg))
andrewonlab8d29f122014-10-22 17:15:04 -0400786
andrewonlab3622beb2014-10-28 16:07:56 -0400787 #END ITERATION FOR LOOP
andrewonlab8790abb2014-11-06 13:51:54 -0500788
789 #Check all list for latency existence and set assertion
790 if (port_down_graph_to_ofp_list and port_down_device_to_ofp_list\
791 and port_up_graph_to_ofp_list and port_up_device_to_ofp_list):
792 assertion = main.TRUE
793
andrewonlababb11c32014-11-04 15:03:24 -0500794 #Calculate and report latency measurements
andrewonlab3622beb2014-10-28 16:07:56 -0400795 port_down_graph_to_ofp_min = min(port_down_graph_to_ofp_list)
796 port_down_graph_to_ofp_max = max(port_down_graph_to_ofp_list)
797 port_down_graph_to_ofp_avg = \
798 (sum(port_down_graph_to_ofp_list) /
799 len(port_down_graph_to_ofp_list))
800
andrewonlabf9828f02014-11-10 14:50:27 -0500801 main.log.report("Port down graph-to-ofp Min: "+
802 str(port_down_graph_to_ofp_min)+" ms Max: "+
803 str(port_down_graph_to_ofp_max)+" ms Avg: "+
andrewonlab58f7d702014-11-07 13:21:19 -0500804 str(port_down_graph_to_ofp_avg)+" ms")
andrewonlababb11c32014-11-04 15:03:24 -0500805
806 port_down_device_to_ofp_min = min(port_down_device_to_ofp_list)
807 port_down_device_to_ofp_max = max(port_down_device_to_ofp_list)
808 port_down_device_to_ofp_avg = \
809 (sum(port_down_device_to_ofp_list) /\
810 len(port_down_device_to_ofp_list))
811
andrewonlabf9828f02014-11-10 14:50:27 -0500812 main.log.report("Port down device-to-ofp Min: "+
813 str(port_down_device_to_ofp_min)+" ms Max: "+
814 str(port_down_device_to_ofp_max)+" ms Avg: "+
andrewonlab58f7d702014-11-07 13:21:19 -0500815 str(port_down_device_to_ofp_avg)+" ms")
andrewonlababb11c32014-11-04 15:03:24 -0500816
817 port_up_graph_to_ofp_min = min(port_up_graph_to_ofp_list)
818 port_up_graph_to_ofp_max = max(port_up_graph_to_ofp_list)
819 port_up_graph_to_ofp_avg = \
820 (sum(port_up_graph_to_ofp_list) /\
821 len(port_up_graph_to_ofp_list))
andrewonlab8790abb2014-11-06 13:51:54 -0500822
andrewonlabf9828f02014-11-10 14:50:27 -0500823 main.log.report("Port up graph-to-ofp Min: "+
824 str(port_up_graph_to_ofp_min)+" ms Max: "+
825 str(port_up_graph_to_ofp_max)+" ms Avg: "+
andrewonlab58f7d702014-11-07 13:21:19 -0500826 str(port_up_graph_to_ofp_avg)+" ms")
andrewonlab8790abb2014-11-06 13:51:54 -0500827
828 port_up_device_to_ofp_min = min(port_up_device_to_ofp_list)
829 port_up_device_to_ofp_max = max(port_up_device_to_ofp_list)
830 port_up_device_to_ofp_avg = \
831 (sum(port_up_device_to_ofp_list) /\
832 len(port_up_device_to_ofp_list))
833
andrewonlabf9828f02014-11-10 14:50:27 -0500834 main.log.report("Port up device-to-ofp Min: "+
835 str(port_up_device_to_ofp_min)+" ms Max: "+
836 str(port_up_device_to_ofp_max)+" ms Avg: "+
andrewonlab58f7d702014-11-07 13:21:19 -0500837 str(port_up_device_to_ofp_avg)+" ms")
andrewonlab8790abb2014-11-06 13:51:54 -0500838
839 utilities.assert_equals(expect=main.TRUE, actual=assertion,
840 onpass="Port discovery latency calculation successful",
841 onfail="Port discovery test failed")
andrewonlababb11c32014-11-04 15:03:24 -0500842
andrewonlab3622beb2014-10-28 16:07:56 -0400843 def CASE4(self, main):
844 '''
845 Link down event using loss rate 100%
andrewonlab53b641c2014-10-31 19:44:44 -0400846
847 Important:
848 Use a simple 2 switch topology with 1 link between
849 the two switches. Ensure that mac addresses of the
850 switches are 1 / 2 respectively
andrewonlab3622beb2014-10-28 16:07:56 -0400851 '''
852 import time
853 import subprocess
854 import os
855 import requests
856 import json
857
858 ONOS1_ip = main.params['CTRL']['ip1']
859 ONOS2_ip = main.params['CTRL']['ip2']
860 ONOS3_ip = main.params['CTRL']['ip3']
861 ONOS_user = main.params['CTRL']['user']
862
863 default_sw_port = main.params['CTRL']['port1']
864
865 #Number of iterations of case
866 num_iter = main.params['TEST']['numIter']
867
868 #Timestamp 'keys' for json metrics output.
869 #These are subject to change, hence moved into params
870 deviceTimestamp = main.params['JSON']['deviceTimestamp']
871 linkTimestamp = main.params['JSON']['linkTimestamp']
andrewonlab53b641c2014-10-31 19:44:44 -0400872 graphTimestamp = main.params['JSON']['graphTimestamp']
andrewonlab58f7d702014-11-07 13:21:19 -0500873
874 debug_mode = main.params['TEST']['debugMode']
875
876 local_time = time.strftime('%x %X')
andrewonlabb1998c52014-11-10 13:31:43 -0500877 local_time = local_time.replace("/","")
878 local_time = local_time.replace(" ","_")
879 local_time = local_time.replace(":","")
andrewonlab58f7d702014-11-07 13:21:19 -0500880 if debug_mode == 'on':
881 main.ONOS1.tshark_pcap("eth0",
andrewonlabb1998c52014-11-10 13:31:43 -0500882 "/tmp/link_lat_pcap_"+local_time)
andrewonlab53b641c2014-10-31 19:44:44 -0400883
andrewonlabe5bcef92014-11-06 17:53:20 -0500884 #Threshold for this test case
885 up_threshold_str = main.params['TEST']['linkUpThreshold']
886 down_threshold_str = main.params['TEST']['linkDownThreshold']
887
888 up_threshold_obj = up_threshold_str.split(",")
889 down_threshold_obj = down_threshold_str.split(",")
890
891 up_threshold_min = int(up_threshold_obj[0])
892 up_threshold_max = int(up_threshold_obj[1])
893
894 down_threshold_min = int(down_threshold_obj[0])
895 down_threshold_max = int(down_threshold_obj[1])
896
andrewonlab3622beb2014-10-28 16:07:56 -0400897 assertion = main.TRUE
898 #Link event timestamp to system time list
899 link_down_link_to_system_list = []
900 link_up_link_to_system_list = []
901 #Graph event timestamp to system time list
902 link_down_graph_to_system_list = []
903 link_up_graph_to_system_list = []
904
andrewonlab4b5c8b92014-11-10 16:04:33 -0500905 main.log.report("Link up / down discovery latency between "+
andrewonlab3622beb2014-10-28 16:07:56 -0400906 "two switches")
andrewonlab4b5c8b92014-11-10 16:04:33 -0500907 main.log.report("Simulated by setting loss-rate 100%")
908 main.log.report("'tc qdisc add dev <intfs> root netem loss 100%'")
909 main.log.report("Total iterations of test: "+str(num_iter))
andrewonlab3622beb2014-10-28 16:07:56 -0400910
911 main.step("Assign all switches")
912 main.Mininet1.assign_sw_controller(sw="1",
913 ip1=ONOS1_ip, port1=default_sw_port)
914 main.Mininet1.assign_sw_controller(sw="2",
915 ip1=ONOS1_ip, port1=default_sw_port)
916
917 main.step("Verifying switch assignment")
918 result_s1 = main.Mininet1.get_sw_controller(sw="s1")
919 result_s2 = main.Mininet1.get_sw_controller(sw="s2")
andrewonlab3622beb2014-10-28 16:07:56 -0400920
921 #Allow time for events to finish before taking measurements
922 time.sleep(10)
923
andrewonlababb11c32014-11-04 15:03:24 -0500924 link_down1 = False
925 link_down2 = False
926 link_down3 = False
andrewonlab3622beb2014-10-28 16:07:56 -0400927 #Start iteration of link event test
928 for i in range(0, int(num_iter)):
929 main.step("Getting initial system time as t0")
andrewonlab8d29f122014-10-22 17:15:04 -0400930
andrewonlab3622beb2014-10-28 16:07:56 -0400931 timestamp_link_down_t0 = time.time() * 1000
932 #Link down is simulated by 100% loss rate using traffic
933 #control command
934 main.Mininet1.handle.sendline(
935 "sh tc qdisc add dev s1-eth1 root netem loss 100%")
936
andrewonlab53b641c2014-10-31 19:44:44 -0400937 #TODO: Iterate through 'links' command to verify that
andrewonlababb11c32014-11-04 15:03:24 -0500938 # link s1 -> s2 went down (loop timeout 30 seconds)
939 # on all 3 ONOS instances
andrewonlab53b641c2014-10-31 19:44:44 -0400940 main.log.info("Checking ONOS for link update")
941 loop_count = 0
andrewonlababb11c32014-11-04 15:03:24 -0500942 while( not (link_down1 and link_down2 and link_down3)\
943 and loop_count < 30 ):
944 json_str1 = main.ONOS1cli.links()
945 json_str2 = main.ONOS2cli.links()
946 json_str3 = main.ONOS3cli.links()
947
948 if not (json_str1 and json_str2 and json_str3):
949 main.log.error("CLI command returned error ")
andrewonlab53b641c2014-10-31 19:44:44 -0400950 break
951 else:
andrewonlababb11c32014-11-04 15:03:24 -0500952 json_obj1 = json.loads(json_str1)
953 json_obj2 = json.loads(json_str2)
954 json_obj3 = json.loads(json_str3)
955 for obj1 in json_obj1:
956 if '01' not in obj1['src']['device']:
957 link_down1 = True
andrewonlabf9828f02014-11-10 14:50:27 -0500958 main.log.info("Link down from "+
andrewonlababb11c32014-11-04 15:03:24 -0500959 "s1 -> s2 on ONOS1 detected")
960 for obj2 in json_obj2:
961 if '01' not in obj2['src']['device']:
962 link_down2 = True
andrewonlabf9828f02014-11-10 14:50:27 -0500963 main.log.info("Link down from "+
andrewonlababb11c32014-11-04 15:03:24 -0500964 "s1 -> s2 on ONOS2 detected")
965 for obj3 in json_obj3:
966 if '01' not in obj3['src']['device']:
967 link_down3 = True
andrewonlabf9828f02014-11-10 14:50:27 -0500968 main.log.info("Link down from "+
andrewonlababb11c32014-11-04 15:03:24 -0500969 "s1 -> s2 on ONOS3 detected")
970
andrewonlab53b641c2014-10-31 19:44:44 -0400971 loop_count += 1
andrewonlababb11c32014-11-04 15:03:24 -0500972 #If CLI doesn't like the continuous requests
973 #and exits in this loop, increase the sleep here.
974 #Consequently, while loop timeout will increase
andrewonlab53b641c2014-10-31 19:44:44 -0400975 time.sleep(1)
976
977 #Give time for metrics measurement to catch up
andrewonlababb11c32014-11-04 15:03:24 -0500978 #NOTE: May need to be configured more accurately
andrewonlab53b641c2014-10-31 19:44:44 -0400979 time.sleep(10)
andrewonlababb11c32014-11-04 15:03:24 -0500980 #If we exited the while loop and link down 1,2,3 are still
andrewonlab53b641c2014-10-31 19:44:44 -0400981 #false, then ONOS has failed to discover link down event
andrewonlababb11c32014-11-04 15:03:24 -0500982 if not (link_down1 and link_down2 and link_down3):
andrewonlab53b641c2014-10-31 19:44:44 -0400983 main.log.info("Link down discovery failed")
984
985 link_down_lat_graph1 = 0
986 link_down_lat_graph2 = 0
987 link_down_lat_graph3 = 0
988 link_down_lat_device1 = 0
989 link_down_lat_device2 = 0
990 link_down_lat_device3 = 0
991
992 assertion = main.FALSE
993 else:
994 json_topo_metrics_1 =\
995 main.ONOS1cli.topology_events_metrics()
996 json_topo_metrics_2 =\
997 main.ONOS2cli.topology_events_metrics()
998 json_topo_metrics_3 =\
999 main.ONOS3cli.topology_events_metrics()
1000 json_topo_metrics_1 = json.loads(json_topo_metrics_1)
1001 json_topo_metrics_2 = json.loads(json_topo_metrics_2)
1002 json_topo_metrics_3 = json.loads(json_topo_metrics_3)
1003
1004 main.log.info("Obtaining graph and device timestamp")
1005 graph_timestamp_1 = \
1006 json_topo_metrics_1[graphTimestamp]['value']
1007 graph_timestamp_2 = \
1008 json_topo_metrics_2[graphTimestamp]['value']
1009 graph_timestamp_3 = \
1010 json_topo_metrics_3[graphTimestamp]['value']
1011
1012 link_timestamp_1 = \
1013 json_topo_metrics_1[linkTimestamp]['value']
1014 link_timestamp_2 = \
1015 json_topo_metrics_2[linkTimestamp]['value']
1016 link_timestamp_3 = \
1017 json_topo_metrics_3[linkTimestamp]['value']
1018
1019 if graph_timestamp_1 and graph_timestamp_2 and\
1020 graph_timestamp_3 and link_timestamp_1 and\
1021 link_timestamp_2 and link_timestamp_3:
1022 link_down_lat_graph1 = int(graph_timestamp_1) -\
1023 timestamp_link_down_t0
1024 link_down_lat_graph2 = int(graph_timestamp_2) -\
1025 timestamp_link_down_t0
1026 link_down_lat_graph3 = int(graph_timestamp_3) -\
1027 timestamp_link_down_t0
1028
1029 link_down_lat_link1 = int(link_timestamp_1) -\
1030 timestamp_link_down_t0
1031 link_down_lat_link2 = int(link_timestamp_2) -\
1032 timestamp_link_down_t0
1033 link_down_lat_link3 = int(link_timestamp_3) -\
1034 timestamp_link_down_t0
1035 else:
1036 main.log.error("There was an error calculating"+
1037 " the delta for link down event")
1038 link_down_lat_graph1 = 0
1039 link_down_lat_graph2 = 0
1040 link_down_lat_graph3 = 0
1041
1042 link_down_lat_device1 = 0
1043 link_down_lat_device2 = 0
1044 link_down_lat_device3 = 0
1045
andrewonlabf9828f02014-11-10 14:50:27 -05001046 main.log.info("Link down latency ONOS1 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001047 str(i)+" (end-to-end): "+
andrewonlababb11c32014-11-04 15:03:24 -05001048 str(link_down_lat_graph1)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -05001049 main.log.info("Link down latency ONOS2 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001050 str(i)+" (end-to-end): "+
andrewonlababb11c32014-11-04 15:03:24 -05001051 str(link_down_lat_graph2)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -05001052 main.log.info("Link down latency ONOS3 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001053 str(i)+" (end-to-end): "+
andrewonlababb11c32014-11-04 15:03:24 -05001054 str(link_down_lat_graph3)+" ms")
andrewonlab4e124482014-11-04 13:37:25 -05001055
andrewonlabf9828f02014-11-10 14:50:27 -05001056 main.log.info("Link down latency ONOS1 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001057 str(i)+" (link-event-to-system-timestamp): "+
andrewonlababb11c32014-11-04 15:03:24 -05001058 str(link_down_lat_link1)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -05001059 main.log.info("Link down latency ONOS2 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001060 str(i)+" (link-event-to-system-timestamp): "+
andrewonlababb11c32014-11-04 15:03:24 -05001061 str(link_down_lat_link2)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -05001062 main.log.info("Link down latency ONOS3 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001063 str(i)+" (link-event-to-system-timestamp): "+
1064 str(link_down_lat_link3))
1065
1066 #Calculate avg of node calculations
1067 link_down_lat_graph_avg =\
andrewonlababb11c32014-11-04 15:03:24 -05001068 (link_down_lat_graph1 +
1069 link_down_lat_graph2 +
1070 link_down_lat_graph3) / 3.0
andrewonlab4e124482014-11-04 13:37:25 -05001071 link_down_lat_link_avg =\
andrewonlababb11c32014-11-04 15:03:24 -05001072 (link_down_lat_link1 +
1073 link_down_lat_link2 +
1074 link_down_lat_link3) / 3.0
andrewonlab53b641c2014-10-31 19:44:44 -04001075
andrewonlab4e124482014-11-04 13:37:25 -05001076 #Set threshold and append latency to list
andrewonlabe5bcef92014-11-06 17:53:20 -05001077 if link_down_lat_graph_avg > down_threshold_min and\
1078 link_down_lat_graph_avg < down_threshold_max:
andrewonlab4e124482014-11-04 13:37:25 -05001079 link_down_graph_to_system_list.append(
1080 link_down_lat_graph_avg)
andrewonlab8790abb2014-11-06 13:51:54 -05001081 else:
1082 main.log.info("Link down latency exceeded threshold")
1083 main.log.info("Results for iteration "+str(i)+
1084 "have been omitted")
andrewonlabe5bcef92014-11-06 17:53:20 -05001085 if link_down_lat_link_avg > down_threshold_min and\
1086 link_down_lat_link_avg < down_threshold_max:
andrewonlab4e124482014-11-04 13:37:25 -05001087 link_down_link_to_system_list.append(
1088 link_down_lat_link_avg)
andrewonlab8790abb2014-11-06 13:51:54 -05001089 else:
1090 main.log.info("Link down latency exceeded threshold")
1091 main.log.info("Results for iteration "+str(i)+
1092 "have been omitted")
andrewonlab53b641c2014-10-31 19:44:44 -04001093
1094 #NOTE: To remove loss rate and measure latency:
1095 # 'sh tc qdisc del dev s1-eth1 root'
andrewonlababb11c32014-11-04 15:03:24 -05001096 timestamp_link_up_t0 = time.time() * 1000
andrewonlab53b641c2014-10-31 19:44:44 -04001097 main.Mininet1.handle.sendline("sh tc qdisc del dev "+
1098 "s1-eth1 root")
1099 main.Mininet1.handle.expect("mininet>")
andrewonlababb11c32014-11-04 15:03:24 -05001100
1101 main.log.info("Checking ONOS for link update")
1102
1103 link_down1 = True
1104 link_down2 = True
1105 link_down3 = True
1106 loop_count = 0
1107 while( (link_down1 and link_down2 and link_down3)\
1108 and loop_count < 30 ):
1109 json_str1 = main.ONOS1cli.links()
1110 json_str2 = main.ONOS2cli.links()
1111 json_str3 = main.ONOS3cli.links()
1112 if not (json_str1 and json_str2 and json_str3):
1113 main.log.error("CLI command returned error ")
1114 break
1115 else:
1116 json_obj1 = json.loads(json_str1)
1117 json_obj2 = json.loads(json_str2)
1118 json_obj3 = json.loads(json_str3)
1119
1120 for obj1 in json_obj1:
1121 if '01' in obj1['src']['device']:
1122 link_down1 = False
andrewonlabf9828f02014-11-10 14:50:27 -05001123 main.log.info("Link up from "+
andrewonlababb11c32014-11-04 15:03:24 -05001124 "s1 -> s2 on ONOS1 detected")
1125 for obj2 in json_obj2:
1126 if '01' in obj2['src']['device']:
1127 link_down2 = False
andrewonlabf9828f02014-11-10 14:50:27 -05001128 main.log.info("Link up from "+
andrewonlababb11c32014-11-04 15:03:24 -05001129 "s1 -> s2 on ONOS2 detected")
1130 for obj3 in json_obj3:
1131 if '01' in obj3['src']['device']:
1132 link_down3 = False
andrewonlabf9828f02014-11-10 14:50:27 -05001133 main.log.info("Link up from "+
andrewonlababb11c32014-11-04 15:03:24 -05001134 "s1 -> s2 on ONOS3 detected")
1135
1136 loop_count += 1
1137 time.sleep(1)
1138
1139 if (link_down1 and link_down2 and link_down3):
1140 main.log.info("Link up discovery failed")
1141
1142 link_up_lat_graph1 = 0
1143 link_up_lat_graph2 = 0
1144 link_up_lat_graph3 = 0
1145 link_up_lat_device1 = 0
1146 link_up_lat_device2 = 0
1147 link_up_lat_device3 = 0
1148
1149 assertion = main.FALSE
1150 else:
1151 json_topo_metrics_1 =\
1152 main.ONOS1cli.topology_events_metrics()
1153 json_topo_metrics_2 =\
1154 main.ONOS2cli.topology_events_metrics()
1155 json_topo_metrics_3 =\
1156 main.ONOS3cli.topology_events_metrics()
1157 json_topo_metrics_1 = json.loads(json_topo_metrics_1)
1158 json_topo_metrics_2 = json.loads(json_topo_metrics_2)
1159 json_topo_metrics_3 = json.loads(json_topo_metrics_3)
1160
1161 main.log.info("Obtaining graph and device timestamp")
1162 graph_timestamp_1 = \
1163 json_topo_metrics_1[graphTimestamp]['value']
1164 graph_timestamp_2 = \
1165 json_topo_metrics_2[graphTimestamp]['value']
1166 graph_timestamp_3 = \
1167 json_topo_metrics_3[graphTimestamp]['value']
1168
1169 link_timestamp_1 = \
1170 json_topo_metrics_1[linkTimestamp]['value']
1171 link_timestamp_2 = \
1172 json_topo_metrics_2[linkTimestamp]['value']
1173 link_timestamp_3 = \
1174 json_topo_metrics_3[linkTimestamp]['value']
1175
1176 if graph_timestamp_1 and graph_timestamp_2 and\
1177 graph_timestamp_3 and link_timestamp_1 and\
1178 link_timestamp_2 and link_timestamp_3:
1179 link_up_lat_graph1 = int(graph_timestamp_1) -\
1180 timestamp_link_up_t0
1181 link_up_lat_graph2 = int(graph_timestamp_2) -\
1182 timestamp_link_up_t0
1183 link_up_lat_graph3 = int(graph_timestamp_3) -\
1184 timestamp_link_up_t0
1185
1186 link_up_lat_link1 = int(link_timestamp_1) -\
1187 timestamp_link_up_t0
1188 link_up_lat_link2 = int(link_timestamp_2) -\
1189 timestamp_link_up_t0
1190 link_up_lat_link3 = int(link_timestamp_3) -\
1191 timestamp_link_up_t0
1192 else:
1193 main.log.error("There was an error calculating"+
1194 " the delta for link down event")
1195 link_up_lat_graph1 = 0
1196 link_up_lat_graph2 = 0
1197 link_up_lat_graph3 = 0
1198
1199 link_up_lat_device1 = 0
1200 link_up_lat_device2 = 0
1201 link_up_lat_device3 = 0
andrewonlab58f7d702014-11-07 13:21:19 -05001202
1203 if debug_mode == 'on':
1204 main.log.info("Link up latency ONOS1 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001205 str(i)+" (end-to-end): "+
1206 str(link_up_lat_graph1)+" ms")
andrewonlab58f7d702014-11-07 13:21:19 -05001207 main.log.info("Link up latency ONOS2 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001208 str(i)+" (end-to-end): "+
1209 str(link_up_lat_graph2)+" ms")
andrewonlab58f7d702014-11-07 13:21:19 -05001210 main.log.info("Link up latency ONOS3 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001211 str(i)+" (end-to-end): "+
1212 str(link_up_lat_graph3)+" ms")
1213
andrewonlab58f7d702014-11-07 13:21:19 -05001214 main.log.info("Link up latency ONOS1 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001215 str(i)+" (link-event-to-system-timestamp): "+
1216 str(link_up_lat_link1)+" ms")
andrewonlab58f7d702014-11-07 13:21:19 -05001217 main.log.info("Link up latency ONOS2 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001218 str(i)+" (link-event-to-system-timestamp): "+
1219 str(link_up_lat_link2)+" ms")
andrewonlab58f7d702014-11-07 13:21:19 -05001220 main.log.info("Link up latency ONOS3 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001221 str(i)+" (link-event-to-system-timestamp): "+
1222 str(link_up_lat_link3))
1223
1224 #Calculate avg of node calculations
1225 link_up_lat_graph_avg =\
1226 (link_up_lat_graph1 +
1227 link_up_lat_graph2 +
andrewonlabf9828f02014-11-10 14:50:27 -05001228 link_up_lat_graph3) / 3
andrewonlababb11c32014-11-04 15:03:24 -05001229 link_up_lat_link_avg =\
1230 (link_up_lat_link1 +
1231 link_up_lat_link2 +
andrewonlabf9828f02014-11-10 14:50:27 -05001232 link_up_lat_link3) / 3
andrewonlababb11c32014-11-04 15:03:24 -05001233
1234 #Set threshold and append latency to list
andrewonlabe5bcef92014-11-06 17:53:20 -05001235 if link_up_lat_graph_avg > up_threshold_min and\
1236 link_up_lat_graph_avg < up_threshold_max:
andrewonlababb11c32014-11-04 15:03:24 -05001237 link_up_graph_to_system_list.append(
1238 link_up_lat_graph_avg)
andrewonlab8790abb2014-11-06 13:51:54 -05001239 else:
1240 main.log.info("Link up latency exceeded threshold")
1241 main.log.info("Results for iteration "+str(i)+
1242 "have been omitted")
andrewonlabe5bcef92014-11-06 17:53:20 -05001243 if link_up_lat_link_avg > up_threshold_min and\
1244 link_up_lat_link_avg < up_threshold_max:
andrewonlababb11c32014-11-04 15:03:24 -05001245 link_up_link_to_system_list.append(
1246 link_up_lat_link_avg)
andrewonlab8790abb2014-11-06 13:51:54 -05001247 else:
1248 main.log.info("Link up latency exceeded threshold")
1249 main.log.info("Results for iteration "+str(i)+
1250 "have been omitted")
andrewonlab53b641c2014-10-31 19:44:44 -04001251
andrewonlab4e124482014-11-04 13:37:25 -05001252 #Calculate min, max, avg of list and report
1253 link_down_min = min(link_down_graph_to_system_list)
1254 link_down_max = max(link_down_graph_to_system_list)
1255 link_down_avg = sum(link_down_graph_to_system_list) / \
1256 len(link_down_graph_to_system_list)
andrewonlababb11c32014-11-04 15:03:24 -05001257 link_up_min = min(link_up_graph_to_system_list)
1258 link_up_max = max(link_up_graph_to_system_list)
1259 link_up_avg = sum(link_up_graph_to_system_list) / \
1260 len(link_up_graph_to_system_list)
1261
andrewonlabf9828f02014-11-10 14:50:27 -05001262 main.log.report("Link down latency - Min: "+
1263 str(link_down_min)+" ms Max: "+
1264 str(link_down_max)+" ms Avg: "+
andrewonlab58f7d702014-11-07 13:21:19 -05001265 str(link_down_avg)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -05001266 main.log.report("Link up latency - Min: "+
1267 str(link_up_min)+" ms Max: "+
1268 str(link_up_max)+" ms Avg: "+
andrewonlab58f7d702014-11-07 13:21:19 -05001269 str(link_up_avg)+" ms")
andrewonlab4e124482014-11-04 13:37:25 -05001270
andrewonlab8790abb2014-11-06 13:51:54 -05001271 utilities.assert_equals(expect=main.TRUE, actual=assertion,
1272 onpass="Link discovery latency calculation successful",
1273 onfail="Link discovery latency case failed")
1274
andrewonlabb54b85b2014-10-28 18:43:57 -04001275 def CASE5(self, main):
1276 '''
1277 100 Switch discovery latency
1278
1279 Important:
andrewonlab16ce4852014-10-30 13:41:09 -04001280 This test case can be potentially dangerous if
1281 your machine has previously set iptables rules.
1282 One of the steps of the test case will flush
1283 all existing iptables rules.
andrewonlab8790abb2014-11-06 13:51:54 -05001284 Note:
1285 You can specify the number of switches in the
1286 params file to adjust the switch discovery size
1287 (and specify the corresponding topology in Mininet1
1288 .topo file)
andrewonlabb54b85b2014-10-28 18:43:57 -04001289 '''
1290 import time
1291 import subprocess
1292 import os
1293 import requests
1294 import json
1295
1296 ONOS1_ip = main.params['CTRL']['ip1']
1297 ONOS2_ip = main.params['CTRL']['ip2']
1298 ONOS3_ip = main.params['CTRL']['ip3']
1299 MN1_ip = main.params['MN']['ip1']
1300 ONOS_user = main.params['CTRL']['user']
1301
1302 default_sw_port = main.params['CTRL']['port1']
1303
1304 #Number of iterations of case
1305 num_iter = main.params['TEST']['numIter']
andrewonlab16ce4852014-10-30 13:41:09 -04001306 num_sw = main.params['TEST']['numSwitch']
1307
andrewonlabb54b85b2014-10-28 18:43:57 -04001308 #Timestamp 'keys' for json metrics output.
1309 #These are subject to change, hence moved into params
1310 deviceTimestamp = main.params['JSON']['deviceTimestamp']
andrewonlab16ce4852014-10-30 13:41:09 -04001311 graphTimestamp = main.params['JSON']['graphTimestamp']
andrewonlab58f7d702014-11-07 13:21:19 -05001312
1313 debug_mode = main.params['TEST']['debugMode']
1314
andrewonlabb1998c52014-11-10 13:31:43 -05001315 local_time = time.strftime('%X')
1316 local_time = local_time.replace("/","")
1317 local_time = local_time.replace(" ","_")
1318 local_time = local_time.replace(":","")
andrewonlab58f7d702014-11-07 13:21:19 -05001319 if debug_mode == 'on':
1320 main.ONOS1.tshark_pcap("eth0",
andrewonlabb1998c52014-11-10 13:31:43 -05001321 "/tmp/100_sw_lat_pcap_"+local_time)
andrewonlabe5bcef92014-11-06 17:53:20 -05001322
1323 #Threshold for this test case
1324 sw_disc_threshold_str = main.params['TEST']['swDisc100Threshold']
1325 sw_disc_threshold_obj = sw_disc_threshold_str.split(",")
1326 sw_disc_threshold_min = int(sw_disc_threshold_obj[0])
1327 sw_disc_threshold_max = int(sw_disc_threshold_obj[1])
1328
andrewonlab53b641c2014-10-31 19:44:44 -04001329 tshark_ofp_output = "/tmp/tshark_ofp_"+num_sw+"sw.txt"
1330 tshark_tcp_output = "/tmp/tshark_tcp_"+num_sw+"sw.txt"
1331
1332 tshark_ofp_result_list = []
1333 tshark_tcp_result_list = []
andrewonlabb54b85b2014-10-28 18:43:57 -04001334
andrewonlabe5bcef92014-11-06 17:53:20 -05001335 sw_discovery_lat_list = []
1336
andrewonlab16ce4852014-10-30 13:41:09 -04001337 main.case(num_sw+" Switch discovery latency")
andrewonlabb54b85b2014-10-28 18:43:57 -04001338 main.step("Assigning all switches to ONOS1")
andrewonlab16ce4852014-10-30 13:41:09 -04001339 for i in range(1, int(num_sw)+1):
andrewonlabb54b85b2014-10-28 18:43:57 -04001340 main.Mininet1.assign_sw_controller(
1341 sw=str(i),
1342 ip1=ONOS1_ip,
1343 port1=default_sw_port)
andrewonlab16ce4852014-10-30 13:41:09 -04001344
andrewonlabb54b85b2014-10-28 18:43:57 -04001345 #Ensure that nodes are configured with ptpd
andrewonlab16ce4852014-10-30 13:41:09 -04001346 #Just a warning message
1347 main.log.info("Please check ptpd configuration to ensure"+\
1348 " All nodes' system times are in sync")
1349 time.sleep(5)
andrewonlabb54b85b2014-10-28 18:43:57 -04001350
1351 for i in range(0, int(num_iter)):
andrewonlab8d29f122014-10-22 17:15:04 -04001352
andrewonlabb54b85b2014-10-28 18:43:57 -04001353 main.step("Set iptables rule to block incoming sw connections")
1354 #Set iptables rule to block incoming switch connections
andrewonlab53b641c2014-10-31 19:44:44 -04001355 #The rule description is as follows:
1356 # Append to INPUT rule,
1357 # behavior DROP that matches following:
1358 # * packet type: tcp
1359 # * source IP: MN1_ip
1360 # * destination PORT: 6633
andrewonlabb54b85b2014-10-28 18:43:57 -04001361 main.ONOS1.handle.sendline(
andrewonlab16ce4852014-10-30 13:41:09 -04001362 "sudo iptables -A INPUT -p tcp -s "+MN1_ip+
andrewonlabb54b85b2014-10-28 18:43:57 -04001363 " --dport "+default_sw_port+" -j DROP")
1364 main.ONOS1.handle.expect("\$")
andrewonlab53b641c2014-10-31 19:44:44 -04001365 # Append to OUTPUT rule,
1366 # behavior DROP that matches following:
1367 # * packet type: tcp
1368 # * source IP: MN1_ip
1369 # * destination PORT: 6633
1370 main.ONOS1.handle.sendline(
1371 "sudo iptables -A OUTPUT -p tcp -s "+MN1_ip+
1372 " --dport "+default_sw_port+" -j DROP")
1373 main.ONOS1.handle.expect("\$")
andrewonlabb54b85b2014-10-28 18:43:57 -04001374 #Give time to allow rule to take effect
andrewonlab8790abb2014-11-06 13:51:54 -05001375 #NOTE: Sleep period may need to be configured
1376 # based on the number of switches in the topology
andrewonlab16ce4852014-10-30 13:41:09 -04001377 main.log.info("Please wait for switch connection to "+
1378 "time out")
1379 time.sleep(60)
1380
1381 #Gather vendor OFP with tshark
1382 main.ONOS1.tshark_grep("OFP 86 Vendor",
1383 tshark_ofp_output)
andrewonlab53b641c2014-10-31 19:44:44 -04001384 main.ONOS1.tshark_grep("TCP 74 ",
1385 tshark_tcp_output)
andrewonlabb54b85b2014-10-28 18:43:57 -04001386
andrewonlab16ce4852014-10-30 13:41:09 -04001387 #NOTE: Remove all iptables rule quickly (flush)
andrewonlabb54b85b2014-10-28 18:43:57 -04001388 # Before removal, obtain TestON timestamp at which
andrewonlab16ce4852014-10-30 13:41:09 -04001389 # removal took place
1390 # (ensuring nodes are configured via ptp)
andrewonlabb54b85b2014-10-28 18:43:57 -04001391 # sudo iptables -F
andrewonlab16ce4852014-10-30 13:41:09 -04001392
1393 t0_system = time.time() * 1000
1394 main.ONOS1.handle.sendline(
1395 "sudo iptables -F")
andrewonlabb54b85b2014-10-28 18:43:57 -04001396
andrewonlab16ce4852014-10-30 13:41:09 -04001397 #Counter to track loop count
1398 counter_loop = 0
1399 counter_avail1 = 0
1400 counter_avail2 = 0
1401 counter_avail3 = 0
1402 onos1_dev = False
1403 onos2_dev = False
1404 onos3_dev = False
1405 while counter_loop < 60:
1406 #Continue to check devices for all device
1407 #availability. When all devices in all 3
1408 #ONOS instances indicate that devices are available
1409 #obtain graph event timestamp for t1.
1410 device_str_obj1 = main.ONOS1cli.devices()
1411 device_str_obj2 = main.ONOS2cli.devices()
1412 device_str_obj3 = main.ONOS3cli.devices()
1413
1414 device_json1 = json.loads(device_str_obj1)
1415 device_json2 = json.loads(device_str_obj2)
1416 device_json3 = json.loads(device_str_obj3)
1417
1418 for device1 in device_json1:
1419 if device1['available'] == True:
1420 counter_avail1 += 1
1421 if counter_avail1 == int(num_sw):
1422 onos1_dev = True
1423 main.log.info("All devices have been "+
1424 "discovered on ONOS1")
1425 else:
1426 counter_avail1 = 0
1427 for device2 in device_json2:
1428 if device2['available'] == True:
1429 counter_avail2 += 1
1430 if counter_avail2 == int(num_sw):
1431 onos2_dev = True
1432 main.log.info("All devices have been "+
1433 "discovered on ONOS2")
1434 else:
1435 counter_avail2 = 0
1436 for device3 in device_json3:
1437 if device3['available'] == True:
1438 counter_avail3 += 1
1439 if counter_avail3 == int(num_sw):
1440 onos3_dev = True
1441 main.log.info("All devices have been "+
1442 "discovered on ONOS3")
1443 else:
1444 counter_avail3 = 0
1445
1446 if onos1_dev and onos2_dev and onos3_dev:
1447 main.log.info("All devices have been discovered "+
1448 "on all ONOS instances")
1449 json_str_topology_metrics_1 =\
1450 main.ONOS1cli.topology_events_metrics()
1451 json_str_topology_metrics_2 =\
1452 main.ONOS2cli.topology_events_metrics()
1453 json_str_topology_metrics_3 =\
1454 main.ONOS3cli.topology_events_metrics()
andrewonlab53b641c2014-10-31 19:44:44 -04001455
1456 #Exit while loop if all devices discovered
andrewonlab16ce4852014-10-30 13:41:09 -04001457 break
1458
1459 counter_loop += 1
1460 #Give some time in between CLI calls
1461 #(will not affect measurement)
1462 time.sleep(3)
1463
1464 main.ONOS1.tshark_stop()
1465
1466 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
1467 tshark_ofp_output+" /tmp/")
andrewonlab53b641c2014-10-31 19:44:44 -04001468 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
1469 tshark_tcp_output+" /tmp/")
andrewonlab16ce4852014-10-30 13:41:09 -04001470
andrewonlab16ce4852014-10-30 13:41:09 -04001471 #TODO: Automate OFP output analysis
andrewonlab58f7d702014-11-07 13:21:19 -05001472 #Debug mode - print out packets captured at runtime
1473 if debug_mode == 'on':
1474 ofp_file = open(tshark_ofp_output, 'r')
1475 main.log.info("Tshark OFP Vendor output: ")
1476 for line in ofp_file:
1477 tshark_ofp_result_list.append(line)
andrewonlabe5bcef92014-11-06 17:53:20 -05001478 main.log.info(line)
andrewonlab58f7d702014-11-07 13:21:19 -05001479 ofp_file.close()
andrewonlab16ce4852014-10-30 13:41:09 -04001480
andrewonlab58f7d702014-11-07 13:21:19 -05001481 tcp_file = open(tshark_tcp_output, 'r')
1482 main.log.info("Tshark TCP 74 output: ")
1483 for line in tcp_file:
1484 tshark_tcp_result_list.append(line)
andrewonlabe5bcef92014-11-06 17:53:20 -05001485 main.log.info(line)
andrewonlab58f7d702014-11-07 13:21:19 -05001486 tcp_file.close()
andrewonlab53b641c2014-10-31 19:44:44 -04001487
andrewonlab16ce4852014-10-30 13:41:09 -04001488 json_obj_1 = json.loads(json_str_topology_metrics_1)
1489 json_obj_2 = json.loads(json_str_topology_metrics_2)
1490 json_obj_3 = json.loads(json_str_topology_metrics_3)
1491
1492 graph_timestamp_1 = \
1493 json_obj_1[graphTimestamp]['value']
1494 graph_timestamp_2 = \
1495 json_obj_2[graphTimestamp]['value']
1496 graph_timestamp_3 = \
1497 json_obj_3[graphTimestamp]['value']
1498
andrewonlabe5bcef92014-11-06 17:53:20 -05001499 graph_lat_1 = int(graph_timestamp_1) - int(t0_system)
1500 graph_lat_2 = int(graph_timestamp_2) - int(t0_system)
1501 graph_lat_3 = int(graph_timestamp_3) - int(t0_system)
andrewonlab16ce4852014-10-30 13:41:09 -04001502
andrewonlabe5bcef92014-11-06 17:53:20 -05001503 avg_graph_lat = \
1504 (int(graph_lat_1) +\
1505 int(graph_lat_2) +\
1506 int(graph_lat_3)) / 3
1507
1508 if avg_graph_lat > sw_disc_threshold_min \
1509 and avg_graph_lat < sw_disc_threshold_max:
1510 sw_discovery_lat_list.append(
1511 avg_graph_lat)
1512 else:
1513 main.log.info("100 Switch discovery latency "+
1514 "exceeded the threshold.")
1515
1516 #END ITERATION FOR LOOP
andrewonlab16ce4852014-10-30 13:41:09 -04001517
andrewonlabe5bcef92014-11-06 17:53:20 -05001518 sw_lat_min = min(sw_discovery_lat_list)
1519 sw_lat_max = max(sw_discovery_lat_list)
1520 sw_lat_avg = sum(sw_discovery_lat_list) /\
1521 len(sw_discovery_lat_list)
andrewonlab16ce4852014-10-30 13:41:09 -04001522
andrewonlabf9828f02014-11-10 14:50:27 -05001523 main.log.report("100 Switch discovery lat "+\
1524 "Min: "+str(sw_lat_min)+" ms"+\
1525 "Max: "+str(sw_lat_max)+" ms"+\
1526 "Avg: "+str(sw_lat_avg)+" ms")
andrewonlab16ce4852014-10-30 13:41:09 -04001527
andrewonlabb54b85b2014-10-28 18:43:57 -04001528