blob: 1911942e49735047c837a278fd17a812a7917532 [file] [log] [blame]
"""
Copyright 2015 Open Networking Foundation ( ONF )
Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
TestON is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
( at your option ) any later version.
TestON is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with TestON. If not, see <http://www.gnu.org/licenses/>.
"""
"""
SCPFintentEventTp
- Use intentperf app to generate a lot of intent install and withdraw events
- Test will run with 1,3,5,7 nodes, and with all neighbors
- Test will run 400 seconds and grep the overall rate from intent-perf summary
yunpeng@onlab.us
"""
import time
class SCPFintentEventTp:
def __init__( self ):
self.default = ''
def CASE0( self, main ):
"""
- GIT
- BUILDING ONOS
Pull specific ONOS branch, then Build ONOS ono ONOS Bench.
This step is usually skipped. Because in a Jenkins driven automated
test env. We want Jenkins jobs to pull&build for flexibility to handle
different versions of ONOS.
- Construct tests variables
"""
try:
from tests.dependencies.ONOSSetup import ONOSSetup
main.testSetUp = ONOSSetup()
except ImportError:
main.log.error( "ONOSSetup not found. exiting the test" )
main.cleanAndExit()
main.testSetUp.envSetupDescription()
stepResult = main.FALSE
try:
main.cellName = main.params[ 'ENV' ][ 'cellName' ]
main.apps = main.params[ 'ENV' ][ 'cellApps' ]
main.BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
main.BENCHUser = main.params[ 'BENCH' ][ 'user' ]
main.MN1Ip = main.params[ 'MN' ][ 'ip1' ]
main.skipRelRsrc = main.params[ 'TEST' ][ 'skipReleaseResourcesOnWithdrawal' ]
main.flowObj = main.params[ 'TEST' ][ 'flowObj' ]
main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
main.installSleep = int( main.params[ 'SLEEP' ][ 'install' ] )
main.verifySleep = int( main.params[ 'SLEEP' ][ 'verify' ] )
main.scale = ( main.params[ 'SCALE' ] ).split( "," )
main.testDuration = main.params[ 'TEST' ][ 'duration' ]
main.logInterval = main.params[ 'TEST' ][ 'log_interval' ]
main.debug = main.params[ 'debugMode' ]
main.intentManagerCfg = main.params[ 'CFG' ][ 'intentManager' ]
main.intentConfigRegiCfg = main.params[ 'CFG' ][ 'intentConfigRegi' ]
main.nullProviderCfg = main.params[ 'CFG' ][ 'nullProvider' ]
main.intentPerfInstallerCfg = main.params[ 'CFG' ][ 'intentPerfInstaller' ]
main.neighbor = ( main.params[ 'TEST' ][ 'neighbors' ] ).split( "," )
main.timeout = int( main.params[ 'SLEEP' ][ 'timeout' ] )
main.cyclePeriod = main.params[ 'TEST' ][ 'cyclePeriod' ]
if main.flowObj == "True":
main.flowObj = True
main.dbFileName = main.params[ 'DATABASE' ][ 'dbFlowObj' ]
main.numKeys = main.params[ 'TEST' ][ 'numKeysFlowObj' ]
else:
main.flowObj = False
main.dbFileName = main.params[ 'DATABASE' ][ 'dbName' ]
main.numKeys = main.params[ 'TEST' ][ 'numKeys' ]
stepResult = main.testSetUp.envSetup()
# Create DataBase file
main.log.info( "Create Database file " + main.dbFileName )
resultsDB = open( main.dbFileName, "w+" )
resultsDB.close()
except Exception as e:
main.testSetUp.envSetupException( e )
main.testSetUp.evnSetupConclusion( stepResult )
main.commit = main.commit.split( " " )[ 1 ]
def CASE1( self, main ):
# Clean up test environment and set up
import time
main.maxNumBatch = 0
main.testSetUp.ONOSSetUp( main.Cluster, True,
cellName=main.cellName, killRemoveMax=False )
# config apps
main.Cluster.active( 0 ).CLI.setCfg( main.intentManagerCfg,
"skipReleaseResourcesOnWithdrawal " + main.skipRelRsrc )
main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg,
"deviceCount " + str( int( main.Cluster.numCtrls * 10 ) ) )
main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg, "topoShape linear" )
main.Cluster.active( 0 ).CLI.setCfg( main.nullProviderCfg, "enabled true" )
if main.flowObj:
main.Cluster.active( 0 ).CLI.setCfg( main.intentConfigRegiCfg,
"useFlowObjectives", value="true" )
time.sleep( main.startUpSleep )
# balanceMasters
main.Cluster.active( 0 ).CLI.balanceMasters()
time.sleep( main.startUpSleep )
def CASE2( self, main ):
import numpy
# If we activate intentperf from the cell, there's chance that it doesn't get all cluster
# nodes when some of the nodes have a large startup delay
main.log.info( "Activate intentperf app" )
main.Cluster.active( 0 ).CLI.app( "intentperf", "activate" )
time.sleep( 5 )
main.log.info( "Cluster Count = " + str( main.Cluster.numCtrls ) )
neighbors = '0' if main.neighbor.pop( 0 ) == '0' else str( main.Cluster.numCtrls - 1 )
main.log.info( "Neighbors: " + neighbors )
main.log.info( "Config intent-perf app" )
main.Cluster.active( 0 ).CLI.setCfg( main.intentPerfInstallerCfg,
"numKeys " + main.numKeys )
main.Cluster.active( 0 ).CLI.setCfg( main.intentPerfInstallerCfg,
"numNeighbors " + neighbors )
main.Cluster.active( 0 ).CLI.setCfg( main.intentPerfInstallerCfg,
"cyclePeriod " + main.cyclePeriod )
main.log.info( "Starting intent-perf test for " + str( main.testDuration ) + " seconds..." )
main.Cluster.active( 0 ).CLI.sendline( "intent-perf-start" )
stop = time.time() + float( main.testDuration )
while time.time() < stop:
time.sleep( 15 )
result = main.Cluster.active( 0 ).CLI.getIntentPerfSummary()
if result:
for ctrl in main.Cluster.active():
main.log.info( "Node {} Overall Rate: {}".format( ctrl.ipAddress,
result[ ctrl.ipAddress ] ) )
main.log.info( "Stop intent-perf" )
for ctrl in main.Cluster.active():
ctrl.CLI.sendline( "intent-perf-stop" )
tp = 0.0
if result:
for ctrl in main.Cluster.active():
main.log.info( "Node {} final Overall Rate: {}".format( ctrl.ipAddress,
result[ ctrl.ipAddress ] ) )
tp += float( result[ ctrl.ipAddress ] )
# Check if throughput result is abnormal
if main.flowObj:
threshold = float( main.params[ 'ALARM' ][ 'minTpFlowObj' ].split( ',' )[ main.cycle - 1 ] )
else:
threshold = float( main.params[ 'ALARM' ][ 'minTp' ].split( ',' )[ main.cycle - 1 ] )
if tp < threshold:
main.log.alarm( "{}-node with {} neighbor: {}/s < {}/s".format( main.Cluster.numCtrls,
neighbors, tp, threshold ) )
with open( main.dbFileName, "a" ) as resultDB:
for nodes in range( main.Cluster.numCtrls ):
resultString = "'" + main.commit + "',"
resultString += "'1gig',"
resultString += str( main.Cluster.numCtrls ) + ","
resultString += "'baremetal" + str(nodes + 1) + "',"
resultString += neighbors + ","
resultString += result[ main.Cluster.active( nodes ).ipAddress ] + ","
resultString += str( 0 ) + "\n" # no stddev
resultDB.write( resultString )
resultDB.close()