blob: c2218874736ef8e003f6f8bbd83cc285c745689b [file] [log] [blame]
YPZhanga482c202016-02-18 17:03:07 -08001"""
2 SCPFhostLat
3 This test will test the host found latency.
4 Host will arping a ip address, tshark will caputure the package time, then compare with the topology event timestamp.
5 Test will run with 1 node from start, and scale up to 7 nodes.
6 The event timestamp will only greb the latest one, then calculate average and standar dev.
7
8 yunpeng@onlab.us
9"""
10class SCPFhostLat:
11
12 def __init__( self ):
13 self.default = ''
14
15 def CASE0( self, main):
16 import sys
17 import json
18 import time
19 import os
20 import imp
21
22 main.case( "Constructing test variables and building ONOS package" )
23 main.step( "Constructing test variables" )
24 stepResult = main.FALSE
25
26 # Test variables
27 main.testOnDirectory = os.path.dirname( os.getcwd ( ) )
28 main.cellName = main.params[ 'ENV' ][ 'cellName' ]
29 main.apps = main.params[ 'ENV' ][ 'cellApps' ]
30 main.scale = ( main.params[ 'SCALE' ] ).split( "," )
31 main.ONOSport = main.params[ 'CTRL' ][ 'port' ]
32 main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
33 main.installSleep = int( main.params[ 'SLEEP' ][ 'install' ] )
34 main.measurementSleep = int( main.params['SLEEP']['measurement'])
35 main.timeout = int( main.params['SLEEP']['timeout'] )
36 main.dbFileName = main.params['DATABASE']['file']
37 main.cellData = {} # for creating cell file
38
39 # Tshark params
40 main.tsharkResultPath = main.params['TSHARK']['tsharkPath']
41 main.tsharkPacketIn = main.params['TSHARK']['tsharkPacketIn']
42
43 main.numlter = main.params['TEST']['numIter']
44 main.iterIgnore = int(main.params['TEST']['iterIgnore'])
45 main.hostTimestampKey = main.params['TEST']['hostTimestamp']
46 main.thresholdStr = main.params['TEST']['singleSwThreshold']
47 main.thresholdObj = main.thresholdStr.split(',')
48 main.thresholdMin = int(main.thresholdObj[0])
49 main.thresholdMax = int(main.thresholdObj[1])
50 main.threadID = 0
51
52 main.CLIs = []
53 main.ONOSip = []
54 main.maxNumBatch = 0
55 main.ONOSip = main.ONOSbench.getOnosIps()
56 main.log.info(main.ONOSip)
57 main.setupSkipped = False
58
59 gitBranch = main.params[ 'GIT' ][ 'branch' ]
60 gitPull = main.params[ 'GIT' ][ 'pull' ]
61 nic = main.params['DATABASE']['nic']
62 node = main.params['DATABASE']['node']
63 nic = main.params['DATABASE']['nic']
64 node = main.params['DATABASE']['node']
65 stepResult = main.TRUE
66
67 main.log.info("Cresting DB file")
68 with open(main.dbFileName, "w+") as dbFile:
69 dbFile.write("")
70
71 utilities.assert_equals( expect=main.TRUE,
72 actual=stepResult,
73 onpass="environment set up successfull",
74 onfail="environment set up Failed" )
75
76 def CASE1( self ):
77 # main.scale[ 0 ] determines the current number of ONOS controller
78 main.CLIs = []
79 main.numCtrls = int( main.scale[ 0 ] )
80 main.log.info( "Creating list of ONOS cli handles" )
81 for i in range(main.numCtrls):
82 main.CLIs.append( getattr( main, 'ONOScli%s' % (i+1) ) )
83
84 main.log.info(main.CLIs)
85 if not main.CLIs:
86 main.log.error( "Failed to create the list of ONOS cli handles" )
87 main.cleanup()
88 main.exit()
89
90 main.commit = main.ONOSbench.getVersion(report=True)
91 main.commit = main.commit.split(" ")[1]
92
93 if gitPull == 'True':
94 if not main.startUp.onosBuild( main, gitBranch ):
95 main.log.error( "Failed to build ONOS" )
96 main.cleanup()
97 main.exit()
98 else:
99 main.log.warn( "Did not pull new code so skipping mvn " +
100 "clean install" )
101 with open(main.dbFileName, "a") as dbFile:
102 temp = "'" + main.commit + "',"
103 temp += "'" + nic + "',"
104 dbFile.write(temp)
105 dbFile.close()
106
107 def CASE2( self, main ):
108 """
109 - Uninstall ONOS cluster
110 - Verify ONOS start up
111 - Install ONOS cluster
112 - Connect to cli
113 """
114 main.log.info( "Starting up %s node(s) ONOS cluster" % main.numCtrls)
115 main.log.info( "Safety check, killing all ONOS processes" +
116 " before initiating environment setup" )
117
118 for i in range( main.numCtrls ):
You Wangb98a9fa2017-02-15 17:27:42 -0800119 main.ONOSbench.onosStop( main.ONOSip[ i ] )
120 main.ONOSbench.onosKill( main.ONOSip[ i ] )
YPZhanga482c202016-02-18 17:03:07 -0800121
122 main.log.info( "NODE COUNT = %s" % main.numCtrls)
123
124 tempOnosIp = []
125 for i in range( main.numCtrls ):
126 tempOnosIp.append( main.ONOSip[i] )
127
128 main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
129 "temp",
130 main.Mininet1.ip_address,
131 main.apps,
Devin Lim461f0872017-06-05 16:49:33 -0700132 tempOnosIp,
133 main.ONOScli1.user_name )
YPZhanga482c202016-02-18 17:03:07 -0800134
135 main.step( "Apply cell to environment" )
136 cellResult = main.ONOSbench.setCell( "temp" )
137 verifyResult = main.ONOSbench.verifyCell()
138 stepResult = cellResult and verifyResult
139 utilities.assert_equals( expect=main.TRUE,
140 actual=stepResult,
141 onpass="Successfully applied cell to " + \
142 "environment",
143 onfail="Failed to apply cell to environment " )
144
145 main.step( "Creating ONOS package" )
Jon Hallbd60ea02016-08-23 10:03:59 -0700146 packageResult = main.ONOSbench.buckBuild()
YPZhanga482c202016-02-18 17:03:07 -0800147 stepResult = packageResult
148 utilities.assert_equals( expect=main.TRUE,
149 actual=stepResult,
150 onpass="Successfully created ONOS package",
151 onfail="Failed to create ONOS package" )
152
153 main.step( "Uninstall ONOS package on all Nodes" )
154 uninstallResult = main.TRUE
155 for i in range( int( main.numCtrls ) ):
156 main.log.info( "Uninstalling package on ONOS Node IP: " + main.ONOSip[i] )
157 u_result = main.ONOSbench.onosUninstall( main.ONOSip[i] )
158 utilities.assert_equals( expect=main.TRUE, actual=u_result,
159 onpass="Test step PASS",
160 onfail="Test step FAIL" )
161 uninstallResult = ( uninstallResult and u_result )
162
163 main.step( "Install ONOS package on all Nodes" )
164 installResult = main.TRUE
165 for i in range( int( main.numCtrls ) ):
166 main.log.info( "Installing package on ONOS Node IP: " + main.ONOSip[i] )
167 i_result = main.ONOSbench.onosInstall( node=main.ONOSip[i] )
168 utilities.assert_equals( expect=main.TRUE, actual=i_result,
169 onpass="Test step PASS",
170 onfail="Test step FAIL" )
171 installResult = installResult and i_result
YPZhanga482c202016-02-18 17:03:07 -0800172
Chiyu Chengef109502016-11-21 15:51:38 -0800173 main.step( "Set up ONOS secure SSH" )
174 secureSshResult = main.TRUE
175 for i in range( int( main.numCtrls ) ):
176 secureSshResult = secureSshResult and main.ONOSbench.onosSecureSSH( node=main.ONOSip[i] )
177 utilities.assert_equals( expect=main.TRUE, actual=secureSshResult,
178 onpass="Test step PASS",
179 onfail="Test step FAIL" )
180
You Wang0357c432017-01-09 16:13:33 -0800181 time.sleep( main.startUpSleep )
182 main.step( "Starting ONOS service" )
183 stopResult = main.TRUE
184 startResult = main.TRUE
185 onosIsUp = main.TRUE
186
187 for i in range( main.numCtrls ):
188 onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
189 if onosIsUp == main.TRUE:
190 main.log.report( "ONOS instance is up and ready" )
191 else:
192 main.log.report( "ONOS instance may not be up, stop and " +
193 "start ONOS again " )
194 for i in range( main.numCtrls ):
195 stopResult = stopResult and \
196 main.ONOSbench.onosStop( main.ONOSip[ i ] )
197 for i in range( main.numCtrls ):
198 startResult = startResult and \
199 main.ONOSbench.onosStart( main.ONOSip[ i ] )
200 stepResult = onosIsUp and stopResult and startResult
201 utilities.assert_equals( expect=main.TRUE,
202 actual=stepResult,
203 onpass="ONOS service is ready",
204 onfail="ONOS service did not start properly" )
205
YPZhanga482c202016-02-18 17:03:07 -0800206 main.step( "Start ONOS CLI on all nodes" )
207 cliResult = main.TRUE
Jon Hall6509dbf2016-06-21 17:01:17 -0700208 main.step(" Start ONOS cli using thread ")
YPZhanga482c202016-02-18 17:03:07 -0800209 time.sleep( main.startUpSleep )
210 startCliResult = main.TRUE
211 pool = []
212
213 for i in range( int( main.numCtrls) ):
214 t = main.Thread( target=main.CLIs[i].startOnosCli,
215 threadID=main.threadID,
216 name="startOnosCli",
217 args=[ main.ONOSip[i] ],
218 kwargs = {"onosStartTimeout":main.timeout} )
219 pool.append(t)
220 t.start()
221 main.threadID = main.threadID + 1
222 for t in pool:
223 t.join()
224 startCliResult = startCliResult and t.result
225 time.sleep( main.startUpSleep )
226
227 def CASE11( self, main ):
228 main.log.info( "set and configure Application" )
229 import json
230 import time
231 time.sleep(main.startUpSleep)
232 main.step( "Activating org.onosproject.proxyarp" )
233 appStatus = utilities.retry( main.ONOSrest1.activateApp,
234 main.FALSE,
235 ['org.onosproject.proxyarp'],
236 sleep=3,
237 attempts=3 )
238 utilities.assert_equals( expect=main.TRUE,
239 actual=appStatus,
240 onpass="Successfully activated proxyarp",
241 onfail="Failed to activated proxyarp")
242
243 main.step( "Set up Default Topology Provider" )
244 appStatus = main.TRUE
245 configName = 'org.onosproject.net.topology.impl.DefaultTopologyProvider'
246 configParam = 'maxEvents'
247 appStatus = appStatus and main.CLIs[0].setCfg( configName, configParam,'1' )
248 configParam = 'maxBatchMs'
249 appStatus = appStatus and main.CLIs[0].setCfg( configName, configParam, '0')
250 configParam = 'maxIdleMs'
251 appStatus = appStatus and main.CLIs[0].setCfg( configName, configParam,'0' )
252 utilities.assert_equals( expect=main.TRUE,
253 actual=appStatus,
254 onpass="Successfully set DefaultTopologyProvider",
255 onfail="Failed to set DefaultTopologyProvider" )
256
257 time.sleep(main.startUpSleep)
258 main.step('Starting mininet topology')
259 mnStatus = main.Mininet1.startNet(args='--topo=linear,1')
260 utilities.assert_equals( expect=main.TRUE,
261 actual=mnStatus,
262 onpass="Successfully started Mininet",
263 onfail="Failed to activate Mininet" )
264 main.step("Assinging masters to switches")
265 switches = main.Mininet1.getSwitches()
266 swStatus = main.Mininet1.assignSwController( sw=switches.keys(), ip=main.ONOSip[0] )
267 utilities.assert_equals( expect=main.TRUE,
268 actual=swStatus,
269 onpass="Successfully assigned switches to masters",
270 onfail="Failed assign switches to masters" )
271
272 time.sleep(main.startUpSleep)
273
274 def CASE20(self, main):
275 """
276 host1 send arping package and measure latency
277
278 There are only 1 levels of latency measurements to this test:
279 1 ) ARPING-to-device measurement: Measurement the time from host1
280 send apring package to onos processing the host event
281
282 """
283 import time
284 import subprocess
285 import json
286 import requests
287 import os
288 import numpy
289
290 # Host adding measurement
291 assertion = main.TRUE
292
293 main.log.report('Latency of adding one host to ONOS')
294 main.log.report('First ' + str(main.iterIgnore) + ' iterations ignored' + ' for jvm warmup time')
295 main.log.report('Total iterations of test: ' + str(main.numlter))
296
297 addingHostTime = []
298 metricsResultList = []
299 for i in range(0, int(main.numlter)):
300 main.log.info('Clean up data file')
301 with open(main.tsharkResultPath, "w") as dbFile:
302 dbFile.write("")
303
304 main.log.info('Starting tshark capture')
305 main.ONOSbench.tsharkGrep(main.tsharkPacketIn, main.tsharkResultPath)
306 time.sleep(main.measurementSleep)
307
308 main.log.info('host 1 arping...')
309 main.Mininet1.arping(srcHost='h1', dstHost='10.0.0.2')
310
311 time.sleep(main.measurementSleep)
312
313 main.log.info('Stopping all Tshark processes')
314 main.ONOSbench.tsharkStop()
315
316 time.sleep(main.measurementSleep)
317
318 # Get tshark output
319 with open(main.tsharkResultPath, "r") as resultFile:
320 resultText = resultFile.readline()
321 main.log.info('Capture result:' + resultText)
322 resultText = resultText.split(' ')
323 if len(resultText) > 1:
324 tsharkResultTime = float(resultText[1]) * 1000.0
325 else:
326 main.log.error('Tshark output file for packet_in' + ' returned unexpected results')
327 hostTime = 0
328 caseResult = main.FALSE
329 resultFile.close()
330 # Compare the timestemps, and get the lowest one.
331 temp = 0;
332 # Get host event timestamps from each nodes
333 for node in range (0, main.numCtrls):
334 metricsResult = json.loads(main.CLIs[node].topologyEventsMetrics())
335 metricsResult = metricsResult.get(main.hostTimestampKey).get("value")
336 main.log.info("ONOS topology event matrics timestemp: {}".format(str(metricsResult)) )
337
338 if temp < metricsResult:
339 temp = metricsResult
340 metricsResult = temp
341
342 addingHostTime.append(float(metricsResult) - tsharkResultTime)
343 main.log.info("Result of this iteration: {}".format( str( float(metricsResult) - tsharkResultTime) ))
344 # gethost to remove
345 gethost = main.ONOSrest1.hosts()
346 HosttoRemove = []
347 HosttoRemove.append( json.loads( gethost[1:len(gethost)-1] ).get('id') )
348 main.CLIs[0].removeHost(HosttoRemove)
349
YPZhang82ca5892016-03-01 15:32:09 -0800350 main.log.info("Result List: {}".format(addingHostTime))
351
YPZhanga482c202016-02-18 17:03:07 -0800352 # calculate average latency from each nodes
353 averageResult = numpy.average(addingHostTime)
YPZhang82ca5892016-03-01 15:32:09 -0800354 main.log.info("Average Latency: {}".format(averageResult))
YPZhanga482c202016-02-18 17:03:07 -0800355
356 # calculate std
357 stdResult = numpy.std(addingHostTime)
YPZhang82ca5892016-03-01 15:32:09 -0800358 main.log.info("std: {}".format(stdResult))
YPZhanga482c202016-02-18 17:03:07 -0800359
360 # write to DB file
361 main.log.info("Writing results to DS file")
362 with open(main.dbFileName, "a") as dbFile:
363 # Scale number
364 temp = str(main.numCtrls)
365 temp += ",'" + "baremetal1" + "'"
366 # average latency
367 temp += "," + str( averageResult )
368 # std of latency
369 temp += "," + str(stdResult)
370 temp += "\n"
371 dbFile.write( temp )
372
373 assertion = main.TRUE
374
375 utilities.assert_equals(expect=main.TRUE, actual=assertion,
376 onpass='Host latency test successful',
377 onfail='Host latency test failed')
378
379 main.Mininet1.stopNet()
380 del main.scale[0]