[ONOS-6153] Refactor intent reroute test
Change-Id: I5c7d95529a535ac6d151f04fcc04d966eeaaeb3d
diff --git a/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py b/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
index 24cf32b..1f830ad 100644
--- a/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
+++ b/TestON/tests/SCPF/SCPFintentRerouteLat/dependencies/intentRerouteLatFuncs.py
@@ -4,20 +4,40 @@
'''
import numpy
import time
+import json
def _init_( self ):
self.default = ''
-def checkLog( main, nodeId ):
- try:
- logNames = main.ONOSbench.listLog( main.onosIp[ nodeId ] )
- assert logNames is not None
- if len( logNames ) >= 2:
- return 2
- return 1
- except AssertionError:
- main.log.error("There is no karaf log")
- return -1
+def sanityCheck( main, linkNumExpected, flowNumExpected, intentNumExpected ):
+ '''
+ Sanity check on numbers of links, flows and intents in ONOS
+ '''
+ attemps = 0
+ main.verify = main.FALSE
+ linkNum = 0
+ flowNum = 0
+ intentNum = 0
+ while attemps <= main.verifyAttempts:
+ time.sleep(main.verifySleep)
+ summary = json.loads( main.CLIs[0].summary( timeout=main.timeout ) )
+ linkNum = summary.get("links")
+ flowNum = summary.get("flows")
+ intentNum = summary.get("intents")
+ if linkNum == linkNumExpected and flowNum == flowNumExpected and intentNum == intentNumExpected:
+ main.log.info("links: {}, flows: {}, intents: {}".format(linkNum, flowNum, intentNum))
+ main.verify = main.TRUE
+ break
+ attemps += 1
+ if not main.verify:
+ main.log.warn("Links or flows or intents number not as expected")
+ main.log.warn("links: {}, flows: {}, intents: {}".format(linkNum, flowNum, intentNum))
+ # bring back topology
+ bringBackTopology( main )
+ if main.validRun >= main.warmUp:
+ main.invalidRun += 1
+ else:
+ main.validRun += 1
def bringBackTopology( main ):
main.log.info( "Bring back topology " )
@@ -35,75 +55,86 @@
main.CLIs[ 0 ].deviceRole(main.end2[ 'name' ], main.ONOSip[ 0 ])
time.sleep( main.setMasterSleep )
-def getValues( main ):
+def getLogNum( main, nodeId ):
'''
- Calculated the wanted values for intentRerouteTest
-
- 1. Get the first "last topology timestamp" from karaf.log in different node
- 2. Get the first "first intent installed timestamp" from karaf log in different node
- 3. Get the last "last intent installed timestamp" from karaf log in different node
-
- Return:
- last_topology_to_first_installed: The time from the last topology to the first intent installed
- first_installed_to_last_installed: Time time from the first topology to the last intent installed
- totalTime: The time from the last topology to the last intent installed
-
+ Return the number of karaf log files
'''
- lastTopologyTimestamp = compareTimestamp( main, main.searchTerm[ "TopologyTime" ], "creationTime=", ",", 'last',func='min' )
- firstIntentInstalledTimestamp = compareTimestamp( main, main.searchTerm[ "InstallTime" ], "time = ", " ", 'first',func='min' )
- lastIntentInstalledTimestamp = compareTimestamp( main, main.searchTerm[ "InstallTime" ], "time = ", " ", 'last',func='max' )
-
- if lastTopologyTimestamp == -1 or firstIntentInstalledTimestamp == -1 or lastIntentInstalledTimestamp == -1:
- main.log.warn( "Can't get timestamp from karaf log! " )
- bringBackTopology( main )
- return -1, -1, -1
-
- #calculate values
- lastTopologyToFirstInstalled = firstIntentInstalledTimestamp - lastTopologyTimestamp
- if lastTopologyToFirstInstalled < 0:
- main.record = main.record + 1
-
- firstInstalledToLastInstalled = lastIntentInstalledTimestamp - firstIntentInstalledTimestamp
- totalTime = lastIntentInstalledTimestamp - lastTopologyTimestamp
-
- if main.validRun >= main.warmUp and main.verify:
- main.log.info( "Last topology time stamp: {0:f}".format( lastTopologyTimestamp ))
- main.log.info( "First installed time stamp: {0:f}".format( firstIntentInstalledTimestamp ))
- main.log.info( "Last installed time stamp: {0:f}".format( lastIntentInstalledTimestamp ))
- main.log.info( "Last topology to first installed latency:{0:f}".format( lastTopologyToFirstInstalled ))
- main.log.info( "First installed to last installed latency:{0:f}".format( firstInstalledToLastInstalled ))
- main.log.info( "Overall latency:{0:f}".format( totalTime ))
- main.LatencyList.append( totalTime )
- main.LatencyListTopoToFirstInstalled.append( lastTopologyToFirstInstalled )
- main.LatencyListFirstInstalledToLastInstalled.append( firstInstalledToLastInstalled )
- return lastTopologyToFirstInstalled, firstInstalledToLastInstalled, totalTime
-
-def compareTimestamp( main, compareTerm, splitTerm_before, splitTerm_after, mode, func='max' ):
- '''
- Compare all the timestamps of compareTerm from different node.
-
- func:
- max: Compare which one is the biggest and retun it
- min: Compare which one is the smallest and return it
-
- return:
- This function will return the biggest or smallest timestamps of the compareTerm.
-
- '''
- compareTermList = []
- for i in range( main.numCtrls ):
- timestamp = main.CLIs[ i ].getTimeStampFromLog( mode, compareTerm, splitTerm_before, splitTerm_after, startLine=main.totalLines[ i ], logNum=checkLog( main, i ) )
- compareTermList.append( timestamp )
- main.log.info("-----------------------------------------------")
- for i in range( main.numCtrls ):
- main.log.info( "ONOS Node {} {} {} time stamp: {}".format((i+1), mode, compareTerm, compareTermList[ i ]))
- x = min( compareTermList )
- main.log.info("-----------------------------------------------")
- if x == -1:
- main.log.warn( "Can't compare timestamps" )
+ try:
+ logNameList = main.ONOSbench.listLog( main.onosIp[ nodeId ] )
+ assert logNameList is not None
+ # FIXME: are two karaf logs enough to cover the events we want?
+ if len( logNameList ) >= 2:
+ return 2
+ return 1
+ except AssertionError:
+ main.log.error("There is no karaf log")
return -1
- else:
- if func == 'max':
- return max( compareTermList )
- if func == 'min':
- return min( compareTermList )
+
+def getTopologyTimestamps( main ):
+ '''
+ Get timestamps for the last topology events on all cluster nodes
+ '''
+ timestamps = []
+ for i in range( main.numCtrls ):
+ # Search for last topology event in karaf log
+ lines = main.CLIs[ i ].logSearch( mode='last', searchTerm=main.searchTerm[ "TopologyTime" ], startLine=main.startLine[ i ], logNum=getLogNum( main, i ) )
+ if lines is None or len( lines ) != 1:
+ main.log.error( "Error when trying to get topology event timestamp" )
+ return main.ERROR
+ try:
+ timestampField = lines[0].split( "creationTime=" )
+ timestamp = timestampField[ 1 ].split( "," )
+ timestamp = int( timestamp[ 0 ] )
+ timestamps.append( timestamp )
+ except KeyError:
+ main.log.error( "Error when trying to get intent key or timestamp" )
+ return main.ERROR
+ return timestamps
+
+def getIntentTimestamps( main ):
+ '''
+ Get timestamps for all intent keys on all cluster nodes
+ '''
+ timestamps = {}
+ for i in range( main.numCtrls ):
+ # Search for intent INSTALLED event in karaf log
+ lines = main.CLIs[ i ].logSearch( mode='all', searchTerm=main.searchTerm[ "InstallTime" ], startLine=main.startLine[ i ], logNum=getLogNum( main, i ) )
+ if lines is None or len( lines ) == 0:
+ main.log.error( "Error when trying to get intent key or timestamp" )
+ return main.ERROR
+ for line in lines:
+ try:
+ # Get intent key
+ keyField = line.split( "key=" )
+ key = keyField[ 1 ].split( "," )
+ key = key[ 0 ]
+ if not key in timestamps.keys():
+ timestamps[ key ] = []
+ # Get timestamp
+ timestampField = line.split( "time = " )
+ timestamp = timestampField[ 1 ].split( " " )
+ timestamp = int( timestamp[ 0 ] )
+ timestamps[ key ].append( timestamp )
+ except KeyError:
+ main.log.error( "Error when trying to get intent key or timestamp" )
+ return main.ERROR
+ return timestamps
+
+def calculateLatency( main, topologyTimestamps, intentTimestamps ):
+ '''
+ Calculate reroute latency values using timestamps
+ '''
+ topologyTimestamp = numpy.min( topologyTimestamps )
+ firstInstalledLatency = {}
+ lastInstalledLatency = {}
+ for key in intentTimestamps.keys():
+ firstInstalledTimestamp = numpy.min( intentTimestamps[ key ] )
+ lastInstalledTimestamp = numpy.max( intentTimestamps[ key ] )
+ firstInstalledLatency[ key ] = firstInstalledTimestamp - topologyTimestamp
+ lastInstalledLatency[ key ] = lastInstalledTimestamp - topologyTimestamp
+ firstLocalLatnecy = numpy.min( firstInstalledLatency.values() )
+ lastLocalLatnecy = numpy.max( firstInstalledLatency.values() )
+ firstGlobalLatency = numpy.min( lastInstalledLatency.values() )
+ lastGlobalLatnecy = numpy.max( lastInstalledLatency.values() )
+ main.log.info( "firstLocalLatnecy: {}, lastLocalLatnecy: {}, firstGlobalLatency: {}, lastGlobalLatnecy: {}".format( firstLocalLatnecy, lastLocalLatnecy, firstGlobalLatency, lastGlobalLatnecy ) )
+ return firstLocalLatnecy, lastLocalLatnecy, firstGlobalLatency, lastGlobalLatnecy