blob: fa089d4ea0d83f5204f0ea24ead02b60fb379142 [file] [log] [blame]
cameron@onlab.us059c2562015-04-02 14:12:51 -07001# ScaleOutTemplate
andrew@onlab.us2ae3a112015-02-02 11:24:32 -08002#
3# CASE1 starts number of nodes specified in param file
4#
5# cameron@onlab.us
6
andrew@onlab.us10332202015-03-11 15:04:43 -07007import sys
cameron@onlab.us059c2562015-04-02 14:12:51 -07008import os.path
cameron@onlab.usaaecfd72015-07-08 12:27:26 -07009import time
andrew@onlab.us10332202015-03-11 15:04:43 -070010
andrew@onlab.us2ae3a112015-02-02 11:24:32 -080011
cameron@onlab.usaaecfd72015-07-08 12:27:26 -070012class SCPFintentEventTP:
andrew@onlab.us2ae3a112015-02-02 11:24:32 -080013
14 def __init__( self ):
15 self.default = ''
16
cameron@onlab.usaaecfd72015-07-08 12:27:26 -070017 def CASE1( self, main ):
18 import sys
cameron@onlab.usc10e22c2015-05-13 13:07:28 -070019 import os.path
cameron@onlab.usaaecfd72015-07-08 12:27:26 -070020 import time
cameron@onlab.usc10e22c2015-05-13 13:07:28 -070021
cameron@onlab.usaaecfd72015-07-08 12:27:26 -070022 global init
23 try:
24 if type(init) is not bool:
25 init = Fals
26 except NameError:
27 init = False
28
andrew@onlab.us10332202015-03-11 15:04:43 -070029 #Load values from params file
andrew@onlab.us2ae3a112015-02-02 11:24:32 -080030 checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
31 gitPull = main.params[ 'GIT' ][ 'autopull' ]
32 cellName = main.params[ 'ENV' ][ 'cellName' ]
cameron@onlab.us059c2562015-04-02 14:12:51 -070033 Apps = main.params[ 'ENV' ][ 'cellApps' ]
andrew@onlab.us2ae3a112015-02-02 11:24:32 -080034 BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
35 BENCHUser = main.params[ 'BENCH' ][ 'user' ]
cameron@onlab.us059c2562015-04-02 14:12:51 -070036 MN1Ip = main.params[ 'MN' ][ 'ip1' ]
andrew@onlab.us10332202015-03-11 15:04:43 -070037 maxNodes = int(main.params[ 'availableNodes' ])
andrew@onlab.us10332202015-03-11 15:04:43 -070038 skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
cameron@onlab.usaaecfd72015-07-08 12:27:26 -070039 cellName = main.params[ 'ENV' ][ 'cellName' ]
jenkins3af0cd82015-03-24 10:27:16 -070040 numSwitches = (main.params[ 'TEST' ][ 'numSwitches' ]).split(",")
cameron@onlab.uscd4e8a22015-05-11 10:58:43 -070041 flowRuleBU = main.params[ 'TEST' ][ 'flowRuleBUEnabled' ]
cameron@onlab.usc10e22c2015-05-13 13:07:28 -070042 onBaremetal = main.params['isOnBaremetal']
43 homeDir = os.path.expanduser('~')
andrew@onlab.us2ae3a112015-02-02 11:24:32 -080044
cameron@onlab.us412e9562015-05-13 16:04:34 -070045 main.exceptions = [0]*11
46 main.warnings = [0]*11
47 main.errors = [0]*11
48
cameron@onlab.us059c2562015-04-02 14:12:51 -070049 # -- INIT SECTION, ONLY RUNS ONCE -- #
50 if init == False:
51 init = True
52 global clusterCount #number of nodes running
53 global ONOSIp #list of ONOS IP addresses
54 global scale
cameron@onlab.usc80a8c82015-04-15 14:57:37 -070055 global commit
cameron@onlab.usc10e22c2015-05-13 13:07:28 -070056
cameron@onlab.us059c2562015-04-02 14:12:51 -070057 clusterCount = 0
cameron@onlab.usaaecfd72015-07-08 12:27:26 -070058 ONOSIp = []
cameron@onlab.us059c2562015-04-02 14:12:51 -070059 scale = (main.params[ 'SCALE' ]).split(",")
60 clusterCount = int(scale[0])
61
62 #Populate ONOSIp with ips from params
jenkins15b2b132015-06-23 14:04:09 -070063 ONOSIp.extend(main.ONOSbench.getOnosIps())
jenkins15b2b132015-06-23 14:04:09 -070064
cameron@onlab.us059c2562015-04-02 14:12:51 -070065 #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
66 if skipMvn != "yes":
67 mvnResult = main.ONOSbench.cleanInstall()
68
69 #git
70 main.step( "Git checkout and pull " + checkoutBranch )
71 if gitPull == 'on':
72 checkoutResult = main.ONOSbench.gitCheckout( checkoutBranch )
73 pullResult = main.ONOSbench.gitPull()
74
75 else:
76 checkoutResult = main.TRUE
77 pullResult = main.TRUE
78 main.log.info( "Skipped git checkout and pull" )
andrew@onlab.us10332202015-03-11 15:04:43 -070079
cameron@onlab.usc80a8c82015-04-15 14:57:37 -070080 commit = main.ONOSbench.getVersion()
81 commit = (commit.split(" "))[1]
82
83 resultsDB = open("IntentEventTPDB", "w+")
84 resultsDB.close()
85
cameron@onlab.us059c2562015-04-02 14:12:51 -070086 # -- END OF INIT SECTION --#
87
88 clusterCount = int(scale[0])
89 scale.remove(scale[0])
jenkins5a771992015-06-24 13:53:27 -070090
91 MN1Ip = ONOSIp[len(ONOSIp) -1]
92 BENCHIp = ONOSIp[len(ONOSIp) -2]
93
cameron@onlab.us059c2562015-04-02 14:12:51 -070094 #kill off all onos processes
andrew@onlab.us10332202015-03-11 15:04:43 -070095 main.log.step("Safety check, killing all ONOS processes")
96 main.log.step("before initiating enviornment setup")
cameron@onlab.usaaecfd72015-07-08 12:27:26 -070097 for node in range(maxNodes):
andrew@onlab.us10332202015-03-11 15:04:43 -070098 main.ONOSbench.onosDie(ONOSIp[node])
jenkins8f8f4f32015-06-24 14:05:04 -070099
100 MN1Ip = ONOSIp[len(ONOSIp) -1]
101 BENCHIp = ONOSIp[len(ONOSIp) -2]
102
andrew@onlab.us10332202015-03-11 15:04:43 -0700103 #Uninstall everywhere
andrew@onlab.us2ae3a112015-02-02 11:24:32 -0800104 main.log.step( "Cleaning Enviornment..." )
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700105 for i in range(maxNodes):
andrew@onlab.us10332202015-03-11 15:04:43 -0700106 main.log.info(" Uninstalling ONOS " + str(i) )
107 main.ONOSbench.onosUninstall( ONOSIp[i] )
cameron@onlab.us059c2562015-04-02 14:12:51 -0700108
109 #construct the cell file
110 main.log.info("Creating cell file")
111 cellIp = []
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700112 for node in range (clusterCount):
cameron@onlab.us059c2562015-04-02 14:12:51 -0700113 cellIp.append(ONOSIp[node])
jenkins5a771992015-06-24 13:53:27 -0700114
cameron@onlab.us059c2562015-04-02 14:12:51 -0700115 main.ONOSbench.createCellFile(BENCHIp,cellName,MN1Ip,str(Apps), *cellIp)
116
117 main.step( "Set Cell" )
118 main.ONOSbench.setCell(cellName)
andrew@onlab.us2ae3a112015-02-02 11:24:32 -0800119
jenkins3af0cd82015-03-24 10:27:16 -0700120 myDistribution = []
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700121 for node in range (clusterCount):
122 myDistribution.append(numSwitches[node])
andrew@onlab.us2ae3a112015-02-02 11:24:32 -0800123
cameron@onlab.usc80a8c82015-04-15 14:57:37 -0700124 #main.ONOSbench.createLinkGraphFile( BENCHIp,cellIp,myDistribution)
cameron@onlab.usc10e22c2015-05-13 13:07:28 -0700125
126 if onBaremetal == "True":
127 filename = "/onos/tools/package/bin/onos-service"
128 serviceConfig = open(homeDir + filename, 'w+')
129 serviceConfig.write("#!/bin/bash\n ")
130 serviceConfig.write("#------------------------------------- \n ")
131 serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
132 serviceConfig.write("#------------------------------------- \n ")
133 serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
134 serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms8G -Xmx8G}" \n """)
135 serviceConfig.write("")
136 serviceConfig.write("ONOS_HOME=/opt/onos \n ")
137 serviceConfig.write("")
138 serviceConfig.write("[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n")
139 serviceConfig.write("""${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """)
140 serviceConfig.close()
141 main.log.info("Set /onos/tools/package/bin/onos-service with 8G Xms/Xmx Options.")
142
andrew@onlab.us2ae3a112015-02-02 11:24:32 -0800143 main.step( "Creating ONOS package" )
144 packageResult = main.ONOSbench.onosPackage()
145
andrew@onlab.us2ae3a112015-02-02 11:24:32 -0800146 main.step( "verify cells" )
147 verifyCellResult = main.ONOSbench.verifyCell()
cameron@onlab.us059c2562015-04-02 14:12:51 -0700148
149 main.log.report( "Initializeing " + str( clusterCount ) + " node cluster." )
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700150 for node in range(clusterCount):
cameron@onlab.us059c2562015-04-02 14:12:51 -0700151 main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
andrew@onlab.us10332202015-03-11 15:04:43 -0700152 main.ONOSbench.onosInstall( ONOSIp[node])
cameron@onlab.us059c2562015-04-02 14:12:51 -0700153
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700154 for node in range(clusterCount):
andrew@onlab.us10332202015-03-11 15:04:43 -0700155 for i in range( 2 ):
156 isup = main.ONOSbench.isup( ONOSIp[node] )
157 if isup:
158 main.log.info("ONOS " + str(node) + " is up\n")
159 break
160 if not isup:
161 main.log.report( "ONOS " + str(node) + " didn't start!" )
cameron@onlab.us059c2562015-04-02 14:12:51 -0700162 main.log.info("Startup sequence complete")
163
cameron@onlab.usc80a8c82015-04-15 14:57:37 -0700164 time.sleep(20)
165
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700166 main.ONOSbench.onosCfgSet( ONOSIp[0], "org.onosproject.store.flow.impl.NewDistributedFlowRuleStore", "backupEnabled false")
cameron@onlab.usf33b45c2015-05-06 13:54:46 -0700167
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700168 main.log.step("Setting up null provider")
169 for i in range(3):
170 main.ONOSbench.onosCfgSet( ONOSIp[0], "org.onosproject.provider.nil.NullProviders", "deviceCount 8")
171 main.ONOSbench.onosCfgSet( ONOSIp[0], "org.onosproject.provider.nil.NullProviders", "topoShape linear")
172 main.ONOSbench.onosCfgSet( ONOSIp[0], "org.onosproject.provider.nil.NullProviders", "enabled true")
173 time.sleep(5)
174
175 main.ONOSbench.handle.sendline("onos $OC1 summary")
cameron@onlab.usf33b45c2015-05-06 13:54:46 -0700176 main.ONOSbench.handle.expect(":~")
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700177
178 before = main.ONOSbench.handle.before
179 if "devices=8" in before and "links=14" in before:
cameron@onlab.usf33b45c2015-05-06 13:54:46 -0700180 break
cameron@onlab.uscd4e8a22015-05-11 10:58:43 -0700181
cameron@onlab.usc80a8c82015-04-15 14:57:37 -0700182 main.ONOSbench.handle.sendline("""onos $OC1 "balance-masters" """)
183 main.ONOSbench.handle.expect(":~")
184 print main.ONOSbench.handle.before
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700185
andrew@onlab.us10332202015-03-11 15:04:43 -0700186 lastOutput = "--"
187 origin = time.time()
188 clockStarted = False
cameron@onlab.uscd4e8a22015-05-11 10:58:43 -0700189 while True:
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700190
191 main.ONOSbench.handle.sendline("")
192 main.ONOSbench.handle.expect(":~")
193
andrew@onlab.us10332202015-03-11 15:04:43 -0700194 main.ONOSbench.handle.sendline("onos $OC1 summary")
195 main.ONOSbench.handle.expect(":~")
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700196
cameron@onlab.usf33b45c2015-05-06 13:54:46 -0700197 main.log.info("before" + main.ONOSbench.handle.before)
Jon Hallf57a5ef2015-07-07 17:56:16 -0700198 clusterCheck = main.ONOSbench.handle.before
andrew@onlab.us10332202015-03-11 15:04:43 -0700199 print("\nBefore: " + str(clusterCheck))
cameron@onlab.us059c2562015-04-02 14:12:51 -0700200 if ("SCC(s)=1,") in clusterCheck:
andrew@onlab.us10332202015-03-11 15:04:43 -0700201 break
202 if clusterCheck != lastOutput:
203 sameOutput = False
204 elif clusterCheck == lastOutput:
205 if clockStarted == False:
206 start = time.time()
207 clockStarted = True
cameron@onlab.usaaecfd72015-07-08 12:27:26 -0700208 if time.time() > (start + 30):
andrew@onlab.us10332202015-03-11 15:04:43 -0700209 main.log.error("TIMEOUT EXCEEDED: Clusters have not converged, continuing anyway...")
210 break
211 lastOutput = clusterCheck
212 time.sleep(5)
jenkins50379942015-06-19 13:36:43 -0700213 main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"])
cameron@onlab.us059c2562015-04-02 14:12:51 -0700214 def CASE2( self, main ):
andrew@onlab.us10332202015-03-11 15:04:43 -0700215 import time
andrew@onlab.us2ae3a112015-02-02 11:24:32 -0800216 import json
cameron@onlab.us059c2562015-04-02 14:12:51 -0700217 import string
andrew@onlab.us10332202015-03-11 15:04:43 -0700218 import csv
jenkins3af0cd82015-03-24 10:27:16 -0700219 import numpy
cameron@onlab.usc10e22c2015-05-13 13:07:28 -0700220 import os.path
221
222 global currentNeighbors
223 neighbors = []
224
225 try:
226 currentNeighbors
227 except:
228 currentNeighbors = "0"
229 neighbors = ['0']
230 else:
231 if currentNeighbors == "r": #reset
232 currentNeighbors = "a"
233 neighbors = ['0']
234 else:
235 currentNeighbors = "r"
236 neighbors = ['a']
237
238 if clusterCount == 1:
239 currentNeighbors = "r"
andrew@onlab.us10332202015-03-11 15:04:43 -0700240
andrew@onlab.us2ae3a112015-02-02 11:24:32 -0800241 main.log.info("Cluster Count = " + str(clusterCount))
242
andrew@onlab.us10332202015-03-11 15:04:43 -0700243 intentsRate = main.params['METRICS']['intents_rate']
244 intentsWithdrawn = main.params[ 'METRICS' ][ 'intents_withdrawn' ]
245 intentsFailed = main.params[ 'METRICS' ][ 'intents_failed' ]
246 testDuration = main.params[ 'TEST' ][ 'duration' ]
247 logInterval = main.params[ 'TEST' ][ 'log_interval' ]
248 debug = main.params[ 'debugMode' ]
cameron@onlab.us059c2562015-04-02 14:12:51 -0700249 numKeys = main.params[ 'TEST' ][ 'numKeys' ]
250 cyclePeriod = main.params[ 'TEST' ][ 'cyclePeriod' ]
cameron@onlab.usc10e22c2015-05-13 13:07:28 -0700251 #neighbors = (main.params[ 'TEST' ][ 'neighbors' ]).split(",")
andrew@onlab.us10332202015-03-11 15:04:43 -0700252 metricList = [intentsRate, intentsWithdrawn, intentsFailed]
jenkins3af0cd82015-03-24 10:27:16 -0700253
cameron@onlab.us059c2562015-04-02 14:12:51 -0700254 for n in range(0, len(neighbors)):
255 if neighbors[n] == 'a':
256 neighbors[n] = str(clusterCount -1)
cameron@onlab.usc80a8c82015-04-15 14:57:37 -0700257 if int(clusterCount) == 1:
258 neighbors = neighbors.pop()
259
cameron@onlab.us059c2562015-04-02 14:12:51 -0700260 for n in neighbors:
261 main.log.info("Run with " + n + " neighbors")
262 time.sleep(5)
cameron@onlab.uscd4e8a22015-05-11 10:58:43 -0700263 main.ONOSbench.handle.sendline("onos $OC1 cfg set org.onosproject.intentperf.IntentPerfInstaller numKeys " + numKeys )
cameron@onlab.us059c2562015-04-02 14:12:51 -0700264 main.ONOSbench.handle.expect(":~")
265 main.ONOSbench.handle.sendline("onos $OC1 cfg set org.onosproject.intentperf.IntentPerfInstaller numNeighbors " + n )
266 main.ONOSbench.handle.expect(":~")
267 main.ONOSbench.handle.sendline("onos $OC1 cfg set org.onosproject.intentperf.IntentPerfInstaller cyclePeriod " + cyclePeriod )
268 main.ONOSbench.handle.expect(":~")
jenkins3af0cd82015-03-24 10:27:16 -0700269
cameron@onlab.us059c2562015-04-02 14:12:51 -0700270 cmd = "onos $OC1 intent-perf-start"
271 main.ONOSbench.handle.sendline(cmd)
272 main.ONOSbench.handle.expect(":~")
273 main.log.info("Starting ONOS (all nodes) intent-perf from $OC1" )
jenkins3af0cd82015-03-24 10:27:16 -0700274
cameron@onlab.us059c2562015-04-02 14:12:51 -0700275 main.log.info( "Starting test loop for " + str(testDuration) + " seconds...\n" )
276 stop = time.time() + float( testDuration )
jenkins3af0cd82015-03-24 10:27:16 -0700277
cameron@onlab.us059c2562015-04-02 14:12:51 -0700278 while time.time() < stop:
279 time.sleep( float( logInterval ) )
280 groupResult = []
281 for node in range (1, clusterCount + 1):
282 groupResult.append(0)
jenkins3af0cd82015-03-24 10:27:16 -0700283
cameron@onlab.us059c2562015-04-02 14:12:51 -0700284 cmd = " onos-ssh $OC" + str(node) + """ cat /opt/onos/log/karaf.log | grep "SNAPSHOT | Throughput" | tail -1 """
285 main.log.info("COMMAND: " + str(cmd))
286
287 x = 0
288 while True:
289 main.ONOSbench.handle.sendline(cmd)
jenkins50379942015-06-19 13:36:43 -0700290 time.sleep(6)
cameron@onlab.us059c2562015-04-02 14:12:51 -0700291 main.ONOSbench.handle.expect(":~")
292 raw = main.ONOSbench.handle.before
293 if "OVERALL=" in raw:
294 break
295 x += 1
296 if x > 10:
297 main.log.error("Expected output not being recieved... continuing")
298 break
299 time.sleep(2)
300
301 raw = raw.splitlines()
302 splitResults = []
303 for line in raw:
304 splitResults.extend(line.split(" "))
305
306 myResult = "--"
307 for field in splitResults:
308 if "OVERALL" in field:
309 myResult = field
310
311 if myResult == "--":
312 main.log.error("Parsing/Pexpect error\n" + str(splitResults))
313
314 myResult = myResult.replace(";", "")
315 myResult = myResult.replace("OVERALL=","")
316 myResult = float(myResult)
317 groupResult[len(groupResult) -1] = myResult
318
319 main.log.info("Node " + str(node) + " overall rate: " + str(myResult))
320
cameron@onlab.usc80a8c82015-04-15 14:57:37 -0700321 clusterTotal = str(numpy.sum(groupResult))
cameron@onlab.us059c2562015-04-02 14:12:51 -0700322 main.log.report("Results from this round of polling: " + str(groupResult))
cameron@onlab.usc80a8c82015-04-15 14:57:37 -0700323 main.log.report("Cluster Total: " + clusterTotal + "\n")
cameron@onlab.usc10e22c2015-05-13 13:07:28 -0700324
cameron@onlab.us059c2562015-04-02 14:12:51 -0700325 cmd = "onos $OC1 intent-perf-stop"
326 main.ONOSbench.handle.sendline(cmd)
327 main.ONOSbench.handle.expect(":~")
328 main.log.info("Stopping intentperf" )
cameron@onlab.usc80a8c82015-04-15 14:57:37 -0700329
330 resultsDB = open("IntentEventTPDB", "a")
331 for node in groupResult:
332
333 resultString = "'" + commit + "',"
334 resultString += "'1gig',"
335 resultString += str(clusterCount) + ","
336 resultString += "'baremetal" + str(int(groupResult.index(node)) + 1) + "',"
337 resultString += n + ","
338 resultString += str(node) + ","
339 resultString += str(0) + "\n" #no stddev
340 resultsDB.write(resultString)
341
342 resultsDB.close()
cameron@onlab.usc10e22c2015-05-13 13:07:28 -0700343
jenkins50379942015-06-19 13:36:43 -0700344 main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"])
cameron@onlab.usc80a8c82015-04-15 14:57:37 -0700345