blob: 2c990c36c3d2a766a1cf8f1248a64e37f71a5394 [file] [log] [blame]
YPZhangb34b7e12016-06-14 14:28:19 -07001"""
2SCPFintentInstallWithdrawLat:
3 - Test the latency of intent installed and withdrawn
4 - Use Push-test-intents command to push intents
5 - Use Null provider with 7 devices and linear topology
6 - Always push intents between 1/6 and 7/5
7 - The batch size is defined in parm file. (default 1,100,1000)
cameron@onlab.us41c16f52015-07-08 15:40:28 -07008
YPZhangb34b7e12016-06-14 14:28:19 -07009 yunpeng@onlab.us
10"""
cameron@onlab.us41c16f52015-07-08 15:40:28 -070011class SCPFintentInstallWithdrawLat:
cameron@onlab.us41c16f52015-07-08 15:40:28 -070012 def __init__( self ):
13 self.default = ''
14
YPZhangb34b7e12016-06-14 14:28:19 -070015 def CASE0( self, main ):
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']
27
28 main.case("Pull onos branch and build onos on Teststation.")
29
30 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.apps = main.params['ENV']['cellApps']
59 main.BENCHUser = main.params['BENCH']['user']
60 main.BENCHIp = main.params['BENCH']['ip1']
61 main.MN1Ip = main.params['MN']['ip1']
62 main.maxNodes = int(main.params['max'])
63 main.cellName = main.params['ENV']['cellName']
64 main.scale = (main.params['SCALE']).split(",")
YPZhangb34b7e12016-06-14 14:28:19 -070065 main.timeout = int(main.params['SLEEP']['timeout'])
66 main.startUpSleep = int(main.params['SLEEP']['startup'])
67 main.installSleep = int(main.params['SLEEP']['install'])
68 main.verifySleep = int(main.params['SLEEP']['verify'])
69 main.verifyAttempts = int(main.params['ATTEMPTS']['verify'])
70 main.sampleSize = int(main.params['TEST']['sampleSize'])
71 main.warmUp = int(main.params['TEST']['warmUp'])
72 main.intentsList = (main.params['TEST']['intents']).split(",")
73 main.ingress = main.params['TEST']['ingress']
74 main.egress = main.params['TEST']['egress']
75 main.debug = main.params['TEST']['debug']
YPZhange6ef82a2016-07-05 16:48:15 -070076 main.flowObj = main.params['TEST']['flowObj']
77
78 if main.flowObj == "True":
79 main.flowObj = True
80 main.dbFileName = main.params['DATABASE']['dbFlowObj']
81 else:
82 main.flowObj = False
83 main.dbFileName = main.params['DATABASE']['dbName']
84
YPZhangb34b7e12016-06-14 14:28:19 -070085 for i in range(0, len(main.intentsList)):
86 main.intentsList[i] = int(main.intentsList[i])
87 # Create DataBase file
88 main.log.info("Create Database file " + main.dbFileName)
89 resultsDB = open(main.dbFileName, "w+")
90 resultsDB.close()
91
Jon Hall4ba53f02015-07-29 13:07:41 -070092 def CASE1( self, main ):
YPZhangb34b7e12016-06-14 14:28:19 -070093 # Clean up test environment and set up
Jon Hall4ba53f02015-07-29 13:07:41 -070094 import time
YPZhangb34b7e12016-06-14 14:28:19 -070095 main.log.info("Get ONOS cluster IP")
96 print(main.scale)
97 main.numCtrls = int(main.scale[0])
98 main.ONOSip = []
99 main.maxNumBatch = 0
100 main.AllONOSip = main.ONOSbench.getOnosIps()
101 for i in range(main.numCtrls):
102 main.ONOSip.append(main.AllONOSip[i])
103 main.log.info(main.ONOSip)
104 main.CLIs = []
105 main.log.info("Creating list of ONOS cli handles")
106 for i in range(main.numCtrls):
107 main.CLIs.append(getattr(main, 'ONOS%scli' % (i + 1)))
Jon Hall4ba53f02015-07-29 13:07:41 -0700108
YPZhangb34b7e12016-06-14 14:28:19 -0700109 if not main.CLIs:
110 main.log.error("Failed to create the list of ONOS cli handles")
111 main.cleanup()
112 main.exit()
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700113
YPZhangb34b7e12016-06-14 14:28:19 -0700114 main.commit = main.ONOSbench.getVersion(report=True)
115 main.commit = main.commit.split(" ")[1]
116 main.log.info("Starting up %s node(s) ONOS cluster" % main.numCtrls)
117 main.log.info("Safety check, killing all ONOS processes" +
118 " before initiating environment setup")
Jon Hall4ba53f02015-07-29 13:07:41 -0700119
YPZhangb34b7e12016-06-14 14:28:19 -0700120 for i in range(main.numCtrls):
You Wangb98a9fa2017-02-15 17:27:42 -0800121 main.ONOSbench.onosStop(main.ONOSip[i])
122 main.ONOSbench.onosKill(main.ONOSip[i])
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700123
YPZhangb34b7e12016-06-14 14:28:19 -0700124 main.log.info("NODE COUNT = %s" % main.numCtrls)
125 main.ONOSbench.createCellFile(main.ONOSbench.ip_address,
126 main.cellName,
127 main.MN1Ip,
128 main.apps,
Devin Lim461f0872017-06-05 16:49:33 -0700129 main.ONOSip,
130 main.ONOScli1.user_name )
YPZhangb34b7e12016-06-14 14:28:19 -0700131 main.step("Apply cell to environment")
132 cellResult = main.ONOSbench.setCell(main.cellName)
133 verifyResult = main.ONOSbench.verifyCell()
134 stepResult = cellResult and verifyResult
135 utilities.assert_equals(expect=main.TRUE,
136 actual=stepResult,
137 onpass="Successfully applied cell to " + \
138 "environment",
139 onfail="Failed to apply cell to environment ")
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700140
YPZhangb34b7e12016-06-14 14:28:19 -0700141 main.step("Creating ONOS package")
Jon Hallbd60ea02016-08-23 10:03:59 -0700142 packageResult = main.ONOSbench.buckBuild()
YPZhangb34b7e12016-06-14 14:28:19 -0700143 stepResult = packageResult
144 utilities.assert_equals(expect=main.TRUE,
145 actual=stepResult,
146 onpass="Successfully created ONOS package",
147 onfail="Failed to create ONOS package")
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700148
YPZhangb34b7e12016-06-14 14:28:19 -0700149 main.step("Uninstall ONOS package on all Nodes")
150 uninstallResult = main.TRUE
151 for i in range(int(main.numCtrls)):
152 main.log.info("Uninstalling package on ONOS Node IP: " + main.ONOSip[i])
153 u_result = main.ONOSbench.onosUninstall(main.ONOSip[i])
154 utilities.assert_equals(expect=main.TRUE, actual=u_result,
155 onpass="Test step PASS",
156 onfail="Test step FAIL")
157 uninstallResult = (uninstallResult and u_result)
Jon Hall4ba53f02015-07-29 13:07:41 -0700158
YPZhangb34b7e12016-06-14 14:28:19 -0700159 main.step("Install ONOS package on all Nodes")
160 installResult = main.TRUE
161 for i in range(int(main.numCtrls)):
162 main.log.info("Installing package on ONOS Node IP: " + main.ONOSip[i])
163 i_result = main.ONOSbench.onosInstall(node=main.ONOSip[i])
164 utilities.assert_equals(expect=main.TRUE, actual=i_result,
165 onpass="Test step PASS",
166 onfail="Test step FAIL")
167 installResult = installResult and i_result
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700168
Chiyu Chengef109502016-11-21 15:51:38 -0800169 main.step( "Set up ONOS secure SSH" )
170 secureSshResult = main.TRUE
171 for i in range( int( main.numCtrls ) ):
172 secureSshResult = secureSshResult and main.ONOSbench.onosSecureSSH( node=main.ONOSip[i] )
173 utilities.assert_equals( expect=main.TRUE, actual=secureSshResult,
174 onpass="Test step PASS",
175 onfail="Test step FAIL" )
176
You Wang0357c432017-01-09 16:13:33 -0800177 time.sleep( main.startUpSleep )
178 main.step( "Starting ONOS service" )
179 stopResult = main.TRUE
180 startResult = main.TRUE
181 onosIsUp = main.TRUE
182 for i in range( main.numCtrls ):
183 onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
184 if onosIsUp == main.TRUE:
185 main.log.report( "ONOS instance is up and ready" )
186 else:
187 main.log.report( "ONOS instance may not be up, stop and " +
188 "start ONOS again " )
189 for i in range( main.numCtrls ):
190 stopResult = stopResult and \
191 main.ONOSbench.onosStop( main.ONOSip[ i ] )
192 for i in range( main.numCtrls ):
193 startResult = startResult and \
194 main.ONOSbench.onosStart( main.ONOSip[ i ] )
195 stepResult = onosIsUp and stopResult and startResult
196 utilities.assert_equals( expect=main.TRUE,
197 actual=stepResult,
198 onpass="ONOS service is ready",
199 onfail="ONOS service did not start properly" )
200
YPZhangb34b7e12016-06-14 14:28:19 -0700201 time.sleep(2)
202 main.step("Start ONOS CLI on all nodes")
203 cliResult = main.TRUE
Jon Hall6509dbf2016-06-21 17:01:17 -0700204 main.step(" Start ONOS cli using thread ")
YPZhangb34b7e12016-06-14 14:28:19 -0700205 startCliResult = main.TRUE
206 pool = []
207 main.threadID = 0
208 for i in range(int(main.numCtrls)):
209 t = main.Thread(target=main.CLIs[i].startOnosCli,
210 threadID=main.threadID,
211 name="startOnosCli",
212 args=[main.ONOSip[i]],
213 kwargs={"onosStartTimeout": main.timeout})
214 pool.append(t)
215 t.start()
216 main.threadID = main.threadID + 1
217 for t in pool:
218 t.join()
219 startCliResult = startCliResult and t.result
220 time.sleep(main.startUpSleep)
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700221
YPZhangb34b7e12016-06-14 14:28:19 -0700222 # configure apps
223 main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "deviceCount", value=7)
224 main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "topoShape", value="linear")
225 main.CLIs[0].setCfg("org.onosproject.provider.nil.NullProviders", "enabled", value="true")
YPZhang325822f2016-06-17 16:01:45 -0700226 main.CLIs[0].setCfg("org.onosproject.net.intent.impl.IntentManager", "skipReleaseResourcesOnWithdrawal", value="true")
YPZhange6ef82a2016-07-05 16:48:15 -0700227 if main.flowObj:
228 main.CLIs[0].setCfg("org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator",
229 "useFlowObjectives", value="true")
You Wang106d0fa2017-05-15 17:22:15 -0700230 main.CLIs[0].setCfg("org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator",
231 "defaultFlowObjectiveCompiler",
232 value='org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler')
YPZhangb34b7e12016-06-14 14:28:19 -0700233 time.sleep(main.startUpSleep)
Jon Hall4ba53f02015-07-29 13:07:41 -0700234
YPZhangb34b7e12016-06-14 14:28:19 -0700235 # balanceMasters
236 main.CLIs[0].balanceMasters()
You Wang3b148ea2016-06-20 20:33:42 -0700237 time.sleep(main.startUpSleep)
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700238
239 def CASE2( self, main ):
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700240 import time
241 import numpy
YPZhangb34b7e12016-06-14 14:28:19 -0700242 import json
243 print(main.intentsList)
244 for batchSize in main.intentsList:
245 main.log.report("Intent Batch size: {}".format(batchSize))
246 main.installLatList = []
247 main.withdrawLatList = []
248 validrun = 0
249 invalidrun = 0
250 # we use two variables to control the iteration
251 while validrun <= main.warmUp + main.sampleSize and invalidrun < 20:
252 if validrun >= main.warmUp:
253 main.log.info("================================================")
254 main.log.info("Starting test iteration " + str(validrun - main.warmUp))
255 main.log.info("Total test iteration: " + str(invalidrun + validrun))
256 main.log.info("================================================")
257 else:
258 main.log.info("====================Warm Up=====================")
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700259
YPZhangb34b7e12016-06-14 14:28:19 -0700260 # push intents
261 installResult = main.CLIs[0].pushTestIntents(main.ingress, main.egress, batchSize,
262 offset=1, options="-i", timeout=main.timeout,
263 getResponse=True)
264 if type(installResult) is str:
265 if "Failure" in installResult:
266 main.log.error("Install Intents failure, ignore this iteration.")
267 if validrun < main.warmUp:
268 validrun += 1
269 continue
270 else:
271 invalidrun += 1
272 continue
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700273
YPZhangb34b7e12016-06-14 14:28:19 -0700274 try:
275 latency = int(installResult.split()[5])
276 main.log.info(installResult)
277 except:
278 main.log.error("Failed to get latency, ignore this iteration.")
279 main.log.error("Response from ONOS:")
280 print(installResult)
281 if validrun < main.warmUp:
282 validrun += 1
283 continue
284 else:
285 invalidrun += 1
286 continue
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700287
YPZhangb34b7e12016-06-14 14:28:19 -0700288 if validrun >= main.warmUp:
289 main.installLatList.append(latency)
290 else:
291 invalidrun += 1
292 continue
293 time.sleep(2)
294 # Withdraw Intents
295 withdrawResult = main.CLIs[0].pushTestIntents(main.ingress, main.egress, batchSize,
296 offset=1, options="-w", timeout=main.timeout,
297 getResponse=True)
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700298
YPZhangb34b7e12016-06-14 14:28:19 -0700299 if type(withdrawResult) is str:
300 if "Failure" in withdrawResult:
301 main.log.error("withdraw Intents failure, ignore this iteration.")
302 if validrun < main.warmUp:
303 validrun += 1
304 continue
305 else:
306 invalidrun += 1
307 continue
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700308
YPZhangb34b7e12016-06-14 14:28:19 -0700309 try:
310 latency = int(withdrawResult.split()[5])
311 main.log.info(withdrawResult)
312 except:
313 main.log.error("Failed to get latency, ignore this iteration.")
314 main.log.error("Response from ONOS:")
315 print(withdrawResult)
316 if validrun < main.warmUp:
317 validrun += 1
318 continue
319 else:
320 invalidrun += 1
321 continue
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700322
YPZhangb34b7e12016-06-14 14:28:19 -0700323 if validrun >= main.warmUp:
324 main.withdrawLatList.append(latency)
325 else:
326 invalidrun += 1
327 continue
328 time.sleep(2)
329 main.CLIs[0].purgeWithdrawnIntents()
330 validrun += 1
331 installave = numpy.average(main.installLatList)
332 installstd = numpy.std(main.installLatList)
333 withdrawave = numpy.average(main.withdrawLatList)
334 withdrawstd = numpy.std(main.withdrawLatList)
335 # log report
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700336 main.log.report("----------------------------------------------------")
YPZhangb34b7e12016-06-14 14:28:19 -0700337 main.log.report("Scale: " + str(main.numCtrls))
338 main.log.report("Intent batch: " + str(batchSize))
339 main.log.report("Install average: {} std: {}".format(installave, installstd))
340 main.log.report("Withdraw average: {} std: {}".format(withdrawave, withdrawstd))
341 # write result to database file
342 if not (numpy.isnan(installave) or numpy.isnan(installstd) or\
343 numpy.isnan(withdrawstd) or numpy.isnan(withdrawave)):
344 databaseString = "'" + main.commit + "',"
345 databaseString += str(main.numCtrls) + ","
346 databaseString += str(batchSize) + ","
347 databaseString += str(installave) + ","
348 databaseString += str(installstd) + ","
349 databaseString += str(withdrawave) + ","
350 databaseString += str(withdrawstd) + "\n"
351 resultsDB = open(main.dbFileName, "a")
352 resultsDB.write(databaseString)
353 resultsDB.close()
354 del main.scale[0]