blob: 29d71e5a84878e0bbb38621b9229f1f1d6b298bc [file] [log] [blame]
YPZhang801d46d2016-08-08 13:26:28 -07001'''
2 SCPFportLat test
3 Test latency for port status change
4 Up & Down:
5 PortStatus --- Device --- Link --- Graph
GlennRCdc7ab012015-07-23 15:40:12 -07006
YPZhang801d46d2016-08-08 13:26:28 -07007 yunpeng@onlab.us
8'''
GlennRCdc7ab012015-07-23 15:40:12 -07009class SCPFportLat:
GlennRCdc7ab012015-07-23 15:40:12 -070010 def __init__( self ):
11 self.default = ''
12
YPZhang801d46d2016-08-08 13:26:28 -070013 def CASE0( self, main ):
GlennRCdc7ab012015-07-23 15:40:12 -070014 import os
YPZhang801d46d2016-08-08 13:26:28 -070015 import imp
16 '''
17 - GIT
18 - BUILDING ONOS
19 Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
20 This step is usually skipped. Because in a Jenkins driven automated
21 test env. We want Jenkins jobs to pull&build for flexibility to handle
22 different versions of ONOS.
23 - Construct tests variables
24 '''
25 gitPull = main.params['GIT']['gitPull']
26 gitBranch = main.params['GIT']['gitBranch']
GlennRCdc7ab012015-07-23 15:40:12 -070027
YPZhang801d46d2016-08-08 13:26:28 -070028 main.case( "Pull onos branch and build onos on Teststation." )
GlennRCdc7ab012015-07-23 15:40:12 -070029
YPZhang801d46d2016-08-08 13:26:28 -070030 if gitPull == 'True':
31 main.step( "Git Checkout ONOS branch: " + gitBranch )
32 stepResult = main.ONOSbench.gitCheckout( branch=gitBranch )
33 utilities.assert_equals(expect=main.TRUE,
34 actual=stepResult,
35 onpass="Successfully checkout onos branch.",
36 onfail="Failed to checkout onos branch. Exiting test...")
37 if not stepResult: main.exit()
38
39 main.step( "Git Pull on ONOS branch:" + gitBranch )
40 stepResult = main.ONOSbench.gitPull()
41 utilities.assert_equals(expect=main.TRUE,
42 actual=stepResult,
43 onpass="Successfully pull onos. ",
44 onfail="Failed to pull onos. Exiting test ...")
45 if not stepResult: main.exit()
46
47 main.step( "Building ONOS branch: " + gitBranch )
48 stepResult = main.ONOSbench.cleanInstall( skipTest=True )
49 utilities.assert_equals(expect=main.TRUE,
50 actual=stepResult,
51 onpass="Successfully build onos.",
52 onfail="Failed to build onos. Exiting test...")
53 if not stepResult: main.exit()
54
55 else:
56 main.log.warn( "Skipped pulling onos and Skipped building ONOS" )
57
58 main.testOnDirectory = os.path.dirname( os.getcwd() )
59 main.MN1Ip = main.params['MN']['ip1']
YPZhang0433bee2016-07-12 16:10:59 -070060 main.dependencyPath = main.testOnDirectory + \
61 main.params['DEPENDENCY']['path']
YPZhang801d46d2016-08-08 13:26:28 -070062 main.dependencyFunc = main.params['DEPENDENCY']['function']
63 main.topoName = main.params['DEPENDENCY']['topology']
64 main.cellName = main.params['ENV']['cellName']
65 main.Apps = main.params['ENV']['cellApps']
66 main.scale = (main.params['SCALE']).split(",")
67 main.ofportStatus = main.params['TSHARK']['ofpPortStatus']
68 main.tsharkResultPath = main.params['TSHARK']['tsharkReusltPath']
69 main.sampleSize = int( main.params['TEST']['sampleSize'] )
70 main.warmUp = int( main.params['TEST']['warmUp'] )
71 main.maxProcessTime = int( main.params['TEST']['maxProcessTime'])
72 main.dbFileName = main.params['DATABASE']['dbName']
73 main.startUpSleep = int( main.params['SLEEP']['startup'] )
74 main.measurementSleep = int( main.params['SLEEP']['measure'] )
75 main.maxScale = int( main.params['max'] )
76 main.interface = main.params['TEST']['interface']
77 main.timeout = int( main.params['TIMEOUT']['timeout'] )
78 main.MNSleep = int( main.params['SLEEP']['mininet'])
79 main.device = main.params['TEST']['device']
80 main.debug = main.params['TEST']['debug']
GlennRCdc7ab012015-07-23 15:40:12 -070081
YPZhang801d46d2016-08-08 13:26:28 -070082 if main.debug == "True":
83 main.debug = True
84 else:
85 main.debug = False
GlennRCdc7ab012015-07-23 15:40:12 -070086
YPZhang801d46d2016-08-08 13:26:28 -070087 main.log.info( "Create Database file " + main.dbFileName )
88 resultsDB = open( main.dbFileName, "w+" )
89 resultsDB.close()
GlennRCdc7ab012015-07-23 15:40:12 -070090
YPZhang801d46d2016-08-08 13:26:28 -070091 main.portFunc = imp.load_source(main.dependencyFunc,
92 main.dependencyPath +
93 main.dependencyFunc +
94 ".py")
GlennRCdc7ab012015-07-23 15:40:12 -070095
YPZhang801d46d2016-08-08 13:26:28 -070096 def CASE1( self, main ):
97 # Clean up test environment and set up
98 import time
99 main.log.info( "Get ONOS cluster IP" )
100 print( main.scale )
101 main.numCtrls = int( main.scale.pop(0) )
102 main.ONOSip = []
103 main.maxNumBatch = 0
104 main.AllONOSip = main.ONOSbench.getOnosIps()
105 for i in range( main.numCtrls ):
106 main.ONOSip.append( main.AllONOSip[i] )
107 main.log.info( main.ONOSip )
108 main.CLIs = []
109 main.log.info( "Creating list of ONOS cli handles" )
110 for i in range( main.numCtrls ):
111 main.CLIs.append( getattr(main, 'ONOS%scli' % (i + 1)) )
GlennRCdc7ab012015-07-23 15:40:12 -0700112
YPZhang801d46d2016-08-08 13:26:28 -0700113 if not main.CLIs:
114 main.log.error( "Failed to create the list of ONOS cli handles" )
115 main.cleanup()
116 main.exit()
GlennRCdc7ab012015-07-23 15:40:12 -0700117
YPZhang801d46d2016-08-08 13:26:28 -0700118 main.commit = main.ONOSbench.getVersion( report=True )
119 main.commit = main.commit.split(" ")[1]
120 main.log.info( "Starting up %s node(s) ONOS cluster" % main.numCtrls )
121 main.log.info("Safety check, killing all ONOS processes" +
122 " before initiating environment setup")
GlennRCdc7ab012015-07-23 15:40:12 -0700123
YPZhang801d46d2016-08-08 13:26:28 -0700124 for i in range( main.numCtrls ):
125 main.ONOSbench.onosDie( main.ONOSip[i] )
GlennRCdc7ab012015-07-23 15:40:12 -0700126
YPZhang801d46d2016-08-08 13:26:28 -0700127 main.log.info( "NODE COUNT = %s" % main.numCtrls )
128 main.ONOSbench.createCellFile(main.ONOSbench.ip_address,
129 main.cellName,
130 main.MN1Ip,
131 main.Apps,
132 main.ONOSip)
133 main.step( "Apply cell to environment" )
134 cellResult = main.ONOSbench.setCell( main.cellName )
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 ")
GlennRCdc7ab012015-07-23 15:40:12 -0700142
143 main.step( "Creating ONOS package" )
144 packageResult = main.ONOSbench.onosPackage()
YPZhang801d46d2016-08-08 13:26:28 -0700145 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")
GlennRCdc7ab012015-07-23 15:40:12 -0700150
YPZhang801d46d2016-08-08 13:26:28 -0700151 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
GlennRCdc7ab012015-07-23 15:40:12 -0700160
YPZhang801d46d2016-08-08 13:26:28 -0700161 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
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 time.sleep(2)
181 main.step( "Start ONOS CLI on all nodes" )
182 cliResult = main.TRUE
183 main.step( " Start ONOS cli using thread " )
184 startCliResult = main.TRUE
185 pool = []
186 main.threadID = 0
187 for i in range( int( main.numCtrls ) ):
188 t = main.Thread(target=main.CLIs[i].startOnosCli,
189 threadID=main.threadID,
190 name="startOnosCli",
191 args=[main.ONOSip[i]],
192 kwargs={"onosStartTimeout": main.timeout})
193 pool.append(t)
194 t.start()
195 main.threadID = main.threadID + 1
196 for t in pool:
197 t.join()
198 startCliResult = startCliResult and t.result
199 time.sleep( main.startUpSleep )
200
201 main.log.info( "Configure apps" )
202 main.CLIs[0].setCfg("org.onosproject.net.topology.impl.DefaultTopologyProvider",
203 "maxEvents 1")
204 main.CLIs[0].setCfg("org.onosproject.net.topology.impl.DefaultTopologyProvider",
205 "maxBatchMs 0")
206 main.CLIs[0].setCfg("org.onosproject.net.topology.impl.DefaultTopologyProvider",
207 "maxIdleMs 0")
208 time.sleep(1)
209 main.log.info( "Copy topology file to Mininet" )
210 main.ONOSbench.copyMininetFile(main.topoName,
211 main.dependencyPath,
212 main.Mininet1.user_name,
213 main.Mininet1.ip_address)
214 main.log.info( "Stop Mininet..." )
215 main.Mininet1.stopNet()
216 time.sleep( main.MNSleep )
217 main.log.info( "Start new mininet topology" )
GlennRCdc7ab012015-07-23 15:40:12 -0700218 main.Mininet1.startNet()
YPZhang801d46d2016-08-08 13:26:28 -0700219 main.log.info( "Assign switch to controller to ONOS node 1" )
220 time.sleep(1)
221 main.Mininet1.assignSwController( sw='s1', ip=main.ONOSip[0] )
222 main.Mininet1.assignSwController( sw='s2', ip=main.ONOSip[0] )
GlennRCdc7ab012015-07-23 15:40:12 -0700223
YPZhang801d46d2016-08-08 13:26:28 -0700224 time.sleep(2)
GlennRCdc7ab012015-07-23 15:40:12 -0700225
226 def CASE2( self, main ):
GlennRCdc7ab012015-07-23 15:40:12 -0700227 import time
GlennRCdc7ab012015-07-23 15:40:12 -0700228 import numpy
YPZhang801d46d2016-08-08 13:26:28 -0700229 # dictionary for each node and each timestamps
230 resultDict = {'up' : {}, 'down' : {}}
231 for d in resultDict:
232 for i in range( 1, main.numCtrls + 1 ):
233 resultDict[d][ 'node' + str(i) ] = {}
234 resultDict[d][ 'node' + str(i) ][ 'Ave' ] = {}
235 resultDict[d][ 'node' + str(i) ][ 'Std' ] = {}
236 resultDict[d][ 'node' + str(i) ][ 'EtoE' ] = []
237 resultDict[d][ 'node' + str(i) ][ 'PtoD' ] = []
238 resultDict[d][ 'node' + str(i) ][ 'DtoL' ] = []
239 resultDict[d][ 'node' + str(i) ][ 'LtoG' ] = []
240 for i in range( 1, main.sampleSize + main.warmUp ):
241 main.log.info( "==========================================" )
242 main.log.info( "================iteration:{}==============".format(str (i) ) )
243 if i > main.warmUp:
244 # Portdown iteration
245 main.portFunc.capturePortStatusPack( main, main.device, main.interface, "down", resultDict, False )
246 time.sleep(2)
247 # PortUp iteration
248 main.portFunc.capturePortStatusPack( main, main.device, main.interface, "up", resultDict, False )
GlennRCdc7ab012015-07-23 15:40:12 -0700249 else:
YPZhang801d46d2016-08-08 13:26:28 -0700250 # if warm up, keep old result dictionary
251 main.portFunc.capturePortStatusPack( main, main.device, main.interface, "down", resultDict, True)
252 main.portFunc.capturePortStatusPack( main, main.device, main.interface, "up", resultDict, True)
GlennRCdc7ab012015-07-23 15:40:12 -0700253
YPZhang801d46d2016-08-08 13:26:28 -0700254 # Dictionary for result
255 maxDict = {}
256 maxDict['down'] = {}
257 maxDict['up'] = {}
258 maxDict['down']['max'] = 0
259 maxDict['up']['max'] = 0
260 maxDict['down']['node'] = 0
261 maxDict['up']['node'] = 0
262 EtoEtemp = 0
263 for d in resultDict:
264 for i in range( 1, main.numCtrls + 1 ):
265 # calculate average and std for result, and grep the max End to End data
266 EtoEtemp = numpy.average( resultDict[d][ 'node' + str(i) ]['EtoE'] )
267 resultDict[d][ 'node' + str(i) ][ 'Ave' ][ 'EtoE' ] = EtoEtemp
268 if maxDict[d]['max'] < EtoEtemp:
269 # get max End to End latency
270 maxDict[d]['max'] = EtoEtemp
271 maxDict[d]['node'] = i
272 resultDict[d]['node' + str(i)]['Ave']['PtoD'] = numpy.average(resultDict[d]['node' + str(i)]['PtoD'])
273 resultDict[d]['node' + str(i)]['Ave']['DtoL'] = numpy.average(resultDict[d]['node' + str(i)]['DtoL'])
274 resultDict[d]['node' + str(i)]['Ave']['LtoG'] = numpy.average(resultDict[d]['node' + str(i)]['LtoG'])
GlennRCdc7ab012015-07-23 15:40:12 -0700275
YPZhang801d46d2016-08-08 13:26:28 -0700276 resultDict[d]['node' + str(i)]['Std']['EtoE'] = numpy.std(resultDict[d]['node' + str(i)]['EtoE'])
277 resultDict[d]['node' + str(i)]['Std']['PtoD'] = numpy.std(resultDict[d]['node' + str(i)]['PtoD'])
278 resultDict[d]['node' + str(i)]['Std']['DtoL'] = numpy.std(resultDict[d]['node' + str(i)]['DtoL'])
279 resultDict[d]['node' + str(i)]['Std']['LtoG'] = numpy.std(resultDict[d]['node' + str(i)]['LtoG'])
GlennRCdc7ab012015-07-23 15:40:12 -0700280
YPZhang801d46d2016-08-08 13:26:28 -0700281 main.log.report( "=====node{} Summary:=====".format( str(i) ) )
282 main.log.report( "=============Port {}=======".format( str(d) ) )
283 main.log.report(
284 "End to End average: {}".format( str(resultDict[d][ 'node' + str(i) ][ 'Ave' ][ 'EtoE' ]) ) )
285 main.log.report(
286 "End to End Std: {}".format( str(resultDict[d][ 'node' + str(i) ][ 'Std' ][ 'EtoE' ]) ) )
287 main.log.report(
288 "Package to Device average: {}".format( str(resultDict[d]['node' + str(i)]['Ave']['PtoD']) ) )
289 main.log.report(
290 "Package to Device Std: {}".format( str( resultDict[d]['node' + str(i)]['Std']['PtoD'])))
291 main.log.report(
292 "Device to Link average: {}".format( str( resultDict[d]['node' + str(i)]['Ave']['DtoL']) ) )
293 main.log.report(
294 "Device to Link Std: {}".format( str( resultDict[d]['node' + str(i)]['Std']['DtoL'])))
295 main.log.report(
296 "Link to Grapg average: {}".format( str( resultDict[d]['node' + str(i)]['Ave']['LtoG']) ) )
297 main.log.report(
298 "Link to Grapg Std: {}".format( str( resultDict[d]['node' + str(i)]['Std']['LtoG'] ) ) )
GlennRCdc7ab012015-07-23 15:40:12 -0700299
YPZhang801d46d2016-08-08 13:26:28 -0700300 with open( main.dbFileName, "a" ) as dbFile:
301 # Scale number
302 temp = str( main.numCtrls )
303 temp += ",'baremetal1'"
304 # put result
305 temp += "," + str( resultDict['up'][ 'node' + str(maxDict['up']['node']) ][ 'Ave' ][ 'EtoE' ] )
306 temp += "," + str( resultDict['up'][ 'node' + str(maxDict['up']['node']) ][ 'Ave' ][ 'PtoD' ] )
307 temp += "," + str( resultDict['up'][ 'node' + str(maxDict['up']['node']) ][ 'Ave' ][ 'DtoL' ] )
308 temp += "," + str( resultDict['up'][ 'node' + str(maxDict['up']['node']) ][ 'Ave' ][ 'LtoG' ] )
309 temp += "," + str( resultDict['down'][ 'node' + str(maxDict['down']['node']) ][ 'Ave' ][ 'EtoE' ] )
310 temp += "," + str( resultDict['down'][ 'node' + str(maxDict['down']['node']) ][ 'Ave' ][ 'PtoD' ] )
311 temp += "," + str( resultDict['down'][ 'node' + str(maxDict['down']['node']) ][ 'Ave' ][ 'DtoL' ] )
312 temp += "," + str( resultDict['down'][ 'node' + str(maxDict['down']['node']) ][ 'Ave' ][ 'LtoG' ] )
chengchiyu074e3ef2016-08-24 16:32:32 -0700313
314 temp += "," + str( resultDict['up'][ 'node' + str(maxDict['up']['node']) ][ 'Std' ][ 'EtoE' ] )
315 temp += "," + str( resultDict['down'][ 'node' + str(maxDict['down']['node']) ][ 'Std' ][ 'EtoE' ] )
316
YPZhang801d46d2016-08-08 13:26:28 -0700317 temp += "\n"
318 dbFile.write( temp )
319 dbFile.close()