blob: a458dec2f0bcc422ce325866ddcc00b624d4eb0d [file] [log] [blame]
# Testing the basic functionality of ONOS Next
# For sanity and driver functionality excercises only.
import time
import sys
import os
import re
import time
import json
time.sleep( 1 )
class MultiProd13:
def __init__( self ):
self.default = ''
def CASE1( self, main ):
"""
Startup sequence:
cell <name>
onos-verify-cell
onos-remove-raft-logs
git pull
mvn clean install
onos-package
onos-install -f
onos-wait-for-start
"""
cellName = main.params[ 'ENV' ][ 'cellName' ]
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
gitPull = main.params[ 'GIT' ][ 'pull' ]
main.case( "Setting up test environment" )
main.log.report(
"This testcase is testing setting up test environment" )
main.log.report( "__________________________________" )
main.step( "Applying cell variable to environment" )
cellResult1 = main.ONOSbench.setCell( cellName )
# cellResult2 = main.ONOScli1.setCell( cellName )
# cellResult3 = main.ONOScli2.setCell( cellName )
# cellResult4 = main.ONOScli3.setCell( cellName )
verifyResult = main.ONOSbench.verifyCell()
cellResult = cellResult1
main.step( "Removing raft logs before a clen installation of ONOS" )
removeLogResult = main.ONOSbench.onosRemoveRaftLogs()
main.step( "Git checkout and get version" )
main.ONOSbench.gitCheckout( "master" )
if gitPull == 'True':
gitPullResult = main.ONOSbench.gitPull()
if gitPullResult == 1:
main.step( "Using mvn clean & install" )
main.ONOSbench.cleanInstall()
main.step( "Creating ONOS package" )
packageResult = main.ONOSbench.onosPackage()
elif gitPullResult == 0:
main.log.report(
"Git Pull Failed, look into logs for detailed reason" )
main.cleanup()
main.exit()
main.log.info( "git_pull_result = " + str( gitPullResult ))
else:
main.log.info( "Skipping git pull" )
main.ONOSbench.getVersion( report=True )
packageResult = main.TRUE
# main.step( "Creating a cell" )
# cellCreateResult = main.ONOSbench.createCellFile( **************
# )
main.step( "Installing ONOS package" )
onos1InstallResult = main.ONOSbench.onosInstall(
options="-f",
node=ONOS1Ip )
onos2InstallResult = main.ONOSbench.onosInstall(
options="-f",
node=ONOS2Ip )
onos3InstallResult = main.ONOSbench.onosInstall(
options="-f",
node=ONOS3Ip )
onosInstallResult = onos1InstallResult and onos2InstallResult and\
onos3InstallResult
if onosInstallResult == main.TRUE:
main.log.report( "Installing ONOS package successful" )
else:
main.log.report( "Installing ONOS package failed" )
onos1Isup = main.ONOSbench.isup( ONOS1Ip )
onos2Isup = main.ONOSbench.isup( ONOS2Ip )
onos3Isup = main.ONOSbench.isup( ONOS3Ip )
onosIsup = onos1Isup and onos2Isup and onos3Isup
if onosIsup == main.TRUE:
main.log.report( "ONOS instances are up and ready" )
else:
main.log.report( "ONOS instances may not be up" )
main.step( "Starting ONOS service" )
startResult = main.TRUE
# startResult = main.ONOSbench.onosStart( ONOS1Ip )
startcli1 = main.ONOScli1.startOnosCli( ONOSIp=ONOS1Ip )
startcli2 = main.ONOScli2.startOnosCli( ONOSIp=ONOS2Ip )
startcli3 = main.ONOScli3.startOnosCli( ONOSIp=ONOS3Ip )
print startcli1
print startcli2
print startcli3
# Starting the mininet using the old way
main.step( "Starting Mininet ..." )
netIsUp = main.Mininet1.startNet()
if netIsUp:
main.log.info("Mininet CLI is up")
case1Result = ( packageResult and
cellResult and verifyResult and onosInstallResult and
onosIsup and startResult )
utilities.assertEquals( expect=main.TRUE, actual=case1Result,
onpass="Test startup successful",
onfail="Test startup NOT successful" )
def CASE11( self, main ):
"""
Cleanup sequence:
onos-service <nodeIp> stop
onos-uninstall
TODO: Define rest of cleanup
"""
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
main.case( "Cleaning up test environment" )
main.step( "Testing ONOS kill function" )
killResult1 = main.ONOSbench.onosKill( ONOS1Ip )
killResult2 = main.ONOSbench.onosKill( ONOS2Ip )
killResult3 = main.ONOSbench.onosKill( ONOS3Ip )
main.step( "Stopping ONOS service" )
stopResult1 = main.ONOSbench.onosStop( ONOS1Ip )
stopResult2 = main.ONOSbench.onosStop( ONOS2Ip )
stopResult3 = main.ONOSbench.onosStop( ONOS3Ip )
main.step( "Uninstalling ONOS service" )
uninstallResult = main.ONOSbench.onosUninstall()
def CASE3( self, main ):
"""
Test 'onos' command and its functionality in driver
"""
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
main.case( "Testing 'onos' command" )
main.step( "Sending command 'onos -w <onos-ip> system:name'" )
cmdstr1 = "system:name"
cmdResult1 = main.ONOSbench.onosCli( ONOS1Ip, cmdstr1 )
main.log.info( "onos command returned: " + cmdResult1 )
cmdResult2 = main.ONOSbench.onosCli( ONOS2Ip, cmdstr1 )
main.log.info( "onos command returned: " + cmdResult2 )
cmdResult3 = main.ONOSbench.onosCli( ONOS3Ip, cmdstr1 )
main.log.info( "onos command returned: " + cmdResult3 )
main.step( "Sending command 'onos -w <onos-ip> onos:topology'" )
cmdstr2 = "onos:topology"
cmdResult4 = main.ONOSbench.onosCli( ONOS1Ip, cmdstr2 )
main.log.info( "onos command returned: " + cmdResult4 )
cmdResult5 = main.ONOSbench.onosCli( ONOS2Ip, cmdstr2 )
main.log.info( "onos command returned: " + cmdResult5 )
cmdResult6 = main.ONOSbench.onosCli( ONOS6Ip, cmdstr2 )
main.log.info( "onos command returned: " + cmdResult6 )
def CASE4( self, main ):
import re
import time
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
main.log.report(
"This testcase is testing the assignment of all the switches" +
" to all controllers and discovering the hosts in reactive mode" )
main.log.report( "__________________________________" )
main.case( "Pingall Test(No intents are added)" )
main.step( "Assigning switches to controllers" )
for i in range( 1, 29 ): # 1 to ( num of switches +1 )
main.Mininet1.assignSwController(
sw=str( i ),
count=3,
ip1=ONOS1Ip,
port1=ONOS1Port,
ip2=ONOS2Ip,
port2=ONOS2Port,
ip3=ONOS3Ip,
port3=ONOS3Port )
switchMastership = main.TRUE
for i in range( 1, 29 ):
response = main.Mininet1.getSwController( "s" + str( i ) )
print( "Response is " + str( response ) )
if re.search( "tcp:" + ONOS1Ip, response ):
switchMastership = switchMastership and main.TRUE
else:
switchMastership = main.FALSE
if switchMastership == main.TRUE:
main.log.report( "Controller assignment successfull" )
else:
main.log.report( "Controller assignment failed" )
appInstallResult = main.TRUE
main.log.info( "Activating reactive forwarding app" )
appInstallResult = main.ONOScli1.activateApp( "org.onosproject.fwd" )
appCheck = main.ONOScli1.appToIDCheck()
if appCheck != main.TRUE:
main.log.warn( main.ONOScli1.apps() )
main.log.warn( main.ONOScli1.appIDs() )
time.sleep( 30 )
# REACTIVE FWD test
main.step( "Pingall" )
pingResult = main.FALSE
time1 = time.time()
pingResult = main.Mininet1.pingall()
time2 = time.time()
print "Time for pingall: %2f seconds" % ( time2 - time1 )
case4Result = switchMastership and pingResult
if pingResult == main.TRUE:
main.log.report(
"Pingall Test in reactive mode to" +
" discover the hosts successful" )
else:
main.log.report(
"Pingall Test in reactive mode to discover the hosts failed" )
utilities.assertEquals(
expect=main.TRUE,
actual=case4Result,
onpass="Controller assignment and Pingall Test successful",
onfail="Controller assignment and Pingall Test NOT successful" )
def CASE5( self, main ):
import json
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
main.log.report(
"This testcase is testing if all ONOS nodes are in topology" +
" sync with mininet and its peer ONOS nodes" )
main.log.report( "__________________________________" )
main.case(
"Testing Mininet topology with the" +
" topology of multi instances ONOS" )
main.step( "Collecting topology information from ONOS" )
devices1 = main.ONOScli1.devices()
devices2 = main.ONOScli2.devices()
devices3 = main.ONOScli3.devices()
# print "devices1 = ", devices1
# print "devices2 = ", devices2
# print "devices3 = ", devices3
hosts1 = main.ONOScli1.hosts()
hosts2 = main.ONOScli2.hosts()
hosts3 = main.ONOScli3.hosts()
# print "hosts1 = ", hosts1
# print "hosts2 = ", hosts2
# print "hosts3 = ", hosts3
ports1 = main.ONOScli1.ports()
ports2 = main.ONOScli2.ports()
ports3 = main.ONOScli3.ports()
# print "ports1 = ", ports1
# print "ports2 = ", ports2
# print "ports3 = ", ports3
links1 = main.ONOScli1.links()
links2 = main.ONOScli2.links()
links3 = main.ONOScli3.links()
# print "links1 = ", links1
# print "links2 = ", links2
# print "links3 = ", links3
print "**************"
main.step( "Start continuous pings" )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source1' ],
target=main.params[ 'PING' ][ 'target1' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source2' ],
target=main.params[ 'PING' ][ 'target2' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source3' ],
target=main.params[ 'PING' ][ 'target3' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source4' ],
target=main.params[ 'PING' ][ 'target4' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source5' ],
target=main.params[ 'PING' ][ 'target5' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source6' ],
target=main.params[ 'PING' ][ 'target6' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source7' ],
target=main.params[ 'PING' ][ 'target7' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source8' ],
target=main.params[ 'PING' ][ 'target8' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source9' ],
target=main.params[ 'PING' ][ 'target9' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source10' ],
target=main.params[ 'PING' ][ 'target10' ],
pingTime=500 )
main.step( "Compare ONOS Topology to MN Topology" )
mnSwitches = main.Mininet1.getSwitches()
mnLinks = main.Mininet1.getLinks()
switchesResults1 = main.Mininet1.compareSwitches(
mnSwitches, json.loads( devices1 ), json.loads( ports1 ) )
print "switches_Result1 = ", switchesResults1
utilities.assertEquals( expect=main.TRUE, actual=switchesResults1,
onpass="ONOS1 Switches view is correct",
onfail="ONOS1 Switches view is incorrect" )
switchesResults2 = main.Mininet1.compareSwitches(
mnSwitches, json.loads( devices2 ), json.loads( ports2 ) )
utilities.assertEquals( expect=main.TRUE, actual=switchesResults2,
onpass="ONOS2 Switches view is correct",
onfail="ONOS2 Switches view is incorrect" )
switchesResults3 = main.Mininet1.compareSwitches(
mnSwitches, json.loads( devices3 ), json.loads( ports3 ) )
utilities.assertEquals( expect=main.TRUE, actual=switchesResults3,
onpass="ONOS3 Switches view is correct",
onfail="ONOS3 Switches view is incorrect" )
linksResults1 = main.Mininet1.compareLinks(
mnSwitches, mnLinks, json.loads( links1 ) )
utilities.assertEquals( expect=main.TRUE, actual=linksResults1,
onpass="ONOS1 Links view is correct",
onfail="ONOS1 Links view is incorrect" )
linksResults2 = main.Mininet1.compareLinks(
mnSwitches, mnLinks, json.loads( links2 ) )
utilities.assertEquals( expect=main.TRUE, actual=linksResults2,
onpass="ONOS2 Links view is correct",
onfail="ONOS2 Links view is incorrect" )
linksResults3 = main.Mininet1.compareLinks(
mnSwitches, mnLinks, json.loads( links3 ) )
utilities.assertEquals( expect=main.TRUE, actual=linksResults3,
onpass="ONOS2 Links view is correct",
onfail="ONOS2 Links view is incorrect" )
topoResult = switchesResults1 and switchesResults2 and\
switchesResults3 and linksResults1 and linksResults2 and\
linksResults3
if topoResult == main.TRUE:
main.log.report(
"Topology Check Test with mininet" +
"and ONOS instances successful" )
else:
main.log.report(
"Topology Check Test with mininet and ONOS instances failed" )
utilities.assertEquals( expect=main.TRUE, actual=topoResult,
onpass="Topology Check Test successful",
onfail="Topology Check Test NOT successful" )
def CASE10( self ):
import time
main.log.report(
"This testcase uninstalls the reactive forwarding app" )
main.log.report( "__________________________________" )
main.case( "Uninstalling reactive forwarding app" )
# Unistall onos-app-fwd app to disable reactive forwarding
appInstallResult = main.ONOScli1.deactivateApp( "org.onosproject.fwd" )
appCheck = main.ONOScli1.appToIDCheck()
if appCheck != main.TRUE:
main.log.warn( main.ONOScli1.apps() )
main.log.warn( main.ONOScli1.appIDs() )
main.log.info( "onos-app-fwd uninstalled" )
# After reactive forwarding is disabled,
# the reactive flows on switches timeout in 10-15s
# So sleep for 15s
time.sleep( 15 )
hosts = main.ONOScli1.hosts()
main.log.info( hosts )
case10Result = appInstallResult
utilities.assertEquals(
expect=main.TRUE,
actual=case10Result,
onpass="Reactive forwarding app uninstallation successful",
onfail="Reactive forwarding app uninstallation failed" )
def CASE6( self ):
main.log.report(
"This testcase is testing the addition of" +
" host intents and then doing pingall" )
main.log.report( "__________________________________" )
main.case( "Obtaining hostsfor adding host intents" )
main.step( "Get hosts" )
hosts = main.ONOScli1.hosts()
main.log.info( hosts )
main.step( "Get all devices id" )
devicesIdList = main.ONOScli1.getAllDevicesId()
main.log.info( devicesIdList )
# ONOS displays the hosts in hex format
# unlike mininet which does in decimal format
# So take care while adding intents
"""
main.step( "Add host intents for mn hosts(h8-h18,h9-h19,h10-h20,
h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:08/-1",
"00:00:00:00:00:12/-1" )
hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:09/-1",
"00:00:00:00:00:13/-1" )
hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0A/-1",
"00:00:00:00:00:14/-1" )
hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0B/-1",
"00:00:00:00:00:15/-1" )
hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0C/-1",
"00:00:00:00:00:16/-1" )
hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0D/-1",
"00:00:00:00:00:17/-1" )
hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0E/-1",
"00:00:00:00:00:18/-1" )
hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:0F/-1",
"00:00:00:00:00:19/-1" )
hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:10/-1",
"00:00:00:00:00:1A/-1" )
hthIntentResult = main.ONOScli1.addHostIntent( "00:00:00:00:00:11/-1",
"00:00:00:00:00:1B/-1" )
"""
intentsId = []
for i in range( 8, 18 ):
main.log.info(
"Adding host intent between h" + str( i ) +
" and h" + str( i + 10 ) )
host1 = "00:00:00:00:00:" + \
str( hex( i )[ 2: ] ).zfill( 2 ).upper()
host2 = "00:00:00:00:00:" + \
str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
# NOTE: get host can return None
# TODO: handle this
host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
host2Id = main.ONOScli1.getHost( host2 )[ 'id' ]
tmpResult = main.ONOScli1.addHostIntent( host1Id, host2Id )
intentsId.append( tmpResult )
checkIntent1 = main.ONOScli1.checkIntentState( intentsId )
checkIntent2 = main.ONOScli2.checkIntentState( intentsId )
checkIntent3 = main.ONOScli3.checkIntentState( intentsId )
flowHandle = main.ONOScli1.flows()
main.log.info( "flows:" + flowHandle )
count = 1
i = 8
PingResult = main.TRUE
while i < 18:
main.log.info(
"\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
ping = main.Mininet1.pingHost(
src="h" + str( i ), target="h" + str( i + 10 ) )
if ping == main.FALSE and count < 5:
count += 1
# i = 8
PingResult = main.FALSE
main.log.report( "Ping between h" +
str( i ) +
" and h" +
str( i +
10 ) +
" failed. Making attempt number " +
str( count ) +
" in 2 seconds" )
time.sleep( 2 )
elif ping == main.FALSE:
main.log.report( "All ping attempts between h" +
str( i ) +
" and h" +
str( i +
10 ) +
"have failed" )
i = 19
PingResult = main.FALSE
elif ping == main.TRUE:
main.log.info( "Ping test between h" +
str( i ) +
" and h" +
str( i +
10 ) +
"passed!" )
i += 1
PingResult = main.TRUE
else:
main.log.info( "Unknown error" )
PingResult = main.ERROR
if PingResult == main.FALSE:
main.log.report(
"Host intents have not ben installed correctly. Cleaning up" )
# main.cleanup()
# main.exit()
if PingResult == main.TRUE:
main.log.report( "Host intents have been installed correctly" )
checkIntent1 = main.ONOScli1.checkIntentState( intentsId )
checkIntent2 = main.ONOScli2.checkIntentState( intentsId )
checkIntent3 = main.ONOScli3.checkIntentState( intentsId )
case6Result = PingResult
utilities.assertEquals(
expect=main.TRUE,
actual=case6Result,
onpass="Host intent addition and Pingall Test successful",
onfail="Host intent addition and Pingall Test NOT successful" )
def CASE7( self, main ):
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
linkSleep = int( main.params[ 'timers' ][ 'LinkDiscovery' ] )
main.log.report(
"This testscase is killing a link to" +
" ensure that link discovery is consistent" )
main.log.report( "__________________________________" )
main.case(
"Killing a link to Ensure that Link" +
" Discovery is Working Properly" )
main.step( "Start continuous pings" )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source1' ],
target=main.params[ 'PING' ][ 'target1' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source2' ],
target=main.params[ 'PING' ][ 'target2' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source3' ],
target=main.params[ 'PING' ][ 'target3' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source4' ],
target=main.params[ 'PING' ][ 'target4' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source5' ],
target=main.params[ 'PING' ][ 'target5' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source6' ],
target=main.params[ 'PING' ][ 'target6' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source7' ],
target=main.params[ 'PING' ][ 'target7' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source8' ],
target=main.params[ 'PING' ][ 'target8' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source9' ],
target=main.params[ 'PING' ][ 'target9' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source10' ],
target=main.params[ 'PING' ][ 'target10' ],
pingTime=500 )
main.step( "Determine the current number of switches and links" )
topologyOutput = main.ONOScli1.topology()
topologyResult = main.ONOSbench.getTopology( topologyOutput )
activeSwitches = topologyResult[ 'devices' ]
links = topologyResult[ 'links' ]
main.log.info(
"Currently there are %s switches and %s links" %
( str( activeSwitches ), str( links ) ) )
main.step( "Kill Link between s3 and s28" )
main.Mininet1.link( END1="s3", END2="s28", OPTION="down" )
time.sleep( linkSleep )
topologyOutput = main.ONOScli2.topology()
LinkDown = main.ONOSbench.checkStatus(
topologyOutput, activeSwitches, str(
int( links ) - 2 ) )
if LinkDown == main.TRUE:
main.log.report( "Link Down discovered properly" )
utilities.assertEquals(
expect=main.TRUE,
actual=LinkDown,
onpass="Link Down discovered properly",
onfail="Link down was not discovered in " +
str( linkSleep ) +
" seconds" )
main.step( "Bring link between s3 and s28 back up" )
LinkUp = main.Mininet1.link( END1="s3", END2="s28", OPTION="up" )
time.sleep( linkSleep )
topologyOutput = main.ONOScli2.topology()
LinkUp = main.ONOSbench.checkStatus(
topologyOutput,
activeSwitches,
str( links ) )
if LinkUp == main.TRUE:
main.log.report( "Link up discovered properly" )
utilities.assertEquals(
expect=main.TRUE,
actual=LinkUp,
onpass="Link up discovered properly",
onfail="Link up was not discovered in " +
str( linkSleep ) +
" seconds" )
main.step( "Compare ONOS Topology to MN Topology" )
main.case(
"Testing Mininet topology with the" +
" topology of multi instances ONOS" )
main.step( "Collecting topology information from ONOS" )
devices1 = main.ONOScli1.devices()
devices2 = main.ONOScli2.devices()
devices3 = main.ONOScli3.devices()
print "devices1 = ", devices1
print "devices2 = ", devices2
print "devices3 = ", devices3
hosts1 = main.ONOScli1.hosts()
hosts2 = main.ONOScli2.hosts()
hosts3 = main.ONOScli3.hosts()
# print "hosts1 = ", hosts1
# print "hosts2 = ", hosts2
# print "hosts3 = ", hosts3
ports1 = main.ONOScli1.ports()
ports2 = main.ONOScli2.ports()
ports3 = main.ONOScli3.ports()
# print "ports1 = ", ports1
# print "ports2 = ", ports2
# print "ports3 = ", ports3
links1 = main.ONOScli1.links()
links2 = main.ONOScli2.links()
links3 = main.ONOScli3.links()
# print "links1 = ", links1
# print "links2 = ", links2
# print "links3 = ", links3
print "**************"
main.step( "Start continuous pings" )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source1' ],
target=main.params[ 'PING' ][ 'target1' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source2' ],
target=main.params[ 'PING' ][ 'target2' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source3' ],
target=main.params[ 'PING' ][ 'target3' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source4' ],
target=main.params[ 'PING' ][ 'target4' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source5' ],
target=main.params[ 'PING' ][ 'target5' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source6' ],
target=main.params[ 'PING' ][ 'target6' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source7' ],
target=main.params[ 'PING' ][ 'target7' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source8' ],
target=main.params[ 'PING' ][ 'target8' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source9' ],
target=main.params[ 'PING' ][ 'target9' ],
pingTime=500 )
main.Mininet2.pingLong(
src=main.params[ 'PING' ][ 'source10' ],
target=main.params[ 'PING' ][ 'target10' ],
pingTime=500 )
main.step( "Compare ONOS Topology to MN Topology" )
mnSwitches = main.Mininet1.getSwitches()
mnLinks = main.Mininet1.getLinks()
switchesResults1 = main.Mininet1.compareSwitches(
mnSwitches, json.loads( devices1 ), json.loads( ports1 ) )
print "switches_Result1 = ", switchesResults1
utilities.assertEquals( expect=main.TRUE, actual=switchesResults1,
onpass="ONOS1 Switches view is correct",
onfail="ONOS1 Switches view is incorrect" )
switchesResults2 = main.Mininet1.compareSwitches(
mnSwitches, json.loads( devices1 ), json.loads( ports1 ) )
utilities.assertEquals( expect=main.TRUE, actual=switchesResults2,
onpass="ONOS2 Switches view is correct",
onfail="ONOS2 Switches view is incorrect" )
switchesResults3 = main.Mininet1.compareSwitches(
mnSwitches, json.loads( devices1 ), json.loads( ports1 ) )
utilities.assertEquals( expect=main.TRUE, actual=switchesResults3,
onpass="ONOS3 Switches view is correct",
onfail="ONOS3 Switches view is incorrect" )
linksResults1 = main.Mininet1.compareLinks(
mnSwitches, mnLinks, json.loads( links1 ) )
utilities.assertEquals( expect=main.TRUE, actual=linksResults1,
onpass="ONOS1 Links view is correct",
onfail="ONOS1 Links view is incorrect" )
linksResults2 = main.Mininet1.compareLinks(
mnSwitches, mnLinks, json.loads( links2 ) )
utilities.assertEquals( expect=main.TRUE, actual=linksResults2,
onpass="ONOS2 Links view is correct",
onfail="ONOS2 Links view is incorrect" )
linksResults3 = main.Mininet1.compareLinks(
mnSwitches, mnLinks, json.loads( links3 ) )
utilities.assertEquals( expect=main.TRUE, actual=linksResults3,
onpass="ONOS2 Links view is correct",
onfail="ONOS2 Links view is incorrect" )
topoResult = switchesResults1 and switchesResults2\
and switchesResults3 and linksResults1 and\
linksResults2 and linksResults3
utilities.assertEquals(
expect=main.TRUE,
actual=topoResult and LinkUp and LinkDown,
onpass="Topology Check Test successful",
onfail="Topology Check Test NOT successful" )
def CASE8( self ):
"""
Intent removal
"""
main.log.report(
"This testcase removes any previously added intents" )
main.log.report( "__________________________________" )
main.log.info( "Removing any previously installed intents" )
main.case( "Removing intents" )
main.step( "Obtain the intent id's" )
intentResult = main.ONOScli1.intents( jsonFormat=False )
intentLinewise = intentResult.split( "\n" )
intentList = []
for line in intentLinewise:
if line.startswith( "id=" ):
intentList.append( line )
intentids = []
for line in intentList:
intentids.append( line.split( "," )[ 0 ].split( "=" )[ 1 ] )
for id in intentids:
main.log.info( "id = " + id )
main.step(
"Iterate through the intentids list and remove each intent" )
for id in intentids:
main.ONOScli1.removeIntent( intentId=id ,purge=True )
remainingIntent = main.ONOScli1.intents( jsonFormat=False )
main.log.info( "Remaining intents " + remainingIntent )
case8Result = main.TRUE
intentResult = main.TRUE
if remainingIntent:
main.log.error( "There are still remaining intent" )
intentResult = main.FALSE
i = 8
PingResult = main.TRUE
"""
while i < 18:
main.log.info(
"\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
ping = main.Mininet1.pingHost(
src="h" + str( i ), target="h" + str( i + 10 ) )
if ping == main.TRUE:
i = 19
PingResult = main.TRUE
elif ping == main.FALSE:
i += 1
PingResult = main.FALSE
else:
main.log.info( "Unknown error" )
PingResult = main.ERROR
# Note: If the ping result failed, that means the intents have been
# withdrawn correctly.
if PingResult == main.TRUE:
main.log.report( "Host intents have not been withdrawn correctly" )
# main.cleanup()
# main.exit()
if PingResult == main.FALSE:
main.log.report( "Host intents have been withdrawn correctly" )
"""
case8Result = intentResult
if case8Result == main.TRUE:
main.log.report( "Intent removal successful" )
else:
main.log.report( "Intent removal failed" )
utilities.assertEquals( expect=main.TRUE, actual=case8Result,
onpass="Intent removal test successful",
onfail="Intent removal test failed" )
def CASE9( self ):
"""
This test case adds point intents. Make sure you run test case 8
which is host intent removal before executing this test case.
Else the host intent's flows will persist on switches and the pings
would work even if there is some issue with the point intent's flows
"""
main.log.report(
"This testcase adds point intents and then does pingall" )
main.log.report( "__________________________________" )
main.log.info( "Adding point intents" )
main.case(
"Adding bidirectional point for mn hosts(h8-h18,h9-h19,h10-h20," +
"h11-h21,h12-h22,h13-h23,h14-h24,h15-h25,h16-h26,h17-h27)" )
main.step(
"Add point-to-point intents for mininet hosts" +
" h8 and h18 or ONOS hosts h8 and h12" )
macsDict = {}
for i in range( 1,29 ):
macsDict[ 'h' + str( i ) ]= main.Mininet1.getMacAddress( host='h'+ str( i ) )
print macsDict
# main.step(var1)
ptpIntentResult = main.ONOScli1.addPointIntent(
ingressDevice="of:0000000000003008/1",
egressDevice="of:0000000000006018/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h8' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
ptpIntentResult = main.ONOScli1.addPointIntent(
ingressDevice="of:0000000000006018/1",
egressDevice="of:0000000000003008/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h18' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
var2 = "Add point intents for mn hosts h9&h19 or ONOS hosts h9&h13"
main.step(var2)
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000003009/1",
"of:0000000000006019/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h9' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000006019/1",
"of:0000000000003009/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h19' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
var3 = "Add point intents for MN hosts h10&h20 or ONOS hosts hA&h14"
main.step(var3)
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000003010/1",
"of:0000000000006020/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h10' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000006020/1",
"of:0000000000003010/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h20' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
var4 = "Add point intents for mininet hosts h11 and h21 or" +\
" ONOS hosts hB and h15"
main.case(var4)
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000003011/1",
"of:0000000000006021/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h11' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000006021/1",
"of:0000000000003011/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h21' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
var5 = "Add point intents for mininet hosts h12 and h22 " +\
"ONOS hosts hC and h16"
main.case(var5)
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000003012/1",
"of:0000000000006022/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h12' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000006022/1",
"of:0000000000003012/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h22' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
var6 = "Add point intents for mininet hosts h13 and h23 or" +\
" ONOS hosts hD and h17"
main.case(var6)
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000003013/1",
"of:0000000000006023/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h13' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000006023/1",
"of:0000000000003013/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h23' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
var7 = "Add point intents for mininet hosts h14 and h24 or" +\
" ONOS hosts hE and h18"
main.case(var7)
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000003014/1",
"of:0000000000006024/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h14' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000006024/1",
"of:0000000000003014/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h24' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
var8 = "Add point intents for mininet hosts h15 and h25 or" +\
" ONOS hosts hF and h19"
main.case(var8)
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000003015/1",
"of:0000000000006025/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h15' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000006025/1",
"of:0000000000003015/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h25' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
var9 = "Add intents for mininet hosts h16 and h26 or" +\
" ONOS hosts h10 and h1A"
main.case(var9)
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000003016/1",
"of:0000000000006026/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h16' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000006026/1",
"of:0000000000003016/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h26' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
# main.log.info( getIntentResult )
var10 = "Add point intents for mininet hosts h17 and h27 or" +\
" ONOS hosts h11 and h1B"
main.case(var10)
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000003017/1",
"of:0000000000006027/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h17' ))
if ptpIntentResult == main.TRUE:
getIntentResult = main.ONOScli1.intents()
main.log.info( "Point to point intent install successful" )
#main.log.info( getIntentResult )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000000000006027/1",
"of:0000000000003017/1",
ethType='IPV4',
ethSrc=macsDict.get( 'h27' ))
print(
"_______________________________________________________" +
"________________________________" )
flowHandle = main.ONOScli1.flows()
print "flowHandle = ", flowHandle
main.log.info( "flows :" + flowHandle )
count = 1
i = 8
PingResult = main.TRUE
while i < 18:
main.log.info(
"\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
ping = main.Mininet1.pingHost(
src="h" + str( i ), target="h" + str( i + 10 ) )
if ping == main.FALSE and count < 5:
count += 1
# i = 8
PingResult = main.FALSE
main.log.report( "Ping between h" +
str( i ) +
" and h" +
str( i +
10 ) +
" failed. Making attempt number " +
str( count ) +
" in 2 seconds" )
time.sleep( 2 )
elif ping == main.FALSE:
main.log.report( "All ping attempts between h" +
str( i ) +
" and h" +
str( i +
10 ) +
"have failed" )
i = 19
PingResult = main.FALSE
elif ping == main.TRUE:
main.log.info( "Ping test between h" +
str( i ) +
" and h" +
str( i +
10 ) +
"passed!" )
i += 1
PingResult = main.TRUE
else:
main.log.info( "Unknown error" )
PingResult = main.ERROR
if PingResult == main.FALSE:
main.log.report(
"Ping all test after Point intents" +
" addition failed. Cleaning up" )
# main.cleanup()
# main.exit()
if PingResult == main.TRUE:
main.log.report(
"Ping all test after Point intents addition successful" )
case8Result = PingResult
utilities.assertEquals(
expect=main.TRUE,
actual=case8Result,
onpass="Ping all test after Point intents addition successful",
onfail="Ping all test after Point intents addition failed" )
def CASE31( self ):
"""
This test case adds point intent related to
SDN-IP matching on ICMP ( ethertype=IPV4, ipProto=1 )
"""
import json
main.log.report(
"This test case adds point intent " +
"related to SDN-IP matching on ICMP" )
main.case(
"Adding bidirectional point intent related" +
" to SDN-IP matching on ICMP" )
main.step( "Adding bidirectional point intent" )
# add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32
# --ethType=IPV4 --ipProto=1 of:0000000000003008/1
# of:0000000000006018/1
hostsJson = json.loads( main.ONOScli1.hosts() )
for i in range( 8, 11 ):
main.log.info(
"Adding point intent between h" + str( i ) +
" and h" + str( i + 10 ) )
host1 = "00:00:00:00:00:" + \
str( hex( i )[ 2: ] ).zfill( 2 ).upper()
host2 = "00:00:00:00:00:" + \
str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
host2Id = main.ONOScli1.getHost( host2 )[ 'id' ]
for host in hostsJson:
if host[ 'id' ] == host1Id:
ip1 = host[ 'ipAddresses' ][ 0 ]
ip1 = str( ip1 + "/32" )
device1 = host[ 'location' ][ 'elementId' ]
device1 = str( device1 + "/1" )
elif host[ 'id' ] == host2Id:
ip2 = str( host[ 'ipAddresses' ][ 0 ] ) + "/32"
device2 = host[ 'location' ][ 'elementId' ]
device2 = str( device2 + "/1" )
pIntentResult1 = main.ONOScli1.addPointIntent(
ingressDevice=device1,
egressDevice=device2,
ipSrc=ip1,
ipDst=ip2,
ethType=main.params[ 'SDNIP' ][ 'ethType' ],
ipProto=main.params[ 'SDNIP' ][ 'icmpProto' ], )
getIntentResult = main.ONOScli1.intents( jsonFormat=False )
main.log.info( getIntentResult )
pIntentResult2 = main.ONOScli1.addPointIntent(
ingressDevice=device2,
egressDevice=device1,
ipSrc=ip2,
ipDst=ip1,
ethType=main.params[ 'SDNIP' ][ 'ethType' ],
ipProto=main.params[ 'SDNIP' ][ 'icmpProto' ] )
getIntentResult = main.ONOScli1.intents( jsonFormat=False )
main.log.info( getIntentResult )
if ( pIntentResult1 and pIntentResult2 ) :
# getIntentResult = main.ONOScli1.intents()
# main.log.info( getIntentResult )
main.log.info(
"Point intent related to SDN-IP matching" +
" on ICMP install successful" )
time.sleep( 15 )
getIntentResult = main.ONOScli1.intents( jsonFormat=False )
main.log.info( "intents = " + getIntentResult )
getFlowsResult = main.ONOScli1.flows()
main.log.info( "flows = " + getFlowsResult )
count = 1
i = 8
PingResult = main.TRUE
while i < 11:
main.log.info(
"\n\nh" + str( i ) + " is Pinging h" + str( i + 10 ) )
ping = main.Mininet1.pingHost(
src="h" + str( i ), target="h" + str( i + 10 ) )
if ping == main.FALSE and count < 3:
count += 1
# i = 8
PingResult = main.FALSE
main.log.report( "Ping between h" +
str( i ) +
" and h" +
str( i +
10 ) +
" failed. Making attempt number " +
str( count ) +
" in 2 seconds" )
time.sleep( 2 )
elif ping == main.FALSE:
main.log.report( "All ping attempts between h" +
str( i ) +
" and h" +
str( i +
10 ) +
"have failed" )
i = 19
PingResult = main.FALSE
elif ping == main.TRUE:
main.log.info( "Ping test between h" +
str( i ) +
" and h" +
str( i +
10 ) +
"passed!" )
i += 1
PingResult = main.TRUE
else:
main.log.info( "Unknown error" )
PingResult = main.ERROR
if PingResult == main.FALSE:
main.log.report(
"Ping test after Point intents related to" +
" SDN-IP matching on ICMP failed." )
# main.cleanup()
# main.exit()
if PingResult == main.TRUE:
main.log.report(
"Ping all test after Point intents related to" +
" SDN-IP matching on ICMP successful" )
case31Result = PingResult
utilities.assertEquals(
expect=main.TRUE,
actual=case31Result,
onpass="Point intent related to SDN-IP " +
"matching on ICMP and ping test successful",
onfail="Point intent related to SDN-IP" +
" matching on ICMP and ping test failed" )
def CASE32( self ):
"""
This test case adds point intent related to SDN-IP matching on TCP
( ethertype=IPV4, ipProto=6, DefaultPort for iperf=5001 )
Note: Although BGP port is 179, we are using 5001 because iperf
is used for verifying and iperf's default port is 5001
"""
import json
main.log.report(
"This test case adds point intent" +
" related to SDN-IP matching on TCP" )
main.case(
"Adding bidirectional point intent related" +
" to SDN-IP matching on TCP" )
main.step( "Adding bidirectional point intent" )
"""
add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32
--ethType=IPV4 --ipProto=6 --tcpDst=5001 of:0000000000003008/1
of:0000000000006018/1
add-point-intent --ipSrc=10.0.0.18/32 --ipDst=10.0.0.8/32
--ethType=IPV4 --ipProto=6 --tcpDst=5001 of:0000000000006018/1
of:0000000000003008/1
add-point-intent --ipSrc=10.0.0.8/32 --ipDst=10.0.0.18/32
--ethType=IPV4 --ipProto=6 --tcpSrc=5001 of:0000000000003008/1
of:0000000000006018/1
add-point-intent --ipSrc=10.0.0.18/32 --ipDst=10.0.0.8/32
--ethType=IPV4 --ipProto=6 --tcpSrc=5001 of:0000000000006018/1
of:0000000000003008/1
"""
hostsJson = json.loads( main.ONOScli1.hosts() )
for i in range( 8, 9 ):
main.log.info(
"Adding point intent between h" + str( i ) +
" and h" + str( i + 10 ) )
host1 = "00:00:00:00:00:" + \
str( hex( i )[ 2: ] ).zfill( 2 ).upper()
host2 = "00:00:00:00:00:" + \
str( hex( i + 10 )[ 2: ] ).zfill( 2 ).upper()
host1Id = main.ONOScli1.getHost( host1 )[ 'id' ]
host2Id = main.ONOScli1.getHost( host2 )[ 'id' ]
for host in hostsJson:
if host[ 'id' ] == host1Id:
ip1 = host[ 'ipAddresses' ][ 0 ]
ip1 = str( ip1 + "/32" )
device1 = host[ 'location' ][ 'elementId' ]
device1 = str( device1 + "/1" )
elif host[ 'id' ] == host2Id:
ip2 = str( host[ 'ipAddresses' ][ 0 ] ) + "/32"
device2 = host[ 'location' ][ 'elementId' ]
device2 = str( device2 + "/1" )
pIntentResult1 = main.ONOScli1.addPointIntent(
ingressDevice=device1,
egressDevice=device2,
ipSrc=ip1,
ipDst=ip2,
ethType=main.params[ 'SDNIP' ][ 'ethType' ],
ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
tcpDst=main.params[ 'SDNIP' ][ 'dstPort' ] )
pIntentResult2 = main.ONOScli1.addPointIntent(
ingressDevice=device2,
egressDevice=device1,
ipSrc=ip2,
ipDst=ip1,
ethType=main.params[ 'SDNIP' ][ 'ethType' ],
ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
tcpDst=main.params[ 'SDNIP' ][ 'dstPort' ] )
pIntentResult3 = main.ONOScli1.addPointIntent(
ingressDevice=device1,
egressDevice=device2,
ipSrc=ip1,
ipDst=ip2,
ethType=main.params[ 'SDNIP' ][ 'ethType' ],
ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
tcpSrc=main.params[ 'SDNIP' ][ 'srcPort' ] )
pIntentResult4 = main.ONOScli1.addPointIntent(
ingressDevice=device2,
egressDevice=device1,
ipSrc=ip2,
ipDst=ip1,
ethType=main.params[ 'SDNIP' ][ 'ethType' ],
ipProto=main.params[ 'SDNIP' ][ 'tcpProto' ],
tcpSrc=main.params[ 'SDNIP' ][ 'srcPort' ] )
getIntentResult = main.ONOScli1.intents( jsonFormat=False )
main.log.info( getIntentResult )
pIntentResult = main.TRUE
if getIntentResult:
main.log.report(
"Point intent related to SDN-IP matching" +
" on TCP install successful" )
else:
main.log.report(
"Point intent related to SDN-IP matching" +
" on TCP install failed" )
pIntentResult = main.FALSE
iperfResult = main.Mininet1.iperf( 'h8', 'h18' )
if iperfResult == main.TRUE:
main.log.report( "iperf test successful" )
else:
main.log.report( "iperf test failed" )
case32Result = pIntentResult and iperfResult
utilities.assertEquals(
expect=main.TRUE,
actual=case32Result,
onpass="Ping all test after Point intents addition related " +
"to SDN-IP on TCP match successful",
onfail="Ping all test after Point intents addition related " +
"to SDN-IP on TCP match failed" )
def CASE33( self ):
"""
This test case adds multipoint to singlepoint intent related to
SDN-IP matching on destination ip and the action is to rewrite
the mac address
Here the mac address to be rewritten is the mac address of the
egress device
"""
import json
import time
main.log.report(
"This test case adds multipoint to singlepoint intent related to" +
" SDN-IP matching on destination ip and " +
"rewrite mac address action" )
main.case(
"Adding multipoint to singlepoint intent related to SDN-IP" +
" matching on destination ip" )
main.step( "Adding bidirectional multipoint to singlepoint intent" )
"""
add-multi-to-single-intent --ipDst=10.0.3.0/24
--setEthDst=00:00:00:00:00:12 of:0000000000003008/1 0000000000003009/1
of:0000000000006018/1
add-multi-to-single-intent --ipDst=10.0.1.0/24
--setEthDst=00:00:00:00:00:08 of:0000000000006018/1 0000000000003009/1
of:0000000000003008/1
"""
main.case(
"Installing multipoint to single point " +
"intent with rewrite mac address" )
main.step( "Uninstalling proxy arp app" )
# deactivating proxyarp app
appInstallResult = main.ONOScli1.deactivateApp( "org.onosproject.proxyarp" )
appCheck = main.ONOScli1.appToIDCheck()
if appCheck != main.TRUE:
main.log.warn( main.ONOScli1.apps() )
main.log.warn( main.ONOScli1.appIDs() )
time.sleep( 30 )
main.log.info( "onos-app-proxyarp deactivated" )
main.step( "Changing ipaddress of hosts h8,h9 and h18" )
main.Mininet1.changeIP(
host='h8',
intf='h8-eth0',
newIP='10.0.1.1',
newNetmask='255.255.255.0' )
main.Mininet1.changeIP(
host='h9',
intf='h9-eth0',
newIP='10.0.2.1',
newNetmask='255.255.255.0' )
main.Mininet1.changeIP(
host='h10',
intf='h10-eth0',
newIP='10.0.3.1',
newNetmask='255.255.255.0' )
main.step( "Changing default gateway of hosts h8,h9 and h18" )
main.Mininet1.changeDefaultGateway( host='h8', newGW='10.0.1.254' )
main.Mininet1.changeDefaultGateway( host='h9', newGW='10.0.2.254' )
main.Mininet1.changeDefaultGateway( host='h10', newGW='10.0.3.254' )
main.step(
"Assigning random mac address to the default gateways " +
"since proxyarp app is uninstalled" )
main.Mininet1.addStaticMACAddress(
host='h8',
GW='10.0.1.254',
macaddr='00:00:00:00:11:11' )
main.Mininet1.addStaticMACAddress(
host='h9',
GW='10.0.2.254',
macaddr='00:00:00:00:22:22' )
main.Mininet1.addStaticMACAddress(
host='h10',
GW='10.0.3.254',
macaddr='00:00:00:00:33:33' )
main.step( "Verify static gateway and MAC address assignment" )
main.Mininet1.verifyStaticGWandMAC( host='h8' )
main.Mininet1.verifyStaticGWandMAC( host='h9' )
main.Mininet1.verifyStaticGWandMAC( host='h10' )
ingressDevice1=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ]
ingressDevice2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ]
ingressDeviceList = []
ingressDeviceList.append( ingressDevice1 )
ingressDeviceList.append( ingressDevice2 )
main.step( "Adding multipoint to singlepoint intent" )
pIntentResult1 = main.ONOScli1.addMultipointToSinglepointIntent(
ingressDeviceList,
egressDevice=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
ipDst=main.params[ 'MULTIPOINT_INTENT' ][ 'ip1' ],
setEthDst=main.params[ 'MULTIPOINT_INTENT' ][ 'mac1' ] )
ingressDevice1=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ]
ingressDevice2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ]
ingressDeviceList = [ingressDevice1, ingressDevice2]
pIntentResult2 = main.ONOScli1.addMultipointToSinglepointIntent(
ingressDeviceList,
egressDevice=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
ipDst=main.params[ 'MULTIPOINT_INTENT' ][ 'ip2' ],
setEthDst=main.params[ 'MULTIPOINT_INTENT' ][ 'mac2' ] )
pIntentResult = pIntentResult1 and pIntentResult2
if pIntentResult == main.FALSE:
main.log.info(
"Multi point to single point intent " +
"installation failed" )
else:
pIntentResult = main.TRUE
getIntentResult = main.ONOScli1.intents( jsonFormat=False )
main.log.info( "intents = " + getIntentResult )
time.sleep( 10 )
getFlowsResult = main.ONOScli1.flows( jsonFormat=False )
main.log.info( "flows = " + getFlowsResult )
count = 1
i = 8
PingResult = main.TRUE
main.log.info( "\n\nh" + str( i ) + " is Pinging h" + str( i + 2 ) )
ping = main.Mininet1.pingHost(
src="h" + str( i ), target="h" + str( i + 2 ) )
if ping == main.FALSE and count < 3:
count += 1
PingResult = main.FALSE
main.log.report( "Ping between h" +
str( i ) +
" and h" +
str( i +
2 ) +
" failed. Making attempt number " +
str( count ) +
" in 2 seconds" )
time.sleep( 2 )
elif ping == main.FALSE:
main.log.report( "All ping attempts between h" +
str( i ) +
" and h" +
str( i +
10 ) +
"have failed" )
PingResult = main.FALSE
elif ping == main.TRUE:
main.log.info( "Ping test between h" +
str( i ) +
" and h" +
str( i +
2 ) +
" passed!" )
PingResult = main.TRUE
else:
main.log.info( "Unknown error" )
PingResult = main.ERROR
if PingResult == main.FALSE:
main.log.report( "Ping test failed." )
# main.cleanup()
# main.exit()
if PingResult == main.TRUE:
main.log.report( "Ping all successful" )
if pIntentResult == main.TRUE:
main.log.info(
"Multi point intent with rewrite mac " +
"address installation and ping successful" )
case33Result = pIntentResult and PingResult
utilities.assertEquals(
expect=main.TRUE,
actual=case33Result,
onpass="Ping all test after multipoint to single point" +
" intent addition with rewrite mac address successful",
onfail="Ping all test after multipoint to single point intent" +
" addition with rewrite mac address failed" )
def CASE20( self ):
"""
Exit from mininet cli
reinstall ONOS
"""
import time
cellName = main.params[ 'ENV' ][ 'cellName' ]
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
main.log.report( "This testcase exits the mininet cli and reinstalls" +
"ONOS to switch over to Packet Optical topology" )
main.log.report( "_____________________________________________" )
main.case( "Disconnecting mininet and restarting ONOS" )
main.step( "Disconnecting mininet and restarting ONOS" )
mininetDisconnect = main.Mininet1.disconnect()
print "mininetDisconnect = ", mininetDisconnect
main.step( "Removing raft logs before a clen installation of ONOS" )
main.ONOSbench.onosRemoveRaftLogs()
main.step( "Applying cell variable to environment" )
cellResult = main.ONOSbench.setCell( cellName )
verifyResult = main.ONOSbench.verifyCell()
time.sleep( 5 )
main.step( "Uninstalling ONOS package" )
onos1UninstallResult = main.ONOSbench.onosUninstall( nodeIp = ONOS1Ip)
onos2UninstallResult = main.ONOSbench.onosUninstall( nodeIp = ONOS2Ip)
onos3UninstallResult = main.ONOSbench.onosUninstall( nodeIp = ONOS3Ip)
onosUninstallResult = onos1UninstallResult and onos2UninstallResult \
and onos3UninstallResult
time.sleep( 15 )
main.step( "Installing ONOS package" )
onos1InstallResult = main.ONOSbench.onosInstall(
options="-f",
node=ONOS1Ip )
onos2InstallResult = main.ONOSbench.onosInstall(
options="-f",
node=ONOS2Ip )
onos3InstallResult = main.ONOSbench.onosInstall(
options="-f",
node=ONOS3Ip )
onosInstallResult = onos1InstallResult and onos2InstallResult and\
onos3InstallResult
if onosInstallResult == main.TRUE:
main.log.report( "Installing ONOS package successful" )
else:
main.log.report( "Installing ONOS package failed" )
time.sleep( 10 )
onos1Isup = main.ONOSbench.isup( ONOS1Ip )
onos2Isup = main.ONOSbench.isup( ONOS2Ip )
onos3Isup = main.ONOSbench.isup( ONOS3Ip )
onosIsup = onos1Isup and onos2Isup and onos3Isup
if onosIsup == main.TRUE:
main.log.report( "ONOS instances are up and ready" )
else:
main.log.report( "ONOS instances may not be up" )
main.step( "Starting ONOS service" )
time.sleep( 10 )
startResult = main.TRUE
# startResult = main.ONOSbench.onosStart( ONOS1Ip )
startcli1 = main.ONOScli1.startOnosCli( ONOSIp=ONOS1Ip )
startcli2 = main.ONOScli2.startOnosCli( ONOSIp=ONOS2Ip )
startcli3 = main.ONOScli3.startOnosCli( ONOSIp=ONOS3Ip )
startResult = startcli1 and startcli2 and startcli3
if startResult == main.TRUE:
main.log.report( "ONOS cli starts properly" )
case20Result = mininetDisconnect and cellResult and verifyResult \
and onosInstallResult and onosIsup and startResult
utilities.assert_equals(
expect=main.TRUE,
actual=case20Result,
onpass= "Exiting functionality mininet topology and reinstalling" +
" ONOS successful",
onfail= "Exiting functionality mininet topology and reinstalling" +
" ONOS failed" )
def CASE21( self, main ):
"""
On ONOS bench, run this command:
sudo -E python ~/onos/tools/test/topos/opticalTest.py -OC1 <Ctrls>
which spawns packet optical topology and copies the links
json file to the onos instance.
Note that in case of Packet Optical, the links are not learnt
from the topology, instead the links are learnt
from the json config file
"""
main.log.report(
"This testcase starts the packet layer topology and REST" )
main.log.report( "_____________________________________________" )
main.case( "Starting LINC-OE and other components" )
main.step( "Starting LINC-OE and other components" )
main.log.info( "Activate optical app" )
appInstallResult = main.ONOScli1.activateApp( "org.onosproject.optical" )
appCheck = main.ONOScli1.appToIDCheck()
appCheck = appCheck and main.ONOScli2.appToIDCheck()
appCheck = appCheck and main.ONOScli3.appToIDCheck()
if appCheck != main.TRUE:
main.log.warn( "Checking ONOS application unsuccesful" )
ctrllerIP = []
ctrllerIP.append( main.params[ 'CTRL' ][ 'ip1' ] )
#ctrllerIP.append( main.params[ 'CTRL' ][ 'ip2' ] )
#ctrllerIP.append( main.params[ 'CTRL' ][ 'ip3' ] )
opticalMnScript = main.LincOE2.runOpticalMnScript( ctrllerIP = ctrllerIP )
case21Result = opticalMnScript and appInstallResult
utilities.assert_equals(
expect=main.TRUE,
actual=case21Result,
onpass="Packet optical topology spawned successsfully",
onfail="Packet optical topology spawning failed" )
def CASE22( self, main ):
"""
Curretly we use, 10 optical switches(ROADM's) and
6 packet layer mininet switches each with one host.
Therefore, the roadmCount variable = 10,
packetLayerSWCount variable = 6, hostCount=6 and
links=46.
All this is hardcoded in the testcase. If the topology changes,
these hardcoded values need to be changed
"""
import time
main.log.report(
"This testcase compares the optical+packet topology against what" +
" is expected" )
main.case( "Topology comparision" )
main.step( "Topology comparision" )
devicesResult = main.ONOScli3.devices( jsonFormat=False )
time.sleep( 15 )
print "devices_result = ", devicesResult
devicesLinewise = devicesResult.split( "\n" )
roadmCount = 0
packetLayerSWCount = 0
for line in devicesLinewise:
components = line.split( "," )
availability = components[ 1 ].split( "=" )[ 1 ]
type = components[ 3 ].split( "=" )[ 1 ]
if availability == 'true' and type == 'ROADM':
roadmCount += 1
elif availability == 'true' and type == 'SWITCH':
packetLayerSWCount += 1
if roadmCount == 10:
print "Number of Optical Switches = %d and is" % roadmCount +\
" correctly detected"
main.log.info(
"Number of Optical Switches = " +
str( roadmCount ) +
" and is correctly detected" )
opticalSWResult = main.TRUE
else:
print "Number of Optical Switches = %d and is wrong" % roadmCount
main.log.info(
"Number of Optical Switches = " +
str( roadmCount ) +
" and is wrong" )
opticalSWResult = main.FALSE
if packetLayerSWCount == 6:
print "Number of Packet layer or mininet Switches = %d "\
% packetLayerSWCount + "and is correctly detected"
main.log.info(
"Number of Packet layer or mininet Switches = " +
str( packetLayerSWCount ) +
" and is correctly detected" )
packetSWResult = main.TRUE
else:
print "Number of Packet layer or mininet Switches = %d and"\
% packetLayerSWCount + " is wrong"
main.log.info(
"Number of Packet layer or mininet Switches = " +
str( packetLayerSWCount ) +
" and is wrong" )
packetSWResult = main.FALSE
print "_________________________________"
linksResult = main.ONOScli3.links( jsonFormat=False )
print "links_result = ", linksResult
print "_________________________________"
linkActiveCount = linksResult.count("state=ACTIVE")
main.log.info( "linkActiveCount = " + str( linkActiveCount ))
if linkActiveCount == 46:
linkActiveResult = main.TRUE
main.log.info(
"Number of links in ACTIVE state are correct")
else:
linkActiveResult = main.FALSE
main.log.info(
"Number of links in ACTIVE state are wrong")
case22Result = opticalSWResult and packetSWResult and \
linkActiveResult
utilities.assert_equals(
expect=main.TRUE,
actual=case22Result,
onpass="Packet optical topology discovery successful",
onfail="Packet optical topology discovery failed" )
def CASE23( self, main ):
import time
"""
Add bidirectional point intents between 2 packet layer( mininet )
devices and
ping mininet hosts
"""
main.log.report(
"This testcase adds bidirectional point intents between 2 " +
"packet layer( mininet ) devices and ping mininet hosts" )
main.case( "Topology comparision" )
main.step( "Adding point intents" )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000ffffffff0001/1",
"of:0000ffffffff0005/1" )
if ptpIntentResult == main.TRUE:
main.ONOScli1.intents( jsonFormat=False )
main.log.info( "Point to point intent install successful" )
ptpIntentResult = main.ONOScli1.addPointIntent(
"of:0000ffffffff0005/1",
"of:0000ffffffff0001/1" )
if ptpIntentResult == main.TRUE:
main.ONOScli1.intents( jsonFormat=False )
main.log.info( "Point to point intent install successful" )
time.sleep( 30 )
#flowHandle = main.ONOScli1.flows()
#main.log.info( "flows :" + flowHandle )
# Sleep for 30 seconds to provide time for the intent state to change
time.sleep( 60 )
intentHandle = main.ONOScli1.intents( jsonFormat=False )
main.log.info( "intents :" + intentHandle )
PingResult = main.TRUE
count = 1
main.log.info( "\n\nh1 is Pinging h5" )
ping = main.LincOE2.pingHostOptical( src="h1", target="h5" )
# ping = main.LincOE2.pinghost()
if ping == main.FALSE and count < 5:
count += 1
PingResult = main.FALSE
main.log.info(
"Ping between h1 and h5 failed. Making attempt number " +
str( count ) +
" in 2 seconds" )
time.sleep( 2 )
elif ping == main.FALSE:
main.log.info( "All ping attempts between h1 and h5 have failed" )
PingResult = main.FALSE
elif ping == main.TRUE:
main.log.info( "Ping test between h1 and h5 passed!" )
PingResult = main.TRUE
else:
main.log.info( "Unknown error" )
PingResult = main.ERROR
if PingResult == main.FALSE:
main.log.report(
"Point intents for packet optical have not ben installed" +
" correctly. Cleaning up" )
if PingResult == main.TRUE:
main.log.report(
"Point Intents for packet optical have been " +
"installed correctly" )
case23Result = PingResult
utilities.assert_equals(
expect=main.TRUE,
actual=case23Result,
onpass= "Point intents addition for packet optical and" +
"Pingall Test successful",
onfail= "Point intents addition for packet optical and" +
"Pingall Test NOT successful" )
def CASE24( self, main ):
import time
import json
"""
LINC uses its own switch IDs. You can use the following
command on the LINC console to find the mapping between
DPIDs and LINC IDs.
rp(application:get_all_key(linc)).
Test Rerouting of Packet Optical by bringing a port down
( port 20 ) of a switch( switchID=1, or LincOE switchID =9 ),
so that link
( between switch1 port20 - switch5 port50 ) is inactive
and do a ping test. If rerouting is successful,
ping should pass. also check the flows
"""
main.log.report(
"This testcase tests rerouting and pings mininet hosts" )
main.case( "Test rerouting and pings mininet hosts" )
main.step( "Attach to the Linc-OE session" )
attachConsole = main.LincOE1.attachLincOESession()
print "attachConsole = ", attachConsole
main.step( "Bring a port down and verify the link state" )
main.LincOE1.portDown( swId="9", ptId="20" )
linksNonjson = main.ONOScli3.links( jsonFormat=False )
main.log.info( "links = " + linksNonjson )
linkInactiveCount = linksNonjson.count("state=INACTIVE")
main.log.info( "linkInactiveCount = " + str( linkInactiveCount ))
if linkInactiveCount == 2:
main.log.info(
"Number of links in INACTIVE state are correct")
else:
main.log.info(
"Number of links in INACTIVE state are wrong")
links = main.ONOScli3.links()
main.log.info( "links = " + links )
linksResult = json.loads( links )
linksStateResult = main.FALSE
for item in linksResult:
if item[ 'src' ][ 'device' ] == "of:0000ffffffffff01" and item[
'src' ][ 'port' ] == "20":
if item[ 'dst' ][ 'device' ] == "of:0000ffffffffff05" and item[
'dst' ][ 'port' ] == "50":
linksState = item[ 'state' ]
if linksState == "INACTIVE":
main.log.info(
"Links state is inactive as expected due to one" +
" of the ports being down" )
main.log.report(
"Links state is inactive as expected due to one" +
" of the ports being down" )
linksStateResult = main.TRUE
break
else:
main.log.info(
"Links state is not inactive as expected" )
main.log.report(
"Links state is not inactive as expected" )
linksStateResult = main.FALSE
print "links_state_result = ", linksStateResult
time.sleep( 10 )
#flowHandle = main.ONOScli3.flows()
#main.log.info( "flows :" + flowHandle )
main.step( "Verify Rerouting by a ping test" )
PingResult = main.TRUE
count = 1
main.log.info( "\n\nh1 is Pinging h5" )
ping = main.LincOE2.pingHostOptical( src="h1", target="h5" )
# ping = main.LincOE2.pinghost()
if ping == main.FALSE and count < 5:
count += 1
PingResult = main.FALSE
main.log.info(
"Ping between h1 and h5 failed. Making attempt number " +
str( count ) +
" in 2 seconds" )
time.sleep( 2 )
elif ping == main.FALSE:
main.log.info( "All ping attempts between h1 and h5 have failed" )
PingResult = main.FALSE
elif ping == main.TRUE:
main.log.info( "Ping test between h1 and h5 passed!" )
PingResult = main.TRUE
else:
main.log.info( "Unknown error" )
PingResult = main.ERROR
if PingResult == main.TRUE:
main.log.report( "Ping test successful " )
if PingResult == main.FALSE:
main.log.report( "Ping test failed" )
case24Result = PingResult and linksStateResult
utilities.assert_equals( expect=main.TRUE, actual=case24Result,
onpass="Packet optical rerouting successful",
onfail="Packet optical rerouting failed" )