blob: 7807daf9621e4b16ec57f97a1ba7abeb5f89425a [file] [log] [blame]
# Intent Performance Test for ONOS-next
#
# andrew@onlab.us
#
# November 5, 2014
class IntentPerfNext:
def __init__( self ):
self.default = ""
def CASE1( self, main ):
"""
ONOS startup sequence
"""
import time
global clusterCount
global timeToPost
global runNum
clusterCount = 1
timeToPost = time.strftime("%Y-%m-%d %H:%M:%S")
runNum = time.strftime("%d%H%M%S")
cellName = main.params[ 'ENV' ][ 'cellName' ]
gitPull = main.params[ 'GIT' ][ 'autoPull' ]
checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
intentFilePath = main.params[ 'DB' ][ 'intentFilePath' ]
ONOSIp = []
for i in range(1, 8):
ONOSIp.append(main.params[ 'CTRL' ][ 'ip'+str(i) ])
main.ONOSbench.onosUninstall( nodeIp = ONOSIp[i-1] )
MN1Ip = main.params[ 'MN' ][ 'ip1' ]
BENCHIp = main.params[ 'BENCH' ][ 'ip' ]
main.case( "Setting up test environment" )
main.step( "Clearing previous DB log file" )
fIntentLog = open(intentFilePath, 'w')
# Overwrite with empty line and close
fIntentLog.write('')
fIntentLog.close()
main.step( "Starting mininet topology" )
main.Mininet1.startNet()
main.step( "Creating cell file" )
cellFileResult = main.ONOSbench.createCellFile(
BENCHIp, cellName, MN1Ip,
("onos-core,webconsole,onos-api,onos-app-metrics,onos-gui,"
"onos-cli,onos-openflow"),
ONOSIp[0] )
main.step( "Applying cell file to environment" )
cellApplyResult = main.ONOSbench.setCell( cellName )
verifyCellResult = main.ONOSbench.verifyCell()
main.step( "Removing raft logs" )
main.ONOSbench.onosRemoveRaftLogs()
main.step( "Git checkout and pull " + checkoutBranch )
if gitPull == 'on':
checkoutResult = \
main.ONOSbench.gitCheckout( checkoutBranch )
pullResult = main.ONOSbench.gitPull()
# If you used git pull, auto compile
main.step( "Using onos-build to compile ONOS" )
buildResult = main.ONOSbench.onosBuild()
else:
checkoutResult = main.TRUE
pullResult = main.TRUE
buildResult = main.TRUE
main.log.info( "Git pull skipped by configuration" )
main.log.report( "Commit information - " )
main.ONOSbench.getVersion( report=True )
main.step( "Creating ONOS package" )
packageResult = main.ONOSbench.onosPackage()
main.step( "Installing ONOS package" )
install1Result = main.ONOSbench.onosInstall( node=ONOSIp[0] )
main.step( "Set cell for ONOScli env" )
main.ONOS1cli.setCell( cellName )
time.sleep( 5 )
main.step( "Start onos cli" )
cli1 = main.ONOS1cli.startOnosCli( ONOSIp[0] )
utilities.assert_equals( expect=main.TRUE,
actual=cellFileResult and cellApplyResult and
verifyCellResult and checkoutResult and
pullResult and buildResult and
install1Result, # and install2Result and
# install3Result,
onpass="ONOS started successfully",
onfail="Failed to start ONOS" )
def CASE2( self, main ):
"""
Single intent add latency
"""
import time
import json
import requests
import os
import numpy
global clusterCount
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
ONOSIpList = []
for i in range( 1, 8 ):
ONOSIpList.append( main.params[ 'CTRL' ][ 'ip' + str( i ) ] )
ONOSUser = main.params[ 'CTRL' ][ 'user' ]
defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
# number of iterations of case
numIter = main.params[ 'TEST' ][ 'numIter' ]
numIgnore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
# Timestamp keys for json metrics output
submitTime = main.params[ 'JSON' ][ 'submittedTime' ]
installTime = main.params[ 'JSON' ][ 'installedTime' ]
wdRequestTime = main.params[ 'JSON' ][ 'wdRequestTime' ]
withdrawnTime = main.params[ 'JSON' ][ 'withdrawnTime' ]
assertion = main.TRUE
intentAddLatList = []
# Distribute switches according to cluster count
for i in range( 1, 9 ):
if clusterCount == 1:
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOSIpList[ 0 ],
port=defaultSwPort
)
elif clusterCount == 3:
if i < 3:
index = 0
elif i < 6 and i >= 3:
index = 1
else:
index = 2
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOSIpList[ index ],
port=defaultSwPort
)
elif clusterCount == 5:
if i < 3:
index = 0
elif i < 5 and i >= 3:
index = 1
elif i < 7 and i >= 5:
index = 2
elif i == 7:
index = 3
else:
index = 4
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOSIpList[ index ],
port=defaultSwPort
)
elif clusterCount == 7:
if i < 6:
index = i
else:
index = 6
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOSIpList[ index ],
port=defaultSwPort
)
time.sleep( 10 )
main.log.report( "Single intent add latency test" )
devicesJsonStr = main.ONOS1cli.devices()
devicesJsonObj = json.loads( devicesJsonStr )
if not devicesJsonObj:
main.log.report( "Devices not discovered" )
main.log.report( "Aborting test" )
main.exit()
else:
main.log.info( "Devices discovered successfully" )
deviceIdList = []
# Obtain device id list in ONOS format.
# They should already be in order ( 1,2,3,10,11,12,13, etc )
for device in devicesJsonObj:
deviceIdList.append( device[ 'id' ] )
for i in range( 0, int( numIter ) ):
# addPointIntent( ingrDevice, egrDevice,
# ingrPort, egrPort )
main.ONOS1cli.addPointIntent(
deviceIdList[ 0 ] + "/2", deviceIdList[ 7 ] + "/2" )
# Allow some time for intents to propagate
time.sleep( 5 )
intentsStr = main.ONOS1cli.intents( jsonFormat=True )
intentsObj = json.loads( intentsStr )
for intent in intentsObj:
if intent[ 'state' ] == "INSTALLED":
main.log.info( "Intent installed successfully" )
intentId = intent[ 'id' ]
main.log.info( "Intent id: " + str( intentId ) )
else:
# TODO: Add error handling
main.log.info( "Intent installation failed" )
intentId = ""
# Obtain metrics from ONOS 1, 2, 3
intentsJsonStr1 = main.ONOS1cli.intentsEventsMetrics()
intentsJsonObj1 = json.loads( intentsJsonStr1 )
# Parse values from the json object
intentSubmit1 = \
intentsJsonObj1[ submitTime ][ 'value' ]
intentInstall1 = \
intentsJsonObj1[ installTime ][ 'value' ]
intentInstallLat1 = \
int( intentInstall1 ) - int( intentSubmit1 )
if clusterCount == 3:
intentsJsonStr2 = main.ONOS2cli.intentsEventsMetrics()
intentsJsonStr3 = main.ONOS3cli.intentsEventsMetrics()
intentsJsonObj2 = json.loads( intentsJsonStr2 )
intentsJsonObj3 = json.loads( intentsJsonStr3 )
intentSubmit2 = \
intentsJsonObj2[ submitTime ][ 'value' ]
intentSubmit3 = \
intentsJsonObj3[ submitTime ][ 'value' ]
intentInstall2 = \
intentsJsonObj2[ installTime ][ 'value' ]
intentInstall3 = \
intentsJsonObj3[ installTime ][ 'value' ]
intentInstallLat2 = \
int( intentInstall2 ) - int( intentSubmit2 )
intentInstallLat3 = \
int( intentInstall3 ) - int( intentSubmit3 )
else:
intentInstallLat2 = 0
intentInstallLat3 = 0
if clusterCount == 5:
intentsJsonStr4 = main.ONOS4cli.intentsEventsMetrics()
intentsJsonStr5 = main.ONOS5cli.intentsEventsMetrics()
intentsJsonObj4 = json.loads( intentsJsonStr4 )
intentsJsonObj5 = json.loads( intentsJsonStr5 )
intentSubmit4 = \
intentsJsonObj4[ submitTime ][ 'value' ]
intentSubmit5 = \
intentsJsonObj5[ submitTime ][ 'value' ]
intentInstall4 = \
intentsJsonObj5[ installTime ][ 'value' ]
intentInstall5 = \
intentsJsonObj5[ installTime ][ 'value' ]
intentInstallLat4 = \
int( intentInstall4 ) - int( intentSubmit4 )
intentInstallLat5 = \
int( intentInstall5 ) - int( intentSubmit5 )
else:
intentInstallLat4 = 0
intentInstallLat5 = 0
if clusterCount == 7:
intentsJsonStr6 = main.ONOS6cli.intentsEventsMetrics()
intentsJsonStr7 = main.ONOS7cli.intentsEventsMetrics()
intentsJsonObj6 = json.loads( intentsJsonStr6 )
intentsJsonObj7 = json.loads( intentsJsonStr7 )
intentSubmit6 = \
intentsJsonObj6[ submitTime ][ 'value' ]
intentSubmit7 = \
intentsJsonObj6[ submitTime ][ 'value' ]
intentInstall6 = \
intentsJsonObj6[ installTime ][ 'value' ]
intentInstall7 = \
intentsJsonObj7[ installTime ][ 'value' ]
intentInstallLat6 = \
int( intentInstall6 ) - int( intentSubmit6 )
intentInstallLat7 = \
int( intentInstall7 ) - int( intentSubmit7 )
else:
intentInstallLat6 = 0
intentInstallLat7 = 0
intentInstallLatAvg = \
( intentInstallLat1 +
intentInstallLat2 +
intentInstallLat3 +
intentInstallLat4 +
intentInstallLat5 +
intentInstallLat6 +
intentInstallLat7 ) / clusterCount
main.log.info( "Intent add latency avg for iteration " + str( i ) +
": " + str( intentInstallLatAvg ) + " ms" )
if intentInstallLatAvg > 0.0 and \
intentInstallLatAvg < 1000 and i > numIgnore:
intentAddLatList.append( intentInstallLatAvg )
else:
main.log.info( "Intent add latency exceeded " +
"threshold. Skipping iteration " + str( i ) )
time.sleep( 3 )
# TODO: Only remove intents that were installed
# in this case... Otherwise many other intents
# may show up distorting the results
main.log.info( "Removing intents for next iteration" )
jsonTemp = \
main.ONOS1cli.intents( jsonFormat=True )
jsonObjIntents = json.loads( jsonTemp )
if jsonObjIntents:
for intents in jsonObjIntents:
tempId = intents[ 'id' ]
# main.ONOS1cli.removeIntent( tempId )
main.log.info( "Removing intent id: " +
str( tempId ) )
main.ONOS1cli.removeIntent( tempId )
else:
main.log.info( "Intents were not installed correctly" )
time.sleep( 5 )
if intentAddLatList:
intentAddLatAvg = sum( intentAddLatList ) /\
len( intentAddLatList )
else:
main.log.report( "Intent installation latency test failed" )
intentAddLatAvg = "NA"
assertion = main.FALSE
intentAddLatStd = \
round( numpy.std( intentAddLatList ), 1 )
# END ITERATION FOR LOOP
main.log.report( "Single intent add latency - " )
main.log.report( "Avg: " + str( intentAddLatAvg ) + " ms" )
main.log.report( "Std Deviation: " + str( intentAddLatStd ) + " ms" )
utilities.assert_equals(
expect=main.TRUE,
actual=assertion,
onpass="Single intent install latency test successful",
onfail="Single intent install latency test failed" )
def CASE3( self, main ):
"""
Intent Reroute latency
"""
import time
import json
import requests
import os
import numpy
global clusterCount
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
ONOSUser = main.params[ 'CTRL' ][ 'user' ]
ONOSIpList = []
for i in range( 1, 8 ):
ONOSIpList.append( main.params[ 'CTRL' ][ 'ip' + str( i ) ] )
defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
# number of iterations of case
numIter = main.params[ 'TEST' ][ 'numIter' ]
numIgnore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
assertion = main.TRUE
# Timestamp keys for json metrics output
submitTime = main.params[ 'JSON' ][ 'submittedTime' ]
installTime = main.params[ 'JSON' ][ 'installedTime' ]
wdRequestTime = main.params[ 'JSON' ][ 'wdRequestTime' ]
withdrawnTime = main.params[ 'JSON' ][ 'withdrawnTime' ]
# NOTE: May need to configure interface depending on topology
intfs = main.params[ 'TEST' ][ 'intfs' ]
# Distribute switches according to cluster count
for i in range( 1, 9 ):
if clusterCount == 1:
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOSIpList[ 0 ],
port=defaultSwPort
)
elif clusterCount == 3:
if i < 3:
index = 0
elif i < 6 and i >= 3:
index = 1
else:
index = 2
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOSIpList[ index ],
port=defaultSwPort
)
elif clusterCount == 5:
if i < 3:
index = 0
elif i < 5 and i >= 3:
index = 1
elif i < 7 and i >= 5:
index = 2
elif i == 7:
index = 3
else:
index = 4
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOSIpList[ index ],
port=defaultSwPort
)
elif clusterCount == 7:
if i < 6:
index = i
else:
index = 6
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOSIpList[ index ],
port=defaultSwPort
)
time.sleep(10)
devicesJsonStr = main.ONOS1cli.devices()
devicesJsonObj = json.loads( devicesJsonStr )
deviceIdList = []
# Obtain device id list in ONOS format.
# They should already be in order ( 1,2,3,10,11,12,13, etc )
for device in devicesJsonObj:
deviceIdList.append( device[ 'id' ] )
intentRerouteLatList = []
for i in range( 0, int( numIter ) ):
# addPointIntent( ingrDevice, ingrPort,
# egrDevice, egrPort )
if len( deviceIdList ) > 0:
main.ONOS1cli.addPointIntent(
deviceIdList[ 0 ] + "/2", deviceIdList[ 7 ] + "/2" )
else:
main.log.info( "Failed to fetch devices from ONOS" )
time.sleep( 5 )
intentsStr = main.ONOS1cli.intents( jsonFormat=True )
intentsObj = json.loads( intentsStr )
for intent in intentsObj:
main.log.info(intent)
if intent[ 'state' ] == "INSTALLED":
main.log.info( "Intent installed successfully" )
intentId = intent[ 'id' ]
main.log.info( "Intent id: " + str( intentId ) )
#else:
#TODO: Add error handling
#main.log.info( "Intent installation failed" )
#intentId = ""
main.log.info( "Disabling interface " + intfs )
t0System = time.time() * 1000
main.Mininet1.handle.sendline(
"sh ifconfig " + intfs + " down" )
main.Mininet1.handle.expect( "mininet>" )
# TODO: Check for correct intent reroute
time.sleep( 1 )
# Obtain metrics from ONOS 1, 2, 3
intentsJsonStr1 = main.ONOS1cli.intentsEventsMetrics()
intentsJsonObj1 = json.loads( intentsJsonStr1 )
# Parse values from the json object
intentInstall1 = \
intentsJsonObj1[ installTime ][ 'value' ]
intentRerouteLat1 = \
int( intentInstall1 ) - int( t0System )
if clusterCount == 3:
intentsJsonStr2 = main.ONOS2cli.intentsEventsMetrics()
intentsJsonStr3 = main.ONOS3cli.intentsEventsMetrics()
intentsJsonObj2 = json.loads( intentsJsonStr2 )
intentsJsonObj3 = json.loads( intentsJsonStr3 )
intentInstall2 = \
intentsJsonObj2[ installTime ][ 'value' ]
intentInstall3 = \
intentsJsonObj3[ installTime ][ 'value' ]
intentRerouteLat2 = \
int( intentInstall2 ) - int( t0System )
intentRerouteLat3 = \
int( intentInstall3 ) - int( t0System )
else:
intentRerouteLat2 = 0
intentRerouteLat3 = 0
if clusterCount == 5:
intentsJsonStr4 = main.ONOS4cli.intentsEventsMetrics()
intentsJsonStr5 = main.ONOS5cli.intentsEventsMetrics()
intentsJsonObj4 = json.loads( intentsJsonStr4 )
intentsJsonObj5 = json.loads( intentsJsonStr5 )
intentInstall4 = \
intentsJsonObj4[ installTime ][ 'value' ]
intentInstall5 = \
intentsJsonObj5[ installTime ][ 'value' ]
intentRerouteLat4 = \
int( intentInstall4 ) - int( t0System )
intentRerouteLat5 = \
int( intentInstall5 ) - int( t0System )
else:
intentRerouteLat4 = 0
intentRerouteLat5 = 0
if clusterCount == 7:
intentsJsonStr6 = main.ONOS6cli.intentsEventsMetrics()
intentsJsonStr7 = main.ONOS7cli.intentsEventsMetrics()
intentsJsonObj6 = json.loads( intentsJsonStr6 )
intentsJsonObj7 = json.loads( intentsJsonStr7 )
intentInstall6 = \
intentsJsonObj6[ installTime ][ 'value' ]
intentInstall7 = \
intentsJsonObj7[ installTime ][ 'value' ]
intentRerouteLat6 = \
int( intentInstall6 ) - int( t0System )
intentRerouteLat7 = \
int( intentInstall7 ) - int( t0System )
else:
intentRerouteLat6 = 0
intentRerouteLat7 = 0
intentRerouteLatAvg = \
( intentRerouteLat1 +
intentRerouteLat2 +
intentRerouteLat3 +
intentRerouteLat4 +
intentRerouteLat5 +
intentRerouteLat6 +
intentRerouteLat7 ) / clusterCount
main.log.info( "Intent reroute latency avg for iteration " +
str( i ) + ": " + str( intentRerouteLatAvg )+ " ms")
if intentRerouteLatAvg > 0.0 and \
intentRerouteLatAvg < 1000 and i > numIgnore:
intentRerouteLatList.append( intentRerouteLatAvg )
else:
main.log.info( "Intent reroute latency exceeded " +
"threshold. Skipping iteration " + str( i ) )
main.log.info( "Removing intents for next iteration" )
main.ONOS1cli.removeIntent( intentId )
main.log.info( "Bringing Mininet interface up for next " +
"iteration" )
main.Mininet1.handle.sendline(
"sh ifconfig " + intfs + " up" )
main.Mininet1.handle.expect( "mininet>" )
if intentRerouteLatList:
intentRerouteLatAvg = sum( intentRerouteLatList ) /\
len( intentRerouteLatList )
else:
main.log.report( "Intent reroute test failed. Results NA" )
intentRerouteLatAvg = "NA"
# NOTE: fails test when list is empty
assertion = main.FALSE
intentRerouteLatStd = \
round( numpy.std( intentRerouteLatList ), 1 )
# END ITERATION FOR LOOP
main.log.report( "Single intent reroute latency - " )
main.log.report( "Avg: " + str( intentRerouteLatAvg ) + " ms" )
main.log.report(
"Std Deviation: " +
str( intentRerouteLatStd ) +
" ms" )
utilities.assert_equals(
expect=main.TRUE,
actual=assertion,
onpass="Single intent reroute latency test successful",
onfail="Single intent reroute latency test failed" )
def CASE4( self, main ):
"""
Batch intent install
Supports scale-out scenarios and increasing
number of intents within each iteration
"""
import time
import json
import requests
import os
import numpy
global clusterCount
global timeToPost
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
assertion = main.TRUE
ONOSIpList = []
for i in range( 1, 8 ):
ONOSIpList.append( main.params[ 'CTRL' ][ 'ip' + str( i ) ] )
ONOSUser = main.params[ 'CTRL' ][ 'user' ]
defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
batchIntentSize = int( main.params[ 'TEST' ][ 'batchIntentSize' ] )
batchThreshMin = int( main.params[ 'TEST' ][ 'batchThresholdMin' ] )
batchThreshMax = int( main.params[ 'TEST' ][ 'batchThresholdMax' ] )
# number of iterations of case
numIter = main.params[ 'TEST' ][ 'numIter' ]
numIgnore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
numSwitch = int( main.params[ 'TEST' ][ 'numSwitch' ] )
nThread = main.params[ 'TEST' ][ 'numMult' ]
#nThread = 105
# DB operation variables
intentFilePath = main.params[ 'DB' ][ 'intentFilePath' ]
# Switch assignment NOTE: hardcoded
if clusterCount == 1:
for i in range( 1, numSwitch + 1 ):
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOS1Ip,
port=defaultSwPort )
if clusterCount == 3:
for i in range( 1, 3 ):
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOS1Ip,
port=defaultSwPort )
for i in range( 3, 6 ):
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOS2Ip,
port=defaultSwPort )
for i in range( 6, 9 ):
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOS3Ip,
port=defaultSwPort )
if clusterCount == 5:
main.Mininet1.assignSwController(
sw="s1",
ip=ONOS1Ip,
port=defaultSwPort )
main.Mininet1.assignSwController(
sw="s2",
ip=ONOS1Ip,
port=defaultSwPort )
for i in range( 3, 6 ):
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOS3Ip,
port=defaultSwPort )
main.Mininet1.assignSwController(
sw="s6",
ip=ONOS4Ip,
port=defaultSwPort )
main.Mininet1.assignSwController(
sw="s7",
ip=ONOS5Ip,
port=defaultSwPort )
main.Mininet1.assignSwController(
sw="s8",
ip=ONOS5Ip,
port=defaultSwPort )
if clusterCount == 7:
for i in range( 1, 9 ):
if i < 8:
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOSIpList[ i - 1 ],
port=defaultSwPort )
elif i >= 8:
main.Mininet1.assignSwController(
sw="s" + str( i ),
ip=ONOSIpList[ 6 ],
port=defaultSwPort )
time.sleep( 20 )
main.log.report( "Batch intent installation test of " +
str( batchIntentSize ) + " intent(s)" )
batchResultList = []
main.log.info( "Getting list of available devices" )
deviceIdList = []
jsonStr = main.ONOS1cli.devices()
jsonObj = json.loads( jsonStr )
for device in jsonObj:
deviceIdList.append( device[ 'id' ] )
# List of install / witdhraw latencies for each batch
batchInstallLat = []
batchWithdrawLat = []
sleepTime = 10
baseDir = "/tmp/"
# Batch size increase loop
for batch in range( 0, 5 ):
# Max intent install measurement of all nodes
# Resets after each batch calculation
maxInstallLat = []
maxWithdrawLat = []
# Max single intent install measurement of all nodes
# For example, if batch size is 1000, result latency
# will be divided by 1000
maxSingleInstallLat = []
maxSingleWithdrawLat = []
# Statistical gathering loop over number of iterations
for i in range( 0, int( numIter ) ):
main.log.info( "Pushing " +
str( int( batchIntentSize ) * int( nThread ) ) +
" intents. Iteration " + str( i ) )
for node in range( 1, clusterCount + 1 ):
saveDir = baseDir + "batch_intent_" + str( node ) + ".txt"
main.ONOSbench.pushTestIntentsShell(
deviceIdList[ 0 ] + "/2",
deviceIdList[ 7 ] + "/2",
batchIntentSize,
saveDir, ONOSIpList[ node - 1 ],
numMult=nThread )
# Wait sufficient time for intents to start
# installing
time.sleep( sleepTime )
intent = ""
counter = 300
while len( intent ) > 0 and counter > 0:
main.ONOS1cli.handle.sendline(
"intents | wc -l" )
main.ONOS1cli.handle.expect(
"intents | wc -l" )
main.ONOS1cli.handle.expect(
"onos>" )
intentTemp = main.ONOS1cli.handle.before()
intent = main.ONOS1cli.intents()
intent = json.loads( intent )
counter = counter - 1
time.sleep( 1 )
time.sleep( 5 )
for node in range( 1, clusterCount + 1 ):
saveDir = baseDir + "batch_intent_" + str( node ) + ".txt"
with open( saveDir ) as fOnos:
lineCount = 0
for line in fOnos:
line_temp = ""
main.log.info( "Line read: " + str( line ) )
line_temp = line[ 1: ]
line_temp = line_temp.split( ": " )
#Prevent split method if line doesn't have
#space
if " " in str(line_temp):
result = line_temp[ 1 ].split( " " )[ 0 ]
else:
main.log.warn( "Empty line read" )
result = 0
# TODO: add parameters before appending latency
if lineCount == 0:
if "Failure" in str(line):
main.log.warn("Intent installation failed")
result = 'NA'
else:
main.log.info("Install result: "+result)
batchInstallLat.append( int( result ) )
installResult = result
elif lineCount == 1:
if "Failure" in str(line):
main.log.warn("Intent withdraw failed")
result = 'NA'
else:
main.log.info("Withdraw result: "+result)
batchWithdrawLat.append( int( result ) )
withdrawResult = result
else:
main.log.warn("Invalid results: excess lines")
installResult = 'NA'
withdrawResult = 'NA'
lineCount += 1
main.log.info( "Batch install latency for ONOS" +
str( node ) + " with " +
str( batchIntentSize ) + "intents: " +
str( installResult ) + " ms" )
main.log.info( "Batch withdraw latency for ONOS" +
str( node ) + " with " +
str( batchIntentSize ) + "intents: " +
str( withdrawResult ) + " ms" )
main.log.info( "Single intent install latency ONOS" +
str( node ) + " with " +
str( batchIntentSize ) + "intents: " +
str( float(installResult) /\
int(batchIntentSize) ) + " ms" )
main.log.info( "Single intent withdraw latency ONOS" +
str( node ) + " with " +
str( batchIntentSize ) + "intents: " +
str( float(withdrawResult) /\
int(batchIntentSize) ) + " ms" )
#NOTE: END node loop
if len( batchInstallLat ) > 0 and int( i ) > numIgnore:
maxInstallLat.append( max( batchInstallLat ) )
maxSingleInstallLat.append(
max( batchInstallLat ) / int( batchIntentSize )
)
elif len( batchInstallLat ) == 0:
# If I failed to read anything from the file,
# increase the wait time before checking intents
sleepTime += 30
if len( batchWithdrawLat ) > 0 and int( i ) > numIgnore:
maxWithdrawLat.append( max( batchWithdrawLat ) )
maxSingleWithdrawLat.append(
max( batchWithdrawLat ) / int( batchIntentSize )
)
batchInstallLat = []
batchWithdrawLat = []
# Sleep in between iterations
time.sleep( 5 )
#NOTE: END iteration loop
if maxInstallLat:
avgInstallLat = str( round( numpy.average(maxInstallLat)
, 2 ))
stdInstallLat = str( round(
numpy.std(maxInstallLat), 2))
avgSingleInstallLat = str( round(
numpy.average(maxSingleInstallLat)
, 3 ))
stdSingleInstallLat = str( round(
numpy.std(maxSingleInstallLat),
3 ))
else:
avgInstallLat = "NA"
stdInstallLat = "NA"
main.log.report( "Batch installation failed" )
assertion = main.FALSE
if maxWithdrawLat:
avgWithdrawLat = str( round( numpy.average(maxWithdrawLat)
, 2 ))
stdWithdrawLat = str( round(
numpy.std(maxWithdrawLat), 2))
avgSingleWithdrawLat = str( round(
numpy.average(maxSingleWithdrawLat)
, 3 ))
stdSingleWithdrawLat = str( round(
numpy.std(maxSingleWithdrawLat),
3 ))
else:
avgWithdrawLat = "NA"
stdWithdrawLat = "NA"
main.log.report( "Batch withdraw failed" )
assertion = main.FALSE
main.log.report( "Avg of batch installation latency " +
"of size " + str( batchIntentSize ) + ": " +
str( avgInstallLat ) + " ms" )
main.log.report( "Std Deviation of batch installation latency " +
": " +
str( stdInstallLat ) + " ms" )
main.log.report( "Avg of single installation latency " +
"of size " + str( batchIntentSize ) + ": " +
str( avgSingleInstallLat ) + " ms" )
main.log.report( "Std Deviation of single installation latency " +
": " +
str( stdSingleInstallLat ) + " ms" )
main.log.report( "Avg of batch withdraw latency " +
"of size " + str( batchIntentSize ) + ": " +
str( avgWithdrawLat ) + " ms" )
main.log.report( "Std Deviation of batch withdraw latency " +
": " +
str( stdWithdrawLat ) + " ms" )
main.log.report( "Avg of single withdraw latency " +
"of size " + str( batchIntentSize ) + ": " +
str( avgSingleWithdrawLat ) + " ms" )
main.log.report( "Std Deviation of single withdraw latency " +
": " +
str( stdSingleWithdrawLat ) + " ms" )
dbCmd = (
"INSERT INTO intents_latency_tests VALUES("
"'"+timeToPost+"','intents_latency_results',"
""+runNum+","+str(clusterCount)+","+str(batchIntentSize)+","
""+str(avgInstallLat)+","+str(stdInstallLat)+","
""+str(avgWithdrawLat)+","+str(stdWithdrawLat)+");"
)
# Write result to file (which is posted to DB by jenkins)
fResult = open(intentFilePath, 'a')
if dbCmd:
fResult.write(dbCmd+"\n")
fResult.close()
if batch == 0:
batchIntentSize = 10
elif batch == 1:
batchIntentSize = 100
elif batch == 2:
batchIntentSize = 1000
elif batch == 3:
batchIntentSize = 2000
if batch < 4:
main.log.report( "Increasing batch intent size to " +
str(batchIntentSize) )
#NOTE: END batch loop
#main.log.info( "Removing all intents for next test case" )
#jsonTemp = main.ONOS1cli.intents( jsonFormat=True )
#jsonObjIntents = json.loads( jsonTemp )
# if jsonObjIntents:
# for intents in jsonObjIntents:
# tempId = intents[ 'id' ]
# main.ONOS1cli.removeIntent( tempId )
# main.ONOS1cli.removeIntent( tempId )
utilities.assert_equals(
expect=main.TRUE,
actual=assertion,
onpass="Batch intent install/withdraw test successful",
onfail="Batch intent install/withdraw test failed" )
def CASE5( self, main ):
"""
Increase number of nodes and initiate CLI
"""
import time
import json
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
global clusterCount
clusterCount += 2
main.log.report( "Increasing cluster size to " +
str( clusterCount ) )
installResult = main.FALSE
if clusterCount == 3:
installResult1 = \
main.ONOSbench.onosInstall( node=ONOS2Ip )
installResult2 = \
main.ONOSbench.onosInstall( node=ONOS3Ip )
time.sleep( 5 )
main.log.info( "Starting ONOS CLI" )
main.ONOS2cli.startOnosCli( ONOS2Ip )
main.ONOS3cli.startOnosCli( ONOS3Ip )
installResult = installResult1 and installResult2
if clusterCount == 5:
main.log.info( "Installing ONOS on node 4 and 5" )
installResult1 = \
main.ONOSbench.onosInstall( node=ONOS4Ip )
installResult2 = \
main.ONOSbench.onosInstall( node=ONOS5Ip )
main.log.info( "Starting ONOS CLI" )
main.ONOS4cli.startOnosCli( ONOS4Ip )
main.ONOS5cli.startOnosCli( ONOS5Ip )
installResult = installResult1 and installResult2
if clusterCount == 7:
main.log.info( "Installing ONOS on node 6 and 7" )
installResult1 = \
main.ONOSbench.onosInstall( node=ONOS6Ip )
installResult2 = \
main.ONOSbench.onosInstall( node=ONOS7Ip )
main.log.info( "Starting ONOS CLI" )
main.ONOS6cli.startOnosCli( ONOS6Ip )
main.ONOS7cli.startOnosCli( ONOS7Ip )
installResult = installResult1 and installResult2
time.sleep( 5 )
if installResult == main.TRUE:
assertion = main.TRUE
else:
assertion = main.FALSE
utilities.assert_equals( expect=main.TRUE, actual=assertion,
onpass="Scale out to " + str( clusterCount ) +
" nodes successful",
onfail="Scale out to " + str( clusterCount ) +
" nodes failed" )
def CASE7( self, main ):
# TODO: Fix for scale-out scenario
"""
Batch intent reroute latency
"""
import time
import json
import requests
import os
import numpy
global clusterCount
ONOSIpList = []
for i in range( 1, 8 ):
ONOSIpList.append( main.params[ 'CTRL' ][ 'ip' + str( i ) ] )
ONOSUser = main.params[ 'CTRL' ][ 'user' ]
defaultSwPort = main.params[ 'CTRL' ][ 'port1' ]
batchIntentSize = main.params[ 'TEST' ][ 'batchIntentSize' ]
batchThreshMin = int( main.params[ 'TEST' ][ 'batchThresholdMin' ] )
batchThreshMax = int( main.params[ 'TEST' ][ 'batchThresholdMax' ] )
intfs = main.params[ 'TEST' ][ 'intfs' ]
installTime = main.params[ 'JSON' ][ 'installedTime' ]
# number of iterations of case
numIter = main.params[ 'TEST' ][ 'numIter' ]
numIgnore = int( main.params[ 'TEST' ][ 'numIgnore' ] )
numSwitch = int( main.params[ 'TEST' ][ 'numSwitch' ] )
nThread = main.params[ 'TEST' ][ 'numMult' ]
main.log.report( "Batch intent installation test of " +
batchIntentSize + " intents" )
batchResultList = []
time.sleep( 10 )
main.log.info( "Getting list of available devices" )
deviceIdList = []
jsonStr = main.ONOS1cli.devices()
jsonObj = json.loads( jsonStr )
for device in jsonObj:
deviceIdList.append( device[ 'id' ] )
batchInstallLat = []
batchWithdrawLat = []
sleepTime = 10
baseDir = "/tmp/"
maxInstallLat = []
for i in range( 0, int( numIter ) ):
main.log.info( "Pushing " +
str( int( batchIntentSize ) * int( nThread ) ) +
" intents. Iteration " + str( i ) )
main.ONOSbench.pushTestIntentsShell(
deviceIdList[ 0 ] + "/2",
deviceIdList[ 7 ] + "/2",
batchIntentSize, "/tmp/batch_install.txt",
ONOSIpList[ 0 ], numMult="1", appId="1",
report=False, options="--install" )
# main.ONOSbench.pushTestIntentsShell(
# "of:0000000000001002/1",
# "of:0000000000002002/1",
# 133, "/tmp/temp2.txt", "10.128.174.2",
# numMult="6", appId="2",report=False )
# TODO: Check for installation success then proceed
time.sleep( 30 )
# NOTE: this interface is specific to
# topo-intentFlower.py topology
# reroute case.
main.log.info( "Disabling interface " + intfs )
main.Mininet1.handle.sendline(
"sh ifconfig " + intfs + " down" )
t0System = time.time() * 1000
# TODO: Wait sufficient time for intents to install
time.sleep( 10 )
# TODO: get intent installation time
# Obtain metrics from ONOS 1, 2, 3
intentsJsonStr1 = main.ONOS1cli.intentsEventsMetrics()
intentsJsonObj1 = json.loads( intentsJsonStr1 )
# Parse values from the json object
intentInstall1 = \
intentsJsonObj1[ installTime ][ 'value' ]
intentRerouteLat1 = \
int( intentInstall1 ) - int( t0System )
if clusterCount == 3:
intentsJsonStr2 =\
main.ONOS2cli.intentsEventsMetrics()
intentsJsonStr3 =\
main.ONOS3cli.intentsEventsMetrics()
intentsJsonObj2 = json.loads( intentsJsonStr2 )
intentsJsonObj3 = json.loads( intentsJsonStr3 )
intentInstall2 = \
intentsJsonObj2[ installTime ][ 'value' ]
intentInstall3 = \
intentsJsonObj3[ installTime ][ 'value' ]
intentRerouteLat2 = \
int( intentInstall2 ) - int( t0System )
intentRerouteLat3 = \
int( intentInstall3 ) - int( t0System )
else:
intentRerouteLat2 = 0
intentRerouteLat3 = 0
if clusterCount == 5:
intentsJsonStr4 =\
main.ONOS4cli.intentsEventsMetrics()
intentsJsonStr5 =\
main.ONOS5cli.intentsEventsMetrics()
intentsJsonObj4 = json.loads( intentsJsonStr4 )
intentsJsonObj5 = json.loads( intentsJsonStr5 )
intentInstall4 = \
intentsJsonObj4[ installTime ][ 'value' ]
intentInstall5 = \
intentsJsonObj5[ installTime ][ 'value' ]
intentRerouteLat4 = \
int( intentInstall4 ) - int( t0System )
intentRerouteLat5 = \
int( intentInstall5 ) - int( t0System )
else:
intentRerouteLat4 = 0
intentRerouteLat5 = 0
if clusterCount == 7:
intentsJsonStr6 =\
main.ONOS6cli.intentsEventsMetrics()
intentsJsonStr7 =\
main.ONOS7cli.intentsEventsMetrics()
intentsJsonObj6 = json.loads( intentsJsonStr6 )
intentsJsonObj7 = json.loads( intentsJsonStr7 )
intentInstall6 = \
intentsJsonObj6[ installTime ][ 'value' ]
intentInstall7 = \
intentsJsonObj7[ installTime ][ 'value' ]
intentRerouteLat6 = \
int( intentInstall6 ) - int( t0System )
intentRerouteLat7 = \
int( intentInstall7 ) - int( t0System )
else:
intentRerouteLat6 = 0
intentRerouteLat7 = 0
intentRerouteLatAvg = \
( intentRerouteLat1 +
intentRerouteLat2 +
intentRerouteLat3 +
intentRerouteLat4 +
intentRerouteLat5 +
intentRerouteLat6 +
intentRerouteLat7 ) / clusterCount
main.log.info( "Intent reroute latency avg for iteration " +
str( i ) + ": " + str( intentRerouteLatAvg ) )
# TODO: Remove intents for next iteration
time.sleep( 5 )
intentsStr = main.ONOS1cli.intents()
intentsJson = json.loads( intentsStr )
for intents in intentsJson:
intentId = intents[ 'id' ]
# TODO: make sure this removes all intents
# print intentId
if intentId:
main.ONOS1cli.removeIntent( intentId )
main.Mininet1.handle.sendline(
"sh ifconfig " + intfs + " up" )
main.log.info( "Intents removed and port back up" )
def CASE9( self, main ):
count = 0
swNum1 = 1
swNum2 = 1
appid = 0
portNum1 = 1
portNum2 = 1
time.sleep( 30 )
while True:
# main.ONOS1cli.pushTestIntents(
#"of:0000000000001001/1",
#"of:0000000000002001/1",
# 100, numMult="10", appId="1" )
# main.ONOS2cli.pushTestIntents(
# "of:0000000000001002/1",
# "of:0000000000002002/1",
# 100, numMult="10", appId="2" )
# main.ONOS2cli.pushTestIntents(
# "of:0000000000001003/1",
# "of:0000000000002003/1",
# 100, numMult="10", appId="3" )
count += 1
if count >= 100:
main.ONOSbench.handle.sendline(
"onos 10.128.174.1 intents-events-metrics >>" +
" /tmp/metrics_intents_temp.txt &" )
count = 0
arg1 = "of:000000000000100" + str( swNum1 ) + "/" + str( portNum1 )
arg2 = "of:000000000000200" + str( swNum2 ) + "/" + str( portNum2 )
swNum1 += 1
if swNum1 > 7:
swNum1 = 1
swNum2 += 1
if swNum2 > 7:
appid += 1
if swNum2 > 7:
swNum2 = 1
main.ONOSbench.pushTestIntentsShell(
arg1,
arg2,
100, "/tmp/temp.txt", "10.128.174.1",
numMult="10", appId=appid, report=False )
# main.ONOSbench.pushTestIntentsShell(
# "of:0000000000001002/1",
# "of:0000000000002002/1",
# 133, "/tmp/temp2.txt", "10.128.174.2",
# numMult="6", appId="2",report=False )
# main.ONOSbench.pushTestIntentsShell(
# "of:0000000000001003/1",
# "of:0000000000002003/1",
# 133, "/tmp/temp3.txt", "10.128.174.3",
# numMult="6", appId="3",report=False )
time.sleep( 0.2 )