Package TestON :: Package tests :: Package SCPFflowTp1g :: Module SCPFflowTp1g
[hide private]
[frames] | no frames]

Source Code for Module TestON.tests.SCPFflowTp1g.SCPFflowTp1g

  1  # ScaleOutTemplate -> flowTP 
  2  # 
  3  # CASE1 starts number of nodes specified in param file 
  4  # 
  5  # cameron@onlab.us 
  6   
  7  import sys 
  8  import os.path 
  9   
 10   
11 -class SCPFflowTp1g:
12
13 - def __init__( self ):
14 self.default = ''
15
16 - def CASE1( self, main ):
17 18 import time 19 global init 20 try: 21 if type(init) is not bool: 22 init = False 23 except NameError: 24 init = False 25 26 #Load values from params file 27 checkoutBranch = main.params[ 'GIT' ][ 'checkout' ] 28 gitPull = main.params[ 'GIT' ][ 'autopull' ] 29 cellName = main.params[ 'ENV' ][ 'cellName' ] 30 Apps = main.params[ 'ENV' ][ 'cellApps' ] 31 BENCHUser = main.params[ 'BENCH' ][ 'user' ] 32 BENCHIp = main.params[ 'BENCH' ][ 'ip1' ] 33 main.maxNodes = int(main.params[ 'max' ]) 34 skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ] 35 cellName = main.params[ 'ENV' ][ 'cellName' ] 36 37 main.log.info("==========DEBUG VERSION 3===========") 38 39 # -- INIT SECTION, ONLY RUNS ONCE -- # 40 if init == False: 41 init = True 42 global clusterCount #number of nodes running 43 global ONOSIp #list of ONOS IP addresses 44 global scale 45 global commit 46 47 clusterCount = 0 48 ONOSIp = [ 0 ] 49 scale = (main.params[ 'SCALE' ]).split(",") 50 clusterCount = int(scale[0]) 51 52 #Populate ONOSIp with ips from params 53 for i in range(1, main.maxNodes + 1): 54 ipString = 'ip' + str(i) 55 ONOSIp.append(main.params[ 'CTRL' ][ ipString ]) 56 57 ONOSIp = [0] 58 ONOSIp.extend(main.ONOSbench.getOnosIps()) 59 60 #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test 61 if skipMvn != "yes": 62 mvnResult = main.ONOSbench.cleanInstall() 63 64 #git 65 main.step( "Git checkout and pull " + checkoutBranch ) 66 if gitPull == 'on': 67 checkoutResult = main.ONOSbench.gitCheckout( checkoutBranch ) 68 pullResult = main.ONOSbench.gitPull() 69 70 else: 71 checkoutResult = main.TRUE 72 pullResult = main.TRUE 73 main.log.info( "Skipped git checkout and pull" ) 74 75 commit = main.ONOSbench.getVersion() 76 commit = (commit.split(" "))[1] 77 78 resultsDB = open("/tmp/flowTP1gDB", "w+") 79 resultsDB.close() 80 81 # -- END OF INIT SECTION --# 82 83 clusterCount = int(scale[0]) 84 scale.remove(scale[0]) 85 main.log.info("CLUSTER COUNT: " + str(clusterCount)) 86 87 #kill off all onos processes 88 main.log.step("Safety check, killing all ONOS processes") 89 main.log.step("before initiating enviornment setup") 90 for node in range(1, main.maxNodes + 1): 91 main.ONOSbench.onosDie(ONOSIp[node]) 92 93 #Uninstall everywhere 94 main.log.step( "Cleaning Enviornment..." ) 95 for i in range(1, main.maxNodes + 1): 96 main.log.info(" Uninstalling ONOS " + str(i) ) 97 main.ONOSbench.onosUninstall( ONOSIp[i] ) 98 99 #construct the cell file 100 main.log.info("Creating cell file") 101 cellIp = [] 102 for node in range (1, clusterCount + 1): 103 cellIp.append(ONOSIp[node]) 104 105 main.ONOSbench.createCellFile(BENCHIp,cellName,"localhost",str(Apps), cellIp) 106 main.log.info("Cell Ip list: " + str(cellIp)) 107 108 main.step( "Set Cell" ) 109 main.ONOSbench.setCell(cellName) 110 111 main.step( "Creating ONOS package" ) 112 packageResult = main.ONOSbench.onosPackage() 113 114 main.step( "verify cells" ) 115 verifyCellResult = main.ONOSbench.verifyCell() 116 117 main.log.report( "Initializeing " + str( clusterCount ) + " node cluster." ) 118 for node in range(1, clusterCount + 1): 119 main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node]) 120 main.ONOSbench.onosInstall( ONOSIp[node]) 121 122 for node in range(1, clusterCount + 1): 123 for i in range( 2 ): 124 isup = main.ONOSbench.isup( ONOSIp[node] ) 125 if isup: 126 main.log.info("ONOS " + str(node) + " is up\n") 127 break 128 if not isup: 129 main.log.report( "ONOS " + str(node) + " didn't start!" ) 130 131 for node in range(1, clusterCount + 1): 132 exec "a = main.ONOS%scli.startOnosCli" %str(node) 133 a(ONOSIp[node]) 134 135 main.log.info("Startup sequence complete") 136 main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], outputMode="d")
137 - def CASE2( self, main ):
138 # 139 # This is the flow TP test 140 # 141 import os.path 142 import numpy 143 import math 144 import time 145 import datetime 146 import traceback 147 148 global currentNeighbors 149 try: 150 currentNeighbors 151 except: 152 currentNeighbors = (main.params[ 'TEST' ][ 'neighbors' ]).split(",")[0] 153 else: 154 if currentNeighbors == "r": #reset 155 currentNeighbors = "0" 156 else: 157 currentNeighbors = "a" 158 159 testCMD = [ 0,0,0,0 ] 160 warmUp = int(main.params[ 'TEST' ][ 'warmUp' ]) 161 sampleSize = int(main.params[ 'TEST' ][ 'sampleSize' ]) 162 switches = int(main.params[ 'TEST' ][ 'switches' ]) 163 neighborList = (main.params[ 'TEST' ][ 'neighbors' ]).split(",") 164 testCMD[0] = main.params[ 'TEST' ][ 'testCMD0' ] 165 testCMD[1] = main.params[ 'TEST' ][ 'testCMD1' ] 166 main.maxNodes = main.params[ 'max' ] 167 cooldown = main.params[ 'TEST' ][ 'cooldown' ] 168 cellName = main.params[ 'ENV' ][ 'cellName' ] 169 BENCHIp = main.params[ 'BENCH' ][ 'ip1' ] 170 BENCHUser = main.params[ 'BENCH' ][ 'user' ] 171 MN1Ip = main.params[ 'MN' ][ 'ip1' ] 172 homeDir = os.path.expanduser('~') 173 flowRuleBackup = str(main.params[ 'TEST' ][ 'enableFlowRuleStoreBackup' ]) 174 main.log.info("Flow Rule Backup is set to:" + flowRuleBackup) 175 176 servers = str(clusterCount) 177 178 if clusterCount == 1: 179 neighborList = ['0'] 180 currentNeighbors = "r" 181 else: 182 if currentNeighbors == "a": 183 neighborList = [str(clusterCount-1)] 184 currentNeighbors = "r" 185 else: 186 neighborList = ['0'] 187 188 main.log.info("neightborlist: " + str(neighborList)) 189 190 ts = time.time() 191 st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') 192 193 for n in neighborList: 194 main.log.step("\tSTARTING TEST") 195 main.log.step("\tLOADING FROM SERVERS: \t" + str(clusterCount) ) 196 main.log.step("\tNEIGHBORS:\t" + n ) 197 main.log.info("=============================================================") 198 main.log.info("=============================================================") 199 #write file to configure nil link 200 ipCSV = "" 201 for i in range (1, int(main.maxNodes) + 1): 202 tempstr = "ip" + str(i) 203 ipCSV += main.params[ 'CTRL' ][ tempstr ] 204 if i < int(main.maxNodes): 205 ipCSV +="," 206 207 for i in range(3): 208 main.ONOSbench.onosCfgSet(ONOSIp[1], "org.onosproject.provider.nil.NullProviders", "deviceCount 35") 209 main.ONOSbench.onosCfgSet(ONOSIp[1], "org.onosproject.provider.nil.NullProviders", "topoShape linear") 210 main.ONOSbench.onosCfgSet(ONOSIp[1], "org.onosproject.provider.nil.NullProviders", "enabled true") 211 212 time.sleep(5) 213 main.ONOSbench.handle.sendline("onos $OC1 summary") 214 main.ONOSbench.handle.expect(":~") 215 check = main.ONOSbench.handle.before 216 main.log.info("\nStart up check: \n" + check + "\n") 217 if "SCC(s)=1," in check: 218 break 219 time.sleep(5) 220 221 #devide flows 222 flows = int(main.params[ 'TEST' ][ 'flows' ]) 223 main.log.info("Flow Target = " + str(flows)) 224 225 flows = (flows *max(int(n)+1,int(servers)))/((int(n) + 1)*int(servers)*(switches)) 226 227 main.log.info("Flows per switch = " + str(flows)) 228 229 #build list of servers in "$OC1, $OC2...." format 230 serverEnvVars = "" 231 for i in range (1,int(servers)+1): 232 serverEnvVars += ("-s " + ONOSIp[i] + " ") 233 234 data = [[""]*int(servers)]*int(sampleSize) 235 maxes = [""]*int(sampleSize) 236 237 flowCMD = "python3 " + homeDir + "/onos/tools/test/bin/" 238 flowCMD += testCMD[0] + " " + str(flows) + " " + testCMD[1] 239 flowCMD += " " + str(n) + " " + str(serverEnvVars) + "-j" 240 241 main.log.info(flowCMD) 242 #time.sleep(60) 243 244 for test in range(0, warmUp + sampleSize): 245 if test < warmUp: 246 main.log.info("Warm up " + str(test + 1) + " of " + str(warmUp)) 247 else: 248 main.log.info("====== Test run: " + str(test-warmUp+1) + " ======") 249 250 main.ONOSbench.handle.sendline(flowCMD) 251 main.ONOSbench.handle.expect(":~") 252 rawResult = main.ONOSbench.handle.before 253 main.log.info("Raw results: \n" + rawResult + "\n") 254 255 if "failed" in rawResult: 256 main.log.report("FLOW_TESTER.PY FAILURE") 257 main.log.report( " \n" + rawResult + " \n") 258 for i in range(clusterCount): 259 main.log.report("=======================================================") 260 main.log.report(" ONOS " + str(i) + "LOG REPORT") 261 main.ONOSbench.logReport(ONOSIp[i], ["ERROR", "WARNING", "EXCEPT"], outputMode="d") 262 main.ONOSbench.handle.sendline("onos $OC1 flows") 263 main.ONOSbench.handle.expect(":~") 264 main.log.info(main.ONOSbench.handle.before) 265 266 break 267 268 ######################################################################################## 269 result = [""]*(clusterCount) 270 271 #print("rawResult: " + rawResult) 272 273 rawResult = rawResult.splitlines() 274 275 for node in range(1, clusterCount + 1): 276 for line in rawResult: 277 #print("line: " + line) 278 if ONOSIp[node] in line and "server" in line: 279 temp = line.split(" ") 280 for word in temp: 281 #print ("word: " + word) 282 if "elapsed" in repr(word): 283 index = temp.index(word) + 1 284 myParsed = (temp[index]).replace(",","") 285 myParsed = myParsed.replace("}","") 286 myParsed = int(myParsed) 287 result[node-1] = myParsed 288 main.log.info( ONOSIp[node] + " : " + str(myParsed)) 289 break 290 291 if test >= warmUp: 292 for i in result: 293 if i == "": 294 main.log.error("Missing data point, critical failure incoming") 295 296 print result 297 maxes[test-warmUp] = max(result) 298 main.log.info("Data collection iteration: " + str(test-warmUp) + " of " + str(sampleSize)) 299 main.log.info("Throughput time: " + str(maxes[test-warmUp]) + "(ms)") 300 301 data[test-warmUp] = result 302 303 # wait for flows = 0 304 for checkCount in range(0,5): 305 time.sleep(10) 306 main.ONOSbench.handle.sendline("onos $OC1 summary") 307 main.ONOSbench.handle.expect(":~") 308 flowCheck = main.ONOSbench.handle.before 309 if "flows=0," in flowCheck: 310 main.log.info("Flows removed") 311 break 312 else: 313 for line in flowCheck.splitlines(): 314 if "flows=" in line: 315 main.log.info("Current Summary: " + line) 316 if checkCount == 2: 317 main.log.info("Flows are stuck, moving on ") 318 319 320 time.sleep(5) 321 322 main.log.info("raw data: " + str(data)) 323 main.log.info("maxes:" + str(maxes)) 324 325 326 # report data 327 print("") 328 main.log.info("\t Results (measurments are in milliseconds)") 329 print("") 330 331 nodeString = "" 332 for i in range(1, int(servers) + 1): 333 nodeString += ("\tNode " + str(i)) 334 335 for test in range(0, sampleSize ): 336 main.log.info("\t Test iteration " + str(test + 1) ) 337 main.log.info("\t------------------") 338 main.log.info(nodeString) 339 resultString = "" 340 341 for i in range(0, int(servers) ): 342 resultString += ("\t" + str(data[test][i]) ) 343 main.log.info(resultString) 344 345 print("\n") 346 347 avgOfMaxes = numpy.mean(maxes) 348 main.log.info("Average of max value from each test iteration: " + str(avgOfMaxes)) 349 350 stdOfMaxes = numpy.std(maxes) 351 main.log.info("Standard Deviation of max values: " + str(stdOfMaxes)) 352 print("\n\n") 353 354 avgTP = int(main.params[ 'TEST' ][ 'flows' ]) / avgOfMaxes #result in kflows/second 355 356 tp = [] 357 for i in maxes: 358 tp.append((int(main.params[ 'TEST' ][ 'flows' ]) / i )) 359 360 stdTP = numpy.std(tp) 361 362 main.log.info("Average thoughput: " + str(avgTP) + " Kflows/second" ) 363 main.log.info("Standard deviation of throughput: " + str(stdTP) + " Kflows/second") 364 365 resultsLog = open("/tmp/flowTP1gDB","a") 366 resultString = ("'" + commit + "',") 367 resultString += ("'1gig',") 368 resultString += ((main.params[ 'TEST' ][ 'flows' ]) + ",") 369 resultString += (str(clusterCount) + ",") 370 resultString += (str(n) + ",") 371 resultString += (str(avgTP) + "," + str(stdTP) + "\n") 372 resultsLog.write(resultString) 373 resultsLog.close() 374 375 main.log.report("Result line to file: " + resultString) 376 377 main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"], outputMode="d")
378