YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 1 | ''' |
| 2 | SCPFintentEventTp |
| 3 | - Use intentperf app to generate a lot of intent install and withdraw events |
| 4 | - Test will run with 1,3,5,7 nodes, and with all neighbors |
| 5 | - Test will run 400 seconds and grep the overall rate from intent-perf summary |
andrew@onlab.us | 2ae3a11 | 2015-02-02 11:24:32 -0800 | [diff] [blame] | 6 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 7 | yunpeng@onlab.us |
| 8 | ''' |
| 9 | |
cameron@onlab.us | aaecfd7 | 2015-07-08 12:27:26 -0700 | [diff] [blame] | 10 | import time |
andrew@onlab.us | 1033220 | 2015-03-11 15:04:43 -0700 | [diff] [blame] | 11 | |
andrew@onlab.us | 2ae3a11 | 2015-02-02 11:24:32 -0800 | [diff] [blame] | 12 | |
suibin | 7f2c9cd | 2015-07-08 17:34:59 -0700 | [diff] [blame] | 13 | class SCPFintentEventTp: |
andrew@onlab.us | 2ae3a11 | 2015-02-02 11:24:32 -0800 | [diff] [blame] | 14 | def __init__( self ): |
| 15 | self.default = '' |
| 16 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 17 | def CASE0( self, main ): |
| 18 | ''' |
| 19 | - GIT |
| 20 | - BUILDING ONOS |
| 21 | Pull specific ONOS branch, then Build ONOS ono ONOS Bench. |
| 22 | This step is usually skipped. Because in a Jenkins driven automated |
| 23 | test env. We want Jenkins jobs to pull&build for flexibility to handle |
| 24 | different versions of ONOS. |
| 25 | - Construct tests variables |
| 26 | ''' |
| 27 | gitPull = main.params['GIT']['gitPull'] |
| 28 | gitBranch = main.params['GIT']['gitBranch'] |
cameron@onlab.us | c10e22c | 2015-05-13 13:07:28 -0700 | [diff] [blame] | 29 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 30 | main.case( "Pull onos branch and build onos on Teststation." ) |
cameron@onlab.us | aaecfd7 | 2015-07-08 12:27:26 -0700 | [diff] [blame] | 31 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 32 | if gitPull == 'True': |
| 33 | main.step( "Git Checkout ONOS branch: " + gitBranch ) |
| 34 | stepResult = main.ONOSbench.gitCheckout( branch=gitBranch ) |
| 35 | utilities.assert_equals(expect=main.TRUE, |
| 36 | actual=stepResult, |
| 37 | onpass="Successfully checkout onos branch.", |
| 38 | onfail="Failed to checkout onos branch. Exiting test...") |
| 39 | if not stepResult: main.exit() |
YPZhang | e6ef82a | 2016-07-05 16:48:15 -0700 | [diff] [blame] | 40 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 41 | main.step( "Git Pull on ONOS branch:" + gitBranch ) |
| 42 | stepResult = main.ONOSbench.gitPull() |
| 43 | utilities.assert_equals(expect=main.TRUE, |
| 44 | actual=stepResult, |
| 45 | onpass="Successfully pull onos. ", |
| 46 | onfail="Failed to pull onos. Exiting test ...") |
| 47 | if not stepResult: main.exit() |
andrew@onlab.us | 2ae3a11 | 2015-02-02 11:24:32 -0800 | [diff] [blame] | 48 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 49 | main.step( "Building ONOS branch: " + gitBranch ) |
| 50 | stepResult = main.ONOSbench.cleanInstall( skipTest=True ) |
| 51 | utilities.assert_equals(expect=main.TRUE, |
| 52 | actual=stepResult, |
| 53 | onpass="Successfully build onos.", |
| 54 | onfail="Failed to build onos. Exiting test...") |
| 55 | if not stepResult: main.exit() |
| 56 | |
| 57 | else: |
| 58 | main.log.warn( "Skipped pulling onos and Skipped building ONOS" ) |
| 59 | |
| 60 | main.cellName = main.params['ENV']['cellName'] |
| 61 | main.Apps = main.params['ENV']['cellApps'] |
| 62 | main.BENCHIp = main.params['BENCH']['ip1'] |
| 63 | main.BENCHUser = main.params['BENCH']['user'] |
| 64 | main.MN1Ip = main.params['MN']['ip1'] |
| 65 | main.maxNodes = int(main.params['max']) |
| 66 | main.numSwitches = (main.params['TEST']['numSwitches']).split(",") |
| 67 | main.flowRuleBU = main.params['TEST']['flowRuleBUEnabled'] |
| 68 | main.skipRelRsrc = main.params['TEST']['skipReleaseResourcesOnWithdrawal'] |
YPZhang | e6ef82a | 2016-07-05 16:48:15 -0700 | [diff] [blame] | 69 | main.flowObj = main.params['TEST']['flowObj'] |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 70 | main.startUpSleep = int(main.params['SLEEP']['startup']) |
| 71 | main.installSleep = int(main.params['SLEEP']['install']) |
| 72 | main.verifySleep = int(main.params['SLEEP']['verify']) |
| 73 | main.scale = (main.params['SCALE']).split(",") |
| 74 | main.testDuration = main.params[ 'TEST' ][ 'duration' ] |
| 75 | main.logInterval = main.params[ 'TEST' ][ 'log_interval' ] |
| 76 | main.debug = main.params[ 'debugMode' ] |
| 77 | main.numKeys = main.params[ 'TEST' ][ 'numKeys' ] |
| 78 | main.timeout = int(main.params['SLEEP']['timeout']) |
| 79 | main.cyclePeriod = main.params[ 'TEST' ][ 'cyclePeriod' ] |
YPZhang | e6ef82a | 2016-07-05 16:48:15 -0700 | [diff] [blame] | 80 | if main.flowObj == "True": |
| 81 | main.flowObj = True |
| 82 | main.dbFileName = main.params['DATABASE']['dbFlowObj'] |
| 83 | else: |
| 84 | main.flowObj = False |
| 85 | main.dbFileName = main.params['DATABASE']['dbName'] |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 86 | # Create DataBase file |
| 87 | main.log.info( "Create Database file " + main.dbFileName ) |
| 88 | resultsDB = open( main.dbFileName, "w+" ) |
| 89 | resultsDB.close() |
YPZhang | e6ef82a | 2016-07-05 16:48:15 -0700 | [diff] [blame] | 90 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 91 | # set neighbors |
| 92 | main.neighbors = "1" |
cameron@onlab.us | 412e956 | 2015-05-13 16:04:34 -0700 | [diff] [blame] | 93 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 94 | def CASE1( self, main ): |
| 95 | # Clean up test environment and set up |
| 96 | import time |
| 97 | main.log.info( "Get ONOS cluster IP" ) |
| 98 | print( main.scale ) |
| 99 | main.numCtrls = int( main.scale.pop(0) ) |
| 100 | main.ONOSip = [] |
| 101 | main.maxNumBatch = 0 |
| 102 | main.AllONOSip = main.ONOSbench.getOnosIps() |
| 103 | for i in range( main.numCtrls ): |
| 104 | main.ONOSip.append( main.AllONOSip[i] ) |
| 105 | main.log.info( main.ONOSip ) |
| 106 | main.CLIs = [] |
| 107 | main.log.info( "Creating list of ONOS cli handles" ) |
| 108 | for i in range( main.numCtrls ): |
| 109 | main.CLIs.append( getattr( main, 'ONOS%scli' % (i + 1) ) ) |
cameron@onlab.us | c10e22c | 2015-05-13 13:07:28 -0700 | [diff] [blame] | 110 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 111 | if not main.CLIs: |
| 112 | main.log.error( "Failed to create the list of ONOS cli handles" ) |
| 113 | main.cleanup() |
| 114 | main.exit() |
cameron@onlab.us | c5bf819 | 2015-07-13 13:36:05 -0700 | [diff] [blame] | 115 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 116 | main.commit = main.ONOSbench.getVersion( report=True ) |
| 117 | main.commit = main.commit.split(" ")[1] |
| 118 | main.log.info( "Starting up %s node(s) ONOS cluster" % main.numCtrls ) |
| 119 | main.log.info("Safety check, killing all ONOS processes" + |
| 120 | " before initiating environment setup") |
cameron@onlab.us | 059c256 | 2015-04-02 14:12:51 -0700 | [diff] [blame] | 121 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 122 | for i in range( main.numCtrls ): |
You Wang | b98a9fa | 2017-02-15 17:27:42 -0800 | [diff] [blame^] | 123 | main.ONOSbench.onosStop( main.ONOSip[i] ) |
| 124 | main.ONOSbench.onosKill( main.ONOSip[i] ) |
jenkins | 15b2b13 | 2015-06-23 14:04:09 -0700 | [diff] [blame] | 125 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 126 | main.log.info( "NODE COUNT = %s" % main.numCtrls ) |
| 127 | main.ONOSbench.createCellFile(main.ONOSbench.ip_address, |
| 128 | main.cellName, |
| 129 | main.MN1Ip, |
| 130 | main.Apps, |
| 131 | main.ONOSip) |
| 132 | main.step( "Apply cell to environment" ) |
| 133 | cellResult = main.ONOSbench.setCell( main.cellName ) |
| 134 | verifyResult = main.ONOSbench.verifyCell() |
| 135 | stepResult = cellResult and verifyResult |
| 136 | utilities.assert_equals(expect=main.TRUE, |
| 137 | actual=stepResult, |
| 138 | onpass="Successfully applied cell to " + \ |
| 139 | "environment", |
| 140 | onfail="Failed to apply cell to environment ") |
andrew@onlab.us | 2ae3a11 | 2015-02-02 11:24:32 -0800 | [diff] [blame] | 141 | |
andrew@onlab.us | 2ae3a11 | 2015-02-02 11:24:32 -0800 | [diff] [blame] | 142 | main.step( "Creating ONOS package" ) |
Jon Hall | bd60ea0 | 2016-08-23 10:03:59 -0700 | [diff] [blame] | 143 | packageResult = main.ONOSbench.buckBuild() |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 144 | stepResult = packageResult |
| 145 | utilities.assert_equals(expect=main.TRUE, |
| 146 | actual=stepResult, |
| 147 | onpass="Successfully created ONOS package", |
| 148 | onfail="Failed to create ONOS package") |
andrew@onlab.us | 2ae3a11 | 2015-02-02 11:24:32 -0800 | [diff] [blame] | 149 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 150 | main.step( "Uninstall ONOS package on all Nodes" ) |
| 151 | uninstallResult = main.TRUE |
| 152 | for i in range( int( main.numCtrls ) ): |
| 153 | main.log.info( "Uninstalling package on ONOS Node IP: " + main.ONOSip[i] ) |
| 154 | u_result = main.ONOSbench.onosUninstall( main.ONOSip[i] ) |
| 155 | utilities.assert_equals(expect=main.TRUE, actual=u_result, |
| 156 | onpass="Test step PASS", |
| 157 | onfail="Test step FAIL") |
| 158 | uninstallResult = ( uninstallResult and u_result ) |
Jon Hall | 4ba53f0 | 2015-07-29 13:07:41 -0700 | [diff] [blame] | 159 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 160 | main.step( "Install ONOS package on all Nodes" ) |
| 161 | installResult = main.TRUE |
| 162 | for i in range( int( main.numCtrls ) ): |
| 163 | main.log.info( "Installing package on ONOS Node IP: " + main.ONOSip[i] ) |
| 164 | i_result = main.ONOSbench.onosInstall(node=main.ONOSip[i]) |
| 165 | utilities.assert_equals(expect=main.TRUE, actual=i_result, |
| 166 | onpass="Test step PASS", |
| 167 | onfail="Test step FAIL") |
| 168 | installResult = installResult and i_result |
cameron@onlab.us | 059c256 | 2015-04-02 14:12:51 -0700 | [diff] [blame] | 169 | |
Chiyu Cheng | ef10950 | 2016-11-21 15:51:38 -0800 | [diff] [blame] | 170 | main.step( "Set up ONOS secure SSH" ) |
| 171 | secureSshResult = main.TRUE |
| 172 | for i in range( int( main.numCtrls ) ): |
| 173 | secureSshResult = secureSshResult and main.ONOSbench.onosSecureSSH( node=main.ONOSip[i] ) |
| 174 | utilities.assert_equals( expect=main.TRUE, actual=secureSshResult, |
| 175 | onpass="Test step PASS", |
| 176 | onfail="Test step FAIL" ) |
| 177 | |
You Wang | 0357c43 | 2017-01-09 16:13:33 -0800 | [diff] [blame] | 178 | time.sleep( main.startUpSleep ) |
| 179 | main.step( "Starting ONOS service" ) |
| 180 | stopResult = main.TRUE |
| 181 | startResult = main.TRUE |
| 182 | onosIsUp = main.TRUE |
| 183 | for i in range( main.numCtrls ): |
| 184 | onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] ) |
| 185 | if onosIsUp == main.TRUE: |
| 186 | main.log.report( "ONOS instance is up and ready" ) |
| 187 | else: |
| 188 | main.log.report( "ONOS instance may not be up, stop and " + |
| 189 | "start ONOS again " ) |
| 190 | for i in range( main.numCtrls ): |
| 191 | stopResult = stopResult and \ |
| 192 | main.ONOSbench.onosStop( main.ONOSip[ i ] ) |
| 193 | for i in range( main.numCtrls ): |
| 194 | startResult = startResult and \ |
| 195 | main.ONOSbench.onosStart( main.ONOSip[ i ] ) |
| 196 | stepResult = onosIsUp and stopResult and startResult |
| 197 | utilities.assert_equals( expect=main.TRUE, |
| 198 | actual=stepResult, |
| 199 | onpass="ONOS service is ready", |
| 200 | onfail="ONOS service did not start properly" ) |
| 201 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 202 | main.step( "Start ONOS cli using thread" ) |
| 203 | startCliResult = main.TRUE |
| 204 | pool = [] |
| 205 | main.threadID = 0 |
| 206 | for i in range(int(main.numCtrls)): |
| 207 | t = main.Thread(target=main.CLIs[i].startOnosCli, |
| 208 | threadID=main.threadID, |
| 209 | name="startOnosCli", |
| 210 | args=[main.ONOSip[i]], |
| 211 | kwargs={"onosStartTimeout": main.timeout}) |
| 212 | pool.append(t) |
| 213 | t.start() |
| 214 | main.threadID = main.threadID + 1 |
| 215 | for t in pool: |
| 216 | t.join() |
| 217 | startCliResult = startCliResult and t.result |
| 218 | time.sleep( main.startUpSleep ) |
cameron@onlab.us | 059c256 | 2015-04-02 14:12:51 -0700 | [diff] [blame] | 219 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 220 | # config apps |
| 221 | main.CLIs[0].setCfg( "org.onosproject.store.flow.impl.DistributedFlowRuleStore", |
| 222 | "backupEnabled " + main.flowRuleBU ) |
| 223 | main.CLIs[0].setCfg( "org.onosproject.net.intent.impl.IntentManager", |
| 224 | "skipReleaseResourcesOnWithdrawal " + main.skipRelRsrc ) |
| 225 | main.CLIs[0].setCfg( "org.onosproject.provider.nil.NullProviders", "deviceCount " + str(int(main.numCtrls*10)) ) |
| 226 | main.CLIs[0].setCfg( "org.onosproject.provider.nil.NullProviders", "topoShape linear" ) |
| 227 | main.CLIs[0].setCfg( "org.onosproject.provider.nil.NullProviders", "enabled true" ) |
YPZhang | e6ef82a | 2016-07-05 16:48:15 -0700 | [diff] [blame] | 228 | if main.flowObj: |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 229 | main.CLIs[0].setCfg("org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator", |
| 230 | "useFlowObjectives", value="true") |
| 231 | time.sleep( main.startUpSleep ) |
cameron@onlab.us | eae03dc | 2015-07-29 11:51:28 -0700 | [diff] [blame] | 232 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 233 | # balanceMasters |
| 234 | main.CLIs[0].balanceMasters() |
| 235 | time.sleep( main.startUpSleep ) |
cameron@onlab.us | aaecfd7 | 2015-07-08 12:27:26 -0700 | [diff] [blame] | 236 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 237 | def CASE2(self, main): |
jenkins | 3af0cd8 | 2015-03-24 10:27:16 -0700 | [diff] [blame] | 238 | import numpy |
cameron@onlab.us | c10e22c | 2015-05-13 13:07:28 -0700 | [diff] [blame] | 239 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 240 | main.log.info( "Cluster Count = " + str( main.numCtrls ) ) |
| 241 | # adjust neighbors |
| 242 | if main.numCtrls == 1: |
| 243 | main.neighbors = "0" |
| 244 | main.log.info( "Neighbors: 0" ) |
| 245 | elif main.neighbors != "0": |
| 246 | main.neighbors = "0" |
| 247 | main.log.info( "Neighbors: 0" ) |
| 248 | elif main.neighbors == "0": |
| 249 | main.neighbors = str( main.numCtrls - 1 ) |
| 250 | main.log.info( "Neighbors: " + main.neighbors ) |
cameron@onlab.us | c10e22c | 2015-05-13 13:07:28 -0700 | [diff] [blame] | 251 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 252 | main.log.info( "Config intent-perf app" ) |
| 253 | main.CLIs[0].setCfg( "org.onosproject.intentperf.IntentPerfInstaller", "numKeys " + main.numKeys ) |
| 254 | main.CLIs[0].setCfg( "org.onosproject.intentperf.IntentPerfInstaller", "numNeighbors " + str( main.neighbors ) ) |
| 255 | main.CLIs[0].setCfg( "org.onosproject.intentperf.IntentPerfInstaller", "cyclePeriod " + main.cyclePeriod ) |
cameron@onlab.us | c10e22c | 2015-05-13 13:07:28 -0700 | [diff] [blame] | 256 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 257 | main.log.info( "Starting intent-perf test for " + str(main.testDuration) + " seconds..." ) |
| 258 | main.CLIs[0].sendline( "intent-perf-start" ) |
| 259 | stop = time.time() + float( main.testDuration ) |
andrew@onlab.us | 1033220 | 2015-03-11 15:04:43 -0700 | [diff] [blame] | 260 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 261 | while time.time() < stop: |
| 262 | time.sleep(15) |
| 263 | result = main.CLIs[0].getIntentPerfSummary() |
| 264 | if result: |
| 265 | for ip in main.ONOSip: |
| 266 | main.log.info( "Node {} Overall Rate: {}".format( ip, result[ip] ) ) |
| 267 | main.log.info( "Stop intent-perf" ) |
| 268 | for node in main.CLIs: |
| 269 | node.sendline( "intent-perf-stop" ) |
| 270 | if result: |
| 271 | for ip in main.ONOSip: |
| 272 | main.log.info( "Node {} final Overall Rate: {}".format( ip, result[ip] ) ) |
andrew@onlab.us | 2ae3a11 | 2015-02-02 11:24:32 -0800 | [diff] [blame] | 273 | |
YPZhang | cbc2a06 | 2016-07-11 10:55:44 -0700 | [diff] [blame] | 274 | with open( main.dbFileName, "a" ) as resultDB: |
| 275 | for nodes in range( 0, len( main.ONOSip ) ): |
| 276 | resultString = "'" + main.commit + "'," |
| 277 | resultString += "'1gig'," |
| 278 | resultString += str(main.numCtrls) + "," |
| 279 | resultString += "'baremetal" + str( nodes+1 ) + "'," |
| 280 | resultString += main.neighbors + "," |
| 281 | resultString += result[ main.ONOSip[ nodes ] ]+"," |
| 282 | resultString += str(0) + "\n" # no stddev |
| 283 | resultDB.write( resultString ) |
| 284 | resultDB.close() |