blob: 42159b4ffddc5afca52a28ef712ad93507486c1b [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 ):
119 main.ONOSbench.onosDie( main.ONOSip[ i ] )
120
121 main.log.info( "NODE COUNT = %s" % main.numCtrls)
122
123 tempOnosIp = []
124 for i in range( main.numCtrls ):
125 tempOnosIp.append( main.ONOSip[i] )
126
127 main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
128 "temp",
129 main.Mininet1.ip_address,
130 main.apps,
131 tempOnosIp )
132
133 main.step( "Apply cell to environment" )
134 cellResult = main.ONOSbench.setCell( "temp" )
135 verifyResult = main.ONOSbench.verifyCell()
136 stepResult = cellResult and verifyResult
137 utilities.assert_equals( expect=main.TRUE,
138 actual=stepResult,
139 onpass="Successfully applied cell to " + \
140 "environment",
141 onfail="Failed to apply cell to environment " )
142
143 main.step( "Creating ONOS package" )
Jon Hallbd60ea02016-08-23 10:03:59 -0700144 packageResult = main.ONOSbench.buckBuild()
YPZhanga482c202016-02-18 17:03:07 -0800145 stepResult = packageResult
146 utilities.assert_equals( expect=main.TRUE,
147 actual=stepResult,
148 onpass="Successfully created ONOS package",
149 onfail="Failed to create ONOS package" )
150
151 main.step( "Uninstall ONOS package on all Nodes" )
152 uninstallResult = main.TRUE
153 for i in range( int( main.numCtrls ) ):
154 main.log.info( "Uninstalling package on ONOS Node IP: " + main.ONOSip[i] )
155 u_result = main.ONOSbench.onosUninstall( main.ONOSip[i] )
156 utilities.assert_equals( expect=main.TRUE, actual=u_result,
157 onpass="Test step PASS",
158 onfail="Test step FAIL" )
159 uninstallResult = ( uninstallResult and u_result )
160
161 main.step( "Install ONOS package on all Nodes" )
162 installResult = main.TRUE
163 for i in range( int( main.numCtrls ) ):
164 main.log.info( "Installing package on ONOS Node IP: " + main.ONOSip[i] )
165 i_result = main.ONOSbench.onosInstall( node=main.ONOSip[i] )
166 utilities.assert_equals( expect=main.TRUE, actual=i_result,
167 onpass="Test step PASS",
168 onfail="Test step FAIL" )
169 installResult = installResult and i_result
170 time.sleep( main.startUpSleep )
171 main.step( "Verify ONOS nodes UP status" )
172 statusResult = main.TRUE
173 for i in range( int( main.numCtrls ) ):
174 main.log.info( "ONOS Node " + main.ONOSip[i] + " status:" )
175 onos_status = main.ONOSbench.onosStatus( node=main.ONOSip[i] )
176 utilities.assert_equals( expect=main.TRUE, actual=onos_status,
177 onpass="Test step PASS",
178 onfail="Test step FAIL" )
179 statusResult = ( statusResult and onos_status )
180
Chiyu Chengef109502016-11-21 15:51:38 -0800181 main.step( "Set up ONOS secure SSH" )
182 secureSshResult = main.TRUE
183 for i in range( int( main.numCtrls ) ):
184 secureSshResult = secureSshResult and main.ONOSbench.onosSecureSSH( node=main.ONOSip[i] )
185 utilities.assert_equals( expect=main.TRUE, actual=secureSshResult,
186 onpass="Test step PASS",
187 onfail="Test step FAIL" )
188
YPZhanga482c202016-02-18 17:03:07 -0800189 main.step( "Start ONOS CLI on all nodes" )
190 cliResult = main.TRUE
Jon Hall6509dbf2016-06-21 17:01:17 -0700191 main.step(" Start ONOS cli using thread ")
YPZhanga482c202016-02-18 17:03:07 -0800192 time.sleep( main.startUpSleep )
193 startCliResult = main.TRUE
194 pool = []
195
196 for i in range( int( main.numCtrls) ):
197 t = main.Thread( target=main.CLIs[i].startOnosCli,
198 threadID=main.threadID,
199 name="startOnosCli",
200 args=[ main.ONOSip[i] ],
201 kwargs = {"onosStartTimeout":main.timeout} )
202 pool.append(t)
203 t.start()
204 main.threadID = main.threadID + 1
205 for t in pool:
206 t.join()
207 startCliResult = startCliResult and t.result
208 time.sleep( main.startUpSleep )
209
210 def CASE11( self, main ):
211 main.log.info( "set and configure Application" )
212 import json
213 import time
214 time.sleep(main.startUpSleep)
215 main.step( "Activating org.onosproject.proxyarp" )
216 appStatus = utilities.retry( main.ONOSrest1.activateApp,
217 main.FALSE,
218 ['org.onosproject.proxyarp'],
219 sleep=3,
220 attempts=3 )
221 utilities.assert_equals( expect=main.TRUE,
222 actual=appStatus,
223 onpass="Successfully activated proxyarp",
224 onfail="Failed to activated proxyarp")
225
226 main.step( "Set up Default Topology Provider" )
227 appStatus = main.TRUE
228 configName = 'org.onosproject.net.topology.impl.DefaultTopologyProvider'
229 configParam = 'maxEvents'
230 appStatus = appStatus and main.CLIs[0].setCfg( configName, configParam,'1' )
231 configParam = 'maxBatchMs'
232 appStatus = appStatus and main.CLIs[0].setCfg( configName, configParam, '0')
233 configParam = 'maxIdleMs'
234 appStatus = appStatus and main.CLIs[0].setCfg( configName, configParam,'0' )
235 utilities.assert_equals( expect=main.TRUE,
236 actual=appStatus,
237 onpass="Successfully set DefaultTopologyProvider",
238 onfail="Failed to set DefaultTopologyProvider" )
239
240 time.sleep(main.startUpSleep)
241 main.step('Starting mininet topology')
242 mnStatus = main.Mininet1.startNet(args='--topo=linear,1')
243 utilities.assert_equals( expect=main.TRUE,
244 actual=mnStatus,
245 onpass="Successfully started Mininet",
246 onfail="Failed to activate Mininet" )
247 main.step("Assinging masters to switches")
248 switches = main.Mininet1.getSwitches()
249 swStatus = main.Mininet1.assignSwController( sw=switches.keys(), ip=main.ONOSip[0] )
250 utilities.assert_equals( expect=main.TRUE,
251 actual=swStatus,
252 onpass="Successfully assigned switches to masters",
253 onfail="Failed assign switches to masters" )
254
255 time.sleep(main.startUpSleep)
256
257 def CASE20(self, main):
258 """
259 host1 send arping package and measure latency
260
261 There are only 1 levels of latency measurements to this test:
262 1 ) ARPING-to-device measurement: Measurement the time from host1
263 send apring package to onos processing the host event
264
265 """
266 import time
267 import subprocess
268 import json
269 import requests
270 import os
271 import numpy
272
273 # Host adding measurement
274 assertion = main.TRUE
275
276 main.log.report('Latency of adding one host to ONOS')
277 main.log.report('First ' + str(main.iterIgnore) + ' iterations ignored' + ' for jvm warmup time')
278 main.log.report('Total iterations of test: ' + str(main.numlter))
279
280 addingHostTime = []
281 metricsResultList = []
282 for i in range(0, int(main.numlter)):
283 main.log.info('Clean up data file')
284 with open(main.tsharkResultPath, "w") as dbFile:
285 dbFile.write("")
286
287 main.log.info('Starting tshark capture')
288 main.ONOSbench.tsharkGrep(main.tsharkPacketIn, main.tsharkResultPath)
289 time.sleep(main.measurementSleep)
290
291 main.log.info('host 1 arping...')
292 main.Mininet1.arping(srcHost='h1', dstHost='10.0.0.2')
293
294 time.sleep(main.measurementSleep)
295
296 main.log.info('Stopping all Tshark processes')
297 main.ONOSbench.tsharkStop()
298
299 time.sleep(main.measurementSleep)
300
301 # Get tshark output
302 with open(main.tsharkResultPath, "r") as resultFile:
303 resultText = resultFile.readline()
304 main.log.info('Capture result:' + resultText)
305 resultText = resultText.split(' ')
306 if len(resultText) > 1:
307 tsharkResultTime = float(resultText[1]) * 1000.0
308 else:
309 main.log.error('Tshark output file for packet_in' + ' returned unexpected results')
310 hostTime = 0
311 caseResult = main.FALSE
312 resultFile.close()
313 # Compare the timestemps, and get the lowest one.
314 temp = 0;
315 # Get host event timestamps from each nodes
316 for node in range (0, main.numCtrls):
317 metricsResult = json.loads(main.CLIs[node].topologyEventsMetrics())
318 metricsResult = metricsResult.get(main.hostTimestampKey).get("value")
319 main.log.info("ONOS topology event matrics timestemp: {}".format(str(metricsResult)) )
320
321 if temp < metricsResult:
322 temp = metricsResult
323 metricsResult = temp
324
325 addingHostTime.append(float(metricsResult) - tsharkResultTime)
326 main.log.info("Result of this iteration: {}".format( str( float(metricsResult) - tsharkResultTime) ))
327 # gethost to remove
328 gethost = main.ONOSrest1.hosts()
329 HosttoRemove = []
330 HosttoRemove.append( json.loads( gethost[1:len(gethost)-1] ).get('id') )
331 main.CLIs[0].removeHost(HosttoRemove)
332
YPZhang82ca5892016-03-01 15:32:09 -0800333 main.log.info("Result List: {}".format(addingHostTime))
334
YPZhanga482c202016-02-18 17:03:07 -0800335 # calculate average latency from each nodes
336 averageResult = numpy.average(addingHostTime)
YPZhang82ca5892016-03-01 15:32:09 -0800337 main.log.info("Average Latency: {}".format(averageResult))
YPZhanga482c202016-02-18 17:03:07 -0800338
339 # calculate std
340 stdResult = numpy.std(addingHostTime)
YPZhang82ca5892016-03-01 15:32:09 -0800341 main.log.info("std: {}".format(stdResult))
YPZhanga482c202016-02-18 17:03:07 -0800342
343 # write to DB file
344 main.log.info("Writing results to DS file")
345 with open(main.dbFileName, "a") as dbFile:
346 # Scale number
347 temp = str(main.numCtrls)
348 temp += ",'" + "baremetal1" + "'"
349 # average latency
350 temp += "," + str( averageResult )
351 # std of latency
352 temp += "," + str(stdResult)
353 temp += "\n"
354 dbFile.write( temp )
355
356 assertion = main.TRUE
357
358 utilities.assert_equals(expect=main.TRUE, actual=assertion,
359 onpass='Host latency test successful',
360 onfail='Host latency test failed')
361
362 main.Mininet1.stopNet()
363 del main.scale[0]