cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 1 | # ScaleOutTemplate |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 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 IntentRerouteLat: |
| 12 | |
| 13 | def __init__( self ): |
| 14 | self.default = '' |
| 15 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 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 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 26 | #Load values from params file |
| 27 | checkoutBranch = main.params[ 'GIT' ][ 'checkout' ] |
| 28 | gitPull = main.params[ 'GIT' ][ 'autopull' ] |
| 29 | cellName = main.params[ 'ENV' ][ 'cellName' ] |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 30 | Apps = main.params[ 'ENV' ][ 'cellApps' ] |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 31 | BENCHUser = main.params[ 'BENCH' ][ 'user' ] |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 32 | maxNodes = int(main.params[ 'availableNodes' ]) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 33 | skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ] |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 34 | cellName = main.params[ 'ENV' ][ 'cellName' ] |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 35 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 36 | # -- INIT SECTION, ONLY RUNS ONCE -- # |
| 37 | if init == False: |
| 38 | init = True |
| 39 | global clusterCount #number of nodes running |
| 40 | global ONOSIp #list of ONOS IP addresses |
| 41 | global scale |
| 42 | global commit |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 43 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 44 | clusterCount = 0 |
| 45 | ONOSIp = [ 0 ] |
| 46 | scale = (main.params[ 'SCALE' ]).split(",") |
| 47 | clusterCount = int(scale[0]) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 48 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 49 | #Populate ONOSIp with ips from params |
jenkins | 15b2b13 | 2015-06-23 14:04:09 -0700 | [diff] [blame] | 50 | ONOSIp = [0] |
| 51 | ONOSIp.extend(main.ONOSbench.getOnosIps()) |
jenkins | 15b2b13 | 2015-06-23 14:04:09 -0700 | [diff] [blame] | 52 | |
| 53 | print("-----------------" + str(ONOSIp)) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 54 | #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test |
| 55 | if skipMvn != "yes": |
| 56 | mvnResult = main.ONOSbench.cleanInstall() |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 57 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 58 | #git |
| 59 | main.step( "Git checkout and pull " + checkoutBranch ) |
| 60 | if gitPull == 'on': |
| 61 | checkoutResult = main.ONOSbench.gitCheckout( checkoutBranch ) |
| 62 | pullResult = main.ONOSbench.gitPull() |
| 63 | |
| 64 | else: |
| 65 | checkoutResult = main.TRUE |
| 66 | pullResult = main.TRUE |
| 67 | main.log.info( "Skipped git checkout and pull" ) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 68 | |
| 69 | commit = main.ONOSbench.getVersion() |
| 70 | commit = (commit.split(" "))[1] |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 71 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 72 | resultsDB = open("IntentRerouteLatDB", "w+") |
| 73 | resultsDB.close() |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 74 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 75 | # -- END OF INIT SECTION --# |
| 76 | |
| 77 | clusterCount = int(scale[0]) |
| 78 | scale.remove(scale[0]) |
jenkins | 8f8f4f3 | 2015-06-24 14:05:04 -0700 | [diff] [blame] | 79 | |
| 80 | MN1Ip = ONOSIp[len(ONOSIp)-1] |
| 81 | BENCHIp = ONOSIp[len(ONOSIp)-2] |
| 82 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 83 | #kill off all onos processes |
| 84 | main.log.step("Safety check, killing all ONOS processes") |
| 85 | main.log.step("before initiating enviornment setup") |
| 86 | for node in range(1, maxNodes + 1): |
| 87 | main.ONOSbench.onosDie(ONOSIp[node]) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 88 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 89 | #Uninstall everywhere |
| 90 | main.log.step( "Cleaning Enviornment..." ) |
| 91 | for i in range(1, maxNodes + 1): |
| 92 | main.log.info(" Uninstalling ONOS " + str(i) ) |
| 93 | main.ONOSbench.onosUninstall( ONOSIp[i] ) |
| 94 | |
| 95 | #construct the cell file |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 96 | main.log.info("Creating cell file") |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 97 | cellIp = [] |
| 98 | for node in range (1, clusterCount + 1): |
| 99 | cellIp.append(ONOSIp[node]) |
jenkins | 15b2b13 | 2015-06-23 14:04:09 -0700 | [diff] [blame] | 100 | |
| 101 | print "Cell ip" + str(cellIp) |
| 102 | print cellName |
| 103 | print MN1Ip |
| 104 | print Apps |
| 105 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 106 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 107 | main.ONOSbench.createCellFile(BENCHIp,cellName,MN1Ip,str(Apps), *cellIp) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 108 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 109 | main.step( "Set Cell" ) |
| 110 | main.ONOSbench.setCell(cellName) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 111 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 112 | main.step( "Creating ONOS package" ) |
| 113 | packageResult = main.ONOSbench.onosPackage() |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 114 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 115 | main.step( "verify cells" ) |
| 116 | verifyCellResult = main.ONOSbench.verifyCell() |
| 117 | |
| 118 | main.log.report( "Initializing " + str( clusterCount ) + " node cluster." ) |
| 119 | for node in range(1, clusterCount + 1): |
| 120 | main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node]) |
| 121 | main.ONOSbench.onosInstall( ONOSIp[node]) |
| 122 | |
| 123 | for node in range(1, clusterCount + 1): |
| 124 | for i in range( 2 ): |
| 125 | isup = main.ONOSbench.isup( ONOSIp[node] ) |
| 126 | if isup: |
| 127 | main.log.info("ONOS " + str(node) + " is up\n") |
| 128 | break |
| 129 | if not isup: |
| 130 | main.log.report( "ONOS " + str(node) + " didn't start!" ) |
| 131 | main.log.info("Startup sequence complete") |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 132 | |
| 133 | deviceMastership = (main.params[ 'TEST' ][ "s" + str(clusterCount) ]).split(",") |
| 134 | print("Device mastership list: " + str(deviceMastership)) |
| 135 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 136 | main.ONOSbench.handle.sendline("""onos $OC1 "cfg set org.onosproject.provider.nil.NullProviders deviceCount 8 " """) |
| 137 | main.ONOSbench.handle.expect(":~") |
| 138 | print repr(main.ONOSbench.handle.before) |
| 139 | time.sleep(3) |
| 140 | main.ONOSbench.handle.sendline("""onos $OC1 "cfg set org.onosproject.provider.nil.NullProviders topoShape reroute" """) |
| 141 | main.ONOSbench.handle.expect(":~") |
| 142 | print repr(main.ONOSbench.handle.before) |
| 143 | time.sleep(3) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 144 | |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 145 | time.sleep(10) |
| 146 | |
| 147 | once = True |
| 148 | for attempt in range(0,10): |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 149 | main.ONOSbench.handle.sendline("onos $OC1 summary") |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 150 | main.ONOSbench.handle.expect(":~") |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 151 | x = main.ONOSbench.handle.before |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 152 | main.log.info("Initial setup. ONOS summary response: \n" + x + "\n") |
| 153 | |
| 154 | if "devices=8" in x and "links=16," in x: |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 155 | break |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 156 | else: |
| 157 | if once == False: |
| 158 | main.log.error("Null provider start failed, retrying..") |
| 159 | once = False |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 160 | main.ONOSbench.handle.sendline("""onos $OC1 "cfg set org.onosproject.provider.nil.NullProviders enabled false" """) |
| 161 | main.ONOSbench.handle.expect(":~") |
| 162 | time.sleep(3) |
| 163 | main.ONOSbench.handle.sendline("""onos $OC1 "cfg set org.onosproject.provider.nil.NullProviders enabled true" """) |
| 164 | main.ONOSbench.handle.expect(":~") |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 165 | time.sleep(8) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 166 | |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 167 | index = 1 |
| 168 | for node in deviceMastership: |
| 169 | for attempt in range(0,10): |
| 170 | cmd = ( "onos $OC" + node + """ "device-role null:000000000000000""" + str(index) + " " + ONOSIp[int(node)] + """ master" """) |
| 171 | main.log.info("assigning mastership of device " + str(index) + " to node " + node + ": \n " + cmd + "\n") |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 172 | main.ONOSbench.handle.sendline(cmd) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 173 | main.ONOSbench.handle.expect(":~") |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 174 | time.sleep(4) |
| 175 | |
| 176 | cmd = ( "onos $OC" + node + " roles|grep 00000" + str(index)) |
| 177 | main.log.info(cmd) |
| 178 | main.ONOSbench.handle.sendline(cmd) |
| 179 | main.ONOSbench.handle.expect(":~") |
| 180 | check = main.ONOSbench.handle.before |
| 181 | main.log.info("CHECK:\n" + check) |
| 182 | if ("master=" + ONOSIp[int(node)]) in check: |
| 183 | break |
| 184 | index += 1 |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 185 | |
jenkins | b4e0bb9 | 2015-06-19 13:37:47 -0700 | [diff] [blame] | 186 | main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"]) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 187 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 188 | def CASE2( self, main ): |
| 189 | |
| 190 | import time |
| 191 | import numpy |
| 192 | import datetime |
| 193 | #from scipy import stats |
| 194 | |
| 195 | ts = time.time() |
| 196 | date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d') |
| 197 | |
| 198 | sampleSize = int(main.params[ 'TEST' ][ 'sampleSize' ]) |
| 199 | warmUp = int(main.params[ 'TEST' ][ 'warmUp' ]) |
| 200 | intentsList = (main.params[ 'TEST' ][ 'intents' ]).split(",") |
| 201 | debug = main.params[ 'TEST' ][ 'debug' ] |
| 202 | for i in range(0,len(intentsList)): |
| 203 | intentsList[i] = int(intentsList[i]) |
| 204 | |
| 205 | timestampMetrics = [] |
| 206 | if main.params['METRICS']['Submitted'] == "1": |
| 207 | timestampMetrics.append("Submitted") |
| 208 | if main.params['METRICS']['Installed'] == "1": |
| 209 | timestampMetrics.append("Installed") |
| 210 | if main.params['METRICS']['Failed'] == "1": |
| 211 | timestampMetrics.append("Failed") |
| 212 | if main.params['METRICS']['Withdraw'] == "1": |
| 213 | timestampMetrics.append("Withdraw") |
| 214 | if main.params['METRICS']['Withdrawn'] == "1": |
| 215 | timestampMetrics.append("Withdrawn") |
| 216 | if debug: main.log.info(timestampMetrics) |
| 217 | |
| 218 | if debug == "True": |
| 219 | debug = True |
| 220 | else: |
| 221 | debug = False |
| 222 | |
| 223 | ingress = "null:0000000000000001" |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 224 | egress = "null:0000000000000007" |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 225 | |
| 226 | for intents in intentsList: |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 227 | main.log.report("Intent Batch size: " + str(intents) + "\n ") |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 228 | myResult = [["latency", "lastNode"] for x in range(sampleSize)] |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 229 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 230 | for run in range(0, (warmUp + sampleSize)): |
| 231 | if run > warmUp: |
| 232 | main.log.info("Starting test iteration " + str(run-warmUp)) |
| 233 | |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 234 | cmd = """onos $OC1 "push-test-intents -i """ |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 235 | cmd += ingress + "/0 " |
| 236 | cmd += egress + "/0 " |
| 237 | cmd += str(intents) +""" 1" """ |
| 238 | if debug: main.log.info(cmd) |
| 239 | |
| 240 | withdrawCmd = cmd.replace("intents -i", "intents -w ") |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 241 | |
| 242 | #push-test-intents |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 243 | main.ONOSbench.handle.sendline(cmd) |
| 244 | main.ONOSbench.handle.expect(":~") |
| 245 | myRawResult = main.ONOSbench.handle.before |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 246 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 247 | for i in range(0, 40): |
| 248 | main.ONOSbench.handle.sendline("onos $OC1 summary") |
| 249 | main.ONOSbench.handle.expect(":~") |
| 250 | linkCheck = main.ONOSbench.handle.before |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 251 | if ("links=16,") in linkCheck and ("flows=" + str(intents*7) + ","): |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 252 | break |
| 253 | if i == 39: |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 254 | main.log.error("Flow/link count incorrect, data invalid."+ linkCheck) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 255 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 256 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 257 | #collect timestamp from link cut |
| 258 | cmd = """onos $OC1 null-link "null:0000000000000004/1 null:0000000000000003/2 down" """ |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 259 | if debug: main.log.info("COMMAND: " + str(cmd)) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 260 | main.ONOSbench.handle.sendline(cmd) |
jenkins | b4e0bb9 | 2015-06-19 13:37:47 -0700 | [diff] [blame] | 261 | main.ONOSbench.handle.expect(":~") |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 262 | |
| 263 | cmd = "onos-ssh $OC1 cat /opt/onos/log/karaf.log | grep TopologyManager| tail -1" |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 264 | for i in range(0,10): |
| 265 | main.ONOSbench.handle.sendline(cmd) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 266 | time.sleep(2) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 267 | main.ONOSbench.handle.expect(":~") |
| 268 | raw = main.ONOSbench.handle.before |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 269 | #if "NullLinkProvider" in raw and "links=14" in raw: |
| 270 | if "links=14" in raw: |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 271 | break |
| 272 | if i >= 9: |
| 273 | main.log.error("Expected output not being recieved... continuing") |
| 274 | main.log.info(raw) |
| 275 | break |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 276 | time.sleep(2) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 277 | |
| 278 | temp = raw.splitlines() |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 279 | for line in temp: |
| 280 | if str(date) in line: |
| 281 | temp = line |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 282 | break |
| 283 | |
| 284 | cutTimestamp = (temp.split(" "))[0] + " " + (temp.split(" "))[1] |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 285 | if debug: main.log.info("Cut timestamp: " + cutTimestamp) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 286 | |
| 287 | #validate link count and flow count |
| 288 | for i in range(0, 40): |
| 289 | main.ONOSbench.handle.sendline("onos $OC1 summary") |
| 290 | main.ONOSbench.handle.expect(":~") |
| 291 | linkCheck = main.ONOSbench.handle.before |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 292 | #if "links=" + str(7*intents)+ "," in linkCheck and ("flows=" + str(7*intents) + ",") in linkCheck: |
| 293 | if "links=14," in linkCheck and ("flows=" + str(8*intents) + ",") in linkCheck: |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 294 | break |
| 295 | if i == 39: |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 296 | main.log.error("Link or flow count incorrect, data invalid." + linkCheck) |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 297 | |
| 298 | time.sleep(5) #trying to avoid negative values |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 299 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 300 | #intents events metrics installed timestamp |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 301 | IEMtimestamps = [0]*(clusterCount + 1) |
| 302 | installedTemp = [0]*(clusterCount + 1) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 303 | for node in range(1, clusterCount +1): |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 304 | cmd = "onos $OC" + str(node) + """ "intents-events-metrics"|grep Timestamp """ |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 305 | raw = "" |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 306 | while "epoch)" not in raw: |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 307 | main.ONOSbench.handle.sendline(cmd) |
| 308 | main.ONOSbench.handle.expect(":~") |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 309 | raw = main.ONOSbench.handle.before |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 310 | |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 311 | print(raw) |
| 312 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 313 | intentsTimestamps = {} |
| 314 | rawTimestamps = raw.splitlines() |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 315 | for line in rawTimestamps: |
| 316 | if "Timestamp" in line and "grep" not in line: |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 317 | metricKey = (line.split(" "))[1] |
| 318 | metricTimestamp = (line.split(" ")[len(line.split(" ")) -1]).replace("epoch)=","") |
| 319 | metricTimestamp = float(metricTimestamp) |
| 320 | metricTimestamp = numpy.divide(metricTimestamp, 1000) |
| 321 | if debug: main.log.info(repr(metricTimestamp)) |
| 322 | intentsTimestamps[metricKey] = metricTimestamp |
| 323 | if metricKey == "Installed": |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 324 | installedTemp[node] = metricTimestamp |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 325 | |
| 326 | main.log.info("Node: " + str(node) + " Timestamps: " + str(intentsTimestamps)) |
| 327 | IEMtimestamps[node] = intentsTimestamps |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 328 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 329 | myMax = max(installedTemp) |
| 330 | indexOfMax = installedTemp.index(myMax) |
| 331 | |
| 332 | #number crunch |
| 333 | for metric in timestampMetrics: #this is where we sould add support for computing other timestamp metrics |
| 334 | if metric == "Installed": |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 335 | if run >= warmUp: |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 336 | main.log.report("link cut timestamp: " + cutTimestamp) |
| 337 | #readableInstalledTimestamp = str(intentsTimestamps["Installed"]) |
| 338 | readableInstalledTimestamp = str(myMax) |
| 339 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 340 | #main.log.report("Intent Installed timestamp: " + str(intentsTimestamps["Installed"])) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 341 | main.log.report("Intent Installed timestamp: " + str(myMax)) |
| 342 | |
| 343 | cutEpoch = time.mktime(time.strptime(cutTimestamp, "%Y-%m-%d %H:%M:%S,%f")) |
| 344 | if debug: main.log.info("cutEpoch=" + str(cutEpoch)) |
| 345 | #rerouteLatency = float(intentsTimestamps["Installed"] - cutEpoch) |
| 346 | rerouteLatency = float(myMax - cutEpoch) |
| 347 | |
| 348 | rerouteLatency = numpy.divide(rerouteLatency, 1000) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 349 | main.log.report("Reroute latency:" + str(rerouteLatency) + " (seconds)\n ") |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 350 | myResult[run-warmUp][0] = rerouteLatency |
| 351 | myResult[run-warmUp][1] = indexOfMax |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 352 | if debug: main.log.info("Latency: " + str(myResult[run-warmUp][0])) |
| 353 | if debug: main.log.info("last node: " + str(myResult[run-warmUp][1])) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 354 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 355 | cmd = """ onos $OC1 null-link "null:0000000000000004/1 null:0000000000000003/2 up" """ |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 356 | if debug: main.log.info(cmd) |
| 357 | main.ONOSbench.handle.sendline(cmd) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 358 | main.ONOSbench.handle.expect(":~") |
jenkins | b4e0bb9 | 2015-06-19 13:37:47 -0700 | [diff] [blame] | 359 | |
| 360 | |
| 361 | |
| 362 | #wait for intent withdraw |
| 363 | main.ONOSbench.handle.sendline(withdrawCmd) |
| 364 | main.log.info(withdrawCmd) |
| 365 | main.ONOSbench.handle.expect(":~") |
| 366 | if debug: main.log.info(main.ONOSbench.handle.before) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 367 | main.ONOSbench.handle.sendline("onos $OC1 intents|grep WITHDRAWN|wc -l") |
| 368 | main.ONOSbench.handle.expect(":~") |
| 369 | intentWithdrawCheck = main.ONOSbench.handle.before |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 370 | if (str(intents)) in intentWithdrawCheck: |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 371 | main.log.info("intents withdrawn") |
| 372 | if debug: main.log.info(intentWithdrawCheck) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 373 | |
| 374 | # wait for links to be reestablished |
| 375 | for i in range(0, 10): |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 376 | main.ONOSbench.handle.sendline("onos $OC1 summary") |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 377 | main.ONOSbench.handle.expect(":~") |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 378 | linkCheck = main.ONOSbench.handle.before |
| 379 | if "links=16," in linkCheck: |
| 380 | break |
| 381 | time.sleep(1) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 382 | if i == 9: |
| 383 | main.log.info("Links Failed to reconnect, next iteration of data invalid." + linkCheck) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 384 | |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 385 | if run < warmUp: |
| 386 | main.log.info("Warm up run " + str(run+1) + " completed") |
| 387 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 388 | if debug: main.log.info(myResult) |
| 389 | latTemp = [] |
| 390 | nodeTemp = [] |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 391 | for i in myResult: |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 392 | latTemp.append(i[0]) |
| 393 | nodeTemp.append(i[1]) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 394 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 395 | mode = {} |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 396 | for i in nodeTemp: |
| 397 | if i in mode: |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 398 | mode[i] += 1 |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 399 | else: |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 400 | mode[i] = 1 |
| 401 | |
| 402 | for i in mode.keys(): |
| 403 | if mode[i] == max(mode.values()): |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 404 | nodeMode = i |
| 405 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 406 | average = numpy.average(latTemp) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 407 | stdDev = numpy.std(latTemp) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 408 | |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 409 | average = numpy.multiply(average, 1000) |
| 410 | stdDev = numpy.multiply(stdDev, 1000) |
| 411 | |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 412 | main.log.report("Scale: " + str(clusterCount) + " \tIntent batch: " + str(intents)) |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 413 | main.log.report("Latency average:................" + str(average)) |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 414 | main.log.report("Latency standard deviation:....." + str(stdDev)) |
| 415 | main.log.report("Mode of last node to respond:..." + str(nodeMode)) |
| 416 | main.log.report("________________________________________________________") |
| 417 | |
cameron@onlab.us | 42f5a5b | 2015-05-06 13:55:34 -0700 | [diff] [blame] | 418 | resultsDB = open("IntentRerouteLatDB", "a") |
cameron@onlab.us | c80a8c8 | 2015-04-15 14:57:37 -0700 | [diff] [blame] | 419 | resultsDB.write("'" + commit + "',") |
| 420 | resultsDB.write(str(clusterCount) + ",") |
| 421 | resultsDB.write(str(intents) + ",") |
| 422 | resultsDB.write(str(average) + ",") |
| 423 | resultsDB.write(str(stdDev) + "\n") |
| 424 | resultsDB.close() |
cameron@onlab.us | 1201bc4 | 2015-04-01 16:30:05 -0700 | [diff] [blame] | 425 | |
jenkins | b4e0bb9 | 2015-06-19 13:37:47 -0700 | [diff] [blame] | 426 | main.ONOSbench.logReport(ONOSIp[1], ["ERROR", "WARNING", "EXCEPT"]) |
| 427 | |