blob: a7f7368b5e599e7cffb5d5931e8ef6fd4b5fcd22 [file] [log] [blame]
YPZhangb34b7e12016-06-14 14:28:19 -07001"""
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -07002Copyright 2015 Open Networking Foundation (ONF)
3
4Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
5the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
6or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
7
8 TestON is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 2 of the License, or
11 (at your option) any later version.
12
13 TestON is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with TestON. If not, see <http://www.gnu.org/licenses/>.
20"""
21
22"""
YPZhangb34b7e12016-06-14 14:28:19 -070023SCPFintentInstallWithdrawLat:
24 - Test the latency of intent installed and withdrawn
25 - Use Push-test-intents command to push intents
26 - Use Null provider with 7 devices and linear topology
27 - Always push intents between 1/6 and 7/5
Devin Lim58046fa2017-07-05 16:55:00 -070028 - The batch size is defined in parm file. ( default 1,100,1000)
cameron@onlab.us41c16f52015-07-08 15:40:28 -070029
YPZhangb34b7e12016-06-14 14:28:19 -070030 yunpeng@onlab.us
31"""
cameron@onlab.us41c16f52015-07-08 15:40:28 -070032class SCPFintentInstallWithdrawLat:
cameron@onlab.us41c16f52015-07-08 15:40:28 -070033 def __init__( self ):
34 self.default = ''
35
YPZhangb34b7e12016-06-14 14:28:19 -070036 def CASE0( self, main ):
37 '''
38 - GIT
39 - BUILDING ONOS
40 Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
41 This step is usually skipped. Because in a Jenkins driven automated
42 test env. We want Jenkins jobs to pull&build for flexibility to handle
43 different versions of ONOS.
44 - Construct tests variables
45 '''
YPZhangb34b7e12016-06-14 14:28:19 -070046
Devin Lim58046fa2017-07-05 16:55:00 -070047 try:
48 from tests.dependencies.ONOSSetup import ONOSSetup
49 main.testSetUp = ONOSSetup()
50 except ImportError:
51 main.log.error( "ONOSSetup not found. exiting the test" )
52 main.exit()
53 main.testSetUp.envSetupDescription()
54 stepResult = main.FALSE
55 try:
YPZhangb34b7e12016-06-14 14:28:19 -070056
Devin Lim58046fa2017-07-05 16:55:00 -070057 main.apps = main.params[ 'ENV' ][ 'cellApps' ]
58 main.BENCHUser = main.params[ 'BENCH' ][ 'user' ]
59 main.BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
60 main.MN1Ip = main.params[ 'MN' ][ 'ip1' ]
61 main.maxNodes = int( main.params[ 'max' ] )
62 main.cellName = main.params[ 'ENV' ][ 'cellName' ]
63 main.scale = ( main.params[ 'SCALE' ] ).split( "," )
64 main.timeout = int( main.params[ 'SLEEP' ][ 'timeout' ] )
65 main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
66 main.installSleep = int( main.params[ 'SLEEP' ][ 'install' ] )
67 main.verifySleep = int( main.params[ 'SLEEP' ][ 'verify' ] )
68 main.verifyAttempts = int( main.params[ 'ATTEMPTS' ][ 'verify' ] )
69 main.sampleSize = int( main.params[ 'TEST' ][ 'sampleSize' ] )
70 main.warmUp = int( main.params[ 'TEST' ][ 'warmUp' ] )
71 main.intentsList = ( main.params[ 'TEST' ][ 'intents' ] ).split( "," )
72 main.ingress = main.params[ 'TEST' ][ 'ingress' ]
73 main.egress = main.params[ 'TEST' ][ 'egress' ]
74 main.debug = main.params[ 'TEST' ][ 'debug' ]
75 main.flowObj = main.params[ 'TEST' ][ 'flowObj' ]
YPZhangb34b7e12016-06-14 14:28:19 -070076
Devin Lim58046fa2017-07-05 16:55:00 -070077 if main.flowObj == "True":
78 main.flowObj = True
79 main.dbFileName = main.params[ 'DATABASE' ][ 'dbFlowObj' ]
80 else:
81 main.flowObj = False
82 main.dbFileName = main.params[ 'DATABASE' ][ 'dbName' ]
YPZhangb34b7e12016-06-14 14:28:19 -070083
Devin Lim58046fa2017-07-05 16:55:00 -070084 for i in range( 0, len( main.intentsList ) ):
85 main.intentsList[ i ] = int( main.intentsList[ i ] )
YPZhangb34b7e12016-06-14 14:28:19 -070086
Devin Lim58046fa2017-07-05 16:55:00 -070087 stepResult = main.testSetUp.gitPulling()
88 # Create DataBase file
89 main.log.info( "Create Database file " + main.dbFileName )
90 resultsDB = open( main.dbFileName, "w+" )
91 resultsDB.close()
92 except Exception as e:
93 main.testSetUp.envSetupException( e )
94 main.testSetUp.evnSetupConclusion( stepResult )
95 main.commit = main.commit.split( " " )[ 1 ]
Jon Hall4ba53f02015-07-29 13:07:41 -070096 def CASE1( self, main ):
YPZhangb34b7e12016-06-14 14:28:19 -070097 # Clean up test environment and set up
Jon Hall4ba53f02015-07-29 13:07:41 -070098 import time
Devin Lim58046fa2017-07-05 16:55:00 -070099
YPZhangb34b7e12016-06-14 14:28:19 -0700100 main.maxNumBatch = 0
Devin Lim58046fa2017-07-05 16:55:00 -0700101 main.testSetUp.getNumCtrls( True )
102 main.testSetUp.envSetup( includeGitPull=False, makeMaxNodes=False )
103 main.testSetUp.ONOSSetUp( main.MN1Ip, True,
104 cellName=main.cellName, killRemoveMax=False,
105 CtrlsSet=False )
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700106
YPZhangb34b7e12016-06-14 14:28:19 -0700107 # configure apps
Devin Lim58046fa2017-07-05 16:55:00 -0700108 main.CLIs[ 0 ].setCfg( "org.onosproject.provider.nil.NullProviders", "deviceCount", value=7 )
109 main.CLIs[ 0 ].setCfg( "org.onosproject.provider.nil.NullProviders", "topoShape", value="linear" )
110 main.CLIs[ 0 ].setCfg( "org.onosproject.provider.nil.NullProviders", "enabled", value="true" )
111 main.CLIs[ 0 ].setCfg( "org.onosproject.net.intent.impl.IntentManager", "skipReleaseResourcesOnWithdrawal", value="true" )
YPZhange6ef82a2016-07-05 16:48:15 -0700112 if main.flowObj:
Devin Lim58046fa2017-07-05 16:55:00 -0700113 main.CLIs[ 0 ].setCfg( "org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator",
114 "useFlowObjectives", value="true" )
115 main.CLIs[ 0 ].setCfg( "org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator",
You Wang106d0fa2017-05-15 17:22:15 -0700116 "defaultFlowObjectiveCompiler",
Devin Lim58046fa2017-07-05 16:55:00 -0700117 value='org.onosproject.net.intent.impl.compiler.LinkCollectionIntentObjectiveCompiler' )
118 time.sleep( main.startUpSleep )
Jon Hall4ba53f02015-07-29 13:07:41 -0700119
YPZhangb34b7e12016-06-14 14:28:19 -0700120 # balanceMasters
Devin Lim58046fa2017-07-05 16:55:00 -0700121 main.CLIs[ 0 ].balanceMasters()
122 time.sleep( main.startUpSleep )
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700123
124 def CASE2( self, main ):
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700125 import time
126 import numpy
YPZhangb34b7e12016-06-14 14:28:19 -0700127 import json
Devin Lim58046fa2017-07-05 16:55:00 -0700128 print( main.intentsList )
YPZhangb34b7e12016-06-14 14:28:19 -0700129 for batchSize in main.intentsList:
Devin Lim58046fa2017-07-05 16:55:00 -0700130 main.log.report( "Intent Batch size: {}".format( batchSize ) )
YPZhangb34b7e12016-06-14 14:28:19 -0700131 main.installLatList = []
132 main.withdrawLatList = []
133 validrun = 0
134 invalidrun = 0
135 # we use two variables to control the iteration
136 while validrun <= main.warmUp + main.sampleSize and invalidrun < 20:
137 if validrun >= main.warmUp:
Devin Lim58046fa2017-07-05 16:55:00 -0700138 main.log.info( "================================================" )
139 main.log.info( "Starting test iteration " + str( validrun - main.warmUp ) )
140 main.log.info( "Total test iteration: " + str( invalidrun + validrun ) )
141 main.log.info( "================================================" )
YPZhangb34b7e12016-06-14 14:28:19 -0700142 else:
Devin Lim58046fa2017-07-05 16:55:00 -0700143 main.log.info( "====================Warm Up=====================" )
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700144
YPZhangb34b7e12016-06-14 14:28:19 -0700145 # push intents
Devin Lim58046fa2017-07-05 16:55:00 -0700146 installResult = main.CLIs[ 0 ].pushTestIntents( main.ingress, main.egress, batchSize,
YPZhangb34b7e12016-06-14 14:28:19 -0700147 offset=1, options="-i", timeout=main.timeout,
Devin Lim58046fa2017-07-05 16:55:00 -0700148 getResponse=True )
149 if type( installResult ) is str:
YPZhangb34b7e12016-06-14 14:28:19 -0700150 if "Failure" in installResult:
Devin Lim58046fa2017-07-05 16:55:00 -0700151 main.log.error( "Install Intents failure, ignore this iteration." )
YPZhangb34b7e12016-06-14 14:28:19 -0700152 if validrun < main.warmUp:
153 validrun += 1
154 continue
155 else:
156 invalidrun += 1
157 continue
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700158
YPZhangb34b7e12016-06-14 14:28:19 -0700159 try:
Devin Lim58046fa2017-07-05 16:55:00 -0700160 latency = int( installResult.split()[ 5 ] )
161 main.log.info( installResult )
YPZhangb34b7e12016-06-14 14:28:19 -0700162 except:
Devin Lim58046fa2017-07-05 16:55:00 -0700163 main.log.error( "Failed to get latency, ignore this iteration." )
164 main.log.error( "Response from ONOS:" )
165 print( installResult )
YPZhangb34b7e12016-06-14 14:28:19 -0700166 if validrun < main.warmUp:
167 validrun += 1
168 continue
169 else:
170 invalidrun += 1
171 continue
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700172
YPZhangb34b7e12016-06-14 14:28:19 -0700173 if validrun >= main.warmUp:
Devin Lim58046fa2017-07-05 16:55:00 -0700174 main.installLatList.append( latency )
YPZhangb34b7e12016-06-14 14:28:19 -0700175 else:
176 invalidrun += 1
177 continue
Devin Lim58046fa2017-07-05 16:55:00 -0700178 time.sleep( 2 )
YPZhangb34b7e12016-06-14 14:28:19 -0700179 # Withdraw Intents
Devin Lim58046fa2017-07-05 16:55:00 -0700180 withdrawResult = main.CLIs[ 0 ].pushTestIntents( main.ingress, main.egress, batchSize,
YPZhangb34b7e12016-06-14 14:28:19 -0700181 offset=1, options="-w", timeout=main.timeout,
Devin Lim58046fa2017-07-05 16:55:00 -0700182 getResponse=True )
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700183
Devin Lim58046fa2017-07-05 16:55:00 -0700184 if type( withdrawResult ) is str:
YPZhangb34b7e12016-06-14 14:28:19 -0700185 if "Failure" in withdrawResult:
Devin Lim58046fa2017-07-05 16:55:00 -0700186 main.log.error( "withdraw Intents failure, ignore this iteration." )
YPZhangb34b7e12016-06-14 14:28:19 -0700187 if validrun < main.warmUp:
188 validrun += 1
189 continue
190 else:
191 invalidrun += 1
192 continue
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700193
YPZhangb34b7e12016-06-14 14:28:19 -0700194 try:
Devin Lim58046fa2017-07-05 16:55:00 -0700195 latency = int( withdrawResult.split()[ 5 ] )
196 main.log.info( withdrawResult )
YPZhangb34b7e12016-06-14 14:28:19 -0700197 except:
Devin Lim58046fa2017-07-05 16:55:00 -0700198 main.log.error( "Failed to get latency, ignore this iteration." )
199 main.log.error( "Response from ONOS:" )
200 print( withdrawResult )
YPZhangb34b7e12016-06-14 14:28:19 -0700201 if validrun < main.warmUp:
202 validrun += 1
203 continue
204 else:
205 invalidrun += 1
206 continue
cameron@onlab.us41c16f52015-07-08 15:40:28 -0700207
YPZhangb34b7e12016-06-14 14:28:19 -0700208 if validrun >= main.warmUp:
Devin Lim58046fa2017-07-05 16:55:00 -0700209 main.withdrawLatList.append( latency )
YPZhangb34b7e12016-06-14 14:28:19 -0700210 else:
211 invalidrun += 1
212 continue
Devin Lim58046fa2017-07-05 16:55:00 -0700213 time.sleep( 2 )
214 main.CLIs[ 0 ].purgeWithdrawnIntents()
YPZhangb34b7e12016-06-14 14:28:19 -0700215 validrun += 1
Devin Lim58046fa2017-07-05 16:55:00 -0700216 installave = numpy.average( main.installLatList )
217 installstd = numpy.std( main.installLatList )
218 withdrawave = numpy.average( main.withdrawLatList )
219 withdrawstd = numpy.std( main.withdrawLatList )
YPZhangb34b7e12016-06-14 14:28:19 -0700220 # log report
Devin Lim58046fa2017-07-05 16:55:00 -0700221 main.log.report( "----------------------------------------------------" )
222 main.log.report( "Scale: " + str( main.numCtrls ) )
223 main.log.report( "Intent batch: " + str( batchSize ) )
224 main.log.report( "Install average: {} std: {}".format( installave, installstd ) )
225 main.log.report( "Withdraw average: {} std: {}".format( withdrawave, withdrawstd ) )
YPZhangb34b7e12016-06-14 14:28:19 -0700226 # write result to database file
Devin Lim58046fa2017-07-05 16:55:00 -0700227 if not ( numpy.isnan( installave ) or numpy.isnan( installstd ) or\
228 numpy.isnan( withdrawstd ) or numpy.isnan( withdrawave ) ):
YPZhangb34b7e12016-06-14 14:28:19 -0700229 databaseString = "'" + main.commit + "',"
Devin Lim58046fa2017-07-05 16:55:00 -0700230 databaseString += str( main.numCtrls ) + ","
231 databaseString += str( batchSize ) + ","
232 databaseString += str( installave ) + ","
233 databaseString += str( installstd ) + ","
234 databaseString += str( withdrawave ) + ","
235 databaseString += str( withdrawstd ) + "\n"
236 resultsDB = open( main.dbFileName, "a" )
237 resultsDB.write( databaseString )
YPZhangb34b7e12016-06-14 14:28:19 -0700238 resultsDB.close()