blob: fe1a51641873ff7d8cf0143c102831cbfbd2001d [file] [log] [blame]
andrewonlab2a6c9342014-10-16 13:40:15 -04001#TopoPerfNext
2#
3#Topology Performance test for ONOS-next
4#
5#andrew@onlab.us
andrewonlab4f50ec92014-11-11 14:24:45 -05006#
7#If your machine does not come with numpy
8#run the following command:
9#sudo apt-get install python-numpy python-scipy
andrewonlab2a6c9342014-10-16 13:40:15 -040010
11import time
12import sys
13import os
14import re
15
16class TopoPerfNext:
17 def __init__(self):
18 self.default = ''
19
20 def CASE1(self, main):
21 '''
22 ONOS startup sequence
23 '''
andrewonlabe9fb6722014-10-24 12:20:35 -040024 import time
25
andrewonlab2a6c9342014-10-16 13:40:15 -040026 cell_name = main.params['ENV']['cellName']
27
28 git_pull = main.params['GIT']['autoPull']
29 checkout_branch = main.params['GIT']['checkout']
30
31 ONOS1_ip = main.params['CTRL']['ip1']
andrewonlabba44bcf2014-10-16 16:54:41 -040032 ONOS2_ip = main.params['CTRL']['ip2']
33 ONOS3_ip = main.params['CTRL']['ip3']
andrewonlab6c8bbeb2014-11-14 12:43:48 -050034
35 #### Hardcoded ONOS nodes particular to my env ####
36 ONOS4_ip = "10.128.174.4"
37 ONOS5_ip = "10.128.174.5"
38 ONOS6_ip = "10.128.174.6"
39 ONOS7_ip = "10.128.174.7"
40 #### ####
41
andrewonlab2a6c9342014-10-16 13:40:15 -040042 MN1_ip = main.params['MN']['ip1']
43 BENCH_ip = main.params['BENCH']['ip']
44
45 main.case("Setting up test environment")
andrewonlabf9828f02014-11-10 14:50:27 -050046 main.log.report("Setting up test environment")
andrewonlab2a6c9342014-10-16 13:40:15 -040047
andrewonlab6c8bbeb2014-11-14 12:43:48 -050048 main.step("Cleaning previously installed ONOS if any")
49 main.ONOSbench.onos_uninstall(node_ip=ONOS4_ip)
50 main.ONOSbench.onos_uninstall(node_ip=ONOS5_ip)
51 main.ONOSbench.onos_uninstall(node_ip=ONOS6_ip)
52 main.ONOSbench.onos_uninstall(node_ip=ONOS7_ip)
53
54 #NOTE: This step may be removed after proper
55 # copy cat log functionality
56 main.step("Removing copy-cat files from ONOS nodes")
57 main.ONOS1.handle.sendline("sudo rm /tmp/onos-copy-cat*")
58 main.ONOS2.handle.sendline("sudo rm /tmp/onos-copy-cat*")
59 main.ONOS3.handle.sendline("sudo rm /tmp/onos-copy-cat*")
60
andrewonlab2a6c9342014-10-16 13:40:15 -040061 main.step("Creating cell file")
62 cell_file_result = main.ONOSbench.create_cell_file(
andrewonlabe6745342014-10-17 14:29:13 -040063 BENCH_ip, cell_name, MN1_ip, "onos-core",
andrewonlabba44bcf2014-10-16 16:54:41 -040064 ONOS1_ip, ONOS2_ip, ONOS3_ip)
andrewonlab2a6c9342014-10-16 13:40:15 -040065
66 main.step("Applying cell file to environment")
67 cell_apply_result = main.ONOSbench.set_cell(cell_name)
68 verify_cell_result = main.ONOSbench.verify_cell()
69
70 main.step("Git checkout and pull "+checkout_branch)
71 if git_pull == 'on':
72 checkout_result = \
73 main.ONOSbench.git_checkout(checkout_branch)
74 pull_result = main.ONOSbench.git_pull()
75 else:
76 checkout_result = main.TRUE
77 pull_result = main.TRUE
78 main.log.info("Skipped git checkout and pull")
79
80 main.step("Using mvn clean & install")
andrewonlab8d29f122014-10-22 17:15:04 -040081 #mvn_result = main.ONOSbench.clean_install()
82 mvn_result = main.TRUE
andrewonlab2a6c9342014-10-16 13:40:15 -040083
andrewonlabb1998c52014-11-10 13:31:43 -050084 main.step("Set cell for ONOS cli env")
85 main.ONOS1cli.set_cell(cell_name)
86 main.ONOS2cli.set_cell(cell_name)
87 main.ONOS3cli.set_cell(cell_name)
88
andrewonlab2a6c9342014-10-16 13:40:15 -040089 main.step("Creating ONOS package")
90 package_result = main.ONOSbench.onos_package()
91
92 main.step("Installing ONOS package")
andrewonlabe9fb6722014-10-24 12:20:35 -040093 install1_result = main.ONOSbench.onos_install(node=ONOS1_ip)
94 install2_result = main.ONOSbench.onos_install(node=ONOS2_ip)
95 install3_result = main.ONOSbench.onos_install(node=ONOS3_ip)
andrewonlab2a6c9342014-10-16 13:40:15 -040096
andrewonlabe9fb6722014-10-24 12:20:35 -040097 time.sleep(10)
98
andrewonlab867212a2014-10-22 20:13:38 -040099 main.step("Start onos cli")
andrewonlabe9fb6722014-10-24 12:20:35 -0400100 cli1 = main.ONOS1cli.start_onos_cli(ONOS1_ip)
101 cli2 = main.ONOS2cli.start_onos_cli(ONOS2_ip)
102 cli3 = main.ONOS3cli.start_onos_cli(ONOS3_ip)
103
andrewonlab867212a2014-10-22 20:13:38 -0400104 main.step("Enable metrics feature")
andrewonlabb1998c52014-11-10 13:31:43 -0500105 main.ONOS1cli.feature_install("onos-app-metrics")
106 main.ONOS2cli.feature_install("onos-app-metrics")
107 main.ONOS3cli.feature_install("onos-app-metrics")
andrewonlab867212a2014-10-22 20:13:38 -0400108
andrewonlab2a6c9342014-10-16 13:40:15 -0400109 utilities.assert_equals(expect=main.TRUE,
110 actual= cell_file_result and cell_apply_result and\
111 verify_cell_result and checkout_result and\
112 pull_result and mvn_result and\
andrewonlabe9fb6722014-10-24 12:20:35 -0400113 install1_result and install2_result and\
114 install3_result,
andrewonlabf9828f02014-11-10 14:50:27 -0500115 onpass="Test Environment setup successful",
116 onfail="Failed to setup test environment")
andrewonlab2a6c9342014-10-16 13:40:15 -0400117
andrewonlabba44bcf2014-10-16 16:54:41 -0400118 def CASE2(self, main):
119 '''
120 Assign s1 to ONOS1 and measure latency
andrewonlab3a7c3c72014-10-24 17:21:03 -0400121
122 There are 4 levels of latency measurements to this test:
123 1) End-to-end measurement: Complete end-to-end measurement
124 from TCP (SYN/ACK) handshake to Graph change
125 2) OFP-to-graph measurement: 'ONOS processing' snippet of
126 measurement from OFP Vendor message to Graph change
127 3) OFP-to-device measurement: 'ONOS processing without
128 graph change' snippet of measurement from OFP vendor
129 message to Device change timestamp
130 4) T0-to-device measurement: Measurement that includes
131 the switch handshake to devices timestamp without
132 the graph view change. (TCP handshake -> Device
133 change)
andrewonlabba44bcf2014-10-16 16:54:41 -0400134 '''
135 import time
andrewonlabe6745342014-10-17 14:29:13 -0400136 import subprocess
137 import json
138 import requests
139 import os
andrewonlab4f50ec92014-11-11 14:24:45 -0500140 import numpy
andrewonlabba44bcf2014-10-16 16:54:41 -0400141
142 ONOS1_ip = main.params['CTRL']['ip1']
143 ONOS2_ip = main.params['CTRL']['ip2']
144 ONOS3_ip = main.params['CTRL']['ip3']
andrewonlabe6745342014-10-17 14:29:13 -0400145 ONOS_user = main.params['CTRL']['user']
146
andrewonlabba44bcf2014-10-16 16:54:41 -0400147 default_sw_port = main.params['CTRL']['port1']
148
149 #Number of iterations of case
150 num_iter = main.params['TEST']['numIter']
andrewonlab4b5c8b92014-11-10 16:04:33 -0500151 #Number of first 'x' iterations to ignore:
152 iter_ignore = int(main.params['TEST']['iterIgnore'])
153
andrewonlab226024e2014-10-24 16:01:32 -0400154 #Timestamp 'keys' for json metrics output.
155 #These are subject to change, hence moved into params
156 deviceTimestamp = main.params['JSON']['deviceTimestamp']
157 graphTimestamp = main.params['JSON']['graphTimestamp']
158
andrewonlab58f7d702014-11-07 13:21:19 -0500159 debug_mode = main.params['TEST']['debugMode']
andrewonlabb1998c52014-11-10 13:31:43 -0500160 onos_log = main.params['TEST']['onosLogFile']
andrewonlab58f7d702014-11-07 13:21:19 -0500161
andrewonlabe5bcef92014-11-06 17:53:20 -0500162 #Threshold for the test
163 threshold_str = main.params['TEST']['singleSwThreshold']
164 threshold_obj = threshold_str.split(",")
165 threshold_min = int(threshold_obj[0])
166 threshold_max = int(threshold_obj[1])
167
andrewonlab226024e2014-10-24 16:01:32 -0400168 #List of switch add latency collected from
169 #all iterations
170 latency_end_to_end_list = []
171 latency_ofp_to_graph_list = []
172 latency_ofp_to_device_list = []
173 latency_t0_to_device_list = []
andrewonlab65d73892014-11-10 17:36:00 -0500174 latency_tcp_to_ofp_list = []
andrewonlab226024e2014-10-24 16:01:32 -0400175
andrewonlabba44bcf2014-10-16 16:54:41 -0400176 #Directory/file to store tshark results
177 tshark_of_output = "/tmp/tshark_of_topo.txt"
178 tshark_tcp_output = "/tmp/tshark_tcp_topo.txt"
179
180 #String to grep in tshark output
181 tshark_tcp_string = "TCP 74 "+default_sw_port
182 tshark_of_string = "OFP 86 Vendor"
andrewonlabe6745342014-10-17 14:29:13 -0400183
184 #Initialize assertion to TRUE
185 assertion = main.TRUE
andrewonlab58f7d702014-11-07 13:21:19 -0500186
187 local_time = time.strftime('%x %X')
andrewonlabb1998c52014-11-10 13:31:43 -0500188 local_time = local_time.replace("/","")
189 local_time = local_time.replace(" ","_")
190 local_time = local_time.replace(":","")
andrewonlab58f7d702014-11-07 13:21:19 -0500191 if debug_mode == 'on':
192 main.ONOS1.tshark_pcap("eth0",
andrewonlabb1998c52014-11-10 13:31:43 -0500193 "/tmp/single_sw_lat_pcap_"+local_time)
194
195 main.log.info("TEST")
andrewonlab58f7d702014-11-07 13:21:19 -0500196
andrewonlab4b5c8b92014-11-10 16:04:33 -0500197 main.log.report("Latency of adding one switch to controller")
198 main.log.report("First "+str(iter_ignore)+" iterations ignored"+
199 " for jvm warmup time")
200 main.log.report("Total iterations of test: "+str(num_iter))
andrewonlabba44bcf2014-10-16 16:54:41 -0400201
202 for i in range(0, int(num_iter)):
203 main.log.info("Starting tshark capture")
204
205 #* TCP [ACK, SYN] is used as t0_a, the
206 # very first "exchange" between ONOS and
207 # the switch for end-to-end measurement
208 #* OFP [Stats Reply] is used for t0_b
209 # the very last OFP message between ONOS
210 # and the switch for ONOS measurement
211 main.ONOS1.tshark_grep(tshark_tcp_string,
212 tshark_tcp_output)
213 main.ONOS1.tshark_grep(tshark_of_string,
214 tshark_of_output)
215
216 #Wait and ensure tshark is started and
217 #capturing
218 time.sleep(10)
219
220 main.log.info("Assigning s1 to controller")
221
222 main.Mininet1.assign_sw_controller(sw="1",
223 ip1=ONOS1_ip, port1=default_sw_port)
224
225 #Wait and ensure switch is assigned
226 #before stopping tshark
andrewonlab867212a2014-10-22 20:13:38 -0400227 time.sleep(30)
andrewonlab226024e2014-10-24 16:01:32 -0400228
229 main.log.info("Stopping all Tshark processes")
andrewonlabba44bcf2014-10-16 16:54:41 -0400230 main.ONOS1.stop_tshark()
231
andrewonlabe6745342014-10-17 14:29:13 -0400232 #tshark output is saved in ONOS. Use subprocess
233 #to copy over files to TestON for parsing
234 main.log.info("Copying over tshark files")
235
236 #TCP CAPTURE ****
andrewonlab8d29f122014-10-22 17:15:04 -0400237 #Copy the tshark output from ONOS machine to
238 #TestON machine in tshark_tcp_output directory>file
239 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
240 tshark_tcp_output+" /tmp/")
241 tcp_file = open(tshark_tcp_output, 'r')
242 temp_text = tcp_file.readline()
andrewonlabe6745342014-10-17 14:29:13 -0400243 temp_text = temp_text.split(" ")
andrewonlabba44bcf2014-10-16 16:54:41 -0400244
andrewonlabe6745342014-10-17 14:29:13 -0400245 main.log.info("Object read in from TCP capture: "+
246 str(temp_text))
andrewonlab867212a2014-10-22 20:13:38 -0400247 if len(temp_text) > 1:
andrewonlab3a7c3c72014-10-24 17:21:03 -0400248 t0_tcp = float(temp_text[1])*1000.0
andrewonlabe6745342014-10-17 14:29:13 -0400249 else:
250 main.log.error("Tshark output file for TCP"+
251 " returned unexpected results")
252 t0_tcp = 0
253 assertion = main.FALSE
andrewonlab8d29f122014-10-22 17:15:04 -0400254
255 tcp_file.close()
andrewonlabe6745342014-10-17 14:29:13 -0400256 #****************
andrewonlabba44bcf2014-10-16 16:54:41 -0400257
andrewonlabe6745342014-10-17 14:29:13 -0400258 #OF CAPTURE ****
andrewonlab8d29f122014-10-22 17:15:04 -0400259 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
260 tshark_of_output+" /tmp/")
261 of_file = open(tshark_of_output, 'r')
262
263 line_ofp = ""
andrewonlab226024e2014-10-24 16:01:32 -0400264 #Read until last line of file
andrewonlabe6745342014-10-17 14:29:13 -0400265 while True:
andrewonlab8d29f122014-10-22 17:15:04 -0400266 temp_text = of_file.readline()
267 if temp_text !='':
andrewonlabe6745342014-10-17 14:29:13 -0400268 line_ofp = temp_text
269 else:
270 break
271 obj = line_ofp.split(" ")
272
273 main.log.info("Object read in from OFP capture: "+
274 str(line_ofp))
275
andrewonlab867212a2014-10-22 20:13:38 -0400276 if len(line_ofp) > 1:
andrewonlab3a7c3c72014-10-24 17:21:03 -0400277 t0_ofp = float(obj[1])*1000.0
andrewonlabe6745342014-10-17 14:29:13 -0400278 else:
279 main.log.error("Tshark output file for OFP"+
280 " returned unexpected results")
281 t0_ofp = 0
282 assertion = main.FALSE
andrewonlab8d29f122014-10-22 17:15:04 -0400283
284 of_file.close()
andrewonlabe6745342014-10-17 14:29:13 -0400285 #****************
286
andrewonlab867212a2014-10-22 20:13:38 -0400287 json_str_1 = main.ONOS1cli.topology_events_metrics()
288 json_str_2 = main.ONOS2cli.topology_events_metrics()
289 json_str_3 = main.ONOS3cli.topology_events_metrics()
andrewonlab867212a2014-10-22 20:13:38 -0400290
291 json_obj_1 = json.loads(json_str_1)
292 json_obj_2 = json.loads(json_str_2)
293 json_obj_3 = json.loads(json_str_3)
294
andrewonlab226024e2014-10-24 16:01:32 -0400295 #Obtain graph timestamp. This timestsamp captures
296 #the epoch time at which the topology graph was updated.
297 graph_timestamp_1 = \
298 json_obj_1[graphTimestamp]['value']
299 graph_timestamp_2 = \
300 json_obj_2[graphTimestamp]['value']
301 graph_timestamp_3 = \
302 json_obj_3[graphTimestamp]['value']
andrewonlab867212a2014-10-22 20:13:38 -0400303
andrewonlab226024e2014-10-24 16:01:32 -0400304 #Obtain device timestamp. This timestamp captures
305 #the epoch time at which the device event happened
306 device_timestamp_1 = \
307 json_obj_1[deviceTimestamp]['value']
308 device_timestamp_2 = \
309 json_obj_2[deviceTimestamp]['value']
310 device_timestamp_3 = \
311 json_obj_3[deviceTimestamp]['value']
andrewonlabe9fb6722014-10-24 12:20:35 -0400312
andrewonlab226024e2014-10-24 16:01:32 -0400313 #t0 to device processing latency
314 delta_device_1 = int(device_timestamp_1) - int(t0_tcp)
315 delta_device_2 = int(device_timestamp_2) - int(t0_tcp)
316 delta_device_3 = int(device_timestamp_3) - int(t0_tcp)
317
318 #Get average of delta from all instances
319 avg_delta_device = \
320 (int(delta_device_1)+\
321 int(delta_device_2)+\
322 int(delta_device_3)) / 3
andrewonlabba44bcf2014-10-16 16:54:41 -0400323
andrewonlab226024e2014-10-24 16:01:32 -0400324 #Ensure avg delta meets the threshold before appending
andrewonlab4b5c8b92014-11-10 16:04:33 -0500325 if avg_delta_device > 0.0 and avg_delta_device < 10000\
andrewonlab65d73892014-11-10 17:36:00 -0500326 and int(i) > iter_ignore:
andrewonlab226024e2014-10-24 16:01:32 -0400327 latency_t0_to_device_list.append(avg_delta_device)
andrewonlabee4efeb2014-10-24 16:44:51 -0400328 else:
andrewonlab09d973e2014-10-24 18:56:58 -0400329 main.log.info("Results for t0-to-device ignored"+\
andrewonlab4b5c8b92014-11-10 16:04:33 -0500330 "due to excess in threshold / warmup iteration.")
andrewonlabee4efeb2014-10-24 16:44:51 -0400331
andrewonlab226024e2014-10-24 16:01:32 -0400332 #t0 to graph processing latency (end-to-end)
333 delta_graph_1 = int(graph_timestamp_1) - int(t0_tcp)
334 delta_graph_2 = int(graph_timestamp_2) - int(t0_tcp)
335 delta_graph_3 = int(graph_timestamp_3) - int(t0_tcp)
336
337 #Get average of delta from all instances
338 avg_delta_graph = \
339 (int(delta_graph_1)+\
340 int(delta_graph_2)+\
341 int(delta_graph_3)) / 3
342
andrewonlab226024e2014-10-24 16:01:32 -0400343 #Ensure avg delta meets the threshold before appending
andrewonlab4b5c8b92014-11-10 16:04:33 -0500344 if avg_delta_graph > 0.0 and avg_delta_graph < 10000\
andrewonlab65d73892014-11-10 17:36:00 -0500345 and int(i) > iter_ignore:
andrewonlab09d973e2014-10-24 18:56:58 -0400346 latency_end_to_end_list.append(avg_delta_graph)
andrewonlabee4efeb2014-10-24 16:44:51 -0400347 else:
andrewonlab09d973e2014-10-24 18:56:58 -0400348 main.log.info("Results for end-to-end ignored"+\
349 "due to excess in threshold")
andrewonlab226024e2014-10-24 16:01:32 -0400350
351 #ofp to graph processing latency (ONOS processing)
352 delta_ofp_graph_1 = int(graph_timestamp_1) - int(t0_ofp)
353 delta_ofp_graph_2 = int(graph_timestamp_2) - int(t0_ofp)
354 delta_ofp_graph_3 = int(graph_timestamp_3) - int(t0_ofp)
355
356 avg_delta_ofp_graph = \
357 (int(delta_ofp_graph_1)+\
358 int(delta_ofp_graph_2)+\
359 int(delta_ofp_graph_3)) / 3
360
andrewonlabe5bcef92014-11-06 17:53:20 -0500361 if avg_delta_ofp_graph > threshold_min \
andrewonlab4b5c8b92014-11-10 16:04:33 -0500362 and avg_delta_ofp_graph < threshold_max\
andrewonlab65d73892014-11-10 17:36:00 -0500363 and int(i) > iter_ignore:
andrewonlab226024e2014-10-24 16:01:32 -0400364 latency_ofp_to_graph_list.append(avg_delta_ofp_graph)
andrewonlabee4efeb2014-10-24 16:44:51 -0400365 else:
andrewonlab09d973e2014-10-24 18:56:58 -0400366 main.log.info("Results for ofp-to-graph "+\
367 "ignored due to excess in threshold")
andrewonlabee4efeb2014-10-24 16:44:51 -0400368
andrewonlab226024e2014-10-24 16:01:32 -0400369 #ofp to device processing latency (ONOS processing)
andrewonlabee4efeb2014-10-24 16:44:51 -0400370 delta_ofp_device_1 = float(device_timestamp_1) - float(t0_ofp)
371 delta_ofp_device_2 = float(device_timestamp_2) - float(t0_ofp)
372 delta_ofp_device_3 = float(device_timestamp_3) - float(t0_ofp)
andrewonlab226024e2014-10-24 16:01:32 -0400373
374 avg_delta_ofp_device = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400375 (float(delta_ofp_device_1)+\
376 float(delta_ofp_device_2)+\
andrewonlab4b5c8b92014-11-10 16:04:33 -0500377 float(delta_ofp_device_3)) / 3
andrewonlab226024e2014-10-24 16:01:32 -0400378
andrewonlabf47993a2014-10-24 17:56:01 -0400379 #NOTE: ofp - delta measurements are occasionally negative
380 # due to system time misalignment.
andrewonlabf47993a2014-10-24 17:56:01 -0400381 latency_ofp_to_device_list.append(avg_delta_ofp_device)
andrewonlabba44bcf2014-10-16 16:54:41 -0400382
andrewonlab65d73892014-11-10 17:36:00 -0500383 delta_ofp_tcp = int(t0_ofp) - int(t0_tcp)
384 if delta_ofp_tcp > threshold_min \
385 and delta_ofp_tcp < threshold_max and\
386 int(i) > iter_ignore:
387 latency_tcp_to_ofp_list.append(delta_ofp_tcp)
388 else:
389 main.log.info("Results fo tcp-to-ofp "+\
390 "ignored due to excess in threshold")
391
andrewonlabe6745342014-10-17 14:29:13 -0400392 #TODO:
393 #Fetch logs upon threshold excess
andrewonlabba44bcf2014-10-16 16:54:41 -0400394
andrewonlab226024e2014-10-24 16:01:32 -0400395 main.log.info("ONOS1 delta end-to-end: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400396 str(delta_graph_1) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400397 main.log.info("ONOS2 delta end-to-end: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400398 str(delta_graph_2) + " ms")
399 main.log.info("ONOS3 delta end-to-end: "+
400 str(delta_graph_3) + " ms")
andrewonlabba44bcf2014-10-16 16:54:41 -0400401
andrewonlab226024e2014-10-24 16:01:32 -0400402 main.log.info("ONOS1 delta OFP - graph: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400403 str(delta_ofp_graph_1) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400404 main.log.info("ONOS2 delta OFP - graph: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400405 str(delta_ofp_graph_2) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400406 main.log.info("ONOS3 delta OFP - graph: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400407 str(delta_ofp_graph_3) + " ms")
andrewonlabe6745342014-10-17 14:29:13 -0400408
andrewonlab226024e2014-10-24 16:01:32 -0400409 main.log.info("ONOS1 delta device - t0: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400410 str(delta_device_1) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400411 main.log.info("ONOS2 delta device - t0: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400412 str(delta_device_2) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400413 main.log.info("ONOS3 delta device - t0: "+
andrewonlab09d973e2014-10-24 18:56:58 -0400414 str(delta_device_3) + " ms")
andrewonlab65d73892014-11-10 17:36:00 -0500415
416 main.log.info("TCP to OFP delta: "+
417 str(delta_ofp_tcp) + " ms")
andrewonlab8790abb2014-11-06 13:51:54 -0500418 #main.log.info("ONOS1 delta OFP - device: "+
419 # str(delta_ofp_device_1) + " ms")
420 #main.log.info("ONOS2 delta OFP - device: "+
421 # str(delta_ofp_device_2) + " ms")
422 #main.log.info("ONOS3 delta OFP - device: "+
423 # str(delta_ofp_device_3) + " ms")
andrewonlab226024e2014-10-24 16:01:32 -0400424
andrewonlab8d29f122014-10-22 17:15:04 -0400425 main.step("Remove switch from controller")
426 main.Mininet1.delete_sw_controller("s1")
andrewonlabba44bcf2014-10-16 16:54:41 -0400427
andrewonlab8d29f122014-10-22 17:15:04 -0400428 time.sleep(5)
andrewonlabba44bcf2014-10-16 16:54:41 -0400429
andrewonlab09d973e2014-10-24 18:56:58 -0400430 #END of for loop iteration
andrewonlabf47993a2014-10-24 17:56:01 -0400431
andrewonlabee4efeb2014-10-24 16:44:51 -0400432 #If there is at least 1 element in each list,
andrewonlabc15c9582014-10-24 16:35:52 -0400433 #pass the test case
434 if len(latency_end_to_end_list) > 0 and\
435 len(latency_ofp_to_graph_list) > 0 and\
436 len(latency_ofp_to_device_list) > 0 and\
andrewonlab65d73892014-11-10 17:36:00 -0500437 len(latency_t0_to_device_list) > 0 and\
438 len(latency_tcp_to_ofp_list) > 0:
andrewonlabc15c9582014-10-24 16:35:52 -0400439 assertion = main.TRUE
andrewonlabf47993a2014-10-24 17:56:01 -0400440 elif len(latency_end_to_end_list) == 0:
441 #The appending of 0 here is to prevent
442 #the min,max,sum functions from failing
443 #below
444 latency_end_to_end_list.append(0)
445 assertion = main.FALSE
446 elif len(latency_ofp_to_graph_list) == 0:
447 latency_ofp_to_graph_list.append(0)
448 assertion = main.FALSE
449 elif len(latency_ofp_to_device_list) == 0:
450 latency_ofp_to_device_list.append(0)
451 assertion = main.FALSE
452 elif len(latency_t0_to_device_list) == 0:
453 latency_t0_to_device_list.append(0)
454 assertion = main.FALSE
andrewonlab65d73892014-11-10 17:36:00 -0500455 elif len(latency_tcp_to_ofp_list) == 0:
456 latency_tcp_to_ofp_list.append(0)
457 assertion = main.FALSE
andrewonlabc15c9582014-10-24 16:35:52 -0400458
459 #Calculate min, max, avg of latency lists
460 latency_end_to_end_max = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400461 int(max(latency_end_to_end_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400462 latency_end_to_end_min = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400463 int(min(latency_end_to_end_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400464 latency_end_to_end_avg = \
andrewonlabc90667c2014-10-24 16:48:28 -0400465 (int(sum(latency_end_to_end_list)) / \
andrewonlabc15c9582014-10-24 16:35:52 -0400466 len(latency_end_to_end_list))
andrewonlab69864162014-11-11 16:28:48 -0500467 latency_end_to_end_std_dev = \
468 str(round(numpy.std(latency_end_to_end_list),1))
469
andrewonlabc15c9582014-10-24 16:35:52 -0400470 latency_ofp_to_graph_max = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400471 int(max(latency_ofp_to_graph_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400472 latency_ofp_to_graph_min = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400473 int(min(latency_ofp_to_graph_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400474 latency_ofp_to_graph_avg = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400475 (int(sum(latency_ofp_to_graph_list)) / \
andrewonlabc15c9582014-10-24 16:35:52 -0400476 len(latency_ofp_to_graph_list))
andrewonlab69864162014-11-11 16:28:48 -0500477 latency_ofp_to_graph_std_dev = \
478 str(round(numpy.std(latency_ofp_to_graph_list),1))
andrewonlabc15c9582014-10-24 16:35:52 -0400479
480 latency_ofp_to_device_max = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400481 int(max(latency_ofp_to_device_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400482 latency_ofp_to_device_min = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400483 int(min(latency_ofp_to_device_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400484 latency_ofp_to_device_avg = \
andrewonlabee4efeb2014-10-24 16:44:51 -0400485 (int(sum(latency_ofp_to_device_list)) / \
andrewonlabc15c9582014-10-24 16:35:52 -0400486 len(latency_ofp_to_device_list))
andrewonlab69864162014-11-11 16:28:48 -0500487 latency_ofp_to_device_std_dev = \
488 str(round(numpy.std(latency_ofp_to_device_list),1))
andrewonlabc15c9582014-10-24 16:35:52 -0400489
490 latency_t0_to_device_max = \
andrewonlab4b5c8b92014-11-10 16:04:33 -0500491 int(max(latency_t0_to_device_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400492 latency_t0_to_device_min = \
andrewonlab4b5c8b92014-11-10 16:04:33 -0500493 int(min(latency_t0_to_device_list))
andrewonlabc15c9582014-10-24 16:35:52 -0400494 latency_t0_to_device_avg = \
andrewonlab4b5c8b92014-11-10 16:04:33 -0500495 (int(sum(latency_t0_to_device_list)) / \
andrewonlab69864162014-11-11 16:28:48 -0500496 len(latency_t0_to_device_list))
497 latency_ofp_to_device_std_dev = \
498 str(round(numpy.std(latency_t0_to_device_list),1))
andrewonlabc15c9582014-10-24 16:35:52 -0400499
andrewonlab65d73892014-11-10 17:36:00 -0500500 latency_tcp_to_ofp_max = \
501 int(max(latency_tcp_to_ofp_list))
502 latency_tcp_to_ofp_min = \
503 int(min(latency_tcp_to_ofp_list))
504 latency_tcp_to_ofp_avg = \
505 (int(sum(latency_tcp_to_ofp_list)) / \
506 len(latency_tcp_to_ofp_list))
andrewonlab69864162014-11-11 16:28:48 -0500507 latency_tcp_to_ofp_std_dev = \
508 str(round(numpy.std(latency_tcp_to_ofp_list),1))
andrewonlab65d73892014-11-10 17:36:00 -0500509
andrewonlabf9828f02014-11-10 14:50:27 -0500510 main.log.report("Switch add - End-to-end latency: "+\
andrewonlab4f50ec92014-11-11 14:24:45 -0500511 "Avg: "+str(latency_end_to_end_avg)+" ms "+
andrewonlab69864162014-11-11 16:28:48 -0500512 "Std Deviation: "+latency_end_to_end_std_dev+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -0500513 main.log.report("Switch add - OFP-to-Graph latency: "+\
andrewonlab4f50ec92014-11-11 14:24:45 -0500514 "Avg: "+str(latency_ofp_to_graph_avg)+" ms "+
andrewonlab69864162014-11-11 16:28:48 -0500515 "Std Deviation: "+latency_ofp_to_graph_std_dev+" ms")
andrewonlab65d73892014-11-10 17:36:00 -0500516 main.log.report("Switch add - TCP-to-OFP latency: "+\
andrewonlab4f50ec92014-11-11 14:24:45 -0500517 "Avg: "+str(latency_tcp_to_ofp_avg)+" ms "+
andrewonlab69864162014-11-11 16:28:48 -0500518 "Std Deviation: "+latency_tcp_to_ofp_std_dev+" ms")
andrewonlab226024e2014-10-24 16:01:32 -0400519
andrewonlabb1998c52014-11-10 13:31:43 -0500520 if debug_mode == 'on':
521 main.ONOS1.cp_logs_to_dir("/opt/onos/log/karaf.log",
522 "/tmp/", copy_file_name="sw_lat_karaf")
523
andrewonlab8d29f122014-10-22 17:15:04 -0400524 utilities.assert_equals(expect=main.TRUE, actual=assertion,
525 onpass="Switch latency test successful",
526 onfail="Switch latency test failed")
andrewonlabba44bcf2014-10-16 16:54:41 -0400527
andrewonlab8d29f122014-10-22 17:15:04 -0400528 def CASE3(self, main):
529 '''
530 Bring port up / down and measure latency.
531 Port enable / disable is simulated by ifconfig up / down
andrewonlab393531a2014-10-27 18:36:26 -0400532
533 In ONOS-next, we must ensure that the port we are
534 manipulating is connected to another switch with a valid
535 connection. Otherwise, graph view will not be updated.
andrewonlab8d29f122014-10-22 17:15:04 -0400536 '''
537 import time
538 import subprocess
539 import os
540 import requests
541 import json
andrewonlab4f50ec92014-11-11 14:24:45 -0500542 import numpy
andrewonlab2a6c9342014-10-16 13:40:15 -0400543
andrewonlab8d29f122014-10-22 17:15:04 -0400544 ONOS1_ip = main.params['CTRL']['ip1']
andrewonlab393531a2014-10-27 18:36:26 -0400545 ONOS2_ip = main.params['CTRL']['ip2']
546 ONOS3_ip = main.params['CTRL']['ip3']
andrewonlab8d29f122014-10-22 17:15:04 -0400547 ONOS_user = main.params['CTRL']['user']
andrewonlab8d29f122014-10-22 17:15:04 -0400548
andrewonlab393531a2014-10-27 18:36:26 -0400549 default_sw_port = main.params['CTRL']['port1']
andrewonlab8790abb2014-11-06 13:51:54 -0500550
551 assertion = main.TRUE
andrewonlab393531a2014-10-27 18:36:26 -0400552 #Number of iterations of case
553 num_iter = main.params['TEST']['numIter']
554
555 #Timestamp 'keys' for json metrics output.
556 #These are subject to change, hence moved into params
557 deviceTimestamp = main.params['JSON']['deviceTimestamp']
558 graphTimestamp = main.params['JSON']['graphTimestamp']
andrewonlab58f7d702014-11-07 13:21:19 -0500559
560 debug_mode = main.params['TEST']['debugMode']
561
562 local_time = time.strftime('%x %X')
andrewonlabb1998c52014-11-10 13:31:43 -0500563 local_time = local_time.replace("/","")
564 local_time = local_time.replace(" ","_")
565 local_time = local_time.replace(":","")
andrewonlab58f7d702014-11-07 13:21:19 -0500566 if debug_mode == 'on':
567 main.ONOS1.tshark_pcap("eth0",
andrewonlabb1998c52014-11-10 13:31:43 -0500568 "/tmp/port_lat_pcap_"+local_time)
andrewonlab393531a2014-10-27 18:36:26 -0400569
andrewonlabe5bcef92014-11-06 17:53:20 -0500570 #Threshold for this test case
571 up_threshold_str = main.params['TEST']['portUpThreshold']
572 down_threshold_str = main.params['TEST']['portDownThreshold']
andrewonlabb1998c52014-11-10 13:31:43 -0500573
andrewonlabe5bcef92014-11-06 17:53:20 -0500574 up_threshold_obj = up_threshold_str.split(",")
575 down_threshold_obj = down_threshold_str.split(",")
576
577 up_threshold_min = int(up_threshold_obj[0])
578 up_threshold_max = int(up_threshold_obj[1])
579
580 down_threshold_min = int(down_threshold_obj[0])
581 down_threshold_max = int(down_threshold_obj[1])
582
andrewonlab393531a2014-10-27 18:36:26 -0400583 #NOTE: Some hardcoded variables you may need to configure
584 # besides the params
585
andrewonlab8d29f122014-10-22 17:15:04 -0400586 tshark_port_status = "OFP 130 Port Status"
587
588 tshark_port_up = "/tmp/tshark_port_up.txt"
589 tshark_port_down = "/tmp/tshark_port_down.txt"
andrewonlab393531a2014-10-27 18:36:26 -0400590 interface_config = "s1-eth1"
andrewonlab8d29f122014-10-22 17:15:04 -0400591
592 main.log.report("Port enable / disable latency")
andrewonlab4b5c8b92014-11-10 16:04:33 -0500593 main.log.report("Simulated by ifconfig up / down")
594 main.log.report("Total iterations of test: "+str(num_iter))
andrewonlab8d29f122014-10-22 17:15:04 -0400595
andrewonlab393531a2014-10-27 18:36:26 -0400596 main.step("Assign switches s1 and s2 to controller 1")
andrewonlab8d29f122014-10-22 17:15:04 -0400597 main.Mininet1.assign_sw_controller(sw="1",ip1=ONOS1_ip,
598 port1=default_sw_port)
andrewonlab393531a2014-10-27 18:36:26 -0400599 main.Mininet1.assign_sw_controller(sw="2",ip1=ONOS1_ip,
600 port1=default_sw_port)
andrewonlab8d29f122014-10-22 17:15:04 -0400601
andrewonlab8790abb2014-11-06 13:51:54 -0500602 #Give enough time for metrics to propagate the
603 #assign controller event. Otherwise, these events may
604 #carry over to our measurements
andrewonlabb1998c52014-11-10 13:31:43 -0500605 time.sleep(15)
andrewonlab8d29f122014-10-22 17:15:04 -0400606
andrewonlab393531a2014-10-27 18:36:26 -0400607 port_up_device_to_ofp_list = []
608 port_up_graph_to_ofp_list = []
609 port_down_device_to_ofp_list = []
610 port_down_graph_to_ofp_list = []
611
andrewonlab8d29f122014-10-22 17:15:04 -0400612 for i in range(0, int(num_iter)):
613 main.step("Starting wireshark capture for port status down")
614 main.ONOS1.tshark_grep(tshark_port_status,
615 tshark_port_down)
616
andrewonlabb1998c52014-11-10 13:31:43 -0500617 time.sleep(5)
andrewonlab8d29f122014-10-22 17:15:04 -0400618
andrewonlab393531a2014-10-27 18:36:26 -0400619 #Disable interface that is connected to switch 2
620 main.step("Disable port: "+interface_config)
andrewonlabb1998c52014-11-10 13:31:43 -0500621 main.Mininet1.handle.sendline("sh ifconfig "+
andrewonlab393531a2014-10-27 18:36:26 -0400622 interface_config+" down")
andrewonlabb1998c52014-11-10 13:31:43 -0500623 main.Mininet1.handle.expect("mininet>")
andrewonlab8d29f122014-10-22 17:15:04 -0400624
andrewonlabb1998c52014-11-10 13:31:43 -0500625 time.sleep(3)
andrewonlab8d29f122014-10-22 17:15:04 -0400626 main.ONOS1.tshark_stop()
andrewonlabb1998c52014-11-10 13:31:43 -0500627
628 main.step("Obtain t1 by metrics call")
629 json_str_up_1 = main.ONOS1cli.topology_events_metrics()
630 json_str_up_2 = main.ONOS2cli.topology_events_metrics()
631 json_str_up_3 = main.ONOS3cli.topology_events_metrics()
632
633 json_obj_1 = json.loads(json_str_up_1)
634 json_obj_2 = json.loads(json_str_up_2)
635 json_obj_3 = json.loads(json_str_up_3)
andrewonlab8d29f122014-10-22 17:15:04 -0400636
637 #Copy tshark output file from ONOS to TestON instance
638 #/tmp directory
639 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
640 tshark_port_down+" /tmp/")
641
642 f_port_down = open(tshark_port_down, 'r')
andrewonlab393531a2014-10-27 18:36:26 -0400643 #Get first line of port down event from tshark
andrewonlab8d29f122014-10-22 17:15:04 -0400644 f_line = f_port_down.readline()
645 obj_down = f_line.split(" ")
646 if len(f_line) > 0:
andrewonlabb1998c52014-11-10 13:31:43 -0500647 timestamp_begin_pt_down = int(float(obj_down[1])*1000)
andrewonlab393531a2014-10-27 18:36:26 -0400648 main.log.info("Port down begin timestamp: "+
649 str(timestamp_begin_pt_down))
andrewonlab8d29f122014-10-22 17:15:04 -0400650 else:
651 main.log.info("Tshark output file returned unexpected"+
andrewonlab393531a2014-10-27 18:36:26 -0400652 " results: "+str(obj_down))
andrewonlab8d29f122014-10-22 17:15:04 -0400653 timestamp_begin_pt_down = 0
andrewonlab393531a2014-10-27 18:36:26 -0400654
655 f_port_down.close()
andrewonlab8d29f122014-10-22 17:15:04 -0400656
andrewonlab4e124482014-11-04 13:37:25 -0500657 main.log.info("TEST tshark obj: "+str(obj_down))
658
andrewonlabb1998c52014-11-10 13:31:43 -0500659 time.sleep(3)
andrewonlab393531a2014-10-27 18:36:26 -0400660
661 #Obtain graph timestamp. This timestsamp captures
662 #the epoch time at which the topology graph was updated.
663 graph_timestamp_1 = \
664 json_obj_1[graphTimestamp]['value']
665 graph_timestamp_2 = \
666 json_obj_2[graphTimestamp]['value']
667 graph_timestamp_3 = \
668 json_obj_3[graphTimestamp]['value']
669
andrewonlabb1998c52014-11-10 13:31:43 -0500670 main.log.info("TEST graph timestamp ONOS1: "+
671 str(graph_timestamp_1))
672
andrewonlab393531a2014-10-27 18:36:26 -0400673 #Obtain device timestamp. This timestamp captures
674 #the epoch time at which the device event happened
675 device_timestamp_1 = \
676 json_obj_1[deviceTimestamp]['value']
677 device_timestamp_2 = \
678 json_obj_2[deviceTimestamp]['value']
679 device_timestamp_3 = \
680 json_obj_3[deviceTimestamp]['value']
andrewonlab393531a2014-10-27 18:36:26 -0400681
682 #Get delta between graph event and OFP
683 pt_down_graph_to_ofp_1 = int(graph_timestamp_1) -\
684 int(timestamp_begin_pt_down)
685 pt_down_graph_to_ofp_2 = int(graph_timestamp_2) -\
686 int(timestamp_begin_pt_down)
687 pt_down_graph_to_ofp_3 = int(graph_timestamp_3) -\
688 int(timestamp_begin_pt_down)
689
690 #Get delta between device event and OFP
691 pt_down_device_to_ofp_1 = int(device_timestamp_1) -\
692 int(timestamp_begin_pt_down)
693 pt_down_device_to_ofp_2 = int(device_timestamp_2) -\
694 int(timestamp_begin_pt_down)
695 pt_down_device_to_ofp_3 = int(device_timestamp_3) -\
696 int(timestamp_begin_pt_down)
697
698 #Caluclate average across clusters
699 pt_down_graph_to_ofp_avg =\
700 (int(pt_down_graph_to_ofp_1) +
701 int(pt_down_graph_to_ofp_2) +
andrewonlabf9828f02014-11-10 14:50:27 -0500702 int(pt_down_graph_to_ofp_3)) / 3
andrewonlab393531a2014-10-27 18:36:26 -0400703 pt_down_device_to_ofp_avg = \
704 (int(pt_down_device_to_ofp_1) +
705 int(pt_down_device_to_ofp_2) +
andrewonlabf9828f02014-11-10 14:50:27 -0500706 int(pt_down_device_to_ofp_3)) / 3
andrewonlab393531a2014-10-27 18:36:26 -0400707
andrewonlabb1998c52014-11-10 13:31:43 -0500708 if pt_down_graph_to_ofp_avg > down_threshold_min and \
709 pt_down_graph_to_ofp_avg < down_threshold_max:
andrewonlab393531a2014-10-27 18:36:26 -0400710 port_down_graph_to_ofp_list.append(
andrewonlababb11c32014-11-04 15:03:24 -0500711 pt_down_graph_to_ofp_avg)
712 main.log.info("Port down: graph to ofp avg: "+
713 str(pt_down_graph_to_ofp_avg) + " ms")
andrewonlab393531a2014-10-27 18:36:26 -0400714 else:
715 main.log.info("Average port down graph-to-ofp result" +
716 " exceeded the threshold: "+
717 str(pt_down_graph_to_ofp_avg))
718
andrewonlab3622beb2014-10-28 16:07:56 -0400719 if pt_down_device_to_ofp_avg > 0 and \
720 pt_down_device_to_ofp_avg < 1000:
721 port_down_device_to_ofp_list.append(
andrewonlababb11c32014-11-04 15:03:24 -0500722 pt_down_device_to_ofp_avg)
723 main.log.info("Port down: device to ofp avg: "+
724 str(pt_down_device_to_ofp_avg) + " ms")
andrewonlab3622beb2014-10-28 16:07:56 -0400725 else:
726 main.log.info("Average port down device-to-ofp result" +
727 " exceeded the threshold: "+
728 str(pt_down_device_to_ofp_avg))
729
andrewonlab8d29f122014-10-22 17:15:04 -0400730 #Port up events
731 main.step("Enable port and obtain timestamp")
732 main.step("Starting wireshark capture for port status up")
andrewonlabb1998c52014-11-10 13:31:43 -0500733 main.ONOS1.tshark_grep(tshark_port_status, tshark_port_up)
andrewonlab8790abb2014-11-06 13:51:54 -0500734 time.sleep(5)
andrewonlab8d29f122014-10-22 17:15:04 -0400735
andrewonlabb1998c52014-11-10 13:31:43 -0500736 main.Mininet1.handle.sendline("sh ifconfig "+
andrewonlab393531a2014-10-27 18:36:26 -0400737 interface_config+" up")
andrewonlabb1998c52014-11-10 13:31:43 -0500738 main.Mininet1.handle.expect("mininet>")
andrewonlab8790abb2014-11-06 13:51:54 -0500739
andrewonlabb1998c52014-11-10 13:31:43 -0500740 #Allow time for tshark to capture event
741 time.sleep(3)
andrewonlab8790abb2014-11-06 13:51:54 -0500742 main.ONOS1.tshark_stop()
andrewonlab8d29f122014-10-22 17:15:04 -0400743
andrewonlabb1998c52014-11-10 13:31:43 -0500744 #Obtain metrics shortly afterwards
745 #This timestsamp captures
746 #the epoch time at which the topology graph was updated.
747 main.step("Obtain t1 by REST call")
748 json_str_up_1 = main.ONOS1cli.topology_events_metrics()
749 json_str_up_2 = main.ONOS2cli.topology_events_metrics()
750 json_str_up_3 = main.ONOS3cli.topology_events_metrics()
751
752 json_obj_1 = json.loads(json_str_up_1)
753 json_obj_2 = json.loads(json_str_up_2)
754 json_obj_3 = json.loads(json_str_up_3)
755
andrewonlab8d29f122014-10-22 17:15:04 -0400756 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
757 tshark_port_up+" /tmp/")
758
759 f_port_up = open(tshark_port_up, 'r')
andrewonlab393531a2014-10-27 18:36:26 -0400760 f_line = f_port_up.readline()
andrewonlab8d29f122014-10-22 17:15:04 -0400761 obj_up = f_line.split(" ")
762 if len(f_line) > 0:
andrewonlabb1998c52014-11-10 13:31:43 -0500763 timestamp_begin_pt_up = int(float(obj_up[1])*1000)
andrewonlab393531a2014-10-27 18:36:26 -0400764 main.log.info("Port up begin timestamp: "+
765 str(timestamp_begin_pt_up))
andrewonlab8d29f122014-10-22 17:15:04 -0400766 else:
767 main.log.info("Tshark output file returned unexpected"+
768 " results.")
769 timestamp_begin_pt_up = 0
770
andrewonlab393531a2014-10-27 18:36:26 -0400771 f_port_up.close()
772
andrewonlab393531a2014-10-27 18:36:26 -0400773 graph_timestamp_1 = \
774 json_obj_1[graphTimestamp]['value']
775 graph_timestamp_2 = \
776 json_obj_2[graphTimestamp]['value']
777 graph_timestamp_3 = \
778 json_obj_3[graphTimestamp]['value']
779
780 #Obtain device timestamp. This timestamp captures
781 #the epoch time at which the device event happened
782 device_timestamp_1 = \
783 json_obj_1[deviceTimestamp]['value']
784 device_timestamp_2 = \
785 json_obj_2[deviceTimestamp]['value']
786 device_timestamp_3 = \
787 json_obj_3[deviceTimestamp]['value']
788
789 #Get delta between graph event and OFP
790 pt_up_graph_to_ofp_1 = int(graph_timestamp_1) -\
andrewonlab8d29f122014-10-22 17:15:04 -0400791 int(timestamp_begin_pt_up)
andrewonlab393531a2014-10-27 18:36:26 -0400792 pt_up_graph_to_ofp_2 = int(graph_timestamp_2) -\
andrewonlab8d29f122014-10-22 17:15:04 -0400793 int(timestamp_begin_pt_up)
andrewonlab393531a2014-10-27 18:36:26 -0400794 pt_up_graph_to_ofp_3 = int(graph_timestamp_3) -\
795 int(timestamp_begin_pt_up)
796
797 #Get delta between device event and OFP
798 pt_up_device_to_ofp_1 = int(device_timestamp_1) -\
799 int(timestamp_begin_pt_up)
800 pt_up_device_to_ofp_2 = int(device_timestamp_2) -\
801 int(timestamp_begin_pt_up)
802 pt_up_device_to_ofp_3 = int(device_timestamp_3) -\
andrewonlab8d29f122014-10-22 17:15:04 -0400803 int(timestamp_begin_pt_up)
andrewonlab3622beb2014-10-28 16:07:56 -0400804
andrewonlabb1998c52014-11-10 13:31:43 -0500805 main.log.info("ONOS1 delta G2O: "+str(pt_up_graph_to_ofp_1))
806 main.log.info("ONOS2 delta G2O: "+str(pt_up_graph_to_ofp_2))
807 main.log.info("ONOS3 delta G2O: "+str(pt_up_graph_to_ofp_3))
808
809 main.log.info("ONOS1 delta D2O: "+str(pt_up_device_to_ofp_1))
810 main.log.info("ONOS2 delta D2O: "+str(pt_up_device_to_ofp_2))
811 main.log.info("ONOS3 delta D2O: "+str(pt_up_device_to_ofp_3))
812
andrewonlab3622beb2014-10-28 16:07:56 -0400813 pt_up_graph_to_ofp_avg = \
andrewonlabf9828f02014-11-10 14:50:27 -0500814 (int(pt_up_graph_to_ofp_1) +
815 int(pt_up_graph_to_ofp_2) +
816 int(pt_up_graph_to_ofp_3)) / 3
andrewonlab3622beb2014-10-28 16:07:56 -0400817
818 pt_up_device_to_ofp_avg = \
andrewonlabf9828f02014-11-10 14:50:27 -0500819 (int(pt_up_device_to_ofp_1) +
820 int(pt_up_device_to_ofp_2) +
821 int(pt_up_device_to_ofp_3)) / 3
andrewonlab3622beb2014-10-28 16:07:56 -0400822
andrewonlabe5bcef92014-11-06 17:53:20 -0500823 if pt_up_graph_to_ofp_avg > up_threshold_min and \
824 pt_up_graph_to_ofp_avg < up_threshold_max:
andrewonlab3622beb2014-10-28 16:07:56 -0400825 port_up_graph_to_ofp_list.append(
826 pt_up_graph_to_ofp_avg)
andrewonlababb11c32014-11-04 15:03:24 -0500827 main.log.info("Port down: graph to ofp avg: "+
828 str(pt_up_graph_to_ofp_avg) + " ms")
andrewonlab3622beb2014-10-28 16:07:56 -0400829 else:
830 main.log.info("Average port up graph-to-ofp result"+
831 " exceeded the threshold: "+
832 str(pt_up_graph_to_ofp_avg))
833
andrewonlabe5bcef92014-11-06 17:53:20 -0500834 if pt_up_device_to_ofp_avg > up_threshold_min and \
835 pt_up_device_to_ofp_avg < up_threshold_max:
andrewonlab3622beb2014-10-28 16:07:56 -0400836 port_up_device_to_ofp_list.append(
837 pt_up_device_to_ofp_avg)
andrewonlababb11c32014-11-04 15:03:24 -0500838 main.log.info("Port up: device to ofp avg: "+
839 str(pt_up_device_to_ofp_avg) + " ms")
andrewonlab3622beb2014-10-28 16:07:56 -0400840 else:
andrewonlababb11c32014-11-04 15:03:24 -0500841 main.log.info("Average port up device-to-ofp result"+
andrewonlab3622beb2014-10-28 16:07:56 -0400842 " exceeded the threshold: "+
843 str(pt_up_device_to_ofp_avg))
andrewonlab8d29f122014-10-22 17:15:04 -0400844
andrewonlab3622beb2014-10-28 16:07:56 -0400845 #END ITERATION FOR LOOP
andrewonlab8790abb2014-11-06 13:51:54 -0500846
847 #Check all list for latency existence and set assertion
848 if (port_down_graph_to_ofp_list and port_down_device_to_ofp_list\
849 and port_up_graph_to_ofp_list and port_up_device_to_ofp_list):
850 assertion = main.TRUE
851
andrewonlababb11c32014-11-04 15:03:24 -0500852 #Calculate and report latency measurements
andrewonlab3622beb2014-10-28 16:07:56 -0400853 port_down_graph_to_ofp_min = min(port_down_graph_to_ofp_list)
854 port_down_graph_to_ofp_max = max(port_down_graph_to_ofp_list)
855 port_down_graph_to_ofp_avg = \
856 (sum(port_down_graph_to_ofp_list) /
857 len(port_down_graph_to_ofp_list))
andrewonlab69864162014-11-11 16:28:48 -0500858 port_down_graph_to_ofp_std_dev = \
859 str(round(numpy.std(port_down_graph_to_ofp_list),1))
andrewonlab3622beb2014-10-28 16:07:56 -0400860
andrewonlab4f50ec92014-11-11 14:24:45 -0500861 main.log.report("Port down graph-to-ofp "+
862 "Avg: "+str(port_down_graph_to_ofp_avg)+" ms "+
andrewonlab69864162014-11-11 16:28:48 -0500863 "Std Deviation: "+port_down_graph_to_ofp_std_dev+" ms")
andrewonlababb11c32014-11-04 15:03:24 -0500864
865 port_down_device_to_ofp_min = min(port_down_device_to_ofp_list)
866 port_down_device_to_ofp_max = max(port_down_device_to_ofp_list)
867 port_down_device_to_ofp_avg = \
868 (sum(port_down_device_to_ofp_list) /\
869 len(port_down_device_to_ofp_list))
andrewonlab69864162014-11-11 16:28:48 -0500870 port_down_device_to_ofp_std_dev = \
871 str(round(numpy.std(port_down_device_to_ofp_list),1))
andrewonlababb11c32014-11-04 15:03:24 -0500872
andrewonlab4f50ec92014-11-11 14:24:45 -0500873 main.log.report("Port down device-to-ofp "+
874 "Avg: "+str(port_down_device_to_ofp_avg)+" ms "+
andrewonlab69864162014-11-11 16:28:48 -0500875 "Std Deviation: "+port_down_device_to_ofp_std_dev+" ms")
andrewonlababb11c32014-11-04 15:03:24 -0500876
877 port_up_graph_to_ofp_min = min(port_up_graph_to_ofp_list)
878 port_up_graph_to_ofp_max = max(port_up_graph_to_ofp_list)
879 port_up_graph_to_ofp_avg = \
880 (sum(port_up_graph_to_ofp_list) /\
881 len(port_up_graph_to_ofp_list))
andrewonlab69864162014-11-11 16:28:48 -0500882 port_up_graph_to_ofp_std_dev = \
883 str(round(numpy.std(port_up_graph_to_ofp_list),1))
andrewonlab8790abb2014-11-06 13:51:54 -0500884
andrewonlab4f50ec92014-11-11 14:24:45 -0500885 main.log.report("Port up graph-to-ofp "+
886 "Avg: "+str(port_up_graph_to_ofp_avg)+" ms "+
andrewonlab69864162014-11-11 16:28:48 -0500887 "Std Deviation: "+port_up_graph_to_ofp_std_dev+" ms")
andrewonlab8790abb2014-11-06 13:51:54 -0500888
889 port_up_device_to_ofp_min = min(port_up_device_to_ofp_list)
890 port_up_device_to_ofp_max = max(port_up_device_to_ofp_list)
891 port_up_device_to_ofp_avg = \
892 (sum(port_up_device_to_ofp_list) /\
893 len(port_up_device_to_ofp_list))
andrewonlab69864162014-11-11 16:28:48 -0500894 port_up_device_to_ofp_std_dev = \
895 str(round(numpy.std(port_up_device_to_ofp_list),1))
andrewonlab8790abb2014-11-06 13:51:54 -0500896
andrewonlab4f50ec92014-11-11 14:24:45 -0500897 main.log.report("Port up device-to-ofp "+
898 "Avg: "+str(port_up_device_to_ofp_avg)+" ms "+
andrewonlab69864162014-11-11 16:28:48 -0500899 "Std Deviation: "+port_up_device_to_ofp_std_dev+" ms")
andrewonlab8790abb2014-11-06 13:51:54 -0500900
901 utilities.assert_equals(expect=main.TRUE, actual=assertion,
902 onpass="Port discovery latency calculation successful",
903 onfail="Port discovery test failed")
andrewonlababb11c32014-11-04 15:03:24 -0500904
andrewonlab3622beb2014-10-28 16:07:56 -0400905 def CASE4(self, main):
906 '''
907 Link down event using loss rate 100%
andrewonlab53b641c2014-10-31 19:44:44 -0400908
909 Important:
910 Use a simple 2 switch topology with 1 link between
911 the two switches. Ensure that mac addresses of the
912 switches are 1 / 2 respectively
andrewonlab3622beb2014-10-28 16:07:56 -0400913 '''
914 import time
915 import subprocess
916 import os
917 import requests
918 import json
andrewonlab4f50ec92014-11-11 14:24:45 -0500919 import numpy
920
andrewonlab3622beb2014-10-28 16:07:56 -0400921 ONOS1_ip = main.params['CTRL']['ip1']
922 ONOS2_ip = main.params['CTRL']['ip2']
923 ONOS3_ip = main.params['CTRL']['ip3']
924 ONOS_user = main.params['CTRL']['user']
925
926 default_sw_port = main.params['CTRL']['port1']
927
928 #Number of iterations of case
929 num_iter = main.params['TEST']['numIter']
930
931 #Timestamp 'keys' for json metrics output.
932 #These are subject to change, hence moved into params
933 deviceTimestamp = main.params['JSON']['deviceTimestamp']
934 linkTimestamp = main.params['JSON']['linkTimestamp']
andrewonlab53b641c2014-10-31 19:44:44 -0400935 graphTimestamp = main.params['JSON']['graphTimestamp']
andrewonlab58f7d702014-11-07 13:21:19 -0500936
937 debug_mode = main.params['TEST']['debugMode']
938
939 local_time = time.strftime('%x %X')
andrewonlabb1998c52014-11-10 13:31:43 -0500940 local_time = local_time.replace("/","")
941 local_time = local_time.replace(" ","_")
942 local_time = local_time.replace(":","")
andrewonlab58f7d702014-11-07 13:21:19 -0500943 if debug_mode == 'on':
944 main.ONOS1.tshark_pcap("eth0",
andrewonlabb1998c52014-11-10 13:31:43 -0500945 "/tmp/link_lat_pcap_"+local_time)
andrewonlab53b641c2014-10-31 19:44:44 -0400946
andrewonlabe5bcef92014-11-06 17:53:20 -0500947 #Threshold for this test case
948 up_threshold_str = main.params['TEST']['linkUpThreshold']
949 down_threshold_str = main.params['TEST']['linkDownThreshold']
950
951 up_threshold_obj = up_threshold_str.split(",")
952 down_threshold_obj = down_threshold_str.split(",")
953
954 up_threshold_min = int(up_threshold_obj[0])
955 up_threshold_max = int(up_threshold_obj[1])
956
957 down_threshold_min = int(down_threshold_obj[0])
958 down_threshold_max = int(down_threshold_obj[1])
959
andrewonlab3622beb2014-10-28 16:07:56 -0400960 assertion = main.TRUE
961 #Link event timestamp to system time list
962 link_down_link_to_system_list = []
963 link_up_link_to_system_list = []
964 #Graph event timestamp to system time list
965 link_down_graph_to_system_list = []
966 link_up_graph_to_system_list = []
967
andrewonlab4b5c8b92014-11-10 16:04:33 -0500968 main.log.report("Link up / down discovery latency between "+
andrewonlab3622beb2014-10-28 16:07:56 -0400969 "two switches")
andrewonlab4b5c8b92014-11-10 16:04:33 -0500970 main.log.report("Simulated by setting loss-rate 100%")
971 main.log.report("'tc qdisc add dev <intfs> root netem loss 100%'")
972 main.log.report("Total iterations of test: "+str(num_iter))
andrewonlab3622beb2014-10-28 16:07:56 -0400973
974 main.step("Assign all switches")
975 main.Mininet1.assign_sw_controller(sw="1",
976 ip1=ONOS1_ip, port1=default_sw_port)
977 main.Mininet1.assign_sw_controller(sw="2",
978 ip1=ONOS1_ip, port1=default_sw_port)
979
980 main.step("Verifying switch assignment")
981 result_s1 = main.Mininet1.get_sw_controller(sw="s1")
982 result_s2 = main.Mininet1.get_sw_controller(sw="s2")
andrewonlab3622beb2014-10-28 16:07:56 -0400983
984 #Allow time for events to finish before taking measurements
985 time.sleep(10)
986
andrewonlababb11c32014-11-04 15:03:24 -0500987 link_down1 = False
988 link_down2 = False
989 link_down3 = False
andrewonlab3622beb2014-10-28 16:07:56 -0400990 #Start iteration of link event test
991 for i in range(0, int(num_iter)):
992 main.step("Getting initial system time as t0")
andrewonlab8d29f122014-10-22 17:15:04 -0400993
andrewonlab3622beb2014-10-28 16:07:56 -0400994 timestamp_link_down_t0 = time.time() * 1000
995 #Link down is simulated by 100% loss rate using traffic
996 #control command
997 main.Mininet1.handle.sendline(
998 "sh tc qdisc add dev s1-eth1 root netem loss 100%")
999
andrewonlab53b641c2014-10-31 19:44:44 -04001000 #TODO: Iterate through 'links' command to verify that
andrewonlababb11c32014-11-04 15:03:24 -05001001 # link s1 -> s2 went down (loop timeout 30 seconds)
1002 # on all 3 ONOS instances
andrewonlab53b641c2014-10-31 19:44:44 -04001003 main.log.info("Checking ONOS for link update")
1004 loop_count = 0
andrewonlababb11c32014-11-04 15:03:24 -05001005 while( not (link_down1 and link_down2 and link_down3)\
1006 and loop_count < 30 ):
1007 json_str1 = main.ONOS1cli.links()
1008 json_str2 = main.ONOS2cli.links()
1009 json_str3 = main.ONOS3cli.links()
1010
1011 if not (json_str1 and json_str2 and json_str3):
1012 main.log.error("CLI command returned error ")
andrewonlab53b641c2014-10-31 19:44:44 -04001013 break
1014 else:
andrewonlababb11c32014-11-04 15:03:24 -05001015 json_obj1 = json.loads(json_str1)
1016 json_obj2 = json.loads(json_str2)
1017 json_obj3 = json.loads(json_str3)
1018 for obj1 in json_obj1:
1019 if '01' not in obj1['src']['device']:
1020 link_down1 = True
andrewonlabf9828f02014-11-10 14:50:27 -05001021 main.log.info("Link down from "+
andrewonlababb11c32014-11-04 15:03:24 -05001022 "s1 -> s2 on ONOS1 detected")
1023 for obj2 in json_obj2:
1024 if '01' not in obj2['src']['device']:
1025 link_down2 = True
andrewonlabf9828f02014-11-10 14:50:27 -05001026 main.log.info("Link down from "+
andrewonlababb11c32014-11-04 15:03:24 -05001027 "s1 -> s2 on ONOS2 detected")
1028 for obj3 in json_obj3:
1029 if '01' not in obj3['src']['device']:
1030 link_down3 = True
andrewonlabf9828f02014-11-10 14:50:27 -05001031 main.log.info("Link down from "+
andrewonlababb11c32014-11-04 15:03:24 -05001032 "s1 -> s2 on ONOS3 detected")
1033
andrewonlab53b641c2014-10-31 19:44:44 -04001034 loop_count += 1
andrewonlababb11c32014-11-04 15:03:24 -05001035 #If CLI doesn't like the continuous requests
1036 #and exits in this loop, increase the sleep here.
1037 #Consequently, while loop timeout will increase
andrewonlab53b641c2014-10-31 19:44:44 -04001038 time.sleep(1)
1039
1040 #Give time for metrics measurement to catch up
andrewonlababb11c32014-11-04 15:03:24 -05001041 #NOTE: May need to be configured more accurately
andrewonlab53b641c2014-10-31 19:44:44 -04001042 time.sleep(10)
andrewonlababb11c32014-11-04 15:03:24 -05001043 #If we exited the while loop and link down 1,2,3 are still
andrewonlab53b641c2014-10-31 19:44:44 -04001044 #false, then ONOS has failed to discover link down event
andrewonlababb11c32014-11-04 15:03:24 -05001045 if not (link_down1 and link_down2 and link_down3):
andrewonlab53b641c2014-10-31 19:44:44 -04001046 main.log.info("Link down discovery failed")
1047
1048 link_down_lat_graph1 = 0
1049 link_down_lat_graph2 = 0
1050 link_down_lat_graph3 = 0
1051 link_down_lat_device1 = 0
1052 link_down_lat_device2 = 0
1053 link_down_lat_device3 = 0
1054
1055 assertion = main.FALSE
1056 else:
1057 json_topo_metrics_1 =\
1058 main.ONOS1cli.topology_events_metrics()
1059 json_topo_metrics_2 =\
1060 main.ONOS2cli.topology_events_metrics()
1061 json_topo_metrics_3 =\
1062 main.ONOS3cli.topology_events_metrics()
1063 json_topo_metrics_1 = json.loads(json_topo_metrics_1)
1064 json_topo_metrics_2 = json.loads(json_topo_metrics_2)
1065 json_topo_metrics_3 = json.loads(json_topo_metrics_3)
1066
1067 main.log.info("Obtaining graph and device timestamp")
1068 graph_timestamp_1 = \
1069 json_topo_metrics_1[graphTimestamp]['value']
1070 graph_timestamp_2 = \
1071 json_topo_metrics_2[graphTimestamp]['value']
1072 graph_timestamp_3 = \
1073 json_topo_metrics_3[graphTimestamp]['value']
1074
1075 link_timestamp_1 = \
1076 json_topo_metrics_1[linkTimestamp]['value']
1077 link_timestamp_2 = \
1078 json_topo_metrics_2[linkTimestamp]['value']
1079 link_timestamp_3 = \
1080 json_topo_metrics_3[linkTimestamp]['value']
1081
1082 if graph_timestamp_1 and graph_timestamp_2 and\
1083 graph_timestamp_3 and link_timestamp_1 and\
1084 link_timestamp_2 and link_timestamp_3:
1085 link_down_lat_graph1 = int(graph_timestamp_1) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001086 int(timestamp_link_down_t0)
andrewonlab53b641c2014-10-31 19:44:44 -04001087 link_down_lat_graph2 = int(graph_timestamp_2) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001088 int(timestamp_link_down_t0)
andrewonlab53b641c2014-10-31 19:44:44 -04001089 link_down_lat_graph3 = int(graph_timestamp_3) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001090 int(timestamp_link_down_t0)
andrewonlab53b641c2014-10-31 19:44:44 -04001091
1092 link_down_lat_link1 = int(link_timestamp_1) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001093 int(timestamp_link_down_t0)
andrewonlab53b641c2014-10-31 19:44:44 -04001094 link_down_lat_link2 = int(link_timestamp_2) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001095 int(timestamp_link_down_t0)
andrewonlab53b641c2014-10-31 19:44:44 -04001096 link_down_lat_link3 = int(link_timestamp_3) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001097 int(timestamp_link_down_t0)
andrewonlab53b641c2014-10-31 19:44:44 -04001098 else:
1099 main.log.error("There was an error calculating"+
1100 " the delta for link down event")
1101 link_down_lat_graph1 = 0
1102 link_down_lat_graph2 = 0
1103 link_down_lat_graph3 = 0
1104
1105 link_down_lat_device1 = 0
1106 link_down_lat_device2 = 0
1107 link_down_lat_device3 = 0
1108
andrewonlabf9828f02014-11-10 14:50:27 -05001109 main.log.info("Link down latency ONOS1 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001110 str(i)+" (end-to-end): "+
andrewonlababb11c32014-11-04 15:03:24 -05001111 str(link_down_lat_graph1)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -05001112 main.log.info("Link down latency ONOS2 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001113 str(i)+" (end-to-end): "+
andrewonlababb11c32014-11-04 15:03:24 -05001114 str(link_down_lat_graph2)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -05001115 main.log.info("Link down latency ONOS3 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001116 str(i)+" (end-to-end): "+
andrewonlababb11c32014-11-04 15:03:24 -05001117 str(link_down_lat_graph3)+" ms")
andrewonlab4e124482014-11-04 13:37:25 -05001118
andrewonlabf9828f02014-11-10 14:50:27 -05001119 main.log.info("Link down latency ONOS1 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001120 str(i)+" (link-event-to-system-timestamp): "+
andrewonlababb11c32014-11-04 15:03:24 -05001121 str(link_down_lat_link1)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -05001122 main.log.info("Link down latency ONOS2 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001123 str(i)+" (link-event-to-system-timestamp): "+
andrewonlababb11c32014-11-04 15:03:24 -05001124 str(link_down_lat_link2)+" ms")
andrewonlabf9828f02014-11-10 14:50:27 -05001125 main.log.info("Link down latency ONOS3 iteration "+
andrewonlab4e124482014-11-04 13:37:25 -05001126 str(i)+" (link-event-to-system-timestamp): "+
1127 str(link_down_lat_link3))
1128
1129 #Calculate avg of node calculations
1130 link_down_lat_graph_avg =\
andrewonlababb11c32014-11-04 15:03:24 -05001131 (link_down_lat_graph1 +
1132 link_down_lat_graph2 +
andrewonlab65d73892014-11-10 17:36:00 -05001133 link_down_lat_graph3) / 3
andrewonlab4e124482014-11-04 13:37:25 -05001134 link_down_lat_link_avg =\
andrewonlababb11c32014-11-04 15:03:24 -05001135 (link_down_lat_link1 +
1136 link_down_lat_link2 +
andrewonlab65d73892014-11-10 17:36:00 -05001137 link_down_lat_link3) / 3
andrewonlab53b641c2014-10-31 19:44:44 -04001138
andrewonlab4e124482014-11-04 13:37:25 -05001139 #Set threshold and append latency to list
andrewonlabe5bcef92014-11-06 17:53:20 -05001140 if link_down_lat_graph_avg > down_threshold_min and\
1141 link_down_lat_graph_avg < down_threshold_max:
andrewonlab4e124482014-11-04 13:37:25 -05001142 link_down_graph_to_system_list.append(
1143 link_down_lat_graph_avg)
andrewonlab8790abb2014-11-06 13:51:54 -05001144 else:
1145 main.log.info("Link down latency exceeded threshold")
1146 main.log.info("Results for iteration "+str(i)+
1147 "have been omitted")
andrewonlabe5bcef92014-11-06 17:53:20 -05001148 if link_down_lat_link_avg > down_threshold_min and\
1149 link_down_lat_link_avg < down_threshold_max:
andrewonlab4e124482014-11-04 13:37:25 -05001150 link_down_link_to_system_list.append(
1151 link_down_lat_link_avg)
andrewonlab8790abb2014-11-06 13:51:54 -05001152 else:
1153 main.log.info("Link down latency exceeded threshold")
1154 main.log.info("Results for iteration "+str(i)+
1155 "have been omitted")
andrewonlab53b641c2014-10-31 19:44:44 -04001156
1157 #NOTE: To remove loss rate and measure latency:
1158 # 'sh tc qdisc del dev s1-eth1 root'
andrewonlababb11c32014-11-04 15:03:24 -05001159 timestamp_link_up_t0 = time.time() * 1000
andrewonlab53b641c2014-10-31 19:44:44 -04001160 main.Mininet1.handle.sendline("sh tc qdisc del dev "+
1161 "s1-eth1 root")
1162 main.Mininet1.handle.expect("mininet>")
andrewonlababb11c32014-11-04 15:03:24 -05001163
1164 main.log.info("Checking ONOS for link update")
1165
1166 link_down1 = True
1167 link_down2 = True
1168 link_down3 = True
1169 loop_count = 0
1170 while( (link_down1 and link_down2 and link_down3)\
1171 and loop_count < 30 ):
1172 json_str1 = main.ONOS1cli.links()
1173 json_str2 = main.ONOS2cli.links()
1174 json_str3 = main.ONOS3cli.links()
1175 if not (json_str1 and json_str2 and json_str3):
1176 main.log.error("CLI command returned error ")
1177 break
1178 else:
1179 json_obj1 = json.loads(json_str1)
1180 json_obj2 = json.loads(json_str2)
1181 json_obj3 = json.loads(json_str3)
1182
1183 for obj1 in json_obj1:
1184 if '01' in obj1['src']['device']:
1185 link_down1 = False
andrewonlabf9828f02014-11-10 14:50:27 -05001186 main.log.info("Link up from "+
andrewonlababb11c32014-11-04 15:03:24 -05001187 "s1 -> s2 on ONOS1 detected")
1188 for obj2 in json_obj2:
1189 if '01' in obj2['src']['device']:
1190 link_down2 = False
andrewonlabf9828f02014-11-10 14:50:27 -05001191 main.log.info("Link up from "+
andrewonlababb11c32014-11-04 15:03:24 -05001192 "s1 -> s2 on ONOS2 detected")
1193 for obj3 in json_obj3:
1194 if '01' in obj3['src']['device']:
1195 link_down3 = False
andrewonlabf9828f02014-11-10 14:50:27 -05001196 main.log.info("Link up from "+
andrewonlababb11c32014-11-04 15:03:24 -05001197 "s1 -> s2 on ONOS3 detected")
1198
1199 loop_count += 1
1200 time.sleep(1)
1201
1202 if (link_down1 and link_down2 and link_down3):
1203 main.log.info("Link up discovery failed")
1204
1205 link_up_lat_graph1 = 0
1206 link_up_lat_graph2 = 0
1207 link_up_lat_graph3 = 0
1208 link_up_lat_device1 = 0
1209 link_up_lat_device2 = 0
1210 link_up_lat_device3 = 0
1211
1212 assertion = main.FALSE
1213 else:
1214 json_topo_metrics_1 =\
1215 main.ONOS1cli.topology_events_metrics()
1216 json_topo_metrics_2 =\
1217 main.ONOS2cli.topology_events_metrics()
1218 json_topo_metrics_3 =\
1219 main.ONOS3cli.topology_events_metrics()
1220 json_topo_metrics_1 = json.loads(json_topo_metrics_1)
1221 json_topo_metrics_2 = json.loads(json_topo_metrics_2)
1222 json_topo_metrics_3 = json.loads(json_topo_metrics_3)
1223
1224 main.log.info("Obtaining graph and device timestamp")
1225 graph_timestamp_1 = \
1226 json_topo_metrics_1[graphTimestamp]['value']
1227 graph_timestamp_2 = \
1228 json_topo_metrics_2[graphTimestamp]['value']
1229 graph_timestamp_3 = \
1230 json_topo_metrics_3[graphTimestamp]['value']
1231
1232 link_timestamp_1 = \
1233 json_topo_metrics_1[linkTimestamp]['value']
1234 link_timestamp_2 = \
1235 json_topo_metrics_2[linkTimestamp]['value']
1236 link_timestamp_3 = \
1237 json_topo_metrics_3[linkTimestamp]['value']
1238
1239 if graph_timestamp_1 and graph_timestamp_2 and\
1240 graph_timestamp_3 and link_timestamp_1 and\
1241 link_timestamp_2 and link_timestamp_3:
1242 link_up_lat_graph1 = int(graph_timestamp_1) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001243 int(timestamp_link_up_t0)
andrewonlababb11c32014-11-04 15:03:24 -05001244 link_up_lat_graph2 = int(graph_timestamp_2) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001245 int(timestamp_link_up_t0)
andrewonlababb11c32014-11-04 15:03:24 -05001246 link_up_lat_graph3 = int(graph_timestamp_3) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001247 int(timestamp_link_up_t0)
andrewonlababb11c32014-11-04 15:03:24 -05001248
1249 link_up_lat_link1 = int(link_timestamp_1) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001250 int(timestamp_link_up_t0)
andrewonlababb11c32014-11-04 15:03:24 -05001251 link_up_lat_link2 = int(link_timestamp_2) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001252 int(timestamp_link_up_t0)
andrewonlababb11c32014-11-04 15:03:24 -05001253 link_up_lat_link3 = int(link_timestamp_3) -\
andrewonlab4f50ec92014-11-11 14:24:45 -05001254 int(timestamp_link_up_t0)
andrewonlababb11c32014-11-04 15:03:24 -05001255 else:
1256 main.log.error("There was an error calculating"+
1257 " the delta for link down event")
1258 link_up_lat_graph1 = 0
1259 link_up_lat_graph2 = 0
1260 link_up_lat_graph3 = 0
1261
1262 link_up_lat_device1 = 0
1263 link_up_lat_device2 = 0
1264 link_up_lat_device3 = 0
andrewonlab58f7d702014-11-07 13:21:19 -05001265
1266 if debug_mode == 'on':
1267 main.log.info("Link up latency ONOS1 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001268 str(i)+" (end-to-end): "+
1269 str(link_up_lat_graph1)+" ms")
andrewonlab58f7d702014-11-07 13:21:19 -05001270 main.log.info("Link up latency ONOS2 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001271 str(i)+" (end-to-end): "+
1272 str(link_up_lat_graph2)+" ms")
andrewonlab58f7d702014-11-07 13:21:19 -05001273 main.log.info("Link up latency ONOS3 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001274 str(i)+" (end-to-end): "+
1275 str(link_up_lat_graph3)+" ms")
1276
andrewonlab58f7d702014-11-07 13:21:19 -05001277 main.log.info("Link up latency ONOS1 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001278 str(i)+" (link-event-to-system-timestamp): "+
1279 str(link_up_lat_link1)+" ms")
andrewonlab58f7d702014-11-07 13:21:19 -05001280 main.log.info("Link up latency ONOS2 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001281 str(i)+" (link-event-to-system-timestamp): "+
1282 str(link_up_lat_link2)+" ms")
andrewonlab58f7d702014-11-07 13:21:19 -05001283 main.log.info("Link up latency ONOS3 iteration "+
andrewonlababb11c32014-11-04 15:03:24 -05001284 str(i)+" (link-event-to-system-timestamp): "+
1285 str(link_up_lat_link3))
1286
1287 #Calculate avg of node calculations
1288 link_up_lat_graph_avg =\
1289 (link_up_lat_graph1 +
1290 link_up_lat_graph2 +
andrewonlabf9828f02014-11-10 14:50:27 -05001291 link_up_lat_graph3) / 3
andrewonlababb11c32014-11-04 15:03:24 -05001292 link_up_lat_link_avg =\
1293 (link_up_lat_link1 +
1294 link_up_lat_link2 +
andrewonlabf9828f02014-11-10 14:50:27 -05001295 link_up_lat_link3) / 3
andrewonlababb11c32014-11-04 15:03:24 -05001296
1297 #Set threshold and append latency to list
andrewonlabe5bcef92014-11-06 17:53:20 -05001298 if link_up_lat_graph_avg > up_threshold_min and\
1299 link_up_lat_graph_avg < up_threshold_max:
andrewonlababb11c32014-11-04 15:03:24 -05001300 link_up_graph_to_system_list.append(
1301 link_up_lat_graph_avg)
andrewonlab8790abb2014-11-06 13:51:54 -05001302 else:
1303 main.log.info("Link up latency exceeded threshold")
1304 main.log.info("Results for iteration "+str(i)+
1305 "have been omitted")
andrewonlabe5bcef92014-11-06 17:53:20 -05001306 if link_up_lat_link_avg > up_threshold_min and\
1307 link_up_lat_link_avg < up_threshold_max:
andrewonlababb11c32014-11-04 15:03:24 -05001308 link_up_link_to_system_list.append(
1309 link_up_lat_link_avg)
andrewonlab8790abb2014-11-06 13:51:54 -05001310 else:
1311 main.log.info("Link up latency exceeded threshold")
1312 main.log.info("Results for iteration "+str(i)+
1313 "have been omitted")
andrewonlab53b641c2014-10-31 19:44:44 -04001314
andrewonlab4e124482014-11-04 13:37:25 -05001315 #Calculate min, max, avg of list and report
1316 link_down_min = min(link_down_graph_to_system_list)
1317 link_down_max = max(link_down_graph_to_system_list)
1318 link_down_avg = sum(link_down_graph_to_system_list) / \
1319 len(link_down_graph_to_system_list)
andrewonlababb11c32014-11-04 15:03:24 -05001320 link_up_min = min(link_up_graph_to_system_list)
1321 link_up_max = max(link_up_graph_to_system_list)
1322 link_up_avg = sum(link_up_graph_to_system_list) / \
1323 len(link_up_graph_to_system_list)
andrewonlab69864162014-11-11 16:28:48 -05001324 link_down_std_dev = \
1325 str(round(numpy.std(link_down_graph_to_system_list),1))
1326 link_up_std_dev = \
1327 str(round(numpy.std(link_up_graph_to_system_list),1))
andrewonlababb11c32014-11-04 15:03:24 -05001328
andrewonlab4f50ec92014-11-11 14:24:45 -05001329 main.log.report("Link down latency " +
1330 "Avg: "+str(link_down_avg)+" ms "+
andrewonlab69864162014-11-11 16:28:48 -05001331 "Std Deviation: "+link_down_std_dev+" ms")
andrewonlab4f50ec92014-11-11 14:24:45 -05001332 main.log.report("Link up latency "+
1333 "Avg: "+str(link_up_avg)+" ms "+
andrewonlab69864162014-11-11 16:28:48 -05001334 "Std Deviation: "+link_up_std_dev+" ms")
andrewonlab4e124482014-11-04 13:37:25 -05001335
andrewonlab8790abb2014-11-06 13:51:54 -05001336 utilities.assert_equals(expect=main.TRUE, actual=assertion,
1337 onpass="Link discovery latency calculation successful",
1338 onfail="Link discovery latency case failed")
1339
andrewonlabb54b85b2014-10-28 18:43:57 -04001340 def CASE5(self, main):
1341 '''
1342 100 Switch discovery latency
1343
1344 Important:
andrewonlab16ce4852014-10-30 13:41:09 -04001345 This test case can be potentially dangerous if
1346 your machine has previously set iptables rules.
1347 One of the steps of the test case will flush
1348 all existing iptables rules.
andrewonlab8790abb2014-11-06 13:51:54 -05001349 Note:
1350 You can specify the number of switches in the
1351 params file to adjust the switch discovery size
1352 (and specify the corresponding topology in Mininet1
1353 .topo file)
andrewonlabb54b85b2014-10-28 18:43:57 -04001354 '''
1355 import time
1356 import subprocess
1357 import os
1358 import requests
1359 import json
1360
1361 ONOS1_ip = main.params['CTRL']['ip1']
1362 ONOS2_ip = main.params['CTRL']['ip2']
1363 ONOS3_ip = main.params['CTRL']['ip3']
1364 MN1_ip = main.params['MN']['ip1']
1365 ONOS_user = main.params['CTRL']['user']
1366
1367 default_sw_port = main.params['CTRL']['port1']
1368
1369 #Number of iterations of case
1370 num_iter = main.params['TEST']['numIter']
andrewonlab16ce4852014-10-30 13:41:09 -04001371 num_sw = main.params['TEST']['numSwitch']
1372
andrewonlabb54b85b2014-10-28 18:43:57 -04001373 #Timestamp 'keys' for json metrics output.
1374 #These are subject to change, hence moved into params
1375 deviceTimestamp = main.params['JSON']['deviceTimestamp']
andrewonlab16ce4852014-10-30 13:41:09 -04001376 graphTimestamp = main.params['JSON']['graphTimestamp']
andrewonlab58f7d702014-11-07 13:21:19 -05001377
1378 debug_mode = main.params['TEST']['debugMode']
1379
andrewonlabb1998c52014-11-10 13:31:43 -05001380 local_time = time.strftime('%X')
1381 local_time = local_time.replace("/","")
1382 local_time = local_time.replace(" ","_")
1383 local_time = local_time.replace(":","")
andrewonlab58f7d702014-11-07 13:21:19 -05001384 if debug_mode == 'on':
1385 main.ONOS1.tshark_pcap("eth0",
andrewonlabb1998c52014-11-10 13:31:43 -05001386 "/tmp/100_sw_lat_pcap_"+local_time)
andrewonlabe5bcef92014-11-06 17:53:20 -05001387
1388 #Threshold for this test case
1389 sw_disc_threshold_str = main.params['TEST']['swDisc100Threshold']
1390 sw_disc_threshold_obj = sw_disc_threshold_str.split(",")
1391 sw_disc_threshold_min = int(sw_disc_threshold_obj[0])
1392 sw_disc_threshold_max = int(sw_disc_threshold_obj[1])
1393
andrewonlab53b641c2014-10-31 19:44:44 -04001394 tshark_ofp_output = "/tmp/tshark_ofp_"+num_sw+"sw.txt"
1395 tshark_tcp_output = "/tmp/tshark_tcp_"+num_sw+"sw.txt"
1396
1397 tshark_ofp_result_list = []
1398 tshark_tcp_result_list = []
andrewonlabb54b85b2014-10-28 18:43:57 -04001399
andrewonlabe5bcef92014-11-06 17:53:20 -05001400 sw_discovery_lat_list = []
1401
andrewonlab16ce4852014-10-30 13:41:09 -04001402 main.case(num_sw+" Switch discovery latency")
andrewonlabb54b85b2014-10-28 18:43:57 -04001403 main.step("Assigning all switches to ONOS1")
andrewonlab16ce4852014-10-30 13:41:09 -04001404 for i in range(1, int(num_sw)+1):
andrewonlabb54b85b2014-10-28 18:43:57 -04001405 main.Mininet1.assign_sw_controller(
1406 sw=str(i),
1407 ip1=ONOS1_ip,
1408 port1=default_sw_port)
andrewonlab16ce4852014-10-30 13:41:09 -04001409
andrewonlabb54b85b2014-10-28 18:43:57 -04001410 #Ensure that nodes are configured with ptpd
andrewonlab16ce4852014-10-30 13:41:09 -04001411 #Just a warning message
1412 main.log.info("Please check ptpd configuration to ensure"+\
1413 " All nodes' system times are in sync")
1414 time.sleep(5)
andrewonlabb54b85b2014-10-28 18:43:57 -04001415
1416 for i in range(0, int(num_iter)):
andrewonlab8d29f122014-10-22 17:15:04 -04001417
andrewonlabb54b85b2014-10-28 18:43:57 -04001418 main.step("Set iptables rule to block incoming sw connections")
1419 #Set iptables rule to block incoming switch connections
andrewonlab53b641c2014-10-31 19:44:44 -04001420 #The rule description is as follows:
1421 # Append to INPUT rule,
1422 # behavior DROP that matches following:
1423 # * packet type: tcp
1424 # * source IP: MN1_ip
1425 # * destination PORT: 6633
andrewonlabb54b85b2014-10-28 18:43:57 -04001426 main.ONOS1.handle.sendline(
andrewonlab16ce4852014-10-30 13:41:09 -04001427 "sudo iptables -A INPUT -p tcp -s "+MN1_ip+
andrewonlabb54b85b2014-10-28 18:43:57 -04001428 " --dport "+default_sw_port+" -j DROP")
1429 main.ONOS1.handle.expect("\$")
andrewonlab53b641c2014-10-31 19:44:44 -04001430 # Append to OUTPUT rule,
1431 # behavior DROP that matches following:
1432 # * packet type: tcp
1433 # * source IP: MN1_ip
1434 # * destination PORT: 6633
1435 main.ONOS1.handle.sendline(
1436 "sudo iptables -A OUTPUT -p tcp -s "+MN1_ip+
1437 " --dport "+default_sw_port+" -j DROP")
1438 main.ONOS1.handle.expect("\$")
andrewonlabb54b85b2014-10-28 18:43:57 -04001439 #Give time to allow rule to take effect
andrewonlab8790abb2014-11-06 13:51:54 -05001440 #NOTE: Sleep period may need to be configured
1441 # based on the number of switches in the topology
andrewonlab16ce4852014-10-30 13:41:09 -04001442 main.log.info("Please wait for switch connection to "+
1443 "time out")
1444 time.sleep(60)
1445
1446 #Gather vendor OFP with tshark
1447 main.ONOS1.tshark_grep("OFP 86 Vendor",
1448 tshark_ofp_output)
andrewonlab53b641c2014-10-31 19:44:44 -04001449 main.ONOS1.tshark_grep("TCP 74 ",
1450 tshark_tcp_output)
andrewonlabb54b85b2014-10-28 18:43:57 -04001451
andrewonlab16ce4852014-10-30 13:41:09 -04001452 #NOTE: Remove all iptables rule quickly (flush)
andrewonlabb54b85b2014-10-28 18:43:57 -04001453 # Before removal, obtain TestON timestamp at which
andrewonlab16ce4852014-10-30 13:41:09 -04001454 # removal took place
1455 # (ensuring nodes are configured via ptp)
andrewonlabb54b85b2014-10-28 18:43:57 -04001456 # sudo iptables -F
andrewonlab16ce4852014-10-30 13:41:09 -04001457
1458 t0_system = time.time() * 1000
1459 main.ONOS1.handle.sendline(
1460 "sudo iptables -F")
andrewonlabb54b85b2014-10-28 18:43:57 -04001461
andrewonlab16ce4852014-10-30 13:41:09 -04001462 #Counter to track loop count
1463 counter_loop = 0
1464 counter_avail1 = 0
1465 counter_avail2 = 0
1466 counter_avail3 = 0
1467 onos1_dev = False
1468 onos2_dev = False
1469 onos3_dev = False
1470 while counter_loop < 60:
1471 #Continue to check devices for all device
1472 #availability. When all devices in all 3
1473 #ONOS instances indicate that devices are available
1474 #obtain graph event timestamp for t1.
1475 device_str_obj1 = main.ONOS1cli.devices()
1476 device_str_obj2 = main.ONOS2cli.devices()
1477 device_str_obj3 = main.ONOS3cli.devices()
1478
1479 device_json1 = json.loads(device_str_obj1)
1480 device_json2 = json.loads(device_str_obj2)
1481 device_json3 = json.loads(device_str_obj3)
1482
1483 for device1 in device_json1:
1484 if device1['available'] == True:
1485 counter_avail1 += 1
1486 if counter_avail1 == int(num_sw):
1487 onos1_dev = True
1488 main.log.info("All devices have been "+
1489 "discovered on ONOS1")
1490 else:
1491 counter_avail1 = 0
1492 for device2 in device_json2:
1493 if device2['available'] == True:
1494 counter_avail2 += 1
1495 if counter_avail2 == int(num_sw):
1496 onos2_dev = True
1497 main.log.info("All devices have been "+
1498 "discovered on ONOS2")
1499 else:
1500 counter_avail2 = 0
1501 for device3 in device_json3:
1502 if device3['available'] == True:
1503 counter_avail3 += 1
1504 if counter_avail3 == int(num_sw):
1505 onos3_dev = True
1506 main.log.info("All devices have been "+
1507 "discovered on ONOS3")
1508 else:
1509 counter_avail3 = 0
1510
1511 if onos1_dev and onos2_dev and onos3_dev:
1512 main.log.info("All devices have been discovered "+
1513 "on all ONOS instances")
1514 json_str_topology_metrics_1 =\
1515 main.ONOS1cli.topology_events_metrics()
1516 json_str_topology_metrics_2 =\
1517 main.ONOS2cli.topology_events_metrics()
1518 json_str_topology_metrics_3 =\
1519 main.ONOS3cli.topology_events_metrics()
andrewonlab53b641c2014-10-31 19:44:44 -04001520
1521 #Exit while loop if all devices discovered
andrewonlab16ce4852014-10-30 13:41:09 -04001522 break
1523
1524 counter_loop += 1
1525 #Give some time in between CLI calls
1526 #(will not affect measurement)
1527 time.sleep(3)
1528
1529 main.ONOS1.tshark_stop()
1530
1531 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
1532 tshark_ofp_output+" /tmp/")
andrewonlab53b641c2014-10-31 19:44:44 -04001533 os.system("scp "+ONOS_user+"@"+ONOS1_ip+":"+
1534 tshark_tcp_output+" /tmp/")
andrewonlab16ce4852014-10-30 13:41:09 -04001535
andrewonlab16ce4852014-10-30 13:41:09 -04001536 #TODO: Automate OFP output analysis
andrewonlab58f7d702014-11-07 13:21:19 -05001537 #Debug mode - print out packets captured at runtime
1538 if debug_mode == 'on':
1539 ofp_file = open(tshark_ofp_output, 'r')
1540 main.log.info("Tshark OFP Vendor output: ")
1541 for line in ofp_file:
1542 tshark_ofp_result_list.append(line)
andrewonlabe5bcef92014-11-06 17:53:20 -05001543 main.log.info(line)
andrewonlab58f7d702014-11-07 13:21:19 -05001544 ofp_file.close()
andrewonlab16ce4852014-10-30 13:41:09 -04001545
andrewonlab58f7d702014-11-07 13:21:19 -05001546 tcp_file = open(tshark_tcp_output, 'r')
1547 main.log.info("Tshark TCP 74 output: ")
1548 for line in tcp_file:
1549 tshark_tcp_result_list.append(line)
andrewonlabe5bcef92014-11-06 17:53:20 -05001550 main.log.info(line)
andrewonlab58f7d702014-11-07 13:21:19 -05001551 tcp_file.close()
andrewonlab53b641c2014-10-31 19:44:44 -04001552
andrewonlab16ce4852014-10-30 13:41:09 -04001553 json_obj_1 = json.loads(json_str_topology_metrics_1)
1554 json_obj_2 = json.loads(json_str_topology_metrics_2)
1555 json_obj_3 = json.loads(json_str_topology_metrics_3)
1556
1557 graph_timestamp_1 = \
1558 json_obj_1[graphTimestamp]['value']
1559 graph_timestamp_2 = \
1560 json_obj_2[graphTimestamp]['value']
1561 graph_timestamp_3 = \
1562 json_obj_3[graphTimestamp]['value']
1563
andrewonlabe5bcef92014-11-06 17:53:20 -05001564 graph_lat_1 = int(graph_timestamp_1) - int(t0_system)
1565 graph_lat_2 = int(graph_timestamp_2) - int(t0_system)
1566 graph_lat_3 = int(graph_timestamp_3) - int(t0_system)
andrewonlab16ce4852014-10-30 13:41:09 -04001567
andrewonlabe5bcef92014-11-06 17:53:20 -05001568 avg_graph_lat = \
1569 (int(graph_lat_1) +\
1570 int(graph_lat_2) +\
1571 int(graph_lat_3)) / 3
1572
1573 if avg_graph_lat > sw_disc_threshold_min \
1574 and avg_graph_lat < sw_disc_threshold_max:
1575 sw_discovery_lat_list.append(
1576 avg_graph_lat)
1577 else:
1578 main.log.info("100 Switch discovery latency "+
1579 "exceeded the threshold.")
1580
1581 #END ITERATION FOR LOOP
andrewonlab16ce4852014-10-30 13:41:09 -04001582
andrewonlabe5bcef92014-11-06 17:53:20 -05001583 sw_lat_min = min(sw_discovery_lat_list)
1584 sw_lat_max = max(sw_discovery_lat_list)
1585 sw_lat_avg = sum(sw_discovery_lat_list) /\
1586 len(sw_discovery_lat_list)
andrewonlab16ce4852014-10-30 13:41:09 -04001587
andrewonlabf9828f02014-11-10 14:50:27 -05001588 main.log.report("100 Switch discovery lat "+\
1589 "Min: "+str(sw_lat_min)+" ms"+\
1590 "Max: "+str(sw_lat_max)+" ms"+\
1591 "Avg: "+str(sw_lat_avg)+" ms")
andrewonlab16ce4852014-10-30 13:41:09 -04001592
andrewonlabb54b85b2014-10-28 18:43:57 -04001593