Merge branch 'master' of https://github.com/opennetworkinglab/ONLabTest into devl/newOnosCHO
diff --git a/TestON/bin/cli.py b/TestON/bin/cli.py
index 47b027e..ed1c796 100755
--- a/TestON/bin/cli.py
+++ b/TestON/bin/cli.py
@@ -48,11 +48,12 @@
dump = pprint.PrettyPrinter(indent=4)
__builtin__.testthread = False
introduction = "TestON is the testing framework \nDeveloped by Paxterra Solutions (www.paxterrasolutions.com)"
+__builtin__.COLORS = False
path = re.sub("teston$", "", os.getcwd())
sys.path.append(path+"/Core")
sys.path.append("../")
-from core.teston import *
+from core.teston import *
class CLI( threading.Thread,Cmd,object ):
"command-line interface to execute the test."
@@ -61,7 +62,7 @@
def __init__( self, teston, stdin=sys.stdin ):
self.teston = teston
-
+
self._mainevent = threading.Event()
threading.Thread.__init__(self)
self.main_stop = False
@@ -592,6 +593,8 @@
if __name__ == '__main__':
if len(sys.argv) > 1:
+ __builtin__.COLORS = True
CLI("test").onecmd(' '.join(sys.argv[1:]))
else:
+ __builtin__.COLORS = False
CLI("test").cmdloop()
diff --git a/TestON/core/Thread.py b/TestON/core/Thread.py
index e20abc3..da30339 100644
--- a/TestON/core/Thread.py
+++ b/TestON/core/Thread.py
@@ -1,9 +1,11 @@
#!/usr/bin/env python
import threading
-class Thread(threading.Thread):
- def __init__(self, target = None, threadID=None, name="", args=(), kwargs={}):
- super(Thread, self).__init__()
+
+class Thread( threading.Thread ):
+ def __init__( self, target=None, threadID=None, name="", args=(),
+ kwargs={} ):
+ super( Thread, self ).__init__()
self.threadID = threadID
self.name = name
self.target = target
@@ -14,11 +16,8 @@
def run( self ):
try:
if self.target is not None:
- if len(self.args) != 0:
- self.result = self.target( *self.args )
- else:
- self.result = self.target()
+ self.result = self.target( *self.args, **self.kwargs )
except Exception as e:
- print "Thread-" + str(self.threadID) + \
- ":something went wrong with " + self.name + " method"
+ print "Thread-" + str( self.threadID ) + " '" + self.name + "'"\
+ ":something went wrong with " + self.target + " method"
print e
diff --git a/TestON/core/logger.py b/TestON/core/logger.py
index 80fe0de..1dfe6bf 100644
--- a/TestON/core/logger.py
+++ b/TestON/core/logger.py
@@ -115,8 +115,8 @@
#### Add log-level - Report
logging.addLevelName(9, "REPORT")
logging.addLevelName(7, "EXACT")
- logging.addLevelName(10, "CASE")
- logging.addLevelName(11, "STEP")
+ logging.addLevelName(11, "CASE")
+ logging.addLevelName(12, "STEP")
main.log = logging.getLogger(main.TEST)
def report (msg):
'''
@@ -183,13 +183,42 @@
### initializing logging module and settig log level
main.log.setLevel(logging.INFO)
+ main.log.setLevel(logging.DEBUG) # Temporary
main.LogFileHandler.setLevel(logging.INFO)
# create console handler with a higher log level
main.ConsoleHandler = logging.StreamHandler()
main.ConsoleHandler.setLevel(logging.INFO)
+ main.ConsoleHandler.setLevel(logging.DEBUG) #Temporary
# create formatter and add it to the handlers
- formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+ #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+ class MyFormatter( logging.Formatter ):
+ colors = { 'cyan': '\033[96m', 'purple': '\033[95m',
+ 'blue': '\033[94m', 'green': '\033[92m',
+ 'yellow': '\033[93m', 'red': '\033[91m',
+ 'end': '\033[0m' }
+
+ FORMATS = {'DEFAULT': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'}
+ if COLORS: # NOTE:colors will only be loaded if command is run from one line
+ # IE: './cli.py run testname'
+ # This is to prevent issues with Jenkins parsing
+ # TODO: Make colors configurable
+ levels = { logging.ERROR : colors['red'] +
+ FORMATS['DEFAULT'] +
+ colors['end'],
+ logging.WARN : colors['yellow'] +
+ FORMATS['DEFAULT'] +
+ colors['end'],
+ logging.DEBUG : colors['purple'] +
+ FORMATS['DEFAULT'] +
+ colors['end'] }
+ FORMATS.update( levels )
+
+ def format( self, record ):
+ self._fmt = self.FORMATS.get( record.levelno,
+ self.FORMATS[ 'DEFAULT' ] )
+ return logging.Formatter.format( self, record )
+ formatter = MyFormatter()
main.ConsoleHandler.setFormatter(formatter)
main.LogFileHandler.setFormatter(formatter)
diff --git a/TestON/core/teston.py b/TestON/core/teston.py
index 6e95e3e..3210f9a 100644
--- a/TestON/core/teston.py
+++ b/TestON/core/teston.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
'''
Created on 22-Oct-2012
-
+
@author: Anil Kumar (anilkumar.s@paxterrasolutions.com)
@@ -16,7 +16,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with TestON. If not, see <http://www.gnu.org/licenses/>.
+ along with TestON. If not, see <http://www.gnu.org/licenses/>.
@@ -90,7 +90,7 @@
self.logs_path = logs_path
self.driver = ''
self.Thread = Thread
-
+
self.configparser()
verifyOptions(options)
load_logger()
@@ -99,17 +99,17 @@
self.driversList=[]
if type(self.componentDictionary) == str :
self.componentDictionary = dict(self.componentDictionary)
-
+
for component in self.componentDictionary :
self.driversList.append(self.componentDictionary[component]['type'])
-
+
self.driversList = list(set(self.driversList)) # Removing duplicates.
# Checking the test_target option set for the component or not
if type(self.componentDictionary) == dict:
for component in self.componentDictionary.keys():
if 'test_target' in self.componentDictionary[component].keys():
self.test_target = component
-
+
# Checking for the openspeak file and test script
self.logger.initlog(self)
@@ -247,7 +247,7 @@
#print code[testCaseNumber][step]
self.stepCount = self.stepCount + 1
self.log.exception(e)
- return main.FALSE
+ self.cleanup()
return main.TRUE
if cli.stop:
diff --git a/TestON/dependencies/Jenkins_getresult_HA.py b/TestON/dependencies/Jenkins_getresult_HA.py
index 9cb3b8b..7b4fc09 100755
--- a/TestON/dependencies/Jenkins_getresult_HA.py
+++ b/TestON/dependencies/Jenkins_getresult_HA.py
@@ -70,7 +70,7 @@
output +="<p></p>"
#output +=" Date: %s, %s %s" % (name.split("_")[2], name.split("_")[1], name.split("_")[3]) + "<p>*******************<p>"
- #Open the latest log folder
+ #Open the latest log folder
output += "<h2>Test "+str(test)+"</h2><p>************************************</p>"
f = open(path + name + ".rpt")
@@ -102,8 +102,11 @@
#https://wiki.onosproject.org/display/OST/Test+Results+-+HA#Test+Results+-+HA
#Example anchor on new wiki: #TestResults-HA-TestHATestSanity
page_name = "Master-HA"
- if "ONOS-HA-Maint" in job:
- #NOTE if page name starts with number it prepends 'id-' to anchor links
+ if "ONOS-HA-1.1.X" in job:
+ page_name = "Blackbird-HA"
+ elif "ONOS-HA-Maint" in job:
+ # NOTE if page name starts with number confluence prepends 'id-'
+ # to anchor links
page_name = "id-1.0-HA"
header += "<li><a href=\'#" + str(page_name) + "-Test" + str(test) + "\'> " + str(test) + " - Results: " + str(passes) + " Passed, " + str(fails) + " Failed</a></li>"
diff --git a/TestON/drivers/common/cli/emulator/mininetclidriver.py b/TestON/drivers/common/cli/emulator/mininetclidriver.py
index 5d98972..073e368 100644
--- a/TestON/drivers/common/cli/emulator/mininetclidriver.py
+++ b/TestON/drivers/common/cli/emulator/mininetclidriver.py
@@ -326,7 +326,7 @@
command = args[ "SRC" ] + " ping " + \
args[ "TARGET" ] + " -c 1 -i 1 -W 8"
try:
- main.log.warn( "Sending: " + command )
+ main.log.info( "Sending: " + command )
self.handle.sendline( command )
i = self.handle.expect( [ command, pexpect.TIMEOUT ] )
if i == 1:
diff --git a/TestON/drivers/common/cli/emulator/remotemininetdriver.py b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
index 8e445a9..e451335 100644
--- a/TestON/drivers/common/cli/emulator/remotemininetdriver.py
+++ b/TestON/drivers/common/cli/emulator/remotemininetdriver.py
@@ -299,7 +299,7 @@
self.handle.sendline( "" )
i = self.handle.expect( [ 'No\ssuch\device', 'listening\son',
pexpect.TIMEOUT, "\$" ], timeout=10 )
- main.log.warn( self.handle.before + self.handle.after )
+ main.log.info( self.handle.before + self.handle.after )
if i == 0:
main.log.error( self.name + ": tcpdump - No such device exists.\
tcpdump attempted on: " + intf )
@@ -591,7 +591,6 @@
if actionType == 'remove':
# -D is the 'delete' rule of iptables
actionRemove = '-D'
- # noinspection PyBroadException
try:
self.handle.sendline( "" )
# Delete a specific rule specified into the function
diff --git a/TestON/drivers/common/cli/onosclidriver.py b/TestON/drivers/common/cli/onosclidriver.py
index baed719..ab37367 100644
--- a/TestON/drivers/common/cli/onosclidriver.py
+++ b/TestON/drivers/common/cli/onosclidriver.py
@@ -21,6 +21,7 @@
import re
import json
import types
+import time
sys.path.append( "../" )
from drivers.common.clidriver import CLI
@@ -453,7 +454,6 @@
Return:
topology = current ONOS topology
"""
- import json
try:
# either onos:topology or 'topology' will work in CLI
cmdStr = "topology -j"
@@ -537,7 +537,7 @@
"""
try:
cmdStr = "device-remove "+str(deviceId)
- handle = self.sendline( cmdStr )
+ self.sendline( cmdStr )
return main.TRUE
except TypeError:
main.log.exception( self.name + ": Object not as expected" )
@@ -551,8 +551,6 @@
main.log.exception( self.name + ": Uncaught exception!" )
main.cleanup()
main.exit()
-
-
def devices( self, jsonFormat=True ):
"""
@@ -1207,11 +1205,11 @@
"""
Note:
This function assumes the format of all ingress devices
- is same. That is, all ingress devices include port nos
- with a "/" or all ingress devices could specify device
- ids and port nos seperately.
+ is same. That is, all ingress devices include port numbers
+ with a "/" or all ingress devices could specify device
+ ids and port numbers seperately.
Required:
- * ingressDeviceList: List of device ids of ingress device
+ * ingressDeviceList: List of device ids of ingress device
( Atleast 2 ingress devices required in the list )
* egressDevice: device id of egress device
Optional:
@@ -1284,12 +1282,12 @@
cmd += " " + str( ingressDevice )
else:
main.log.error( "You must specify " +
- "the ingress port" )
+ "the ingress port" )
# TODO: perhaps more meaningful return
return main.FALSE
else:
if len( ingressDeviceList ) == len( portIngressList ):
- for ingressDevice,portIngress in zip( ingressDeviceList,portIngressList ):
+ for ingressDevice, portIngress in zip( ingressDeviceList, portIngressList ):
cmd += " " + \
str( ingressDevice ) + "/" +\
str( portIngress ) + " "
@@ -1318,12 +1316,6 @@
main.log.info( "Multipoint-to-singlepoint intent installed" +
" failed " )
return None
- #match = re.search('id=0x([\da-f]+),', handle)
- #if match:
- #return match.group()[3:-1]
- #else:
- #main.log.error( "Error, intent ID not found" )
- #return None
except TypeError:
main.log.exception( self.name + ": Object not as expected" )
return None
@@ -1639,7 +1631,7 @@
if handle:
return handle
else:
- # Return empty json
+ # Return empty json
return '{}'
except TypeError:
main.log.exception( self.name + ": Object not as expected" )
@@ -2315,3 +2307,430 @@
main.cleanup()
main.exit()
+ def apps( self, jsonFormat=True ):
+ """
+ Returns the output of the apps command for ONOS. This command lists
+ information about installed ONOS applications
+ """
+ # Sample JSON object
+ # [{"name":"org.onosproject.openflow","id":0,"version":"1.2.0",
+ # "description":"ONOS OpenFlow protocol southbound providers",
+ # "origin":"ON.Lab","permissions":"[]","featuresRepo":"",
+ # "features":"[onos-openflow]","state":"ACTIVE"}]
+ try:
+ if jsonFormat:
+ cmdStr = "onos:apps -j"
+ output = self.sendline( cmdStr )
+ assert "Error executing command" not in output
+ ansiEscape = re.compile( r'\r\r\n\x1b[^m]*m' )
+ cleanedOutput = ansiEscape.sub( '', output )
+ return cleanedOutput
+ else:
+ cmdStr = "onos:apps"
+ output = self.sendline( cmdStr )
+ assert "Error executing command" not in output
+ return output
+ # FIXME: look at specific exceptions/Errors
+ except AssertionError:
+ main.log.error( "Error in processing onos:app command: " +
+ str( output ) )
+ return None
+ except TypeError:
+ main.log.exception( self.name + ": Object not as expected" )
+ return None
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ main.cleanup()
+ main.exit()
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+
+ def appStatus( self, appName ):
+ """
+ Uses the onos:apps cli command to return the status of an application.
+ Returns:
+ "ACTIVE" - If app is installed and activated
+ "INSTALLED" - If app is installed and deactivated
+ "UNINSTALLED" - If app is not installed
+ None - on error
+ """
+ try:
+ if not isinstance( appName, types.StringType ):
+ main.log.error( self.name + ".appStatus(): appName must be" +
+ " a string" )
+ return None
+ output = self.apps( jsonFormat=True )
+ appsJson = json.loads( output )
+ state = None
+ for app in appsJson:
+ if appName == app.get('name'):
+ state = app.get('state')
+ break
+ if state == "ACTIVE" or state == "INSTALLED":
+ return state
+ elif state is None:
+ return "UNINSTALLED"
+ elif state:
+ main.log.error( "Unexpected state from 'onos:apps': " +
+ str( state ) )
+ return state
+ except TypeError:
+ main.log.exception( self.name + ": Object not as expected" )
+ return None
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ main.cleanup()
+ main.exit()
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+
+ def app( self, appName, option ):
+ """
+ Interacts with the app command for ONOS. This command manages
+ application inventory.
+ """
+ try:
+ # Validate argument types
+ valid = True
+ if not isinstance( appName, types.StringType ):
+ main.log.error( self.name + ".app(): appName must be a " +
+ "string" )
+ valid = False
+ if not isinstance( option, types.StringType ):
+ main.log.error( self.name + ".app(): option must be a string" )
+ valid = False
+ if not valid:
+ return main.FALSE
+ # Validate Option
+ option = option.lower()
+ # NOTE: Install may become a valid option
+ if option == "activate":
+ pass
+ elif option == "deactivate":
+ pass
+ elif option == "uninstall":
+ pass
+ else:
+ # Invalid option
+ main.log.error( "The ONOS app command argument only takes " +
+ "the values: (activate|deactivate|uninstall)" +
+ "; was given '" + option + "'")
+ return main.FALSE
+ cmdStr = "onos:app " + option + " " + appName
+ output = self.sendline( cmdStr )
+ if "Error executing command" in output:
+ main.log.error( "Error in processing onos:app command: " +
+ str( output ) )
+ return main.FALSE
+ elif "No such application" in output:
+ main.log.error( "The application '" + appName +
+ "' is not installed in ONOS" )
+ return main.FALSE
+ elif "Command not found:" in output:
+ main.log.error( "Error in processing onos:app command: " +
+ str( output ) )
+ return main.FALSE
+ elif "Unsupported command:" in output:
+ main.log.error( "Incorrect command given to 'app': " +
+ str( output ) )
+ # NOTE: we may need to add more checks here
+ # else: Command was successful
+ #main.log.debug( "app response: " + repr( output ) )
+ return main.TRUE
+ except TypeError:
+ main.log.exception( self.name + ": Object not as expected" )
+ return main.ERROR
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ main.cleanup()
+ main.exit()
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+
+ def activateApp( self, appName, check=True ):
+ """
+ Activate an app that is already installed in ONOS
+ appName is the hierarchical app name, not the feature name
+ If check is True, method will check the status of the app after the
+ command is issued
+ Returns main.TRUE if the command was successfully sent
+ main.FALSE if the cli responded with an error or given
+ incorrect input
+ """
+ try:
+ if not isinstance( appName, types.StringType ):
+ main.log.error( self.name + ".activateApp(): appName must be" +
+ " a string" )
+ return main.FALSE
+ status = self.appStatus( appName )
+ if status == "INSTALLED":
+ response = self.app( appName, "activate" )
+ if check and response == main.TRUE:
+ for i in range(10): # try 10 times then give up
+ # TODO: Check with Thomas about this delay
+ status = self.appStatus( appName )
+ if status == "ACTIVE":
+ return main.TRUE
+ else:
+ main.log.debug( "The state of application " +
+ appName + " is " + status )
+ time.sleep( 1 )
+ return main.FALSE
+ else: # not 'check' or command didn't succeed
+ return response
+ elif status == "ACTIVE":
+ return main.TRUE
+ elif status == "UNINSTALLED":
+ main.log.error( self.name + ": Tried to activate the " +
+ "application '" + appName + "' which is not " +
+ "installed." )
+ else:
+ main.log.error( "Unexpected return value from appStatus: " +
+ str( status ) )
+ return main.ERROR
+ except TypeError:
+ main.log.exception( self.name + ": Object not as expected" )
+ return main.ERROR
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ main.cleanup()
+ main.exit()
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+
+ def deactivateApp( self, appName, check=True ):
+ """
+ Deactivate an app that is already activated in ONOS
+ appName is the hierarchical app name, not the feature name
+ If check is True, method will check the status of the app after the
+ command is issued
+ Returns main.TRUE if the command was successfully sent
+ main.FALSE if the cli responded with an error or given
+ incorrect input
+ """
+ try:
+ if not isinstance( appName, types.StringType ):
+ main.log.error( self.name + ".deactivateApp(): appName must " +
+ "be a string" )
+ return main.FALSE
+ status = self.appStatus( appName )
+ if status == "INSTALLED":
+ return main.TRUE
+ elif status == "ACTIVE":
+ response = self.app( appName, "deactivate" )
+ if check and response == main.TRUE:
+ for i in range(10): # try 10 times then give up
+ status = self.appStatus( appName )
+ if status == "INSTALLED":
+ return main.TRUE
+ else:
+ time.sleep( 1 )
+ return main.FALSE
+ else: # not check or command didn't succeed
+ return response
+ elif status == "UNINSTALLED":
+ main.log.warn( self.name + ": Tried to deactivate the " +
+ "application '" + appName + "' which is not " +
+ "installed." )
+ return main.TRUE
+ else:
+ main.log.error( "Unexpected return value from appStatus: " +
+ str( status ) )
+ return main.ERROR
+ except TypeError:
+ main.log.exception( self.name + ": Object not as expected" )
+ return main.ERROR
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ main.cleanup()
+ main.exit()
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+
+ def uninstallApp( self, appName, check=True ):
+ """
+ Uninstall an app that is already installed in ONOS
+ appName is the hierarchical app name, not the feature name
+ If check is True, method will check the status of the app after the
+ command is issued
+ Returns main.TRUE if the command was successfully sent
+ main.FALSE if the cli responded with an error or given
+ incorrect input
+ """
+ # TODO: check with Thomas about the state machine for apps
+ try:
+ if not isinstance( appName, types.StringType ):
+ main.log.error( self.name + ".uninstallApp(): appName must " +
+ "be a string" )
+ return main.FALSE
+ status = self.appStatus( appName )
+ if status == "INSTALLED":
+ response = self.app( appName, "uninstall" )
+ if check and response == main.TRUE:
+ for i in range(10): # try 10 times then give up
+ status = self.appStatus( appName )
+ if status == "UNINSTALLED":
+ return main.TRUE
+ else:
+ time.sleep( 1 )
+ return main.FALSE
+ else: # not check or command didn't succeed
+ return response
+ elif status == "ACTIVE":
+ main.log.warn( self.name + ": Tried to uninstall the " +
+ "application '" + appName + "' which is " +
+ "currently active." )
+ response = self.app( appName, "uninstall" )
+ if check and response == main.TRUE:
+ for i in range(10): # try 10 times then give up
+ status = self.appStatus( appName )
+ if status == "UNINSTALLED":
+ return main.TRUE
+ else:
+ time.sleep( 1 )
+ return main.FALSE
+ else: # not check or command didn't succeed
+ return response
+ elif status == "UNINSTALLED":
+ return main.TRUE
+ else:
+ main.log.error( "Unexpected return value from appStatus: " +
+ str( status ) )
+ return main.ERROR
+ except TypeError:
+ main.log.exception( self.name + ": Object not as expected" )
+ return main.ERROR
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ main.cleanup()
+ main.exit()
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+
+ def appIDs( self, jsonFormat=True ):
+ """
+ Show the mappings between app id and app names given by the 'app-ids'
+ cli command
+ """
+ try:
+ cmdStr = "app-ids"
+ if jsonFormat:
+ cmdStr += " -j"
+ output = self.sendline( cmdStr )
+ assert "Error executing command" not in output
+ ansiEscape = re.compile( r'\r\r\n\x1b[^m]*m' )
+ cleanedOutput = ansiEscape.sub( '', output )
+ return cleanedOutput
+ else:
+ output = self.sendline( cmdStr )
+ assert "Error executing command" not in output
+ return output
+ except AssertionError:
+ main.log.error( "Error in processing onos:app-ids command: " +
+ str( output ) )
+ return None
+ except TypeError:
+ main.log.exception( self.name + ": Object not as expected" )
+ return None
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ main.cleanup()
+ main.exit()
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+
+ def appToIDCheck( self ):
+ """
+ This method will check that each application's ID listed in 'apps' is
+ the same as the ID listed in 'app-ids'. The check will also check that
+ there are no duplicate IDs issued. Note that an app ID should be
+ a globaly unique numerical identifier for app/app-like features. Once
+ an ID is registered, the ID is never freed up so that if an app is
+ reinstalled it will have the same ID.
+
+ Returns: main.TRUE if the check passes and
+ main.FALSE if the check fails or
+ main.ERROR if there is some error in processing the test
+ """
+ try:
+ ids = json.loads( self.appIDs( jsonFormat=True ) )
+ apps = json.loads( self.apps( jsonFormat=True ) )
+ result = main.TRUE
+ for app in apps:
+ appID = app.get( 'id' )
+ if appID is None:
+ main.log.error( "Error parsing app: " + str( app ) )
+ result = main.FALSE
+ appName = app.get( 'name' )
+ if appName is None:
+ main.log.error( "Error parsing app: " + str( app ) )
+ result = main.FALSE
+ # get the entry in ids that has the same appID
+ current = filter(lambda item: item[ 'id' ] == appID, ids)
+ # main.log.debug( "Comparing " + str( app ) + " to " +
+ # str( current ) )
+ if not current: # if ids doesn't have this id
+ result = main.FALSE
+ main.log.error( "'app-ids' does not have the ID for " +
+ str( appName ) + " that apps does." )
+ elif len( current ) > 1:
+ # there is more than one app with this ID
+ result = main.FALSE
+ # We will log this later in the method
+ elif not current[0][ 'name' ] == appName:
+ currentName = current[0][ 'name' ]
+ result = main.FALSE
+ main.log.error( "'app-ids' has " + str( currentName ) +
+ " registered under id:" + str( appID ) +
+ " but 'apps' has " + str( appName ) )
+ else:
+ pass # id and name match!
+ # now make sure that app-ids has no duplicates
+ idsList = []
+ namesList = []
+ for item in ids:
+ idsList.append( item[ 'id' ] )
+ namesList.append( item[ 'name' ] )
+ if len( idsList ) != len( set( idsList ) ) or\
+ len( namesList ) != len( set( namesList ) ):
+ main.log.error( "'app-ids' has some duplicate entries: \n"
+ + json.dumps( ids,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ result = main.FALSE
+ return result
+ except ( ValueError, TypeError ):
+ main.log.exception( self.name + ": Object not as expected" )
+ return main.ERROR
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ main.cleanup()
+ main.exit()
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+
diff --git a/TestON/drivers/common/cli/onosdriver.py b/TestON/drivers/common/cli/onosdriver.py
index b08054b..f96a60e 100644
--- a/TestON/drivers/common/cli/onosdriver.py
+++ b/TestON/drivers/common/cli/onosdriver.py
@@ -48,7 +48,7 @@
self.home = self.options[ 'home' ]
break
if self.home is None or self.home == "":
- self.home = "~/ONOS"
+ self.home = "~/onos"
self.name = self.options[ 'name' ]
self.handle = super( OnosDriver, self ).connect(
@@ -81,13 +81,17 @@
"""
response = main.TRUE
try:
- self.handle.sendline( "" )
- self.handle.expect( "\$" )
- self.handle.sendline( "exit" )
- self.handle.expect( "closed" )
+ if self.handle:
+ self.handle.sendline( "" )
+ self.handle.expect( "\$" )
+ self.handle.sendline( "exit" )
+ self.handle.expect( "closed" )
except pexpect.EOF:
main.log.error( self.name + ": EOF exception found" )
main.log.error( self.name + ": " + self.handle.before )
+ except ValueError:
+ main.log.exception( "Exception in discconect of " + self.name )
+ response = main.TRUE
except Exception:
main.log.exception( self.name + ": Connection failed to the host" )
response = main.FALSE
@@ -173,6 +177,7 @@
'Runtime\sEnvironment\sto\scontinue',
'BUILD\sFAILURE',
'BUILD\sSUCCESS',
+ 'onos\$', #TODO: fix this to be more generic?
'ONOS\$',
pexpect.TIMEOUT ], timeout=600 )
if i == 0:
@@ -188,7 +193,7 @@
main.exit()
elif i == 2:
main.log.info( self.name + ": Build success!" )
- elif i == 3:
+ elif i == 3 or i == 4:
main.log.info( self.name + ": Build complete" )
# Print the build time
for line in self.handle.before.splitlines():
@@ -197,7 +202,7 @@
self.handle.sendline( "" )
self.handle.expect( "\$", timeout=60 )
return main.TRUE
- elif i == 4:
+ elif i == 5:
main.log.error(
self.name +
": mvn clean install TIMEOUT!" )
@@ -220,10 +225,14 @@
main.cleanup()
main.exit()
- def gitPull( self, comp1="" ):
+ def gitPull( self, comp1="", fastForward=True ):
"""
Assumes that "git pull" works without login
+ If the fastForward boolean is set to true, only git pulls that can
+ be fast forwarded will be performed. IE if you have not local commits
+ in your branch.
+
This function will perform a git pull on the ONOS instance.
If used as gitPull( "NODE" ) it will do git pull + NODE. This is
for the purpose of pulling from other nodes if necessary.
@@ -239,11 +248,12 @@
# self.stop()
self.handle.sendline( "cd " + self.home )
self.handle.expect( self.home + "\$" )
- if comp1 == "":
- self.handle.sendline( "git pull" )
- else:
- self.handle.sendline( "git pull " + comp1 )
-
+ cmd = "git pull"
+ if comp1 != "":
+ cmd += ' ' + comp1
+ if fastForward:
+ cmd += ' ' + " --ff-only"
+ self.handle.sendline( cmd )
i = self.handle.expect(
[
'fatal',
@@ -254,6 +264,9 @@
'You\sare\snot\scurrently\son\sa\sbranch',
'You asked me to pull without telling me which branch you',
'Pull is not possible because you have unmerged files',
+ 'Please enter a commit message to explain why this merge',
+ 'Found a swap file by the name',
+ 'Please, commit your changes before you can merge.',
pexpect.TIMEOUT ],
timeout=300 )
# debug
@@ -261,7 +274,11 @@
# "git pull response: " +
# str( self.handle.before ) + str( self.handle.after ) )
if i == 0:
- main.log.error( self.name + ": Git pull had some issue..." )
+ main.log.error( self.name + ": Git pull had some issue" )
+ output = self.handle.after
+ self.handle.expect( '\$' )
+ output += self.handle.before
+ main.log.warn( output )
return main.ERROR
elif i == 1:
main.log.error(
@@ -303,6 +320,29 @@
"you have unmerged files." )
return main.ERROR
elif i == 8:
+ # NOTE: abandoning test since we can't reliably handle this
+ # there could be different default text editors and we
+ # also don't know if we actually want to make the commit
+ main.log.error( "Git pull resulted in a merge commit message" +
+ ". Exiting test!" )
+ main.cleanup()
+ main.exit()
+ elif i == 9: # Merge commit message but swap file exists
+ main.log.error( "Git pull resulted in a merge commit message" +
+ " but a swap file exists." )
+ try:
+ self.handle.send( 'A' ) # Abort
+ self.handle.expect( "\$" )
+ return main.ERROR
+ except Exception:
+ main.log.exception( "Couldn't exit editor prompt!")
+ main.cleanup()
+ main.exit()
+ elif i == 10: # In the middle of a merge commit
+ main.log.error( "Git branch is in the middle of a merge. " )
+ main.log.warn( self.handle.before + self.handle.after )
+ return main.ERROR
+ elif i == 11:
main.log.error( self.name + ": Git Pull - TIMEOUT" )
main.log.error(
self.name + " Response was: " + str(
@@ -348,9 +388,9 @@
self.handle.expect( cmd )
i = self.handle.expect(
[ 'fatal',
- 'Username\sfor\s(.*):\s',
- 'Already\son\s\'',
- 'Switched\sto\sbranch\s\'' + str( branch ),
+ 'Username for (.*): ',
+ 'Already on \'',
+ 'Switched to branch \'' + str( branch ),
pexpect.TIMEOUT,
'error: Your local changes to the following files' +
'would be overwritten by checkout:',
@@ -492,7 +532,7 @@
main.exit()
def createCellFile( self, benchIp, fileName, mnIpAddrs,
- extraFeatureString, *onosIpAddrs ):
+ appString, *onosIpAddrs ):
"""
Creates a cell file based on arguments
Required:
@@ -516,11 +556,11 @@
# Create the cell file in the directory for writing ( w+ )
cellFile = open( tempDirectory + fileName, 'w+' )
- # Feature string is hardcoded environment variables
+ # App string is hardcoded environment variables
# That you may wish to use by default on startup.
- # Note that you may not want certain features listed
+ # Note that you may not want certain apps listed
# on here.
- coreFeatureString = "export ONOS_FEATURES=" + extraFeatureString
+ appString = "export ONOS_APPS=" + appString
mnString = "export OCN="
onosString = "export OC"
tempCount = 1
@@ -549,7 +589,7 @@
tempCount = tempCount + 1
cellFile.write( mnString + "\"" + mnIpAddrs + "\"" + "\n" )
- cellFile.write( coreFeatureString + "\n" )
+ cellFile.write( appString + "\n" )
cellFile.close()
# We use os.system to send the command to TestON cluster
@@ -805,6 +845,7 @@
" stop" )
i = self.handle.expect( [
"stop/waiting",
+ "Could not resolve hostname",
"Unknown\sinstance",
pexpect.TIMEOUT ], timeout=60 )
@@ -812,9 +853,12 @@
main.log.info( "ONOS service stopped" )
return main.TRUE
elif i == 1:
- main.log.info( "Unknown ONOS instance specified: " +
+ main.log.info( "onosStop() Unknown ONOS instance specified: " +
str( nodeIp ) )
return main.FALSE
+ elif i == 2:
+ main.log.warn( "ONOS wasn't running" )
+ return main.TRUE
else:
main.log.error( "ONOS service failed to stop" )
return main.FALSE
@@ -952,8 +996,8 @@
timeout=120 )
if i == 1:
return main.FALSE
- self.handle.sendline( "" )
- self.handle.expect( "\$" )
+ #self.handle.sendline( "" )
+ #self.handle.expect( "\$" )
return main.TRUE
except pexpect.EOF:
@@ -1224,14 +1268,14 @@
def runOnosTopoCfg( self, instanceName, jsonFile ):
"""
On ONOS bench, run this command:
- ./~/ONOS/tools/test/bin/onos-topo-cfg $OC1 filename
+ {ONOS_HOME}/tools/test/bin/onos-topo-cfg $OC1 filename
which starts the rest and copies
the json file to the onos instance
"""
try:
self.handle.sendline( "" )
self.handle.expect( "\$" )
- self.handle.sendline( "cd ~/ONOS/tools/test/bin" )
+ self.handle.sendline( "cd " + self.home + "/tools/test/bin" )
self.handle.expect( "/bin$" )
cmd = "./onos-topo-cfg " + instanceName + " " + jsonFile
print "cmd = ", cmd
@@ -1685,37 +1729,54 @@
os.system( "scp " + tempFile + " admin@" + benchIp + ":" + linkGraphPath)
main.log.info("linkGraph.cfg creation complete")
- def createNullDevProviderFile( self, benchIp, ONOSIpList, deviceCount, numPorts=10):
+ def configNullDev( self, ONOSIpList, deviceCount, numPorts=10):
'''
- benchIp = Ip address of the test bench
ONOSIpList = list of Ip addresses of nodes switches will be devided amongst
- deviceCount = number of switches to distribute
- numPorts = number of ports per device, when not specified in file it defaults to 10, optional arg
+ deviceCount = number of switches to distribute, or list of values to use as custom distribution
+ numPorts = number of ports per device. Defaults to 10 both in this function and in ONOS. Optional arg
'''
- main.log.step("Creating null device provider configuration file." )
- nullDevicePath = self.home + "/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
- tempFile = "/tmp/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
- configFile = open(tempFile, 'w+')
+ main.log.step("Configuring Null Device Provider" )
clusterCount = len(ONOSIpList)
- if type(deviceCount) is int or type(deviceCount) is str:
- main.log.info("Creating device distribution")
- deviceCount = int(deviceCount)
- switchList = [0]*(clusterCount+1)
- baselineSwitchCount = deviceCount/clusterCount
+ try:
+
+ if type(deviceCount) is int or type(deviceCount) is str:
+ main.log.step("Creating device distribution")
+ deviceCount = int(deviceCount)
+ switchList = [0]*(clusterCount+1)
+ baselineSwitchCount = deviceCount/clusterCount
- for node in range(1, clusterCount + 1):
- switchList[node] = baselineSwitchCount
+ for node in range(1, clusterCount + 1):
+ switchList[node] = baselineSwitchCount
- for node in range(1, (deviceCount%clusterCount)+1):
- switchList[node] += 1
+ for node in range(1, (deviceCount%clusterCount)+1):
+ switchList[node] += 1
+
+ if type(deviceCount) is list:
+ main.log.info("Using provided device distribution")
+
+ if len(deviceCount) == clusterCount:
+ switchList = ['0']
+ switchList.extend(deviceCount)
+
+ if len(deviceCount) == (clusterCount + 1):
+ if deviceCount[0] == '0' or deviceCount[0] == 0:
+ switchList = deviceCount
- if type(deviceCount) is list:
- main.log.info("Using provided device distribution")
- switchList = ['0']
- switchList.extend(deviceCount)
+ assert len(switchList) == (clusterCount + 1)
+
+ except AssertionError:
+ main.log.error( "Bad device/Ip list match")
+ except TypeError:
+ main.log.exception( self.name + ": Object not as expected" )
+ return None
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+
ONOSIp = [0]
ONOSIp.extend(ONOSIpList)
@@ -1725,54 +1786,69 @@
devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
if node < clusterCount:
devicesString += (",")
+
+ try:
+ self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider devConfigs " + devicesString )
+ self.handle.expect(":~")
+ self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.device.impl.NullDeviceProvider numPorts " + str(numPorts) )
+ self.handle.expect(":~")
- configFile.write(devicesString + "\n")
- if numPorts == 10:
- configFile.write("#numPorts = 10")
- else:
- configFile.write("numPorts = " + str(numPorts))
+ for i in range(10):
+ self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.device.impl.NullDeviceProvider")
+ self.handle.expect(":~")
+ verification = self.handle.before
+ if (" value=" + str(numPorts)) in verification and (" value=" + devicesString) in verification:
+ break
+ else:
+ time.sleep(1)
- configFile.close()
- os.system( "scp " + tempFile + " admin@" + benchIp + ":" + nullDevicePath)
+ assert ("value=" + str(numPorts)) in verification and (" value=" + fileName) in verification
+
+ except AssertionError:
+ main.log.error("Incorrect Config settings: " + verification)
- def createNullLinkProviderFile( self, benchIp, neighborIpList=0, eventRate=0, onNode=False):
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+
+ def configNullLink( self,fileName="/opt/onos/apache-karaf-3.0.2/etc/linkGraph.cfg", eventRate=0):
'''
- neighbor list is an optional list of neighbors to be written directly to the file
- onNode - bool, if true, alternate file path will be used to scp, inteneded
- for use on cell
+ fileName default is currently the same as the default on ONOS, specify alternate file if
+ you want to use a different topology file than linkGraph.cfg
'''
- main.log.step("Creating Null Link Provider config file")
- nullLinkPath = self.home + "/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
- if onNode == True:
- nullLinkPath = "/opt/onos/apache-karaf-3.0.2/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
- tempFile = "/tmp/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
- configFile = open(tempFile, 'w+')
-
- eventRate = int(eventRate)
-
- if eventRate == 0:
- configFile.write("#eventRate = \n")
- else:
- configFile.write("eventRate = " + str(eventRate) + "\n")
-
- configFile.write("#cfgFile = /tmp/foo.cfg #If enabled, points to the full path to the topology file.\n")
- if neighborIpList != 0:
- configFile.write("neighbors = ")
- for n in range (0, len(neighborIpList)):
- configFile.write(neighborIpList[n])
- if n < (len(neighborIpList) - 1):
- configFile.write(",")
- else:
- configFile.write("#neighbors = ")
+ try:
+ self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider eventRate " + str(eventRate))
+ self.handle.expect(":~")
+ self.handle.sendline("onos $OC1 cfg set org.onosproject.provider.nil.link.impl.NullLinkProvider cfgFile " + fileName )
+ self.handle.expect(":~")
+
+ for i in range(10):
+ self.handle.sendline("onos $OC1 cfg get org.onosproject.provider.nil.link.impl.NullLinkProvider")
+ self.handle.expect(":~")
+ verification = self.handle.before
+ if (" value=" + str(eventRate)) in verification and (" value=" + fileName) in verification:
+ break
+ else:
+ time.sleep(1)
+
+ assert ("value=" + str(eventRate)) in verification and (" value=" + fileName) in verification
+
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ main.cleanup()
+ main.exit()
- configFile.close()
- if onNode == False:
- os.system( "scp " + tempFile + " admin@" + benchIp + ":" + nullLinkPath)
- if onNode == True:
- os.system( "scp " + tempFile + " sdn@" + benchIp + ":" + nullLinkPath)
-
+ except AssertionError:
+ main.log.info("Settings did not post to ONOS")
+ main.log.error(varification)
-
+ except:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.log.error(varification)
+ main.cleanup()
+ main.exit()
diff --git a/TestON/drivers/common/cli/quaggaclidriver.py b/TestON/drivers/common/cli/quaggaclidriver.py
index 5631c9b..bcd83f6 100644
--- a/TestON/drivers/common/cli/quaggaclidriver.py
+++ b/TestON/drivers/common/cli/quaggaclidriver.py
@@ -17,7 +17,20 @@
def connect( self, **connectargs ):
for key in connectargs:
vars( self )[ key ] = connectargs[ key ]
+ self.name = self.options[ 'name' ]
+ self.handle = super( QuaggaCliDriver, self ).connect(
+ user_name=self.user_name,
+ ip_address="127.0.0.1",
+ port=self.port,
+ pwd=self.pwd )
+ if self.handle:
+ return self.handle
+ else:
+ main.log.info( "NO HANDLE" )
+ return main.FALSE
+
+ def connectQuagga( self ):
self.name = self.options[ 'name' ]
# self.handle = super( QuaggaCliDriver,self ).connect(
# user_name=self.user_name, ip_address=self.ip_address,port=self.port,
@@ -177,11 +190,12 @@
routesJsonObj = json.loads( getRoutesResult )
allRoutesActual = []
- for route in routesJsonObj:
- if route[ 'prefix' ] == '172.16.10.0/24':
- continue
- allRoutesActual.append(
- route[ 'prefix' ] + "/" + route[ 'nextHop' ] )
+ for route in routesJsonObj['routes4']:
+ if 'prefix' in route:
+ if route[ 'prefix' ] == '172.16.10.0/24':
+ continue
+ allRoutesActual.append(
+ route[ 'prefix' ] + "/" + route[ 'nextHop' ] )
return sorted( allRoutesActual )
@@ -334,16 +348,35 @@
self.disconnect()
main.log.info( "Start to add routes" )
- for i in range( 0, len( routes ) ):
- routeCmd = "network " + routes[ i ]
+ chunk_size = 20
+
+ if len(routes) > chunk_size:
+ num_iter = (int) (len(routes) / chunk_size)
+ else:
+ num_iter = 1;
+
+ total = 0
+ for n in range( 0, num_iter + 1):
+ routeCmd = ""
+ if (len( routes ) - (n * chunk_size)) >= chunk_size:
+ m = (n + 1) * chunk_size
+ else:
+ m = len( routes )
+ for i in range( n * chunk_size, m ):
+ routeCmd = routeCmd + "network " + routes[ i ] + "\n"
+ total = total + 1
+
+ main.log.info(routeCmd)
try:
self.handle.sendline( routeCmd )
self.handle.expect( "bgpd", timeout=5 )
except Exception:
main.log.warn( "Failed to add route" )
self.disconnect()
+
# waitTimer = 1.00 / routeRate
- # time.sleep( waitTimer )
+ main.log.info("Total routes so far " + ((str) (total)) + " wait for 0 sec")
+ #time.sleep( 1 )
if routesAdded == len( routes ):
main.log.info( "Finished adding routes" )
return main.TRUE
@@ -406,6 +439,7 @@
main.log.info( "NO HANDLE" )
return main.FALSE
+
# Please use the generateRoutes plus addRoutes instead of this one!
def addRoute( self, net, numRoutes, routeRate ):
try:
@@ -565,6 +599,46 @@
# elif brand == "cisco" or brand == "CISCO":
# cisco( ip,user,passwd )
+ def disable_bgp_peer( self, peer, peer_as ):
+ main.log.info( "I am in disconnect_peer_session method!" )
+
+ try:
+ self.handle.sendline( "" )
+ # self.handle.expect( "config-router" )
+ self.handle.expect( "config-router", timeout=5 )
+ except:
+ main.log.warn( "Probably not in config-router mode!" )
+ self.disconnect()
+ main.log.info( "Start to disable peer" )
+
+ cmd = "no neighbor " + peer + " remote-as " + peer_as
+ try:
+ self.handle.sendline( cmd )
+ self.handle.expect( "bgpd", timeout=5 )
+ except:
+ main.log.warn( "Failed to disable peer" )
+ self.disconnect()
+
+ def enable_bgp_peer( self, peer, peer_as ):
+ main.log.info( "I am in enable_bgp_peer method!" )
+
+ try:
+ self.handle.sendline( "" )
+ # self.handle.expect( "config-router" )
+ self.handle.expect( "config-router", timeout=5 )
+ except:
+ main.log.warn( "Probably not in config-router mode!" )
+ self.disconnect()
+ main.log.info( "Start to disable peer" )
+
+ cmd = "neighbor " + peer + " remote-as " + peer_as
+ try:
+ self.handle.sendline( cmd )
+ self.handle.expect( "bgpd", timeout=5 )
+ except:
+ main.log.warn( "Failed to enable peer" )
+ self.disconnect()
+
def disconnect( self ):
"""
Called when Test is complete to disconnect the Quagga handle.
diff --git a/TestON/tests/HATestClusterRestart/HATestClusterRestart.py b/TestON/tests/HATestClusterRestart/HATestClusterRestart.py
index 6655f33..1205b11 100644
--- a/TestON/tests/HATestClusterRestart/HATestClusterRestart.py
+++ b/TestON/tests/HATestClusterRestart/HATestClusterRestart.py
@@ -49,7 +49,7 @@
main.case( "Setting up test environment" )
# TODO: save all the timers and output them for plotting
- # load some vairables from the params file
+ # load some variables from the params file
PULLCODE = False
if main.params[ 'Git' ] == 'True':
PULLCODE = True
@@ -57,38 +57,34 @@
cellName = main.params[ 'ENV' ][ 'cellName' ]
# set global variables
- global ONOS1Ip
global ONOS1Port
- global ONOS2Ip
global ONOS2Port
- global ONOS3Ip
global ONOS3Port
- global ONOS4Ip
global ONOS4Port
- global ONOS5Ip
global ONOS5Port
- global ONOS6Ip
global ONOS6Port
- global ONOS7Ip
global ONOS7Port
global numControllers
-
- ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
- ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
- ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
- ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
- ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
- ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
- ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
- ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
- ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
- ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
- ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
- ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
- ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
- ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
numControllers = int( main.params[ 'num_controllers' ] )
+ # FIXME: just get controller port from params?
+ # TODO: do we really need all these?
+ ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+ ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+ ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
+ ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
+ ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
+ ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
+ ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
+
+ global CLIs
+ CLIs = []
+ global nodes
+ nodes = []
+ for i in range( 1, numControllers + 1 ):
+ CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+ nodes.append( getattr( main, 'ONOS' + str( i ) ) )
+
main.step( "Applying cell variable to environment" )
cellResult = main.ONOSbench.setCell( cellName )
verifyResult = main.ONOSbench.verifyCell()
@@ -96,14 +92,10 @@
# FIXME:this is short term fix
main.log.report( "Removing raft logs" )
main.ONOSbench.onosRemoveRaftLogs()
+
main.log.report( "Uninstalling ONOS" )
- main.ONOSbench.onosUninstall( ONOS1Ip )
- main.ONOSbench.onosUninstall( ONOS2Ip )
- main.ONOSbench.onosUninstall( ONOS3Ip )
- main.ONOSbench.onosUninstall( ONOS4Ip )
- main.ONOSbench.onosUninstall( ONOS5Ip )
- main.ONOSbench.onosUninstall( ONOS6Ip )
- main.ONOSbench.onosUninstall( ONOS7Ip )
+ for node in nodes:
+ main.ONOSbench.onosUninstall( node.ip_address )
cleanInstallResult = main.TRUE
gitPullResult = main.TRUE
@@ -116,6 +108,8 @@
main.step( "Git checkout and pull " + gitBranch )
main.ONOSbench.gitCheckout( gitBranch )
gitPullResult = main.ONOSbench.gitPull()
+ if gitPullResult == main.ERROR:
+ main.log.error( "Error pulling git branch" )
main.step( "Using mvn clean & install" )
cleanInstallResult = main.ONOSbench.cleanInstall()
@@ -128,76 +122,38 @@
packageResult = main.ONOSbench.onosPackage()
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 )
- onos4InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS4Ip )
- onos5InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS5Ip )
- onos6InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS6Ip )
- onos7InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS7Ip )
- onosInstallResult = onos1InstallResult and onos2InstallResult\
- and onos3InstallResult and onos4InstallResult\
- and onos5InstallResult and onos6InstallResult\
- and onos7InstallResult
+ onosInstallResult = main.TRUE
+ for node in nodes:
+ tmpResult = main.ONOSbench.onosInstall( options="-f",
+ node=node.ip_address )
+ onosInstallResult = onosInstallResult and tmpResult
main.step( "Checking if ONOS is up yet" )
for i in range( 2 ):
- onos1Isup = main.ONOSbench.isup( ONOS1Ip )
- if not onos1Isup:
- main.log.report( "ONOS1 didn't start!" )
- main.ONOSbench.onosStop( ONOS1Ip )
- main.ONOSbench.onosStart( ONOS1Ip )
- onos2Isup = main.ONOSbench.isup( ONOS2Ip )
- if not onos2Isup:
- main.log.report( "ONOS2 didn't start!" )
- main.ONOSbench.onosStop( ONOS2Ip )
- main.ONOSbench.onosStart( ONOS2Ip )
- onos3Isup = main.ONOSbench.isup( ONOS3Ip )
- if not onos3Isup:
- main.log.report( "ONOS3 didn't start!" )
- main.ONOSbench.onosStop( ONOS3Ip )
- main.ONOSbench.onosStart( ONOS3Ip )
- onos4Isup = main.ONOSbench.isup( ONOS4Ip )
- if not onos4Isup:
- main.log.report( "ONOS4 didn't start!" )
- main.ONOSbench.onosStop( ONOS4Ip )
- main.ONOSbench.onosStart( ONOS4Ip )
- onos5Isup = main.ONOSbench.isup( ONOS5Ip )
- if not onos5Isup:
- main.log.report( "ONOS5 didn't start!" )
- main.ONOSbench.onosStop( ONOS5Ip )
- main.ONOSbench.onosStart( ONOS5Ip )
- onos6Isup = main.ONOSbench.isup( ONOS6Ip )
- if not onos6Isup:
- main.log.report( "ONOS6 didn't start!" )
- main.ONOSbench.onosStop( ONOS6Ip )
- main.ONOSbench.onosStart( ONOS6Ip )
- onos7Isup = main.ONOSbench.isup( ONOS7Ip )
- if not onos7Isup:
- main.log.report( "ONOS7 didn't start!" )
- main.ONOSbench.onosStop( ONOS7Ip )
- main.ONOSbench.onosStart( ONOS7Ip )
- onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
- and onos4Isup and onos5Isup and onos6Isup and onos7Isup
+ onosIsupResult = main.TRUE
+ for node in nodes:
+ started = main.ONOSbench.isup( node.ip_address )
+ if not started:
+ main.log.report( node.name + " didn't start!" )
+ main.ONOSbench.onosStop( node.ip_address )
+ main.ONOSbench.onosStart( node.ip_address )
+ onosIsupResult = onosIsupResult and started
if onosIsupResult == main.TRUE:
break
- cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
- cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
- cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
- cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
- cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
- cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
- cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
- cliResults = cliResult1 and cliResult2 and cliResult3 and\
- cliResult4 and cliResult5 and cliResult6 and cliResult7
+ main.log.step( "Starting ONOS CLI sessions" )
+ cliResults = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].startOnosCli,
+ name="startOnosCli-" + str( i ),
+ args=[nodes[i].ip_address] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ cliResults = cliResults and t.result
main.step( "Start Packet Capture MN" )
main.Mininet2.startTcpdump(
@@ -206,9 +162,28 @@
intf=main.params[ 'MNtcpdump' ][ 'intf' ],
port=main.params[ 'MNtcpdump' ][ 'port' ] )
+ appCheck = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].appToIDCheck,
+ name="appToIDCheck-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ appCheck = appCheck and t.result
+ utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+ onpass="App Ids seem to be correct",
+ onfail="Something is wrong with app Ids" )
+ if appCheck != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
+
case1Result = ( cleanInstallResult and packageResult and
cellResult and verifyResult and onosInstallResult
- and onosIsupResult and cliResults )
+ and onosIsupResult and cliResults and appCheck)
utilities.assert_equals( expect=main.TRUE, actual=case1Result,
onpass="Test startup successful",
@@ -223,22 +198,36 @@
Assign mastership to controllers
"""
import re
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
+ assert ONOS1Port, "ONOS1Port not defined"
+ assert ONOS2Port, "ONOS2Port not defined"
+ assert ONOS3Port, "ONOS3Port not defined"
+ assert ONOS4Port, "ONOS4Port not defined"
+ assert ONOS5Port, "ONOS5Port not defined"
+ assert ONOS6Port, "ONOS6Port not defined"
+ assert ONOS7Port, "ONOS7Port not defined"
main.log.report( "Assigning switches to controllers" )
main.case( "Assigning Controllers" )
main.step( "Assign switches to controllers" )
+ # TODO: rewrite this function to take lists of ips and ports?
+ # or list of tuples?
for i in range( 1, 29 ):
main.Mininet1.assignSwController(
sw=str( i ),
count=numControllers,
- ip1=ONOS1Ip, port1=ONOS1Port,
- ip2=ONOS2Ip, port2=ONOS2Port,
- ip3=ONOS3Ip, port3=ONOS3Port,
- ip4=ONOS4Ip, port4=ONOS4Port,
- ip5=ONOS5Ip, port5=ONOS5Port,
- ip6=ONOS6Ip, port6=ONOS6Port,
- ip7=ONOS7Ip, port7=ONOS7Port )
+ ip1=nodes[ 0 ].ip_address, port1=ONOS1Port,
+ ip2=nodes[ 1 ].ip_address, port2=ONOS2Port,
+ ip3=nodes[ 2 ].ip_address, port3=ONOS3Port,
+ ip4=nodes[ 3 ].ip_address, port4=ONOS4Port,
+ ip5=nodes[ 4 ].ip_address, port5=ONOS5Port,
+ ip6=nodes[ 5 ].ip_address, port6=ONOS6Port,
+ ip7=nodes[ 6 ].ip_address, port7=ONOS7Port )
mastershipCheck = main.TRUE
for i in range( 1, 29 ):
@@ -247,16 +236,14 @@
main.log.info( str( response ) )
except Exception:
main.log.info( repr( response ) )
- if re.search( "tcp:" + ONOS1Ip, response )\
- and re.search( "tcp:" + ONOS2Ip, response )\
- and re.search( "tcp:" + ONOS3Ip, response )\
- and re.search( "tcp:" + ONOS4Ip, response )\
- and re.search( "tcp:" + ONOS5Ip, response )\
- and re.search( "tcp:" + ONOS6Ip, response )\
- and re.search( "tcp:" + ONOS7Ip, response ):
- mastershipCheck = mastershipCheck and main.TRUE
- else:
- mastershipCheck = main.FALSE
+ for node in nodes:
+ if re.search( "tcp:" + node.ip_address, response ):
+ mastershipCheck = mastershipCheck and main.TRUE
+ else:
+ main.log.error( "Error, node " + node.ip_address + " is " +
+ "not in the list of controllers s" +
+ str( i ) + " is connecting to." )
+ mastershipCheck = main.FALSE
if mastershipCheck == main.TRUE:
main.log.report( "Switch mastership assigned correctly" )
utilities.assert_equals(
@@ -264,135 +251,65 @@
actual=mastershipCheck,
onpass="Switch mastership assigned correctly",
onfail="Switches not assigned correctly to controllers" )
-
# Manually assign mastership to the controller we want
roleCall = main.TRUE
roleCheck = main.TRUE
try:
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
- assert deviceId, "No device id for s1 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS1Ip )
- # Check assignment
- if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
- assert deviceId, "No device id for s28 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS1Ip )
- # Check assignment
- if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
- assert deviceId, "No device id for s2 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS2Ip )
- # Check assignment
- if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
- assert deviceId, "No device id for s3 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS2Ip )
- # Check assignment
- if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
- assert deviceId, "No device id for s5 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS3Ip )
- # Check assignment
- if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
- assert deviceId, "No device id for s6 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS3Ip )
- # Check assignment
- if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
- assert deviceId, "No device id for s4 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS4Ip )
- # Check assignment
- if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- for i in range( 8, 18 ):
- dpid = '3' + str( i ).zfill( 3 )
- deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
- assert deviceId, "No device id for s%i in ONOS" % i
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS5Ip )
+ for i in range( 1, 29 ): # switches 1 through 28
+ # set up correct variables:
+ if i == 1:
+ ip = nodes[ 0 ].ip_address # ONOS1
+ deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+ elif i == 2:
+ ip = nodes[ 1 ].ip_address # ONOS2
+ deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+ elif i == 3:
+ ip = nodes[ 1 ].ip_address # ONOS2
+ deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+ elif i == 4:
+ ip = nodes[ 3 ].ip_address # ONOS4
+ deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+ elif i == 5:
+ ip = nodes[ 2 ].ip_address # ONOS3
+ deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+ elif i == 6:
+ ip = nodes[ 2 ].ip_address # ONOS3
+ deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+ elif i == 7:
+ ip = nodes[ 5 ].ip_address # ONOS6
+ deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+ elif i >= 8 and i <= 17:
+ ip = nodes[ 4 ].ip_address # ONOS5
+ dpid = '3' + str( i ).zfill( 3 )
+ deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+ elif i >= 18 and i <= 27:
+ ip = nodes[ 6 ].ip_address # ONOS7
+ dpid = '6' + str( i ).zfill( 3 )
+ deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+ elif i == 28:
+ ip = nodes[ 0 ].ip_address # ONOS1
+ deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+ else:
+ main.log.error( "You didn't write an else statement for " +
+ "switch s" + str( i ) )
+ # Assign switch
+ assert deviceId, "No device id for s" + str( i ) + " in ONOS"
+ # TODO: make this controller dynamic
+ roleCall = roleCall and main.ONOScli1.deviceRole( deviceId,
+ ip )
# Check assignment
- if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+ master = main.ONOScli1.getRole( deviceId ).get( 'master' )
+ if ip in master:
roleCheck = roleCheck and main.TRUE
else:
roleCheck = roleCheck and main.FALSE
-
- deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
- assert deviceId, "No device id for s7 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS6Ip )
- # Check assignment
- if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- for i in range( 18, 28 ):
- dpid = '6' + str( i ).zfill( 3 )
- deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
- assert deviceId, "No device id for s%i in ONOS" % i
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS7Ip )
- # Check assignment
- if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
+ main.log.error( "Error, controller " + ip + " is not" +
+ " master " + "of device " +
+ str( deviceId ) + ". Master is " +
+ repr( master ) + "." )
except ( AttributeError, AssertionError ):
main.log.exception( "Something is wrong with ONOS device view" )
main.log.info( main.ONOScli1.devices() )
-
utilities.assert_equals(
expect=main.TRUE,
actual=roleCall,
@@ -419,6 +336,11 @@
# datastore!
import time
import json
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
main.log.report( "Adding host intents" )
main.case( "Adding host Intents" )
@@ -427,39 +349,66 @@
# install onos-app-fwd
main.log.info( "Install reactive forwarding app" )
- main.ONOScli1.featureInstall( "onos-app-fwd" )
- main.ONOScli2.featureInstall( "onos-app-fwd" )
- main.ONOScli3.featureInstall( "onos-app-fwd" )
- main.ONOScli4.featureInstall( "onos-app-fwd" )
- main.ONOScli5.featureInstall( "onos-app-fwd" )
- main.ONOScli6.featureInstall( "onos-app-fwd" )
- main.ONOScli7.featureInstall( "onos-app-fwd" )
+ appResults = CLIs[0].activateApp( "org.onosproject.fwd" )
+
+ # FIXME: add this to asserts
+ appCheck = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].appToIDCheck,
+ name="appToIDCheck-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ appCheck = appCheck and t.result
+ utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+ onpass="App Ids seem to be correct",
+ onfail="Something is wrong with app Ids" )
+ if appCheck != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
# REACTIVE FWD test
pingResult = main.FALSE
- time1 = time.time()
- pingResult = main.Mininet1.pingall()
- utilities.assert_equals(
- expect=main.TRUE,
- actual=pingResult,
- onpass="Reactive Pingall test passed",
- onfail="Reactive Pingall failed, one or more ping pairs failed" )
- time2 = time.time()
- main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
+ for i in range(2): # Retry if pingall fails first time
+ time1 = time.time()
+ pingResult = main.Mininet1.pingall()
+ utilities.assert_equals(
+ expect=main.TRUE,
+ actual=pingResult,
+ onpass="Reactive Pingall test passed",
+ onfail="Reactive Pingall failed, one or more ping pairs failed" )
+ time2 = time.time()
+ main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
# uninstall onos-app-fwd
main.log.info( "Uninstall reactive forwarding app" )
- main.ONOScli1.featureUninstall( "onos-app-fwd" )
- main.ONOScli2.featureUninstall( "onos-app-fwd" )
- main.ONOScli3.featureUninstall( "onos-app-fwd" )
- main.ONOScli4.featureUninstall( "onos-app-fwd" )
- main.ONOScli5.featureUninstall( "onos-app-fwd" )
- main.ONOScli6.featureUninstall( "onos-app-fwd" )
- main.ONOScli7.featureUninstall( "onos-app-fwd" )
- # timeout for fwd flows
- time.sleep( 10 )
+ appResults = appResults and CLIs[0].deactivateApp( "org.onosproject.fwd" )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].appToIDCheck,
+ name="appToIDCheck-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
- main.step( "Add host intents" )
+ for t in threads:
+ t.join()
+ appCheck = appCheck and t.result
+ utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+ onpass="App Ids seem to be correct",
+ onfail="Something is wrong with app Ids" )
+ if appCheck != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
+
+ # timeout for fwd flows
+ time.sleep( 11 )
+
+ main.step( "Add host intents" )
intentIds = []
# TODO: move the host numbers to params
# Maybe look at all the paths we ping?
@@ -481,42 +430,57 @@
host1Id = host1Dict.get( 'id', None )
host2Id = host2Dict.get( 'id', None )
if host1Id and host2Id:
-
- tmpId = main.ONOScli1.addHostIntent(
- host1Id,
- host2Id )
+ nodeNum = ( i % 7 )
+ tmpId = CLIs[ nodeNum ].addHostIntent( host1Id, host2Id )
if tmpId:
main.log.info( "Added intent with id: " + tmpId )
intentIds.append( tmpId )
else:
- main.log.error( "addHostIntent reutrned None" )
+ main.log.error( "addHostIntent returned: " +
+ repr( tmpId ) )
else:
- main.log.error( "Error, getHost() failed" )
- main.log.warn( json.dumps( json.loads( main.ONOScli1.hosts() ),
- sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ main.log.error( "Error, getHost() failed for h" + str( i ) +
+ " and/or h" + str( i + 10 ) )
+ hosts = CLIs[ 0 ].hosts()
+ main.log.warn( "Hosts output: " )
+ try:
+ main.log.warn( json.dumps( json.loads( hosts ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( hosts ) )
hostResult = main.FALSE
+ # FIXME: DEBUG
+ intentStart = time.time()
onosIds = main.ONOScli1.getAllIntentsId()
main.log.info( "Submitted intents: " + str( intentIds ) )
main.log.info( "Intents in ONOS: " + str( onosIds ) )
for intent in intentIds:
if intent in onosIds:
- pass # intent submitted is still in onos
+ pass # intent submitted is in onos
else:
intentAddResult = False
+ # FIXME: DEBUG
+ if intentAddResult:
+ intentStop = time.time()
+ else:
+ intentStop = None
# Print the intent states
intents = main.ONOScli1.intents()
intentStates = []
installedCheck = True
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
- for intent in json.loads( intents ): # Iter through intents of a node
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents" )
# add submitted intents not in the store
tmplist = [ i for i, s in intentStates ]
missingIntents = False
@@ -529,17 +493,59 @@
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- # for node in nodes:
- # node.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
pendingMap = main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
+
intentAddResult = bool( pingResult and hostResult and intentAddResult
and not missingIntents and installedCheck )
utilities.assert_equals(
@@ -547,6 +553,29 @@
actual=intentAddResult,
onpass="Pushed host intents to ONOS",
onfail="Error in pushing host intents to ONOS" )
+ for i in range(100):
+ onosIds = main.ONOScli1.getAllIntentsId()
+ main.log.info( "Submitted intents: " + str( sorted( intentIds ) ) )
+ main.log.info( "Intents in ONOS: " + str( sorted( onosIds ) ) )
+ if sorted(onosIds) == sorted(intentIds):
+ break
+ else:
+ time.sleep(1)
+ # FIXME: DEBUG
+ if not intentStop:
+ intentStop = time.time()
+ gossipTime = intentStop - intentStart
+ main.log.info( "It took about " + str( gossipTime ) +
+ " seconds for all intents to appear on ONOS1" )
+ # FIXME: make this time configurable/calculate based off of number of
+ # nodes and gossip rounds
+ utilities.assert_greater_equals(
+ expect=30, actual=gossipTime,
+ onpass="ECM anti-entropy for intents worked within " +
+ "expected time",
+ onfail="Intent ECM anti-entropy took too long" )
+ if gossipTime <= 30:
+ intentAddResult = True
if not intentAddResult or "key" in pendingMap:
import time
@@ -561,13 +590,16 @@
intentStates = []
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
- for intent in json.loads( intents ):
- # Iter through intents of a node
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ # Iter through intents of a node
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents" )
# add submitted intents not in the store
tmplist = [ i for i, s in intentStates ]
for i in intentIds:
@@ -578,20 +610,73 @@
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
def CASE4( self, main ):
"""
Ping across added host intents
"""
import json
+ import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
description = " Ping across added host intents"
main.log.report( description )
main.case( description )
@@ -610,11 +695,15 @@
main.log.report(
"Intents have not been installed correctly, pings failed." )
# TODO: pretty print
- main.log.warn( "ONSO1 intents: " )
- main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
- sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ main.log.warn( "ONOS1 intents: " )
+ try:
+ tmpIntents = main.ONOScli1.intents()
+ main.log.warn( json.dumps( json.loads( tmpIntents ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( tmpIntents ) )
if PingResult == main.TRUE:
main.log.report(
"Intents have been installed correctly and verified by pings" )
@@ -632,28 +721,79 @@
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
# Iter through intents of a node
- for intent in json.loads( intents ):
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents." )
intentStates.sort()
for i, s in intentStates:
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
+
if not installedCheck:
- main.log.info( "Waiting 60 seconds to see if intent states change" )
+ main.log.info( "Waiting 60 seconds to see if the state of " +
+ "intents change" )
time.sleep( 60 )
# Print the intent states
intents = main.ONOScli1.intents()
@@ -661,32 +801,87 @@
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
# Iter through intents of a node
- for intent in json.loads( intents ):
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents." )
intentStates.sort()
for i, s in intentStates:
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
def CASE5( self, main ):
"""
Reading state of ONOS
"""
import json
+ import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# assumes that sts is already in you PYTHONPATH
from sts.topology.teston_topology import TestONTopology
@@ -694,344 +889,232 @@
main.case( "Setting up and gathering data for current state" )
# The general idea for this test case is to pull the state of
# ( intents,flows, topology,... ) from each ONOS node
- # We can then compare them with eachother and also with past states
+ # We can then compare them with each other and also with past states
- main.step( "Get the Mastership of each switch from each controller" )
+ main.step( "Check that each switch has a master" )
global mastershipState
- mastershipState = []
+ mastershipState = '[]'
# Assert that each device has a master
- ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
- ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
- ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
- ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
- ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
- ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
- ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
- rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
- ONOS3MasterNotNull and ONOS4MasterNotNull and\
- ONOS5MasterNotNull and ONOS6MasterNotNull and\
- ONOS7MasterNotNull
+ rolesNotNull = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].rolesNotNull,
+ name="rolesNotNull-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ rolesNotNull = rolesNotNull and t.result
utilities.assert_equals(
expect=main.TRUE,
actual=rolesNotNull,
onpass="Each device has a master",
onfail="Some devices don't have a master assigned" )
- ONOS1Mastership = main.ONOScli1.roles()
- ONOS2Mastership = main.ONOScli2.roles()
- ONOS3Mastership = main.ONOScli3.roles()
- ONOS4Mastership = main.ONOScli4.roles()
- ONOS5Mastership = main.ONOScli5.roles()
- ONOS6Mastership = main.ONOScli6.roles()
- ONOS7Mastership = main.ONOScli7.roles()
- if "Error" in ONOS1Mastership or not ONOS1Mastership\
- or "Error" in ONOS2Mastership or not ONOS2Mastership\
- or "Error" in ONOS3Mastership or not ONOS3Mastership\
- or "Error" in ONOS4Mastership or not ONOS4Mastership\
- or "Error" in ONOS5Mastership or not ONOS5Mastership\
- or "Error" in ONOS6Mastership or not ONOS6Mastership\
- or "Error" in ONOS7Mastership or not ONOS7Mastership:
- main.log.report( "Error in getting ONOS roles" )
- main.log.warn(
- "ONOS1 mastership response: " +
- repr( ONOS1Mastership ) )
- main.log.warn(
- "ONOS2 mastership response: " +
- repr( ONOS2Mastership ) )
- main.log.warn(
- "ONOS3 mastership response: " +
- repr( ONOS3Mastership ) )
- main.log.warn(
- "ONOS4 mastership response: " +
- repr( ONOS4Mastership ) )
- main.log.warn(
- "ONOS5 mastership response: " +
- repr( ONOS5Mastership ) )
- main.log.warn(
- "ONOS6 mastership response: " +
- repr( ONOS6Mastership ) )
- main.log.warn(
- "ONOS7 mastership response: " +
- repr( ONOS7Mastership ) )
- consistentMastership = main.FALSE
- elif ONOS1Mastership == ONOS2Mastership\
- and ONOS1Mastership == ONOS3Mastership\
- and ONOS1Mastership == ONOS4Mastership\
- and ONOS1Mastership == ONOS5Mastership\
- and ONOS1Mastership == ONOS6Mastership\
- and ONOS1Mastership == ONOS7Mastership:
- mastershipState = ONOS1Mastership
- consistentMastership = main.TRUE
+ main.step( "Get the Mastership of each switch from each controller" )
+ ONOSMastership = []
+ mastershipCheck = main.FALSE
+ consistentMastership = True
+ rolesResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].roles,
+ name="roles-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSMastership.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSMastership[i] or "Error" in ONOSMastership[i]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " roles" )
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " mastership response: " +
+ repr( ONOSMastership[i] ) )
+ rolesResults = False
+ utilities.assert_equals(
+ expect=True,
+ actual=rolesResults,
+ onpass="No error in reading roles output",
+ onfail="Error in reading roles from ONOS" )
+
+ main.step( "Check for consistency in roles from each controller" )
+ if all([ i == ONOSMastership[ 0 ] for i in ONOSMastership ] ):
main.log.report(
"Switch roles are consistent across all ONOS nodes" )
else:
- main.log.warn(
- "ONOS1 roles: ",
- json.dumps(
- json.loads( ONOS1Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS2 roles: ",
- json.dumps(
- json.loads( ONOS2Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS3 roles: ",
- json.dumps(
- json.loads( ONOS3Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS4 roles: ",
- json.dumps(
- json.loads( ONOS4Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS5 roles: ",
- json.dumps(
- json.loads( ONOS5Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS6 roles: ",
- json.dumps(
- json.loads( ONOS6Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS7 roles: ",
- json.dumps(
- json.loads( ONOS7Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- consistentMastership = main.FALSE
+ consistentMastership = False
utilities.assert_equals(
- expect=main.TRUE,
+ expect=True,
actual=consistentMastership,
onpass="Switch roles are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of switch roles" )
+ if rolesResults and not consistentMastership:
+ for i in range( numControllers ):
+ try:
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " roles: ",
+ json.dumps(
+ json.loads( ONOSMastership[ i ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( ONOSMastership[ i ] ) )
+ elif rolesResults and consistentMastership:
+ mastershipCheck = main.TRUE
+ mastershipState = ONOSMastership[ 0 ]
+
main.step( "Get the intents from each controller" )
global intentState
intentState = []
- ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
- ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
- ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
- ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
- ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
- ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
- ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+ ONOSIntents = []
intentCheck = main.FALSE
- if "Error" in ONOS1Intents or not ONOS1Intents\
- or "Error" in ONOS2Intents or not ONOS2Intents\
- or "Error" in ONOS3Intents or not ONOS3Intents\
- or "Error" in ONOS4Intents or not ONOS4Intents\
- or "Error" in ONOS5Intents or not ONOS5Intents\
- or "Error" in ONOS6Intents or not ONOS6Intents\
- or "Error" in ONOS7Intents or not ONOS7Intents:
- main.log.report( "Error in getting ONOS intents" )
- main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
- main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
- main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
- main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
- main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
- main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
- main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
- elif ONOS1Intents == ONOS2Intents\
- and ONOS1Intents == ONOS3Intents\
- and ONOS1Intents == ONOS4Intents\
- and ONOS1Intents == ONOS5Intents\
- and ONOS1Intents == ONOS6Intents\
- and ONOS1Intents == ONOS7Intents:
- intentState = ONOS1Intents
- intentCheck = main.TRUE
- main.log.report( "Intents are consistent across all ONOS nodes" )
- else:
- main.log.warn(
- "ONOS1 intents: ",
- json.dumps(
- json.loads( ONOS1Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS2 intents: ",
- json.dumps(
- json.loads( ONOS2Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS3 intents: ",
- json.dumps(
- json.loads( ONOS3Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS4 intents: ",
- json.dumps(
- json.loads( ONOS4Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS5 intents: ",
- json.dumps(
- json.loads( ONOS5Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS6 intents: ",
- json.dumps(
- json.loads( ONOS6Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS7 intents: ",
- json.dumps(
- json.loads( ONOS7Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
+ consistentIntents = True
+ intentsResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].intents,
+ name="intents-" + str( i ),
+ args=[],
+ kwargs={ 'jsonFormat': True } )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSIntents.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSIntents[ i ] or "Error" in ONOSIntents[ i ]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " intents" )
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents response: " +
+ repr( ONOSIntents[ i ] ) )
+ intentsResults = False
utilities.assert_equals(
- expect=main.TRUE,
- actual=intentCheck,
+ expect=True,
+ actual=intentsResults,
+ onpass="No error in reading intents output",
+ onfail="Error in reading intents from ONOS" )
+
+ main.step( "Check for consistency in Intents from each controller" )
+ if all([ sorted( i ) == sorted( ONOSIntents[ 0 ] ) for i in ONOSIntents ] ):
+ main.log.report( "Intents are consistent across all ONOS " +
+ "nodes" )
+ else:
+ consistentIntents = False
+ main.log.report( "Intents not consistent" )
+ utilities.assert_equals(
+ expect=True,
+ actual=consistentIntents,
onpass="Intents are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of intents" )
+ if intentsResults and not consistentIntents:
+ n = len(ONOSIntents)
+ main.log.warn( "ONOS" + str( n ) + " intents: " )
+ main.log.warn( json.dumps( json.loads( ONOSIntents[ -1 ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ for i in range( numControllers ):
+ if ONOSIntents[ i ] != ONOSIntents[ -1 ]:
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents: " )
+ main.log.warn( json.dumps( json.loads( ONOSIntents[i] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ else:
+ main.log.warn( nodes[ i ].name + " intents match ONOS" +
+ str( n ) + " intents" )
+ elif intentsResults and consistentIntents:
+ intentCheck = main.TRUE
+ intentState = ONOSIntents[ 0 ]
+
main.step( "Get the flows from each controller" )
global flowState
flowState = []
+ ONOSFlows = []
+ ONOSFlowsJson = []
flowCheck = main.FALSE
- try:
- ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
- ONOS2Flows = main.ONOScli2.flows( jsonFormat=True )
- ONOS3Flows = main.ONOScli3.flows( jsonFormat=True )
- ONOS4Flows = main.ONOScli4.flows( jsonFormat=True )
- ONOS5Flows = main.ONOScli5.flows( jsonFormat=True )
- ONOS6Flows = main.ONOScli6.flows( jsonFormat=True )
- ONOS7Flows = main.ONOScli7.flows( jsonFormat=True )
- assert ONOS1Flows, "ONOS1 Flows should not be empty"
- assert ONOS2Flows, "ONOS2 Flows should not be empty"
- assert ONOS3Flows, "ONOS3 Flows should not be empty"
- assert ONOS4Flows, "ONOS4 Flows should not be empty"
- assert ONOS5Flows, "ONOS5 Flows should not be empty"
- assert ONOS6Flows, "ONOS6 Flows should not be empty"
- assert ONOS7Flows, "ONOS7 Flows should not be empty"
- assert "Error" not in ONOS1Flows, "ONOS1 Flows contains 'Error'"
- assert "Error" not in ONOS2Flows, "ONOS2 Flows contains 'Error'"
- assert "Error" not in ONOS3Flows, "ONOS3 Flows contains 'Error'"
- assert "Error" not in ONOS4Flows, "ONOS4 Flows contains 'Error'"
- assert "Error" not in ONOS5Flows, "ONOS5 Flows contains 'Error'"
- assert "Error" not in ONOS6Flows, "ONOS6 Flows contains 'Error'"
- assert "Error" not in ONOS7Flows, "ONOS7 Flows contains 'Error'"
- ONOS1FlowsJson = json.loads( ONOS1Flows )
- ONOS2FlowsJson = json.loads( ONOS2Flows )
- ONOS3FlowsJson = json.loads( ONOS3Flows )
- ONOS4FlowsJson = json.loads( ONOS4Flows )
- ONOS5FlowsJson = json.loads( ONOS5Flows )
- ONOS6FlowsJson = json.loads( ONOS6Flows )
- ONOS7FlowsJson = json.loads( ONOS7Flows )
- except ( ValueError, AssertionError ): # From json.loads, or asserts
- main.log.exception( "One or more 'flows' responses from " +
- "ONOS couldn't be decoded." )
- main.log.warn( "ONOS1 flows repsponse: " + ONOS1Flows )
- main.log.warn( "ONOS2 flows repsponse: " + ONOS2Flows )
- main.log.warn( "ONOS3 flows repsponse: " + ONOS3Flows )
- main.log.warn( "ONOS4 flows repsponse: " + ONOS4Flows )
- main.log.warn( "ONOS5 flows repsponse: " + ONOS5Flows )
- main.log.warn( "ONOS6 flows repsponse: " + ONOS6Flows )
- main.log.warn( "ONOS7 flows repsponse: " + ONOS7Flows )
- else: # No exceptions
- if len( ONOS1FlowsJson ) == len( ONOS2FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS3FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS4FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS5FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS6FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS7FlowsJson ):
- # TODO: Do a better check, maybe compare flows on switches?
- # NOTE Possible issue with this not always being set?
- flowState = ONOS1Flows
- flowCheck = main.TRUE
- main.log.report( "Flow count is consistent across all" +
- " ONOS nodes" )
+ consistentFlows = True
+ flowsResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].flows,
+ name="flows-" + str( i ),
+ args=[],
+ kwargs={ 'jsonFormat': True } )
+ threads.append( t )
+ t.start()
+
+ # NOTE: Flows command can take some time to run
+ time.sleep(30)
+ for t in threads:
+ t.join()
+ result = t.result
+ ONOSFlows.append( result )
+
+ for i in range( numControllers ):
+ num = str( i + 1 )
+ if not ONOSFlows[ i ] or "Error" in ONOSFlows[ i ]:
+ main.log.report( "Error in getting ONOS" + num + " flows" )
+ main.log.warn( "ONOS" + num + " flows response: " +
+ repr( ONOSFlows[ i ] ) )
+ flowsResults = False
+ ONOSFlowsJson.append( None )
else:
- main.log.warn( "ONOS1 flows: " +
- json.dumps( ONOS1FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS2 flows: " +
- json.dumps( ONOS2FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS3 flows: " +
- json.dumps( ONOS3FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS4 flows: " +
- json.dumps( ONOS4FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS5 flows: " +
- json.dumps( ONOS5FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS6 flows: " +
- json.dumps( ONOS6FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS7 flows: " +
- json.dumps( ONOS7FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ try:
+ ONOSFlowsJson.append( json.loads( ONOSFlows[ i ] ) )
+ except ( ValueError, TypeError ):
+ # FIXME: change this to log.error?
+ main.log.exception( "Error in parsing ONOS" + num +
+ " response as json." )
+ main.log.error( repr( ONOSFlows[ i ] ) )
+ ONOSFlowsJson.append( None )
+ flowsResults = False
utilities.assert_equals(
- expect=main.TRUE,
- actual=flowCheck,
+ expect=True,
+ actual=flowsResults,
+ onpass="No error in reading flows output",
+ onfail="Error in reading flows from ONOS" )
+
+ main.step( "Check for consistency in Flows from each controller" )
+ tmp = [ len( i ) == len( ONOSFlowsJson[ 0 ] ) for i in ONOSFlowsJson ]
+ if all( tmp ):
+ main.log.report( "Flow count is consistent across all ONOS nodes" )
+ else:
+ consistentFlows = False
+ utilities.assert_equals(
+ expect=True,
+ actual=consistentFlows,
onpass="The flow count is consistent across all ONOS nodes",
onfail="ONOS nodes have different flow counts" )
+ if flowsResults and not consistentFlows:
+ for i in range( numControllers ):
+ try:
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " flows: " +
+ json.dumps( json.loads( ONOSFlows[i] ), sort_keys=True,
+ indent=4, separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " flows: " +
+ repr( ONOSFlows[ i ] ) )
+ elif flowsResults and consistentFlows:
+ flowCheck = main.TRUE
+ flowState = ONOSFlows[ 0 ]
+
main.step( "Get the OF Table entries" )
global flows
flows = []
@@ -1086,64 +1169,80 @@
main.step( "Create TestONTopology object" )
ctrls = []
- count = 1
- while True:
- temp = ()
- if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
- temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
- temp = temp + ( "ONOS" + str( count ), )
- temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
- temp = temp + \
- ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
- ctrls.append( temp )
- count = count + 1
- else:
- break
- MNTopo = TestONTopology(
- main.Mininet1,
- ctrls ) # can also add Intent API info for intent operations
+ for node in nodes:
+ temp = ( node, node.name, node.ip_address, 6633 )
+ ctrls.append( temp )
+ MNTopo = TestONTopology( main.Mininet1, ctrls )
main.step( "Collecting topology information from ONOS" )
devices = []
- devices.append( main.ONOScli1.devices() )
- devices.append( main.ONOScli2.devices() )
- devices.append( main.ONOScli3.devices() )
- devices.append( main.ONOScli4.devices() )
- devices.append( main.ONOScli5.devices() )
- devices.append( main.ONOScli6.devices() )
- devices.append( main.ONOScli7.devices() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].devices,
+ name="devices-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ devices.append( t.result )
hosts = []
- hosts.append( json.loads( main.ONOScli1.hosts() ) )
- hosts.append( json.loads( main.ONOScli2.hosts() ) )
- hosts.append( json.loads( main.ONOScli3.hosts() ) )
- hosts.append( json.loads( main.ONOScli4.hosts() ) )
- hosts.append( json.loads( main.ONOScli5.hosts() ) )
- hosts.append( json.loads( main.ONOScli6.hosts() ) )
- hosts.append( json.loads( main.ONOScli7.hosts() ) )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].hosts,
+ name="hosts-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ try:
+ hosts.append( json.loads( t.result ) )
+ except ( ValueError, TypeError ):
+ # FIXME: better handling of this, print which node
+ # Maybe use thread name?
+ main.log.exception( "Error parsing json output of hosts" )
+ # FIXME: should this be an empty json object instead?
+ hosts.append( None )
+
ports = []
- ports.append( main.ONOScli1.ports() )
- ports.append( main.ONOScli2.ports() )
- ports.append( main.ONOScli3.ports() )
- ports.append( main.ONOScli4.ports() )
- ports.append( main.ONOScli5.ports() )
- ports.append( main.ONOScli6.ports() )
- ports.append( main.ONOScli7.ports() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].ports,
+ name="ports-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ports.append( t.result )
links = []
- links.append( main.ONOScli1.links() )
- links.append( main.ONOScli2.links() )
- links.append( main.ONOScli3.links() )
- links.append( main.ONOScli4.links() )
- links.append( main.ONOScli5.links() )
- links.append( main.ONOScli6.links() )
- links.append( main.ONOScli7.links() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].links,
+ name="links-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ links.append( t.result )
clusters = []
- clusters.append( main.ONOScli1.clusters() )
- clusters.append( main.ONOScli2.clusters() )
- clusters.append( main.ONOScli3.clusters() )
- clusters.append( main.ONOScli4.clusters() )
- clusters.append( main.ONOScli5.clusters() )
- clusters.append( main.ONOScli6.clusters() )
- clusters.append( main.ONOScli7.clusters() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].clusters,
+ name="clusters-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ clusters.append( t.result )
# Compare json objects for hosts and dataplane clusters
# hosts
@@ -1177,10 +1276,9 @@
for controller in range( 0, len( hosts ) ):
controllerStr = str( controller + 1 )
for host in hosts[ controller ]:
- if host.get( 'ips', [] ) == []:
- main.log.error(
- "DEBUG:Error with host ips on controller" +
- controllerStr + ": " + str( host ) )
+ if not host.get( 'ips', [ ] ):
+ main.log.error( "DEBUG:Error with host ips on controller" +
+ controllerStr + ": " + str( host ) )
ipResult = main.FALSE
utilities.assert_equals(
expect=main.TRUE,
@@ -1191,12 +1289,12 @@
# Strongly connected clusters of devices
consistentClustersResult = main.TRUE
for controller in range( len( clusters ) ):
+ controllerStr = str( controller + 1 )
if "Error" not in clusters[ controller ]:
if clusters[ controller ] == clusters[ 0 ]:
continue
else: # clusters not consistent
- main.log.report( "clusters from ONOS" +
- controllerStr +
+ main.log.report( "clusters from ONOS" + controllerStr +
" is inconsistent with ONOS1" )
consistentClustersResult = main.FALSE
@@ -1213,7 +1311,11 @@
onpass="Clusters view is consistent across all ONOS nodes",
onfail="ONOS nodes have different views of clusters" )
# there should always only be one cluster
- numClusters = len( json.loads( clusters[ 0 ] ) )
+ try:
+ numClusters = len( json.loads( clusters[ 0 ] ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing clusters[0]: " +
+ repr( clusters[ 0 ] ) )
clusterResults = main.FALSE
if numClusters == 1:
clusterResults = main.TRUE
@@ -1232,8 +1334,7 @@
if devices[ controller ] or "Error" not in devices[ controller ]:
currentDevicesResult = main.Mininet1.compareSwitches(
MNTopo,
- json.loads(
- devices[ controller ] ) )
+ json.loads( devices[ controller ] ) )
else:
currentDevicesResult = main.FALSE
utilities.assert_equals( expect=main.TRUE,
@@ -1246,8 +1347,7 @@
if ports[ controller ] or "Error" not in ports[ controller ]:
currentPortsResult = main.Mininet1.comparePorts(
MNTopo,
- json.loads(
- ports[ controller ] ) )
+ json.loads( ports[ controller ] ) )
else:
currentPortsResult = main.FALSE
utilities.assert_equals( expect=main.TRUE,
@@ -1260,8 +1360,7 @@
if links[ controller ] or "Error" not in links[ controller ]:
currentLinksResult = main.Mininet1.compareLinks(
MNTopo,
- json.loads(
- links[ controller ] ) )
+ json.loads( links[ controller ] ) )
else:
currentLinksResult = main.FALSE
utilities.assert_equals( expect=main.TRUE,
@@ -1275,16 +1374,17 @@
portsResults = portsResults and currentPortsResult
linksResults = linksResults and currentLinksResult
- topoResult = devicesResults and portsResults and linksResults\
- and consistentHostsResult and consistentClustersResult\
- and clusterResults and ipResult
+ topoResult = ( devicesResults and portsResults and linksResults
+ and consistentHostsResult and consistentClustersResult
+ and clusterResults and ipResult )
utilities.assert_equals( expect=main.TRUE, actual=topoResult,
onpass="Topology Check Test successful",
onfail="Topology Check Test NOT successful" )
finalAssert = main.TRUE
- finalAssert = finalAssert and topoResult and flowCheck \
- and intentCheck and consistentMastership and rolesNotNull
+ finalAssert = ( finalAssert and topoResult and flowCheck
+ and intentCheck and consistentMastership
+ and mastershipCheck and rolesNotNull )
utilities.assert_equals( expect=main.TRUE, actual=finalAssert,
onpass="State check successful",
onfail="State check NOT successful" )
@@ -1293,42 +1393,43 @@
"""
The Failure case.
"""
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
main.log.report( "Restart entire ONOS cluster" )
- main.log.case( "Restart entire ONOS cluster" )
- main.ONOSbench.onosKill( ONOS1Ip )
- main.ONOSbench.onosKill( ONOS2Ip )
- main.ONOSbench.onosKill( ONOS3Ip )
- main.ONOSbench.onosKill( ONOS4Ip )
- main.ONOSbench.onosKill( ONOS5Ip )
- main.ONOSbench.onosKill( ONOS6Ip )
- main.ONOSbench.onosKill( ONOS7Ip )
+ main.case( "Restart entire ONOS cluster" )
+ main.step( "Killing ONOS nodes" )
+ killResults = main.TRUE
+ for node in nodes:
+ killed = main.ONOSbench.onosKill( node.ip_address )
+ killResults = killResults and killed
main.step( "Checking if ONOS is up yet" )
- count = 0
- onosIsupResult = main.FALSE
- while onosIsupResult == main.FALSE and count < 10:
- onos1Isup = main.ONOSbench.isup( ONOS1Ip )
- onos2Isup = main.ONOSbench.isup( ONOS2Ip )
- onos3Isup = main.ONOSbench.isup( ONOS3Ip )
- onos4Isup = main.ONOSbench.isup( ONOS4Ip )
- onos5Isup = main.ONOSbench.isup( ONOS5Ip )
- onos6Isup = main.ONOSbench.isup( ONOS6Ip )
- onos7Isup = main.ONOSbench.isup( ONOS7Ip )
- onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
- and onos4Isup and onos5Isup and onos6Isup and onos7Isup
- count = count + 1
- # TODO: if it becomes an issue, we can retry this step a few times
+ for i in range( 2 ):
+ onosIsupResult = main.TRUE
+ for node in nodes:
+ started = main.ONOSbench.isup( node.ip_address )
+ if not started:
+ main.log.report( node.name + " didn't start!" )
+ onosIsupResult = onosIsupResult and started
+ if onosIsupResult == main.TRUE:
+ break
- cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
- cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
- cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
- cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
- cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
- cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
- cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
- cliResults = cliResult1 and cliResult2 and cliResult3\
- and cliResult4 and cliResult5 and cliResult6\
- and cliResult7
+ main.log.step( "Starting ONOS CLI sessions" )
+ cliResults = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].startOnosCli,
+ name="startOnosCli-" + str( i ),
+ args=[nodes[i].ip_address] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ cliResults = cliResults and t.result
caseResults = main.TRUE and onosIsupResult and cliResults
utilities.assert_equals( expect=main.TRUE, actual=caseResults,
@@ -1340,107 +1441,103 @@
Check state after ONOS failure
"""
import json
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
main.case( "Running ONOS Constant State Tests" )
+ main.step( "Check that each switch has a master" )
# Assert that each device has a master
- ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
- ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
- ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
- ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
- ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
- ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
- ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
- rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
- ONOS3MasterNotNull and ONOS4MasterNotNull and\
- ONOS5MasterNotNull and ONOS6MasterNotNull and\
- ONOS7MasterNotNull
+ rolesNotNull = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].rolesNotNull,
+ name="rolesNotNull-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ rolesNotNull = rolesNotNull and t.result
utilities.assert_equals(
expect=main.TRUE,
actual=rolesNotNull,
onpass="Each device has a master",
onfail="Some devices don't have a master assigned" )
- main.step( "Check if switch roles are consistent across all nodes" )
- ONOS1Mastership = main.ONOScli1.roles()
- ONOS2Mastership = main.ONOScli2.roles()
- ONOS3Mastership = main.ONOScli3.roles()
- ONOS4Mastership = main.ONOScli4.roles()
- ONOS5Mastership = main.ONOScli5.roles()
- ONOS6Mastership = main.ONOScli6.roles()
- ONOS7Mastership = main.ONOScli7.roles()
- if "Error" in ONOS1Mastership or not ONOS1Mastership\
- or "Error" in ONOS2Mastership or not ONOS2Mastership\
- or "Error" in ONOS3Mastership or not ONOS3Mastership\
- or "Error" in ONOS4Mastership or not ONOS4Mastership\
- or "Error" in ONOS5Mastership or not ONOS5Mastership\
- or "Error" in ONOS6Mastership or not ONOS6Mastership\
- or "Error" in ONOS7Mastership or not ONOS7Mastership:
- main.log.error( "Error in getting ONOS mastership" )
- main.log.warn( "ONOS1 mastership response: " +
- repr( ONOS1Mastership ) )
- main.log.warn( "ONOS2 mastership response: " +
- repr( ONOS2Mastership ) )
- main.log.warn( "ONOS3 mastership response: " +
- repr( ONOS3Mastership ) )
- main.log.warn( "ONOS4 mastership response: " +
- repr( ONOS4Mastership ) )
- main.log.warn( "ONOS5 mastership response: " +
- repr( ONOS5Mastership ) )
- main.log.warn( "ONOS6 mastership response: " +
- repr( ONOS6Mastership ) )
- main.log.warn( "ONOS7 mastership response: " +
- repr( ONOS7Mastership ) )
- consistentMastership = main.FALSE
- elif ONOS1Mastership == ONOS2Mastership\
- and ONOS1Mastership == ONOS3Mastership\
- and ONOS1Mastership == ONOS4Mastership\
- and ONOS1Mastership == ONOS5Mastership\
- and ONOS1Mastership == ONOS6Mastership\
- and ONOS1Mastership == ONOS7Mastership:
- consistentMastership = main.TRUE
+ ONOSMastership = []
+ mastershipCheck = main.FALSE
+ consistentMastership = True
+ rolesResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].roles,
+ name="roles-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSMastership.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSMastership[i] or "Error" in ONOSMastership[i]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " roles" )
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " mastership response: " +
+ repr( ONOSMastership[i] ) )
+ rolesResults = False
+ utilities.assert_equals(
+ expect=True,
+ actual=rolesResults,
+ onpass="No error in reading roles output",
+ onfail="Error in reading roles from ONOS" )
+
+ main.step( "Check for consistency in roles from each controller" )
+ if all([ i == ONOSMastership[ 0 ] for i in ONOSMastership ] ):
main.log.report(
"Switch roles are consistent across all ONOS nodes" )
else:
- main.log.warn( "ONOS1 roles: ", json.dumps(
- json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS2 roles: ", json.dumps(
- json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS3 roles: ", json.dumps(
- json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS4 roles: ", json.dumps(
- json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS5 roles: ", json.dumps(
- json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS6 roles: ", json.dumps(
- json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS7 roles: ", json.dumps(
- json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- consistentMastership = main.FALSE
+ consistentMastership = False
utilities.assert_equals(
- expect=main.TRUE,
+ expect=True,
actual=consistentMastership,
onpass="Switch roles are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of switch roles" )
+ if rolesResults and not consistentMastership:
+ for i in range( numControllers ):
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " roles: ",
+ json.dumps(
+ json.loads( ONOSMastership[ i ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ elif rolesResults and not consistentMastership:
+ mastershipCheck = main.TRUE
+
description2 = "Compare switch roles from before failure"
main.step( description2 )
-
- currentJson = json.loads( ONOS1Mastership )
- oldJson = json.loads( mastershipState )
+ try:
+ currentJson = json.loads( ONOSMastership[0] )
+ oldJson = json.loads( mastershipState )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Something is wrong with parsing " +
+ "ONOSMastership[0] or mastershipState" )
+ main.log.error( "ONOSMastership[0]: " + repr( ONOSMastership[0] ) )
+ main.log.error( "mastershipState" + repr( mastershipState ) )
+ main.cleanup()
+ main.exit()
mastershipCheck = main.TRUE
for i in range( 1, 29 ):
switchDPID = str(
- main.Mininet1.getSwitchDPID(
- switch="s" +
- str( i ) ) )
-
+ main.Mininet1.getSwitchDPID( switch="s" + str( i ) ) )
current = [ switch[ 'master' ] for switch in currentJson
if switchDPID in switch[ 'id' ] ]
old = [ switch[ 'master' ] for switch in oldJson
@@ -1461,83 +1558,72 @@
mastershipCheck = mastershipCheck and consistentMastership
main.step( "Get the intents and compare across all nodes" )
- ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
- ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
- ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
- ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
- ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
- ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
- ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+ ONOSIntents = []
intentCheck = main.FALSE
- if "Error" in ONOS1Intents or not ONOS1Intents\
- or "Error" in ONOS2Intents or not ONOS2Intents\
- or "Error" in ONOS3Intents or not ONOS3Intents\
- or "Error" in ONOS4Intents or not ONOS4Intents\
- or "Error" in ONOS5Intents or not ONOS5Intents\
- or "Error" in ONOS6Intents or not ONOS6Intents\
- or "Error" in ONOS7Intents or not ONOS7Intents:
- main.log.report( "Error in getting ONOS intents" )
- main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
- main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
- main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
- main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
- main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
- main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
- main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
- elif ONOS1Intents == ONOS2Intents\
- and ONOS1Intents == ONOS3Intents\
- and ONOS1Intents == ONOS4Intents\
- and ONOS1Intents == ONOS5Intents\
- and ONOS1Intents == ONOS6Intents\
- and ONOS1Intents == ONOS7Intents:
- intentCheck = main.TRUE
- main.log.report( "Intents are consistent across all ONOS nodes" )
- else:
- main.log.warn( "ONOS1 intents: " )
- print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS2 intents: " )
- print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS3 intents: " )
- print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS4 intents: " )
- print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS5 intents: " )
- print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS6 intents: " )
- print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS7 intents: " )
- print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
+ consistentIntents = True
+ intentsResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].intents,
+ name="intents-" + str( i ),
+ args=[],
+ kwargs={ 'jsonFormat': True } )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSIntents.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSIntents[ i ] or "Error" in ONOSIntents[ i ]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " intents" )
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents response: " +
+ repr( ONOSIntents[ i ] ) )
+ intentsResults = False
utilities.assert_equals(
- expect=main.TRUE,
- actual=intentCheck,
+ expect=True,
+ actual=intentsResults,
+ onpass="No error in reading intents output",
+ onfail="Error in reading intents from ONOS" )
+
+ main.step( "Check for consistency in Intents from each controller" )
+ if all([ sorted( i ) == sorted( ONOSIntents[ 0 ] ) for i in ONOSIntents ] ):
+ main.log.report( "Intents are consistent across all ONOS " +
+ "nodes" )
+ else:
+ consistentIntents = False
+ utilities.assert_equals(
+ expect=True,
+ actual=consistentIntents,
onpass="Intents are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of intents" )
- # Print the intent states
- intents = []
- intents.append( ONOS1Intents )
- intents.append( ONOS2Intents )
- intents.append( ONOS3Intents )
- intents.append( ONOS4Intents )
- intents.append( ONOS5Intents )
- intents.append( ONOS6Intents )
- intents.append( ONOS7Intents )
intentStates = []
- for node in intents: # Iter through ONOS nodes
+ for node in ONOSIntents: # Iter through ONOS nodes
nodeStates = []
# Iter through intents of a node
- for intent in json.loads( node ):
- nodeStates.append( intent[ 'state' ] )
+ try:
+ for intent in json.loads( node ):
+ nodeStates.append( intent[ 'state' ] )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error in parsing intents" )
+ main.log.error( repr( node ) )
intentStates.append( nodeStates )
out = [ (i, nodeStates.count( i ) ) for i in set( nodeStates ) ]
main.log.info( dict( out ) )
+ if intentsResults and not consistentIntents:
+ for i in range( numControllers ):
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents: " )
+ main.log.warn( json.dumps(
+ json.loads( ONOSIntents[ i ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ elif intentsResults and consistentIntents:
+ intentCheck = main.TRUE
+
# NOTE: Store has no durability, so intents are lost across system
# restarts
"""
@@ -1545,19 +1631,20 @@
# NOTE: this requires case 5 to pass for intentState to be set.
# maybe we should stop the test if that fails?
sameIntents = main.TRUE
- if intentState and intentState == ONOS1Intents:
+ if intentState and intentState == ONOSIntents[ 0 ]:
sameIntents = main.TRUE
main.log.report( "Intents are consistent with before failure" )
# TODO: possibly the states have changed? we may need to figure out
- # what the aceptable states are
+ # what the acceptable states are
else:
try:
- main.log.warn( "ONOS1 intents: " )
- print json.dumps( json.loads( ONOS1Intents ),
- sort_keys=True, indent=4,
- separators=( ',', ': ' ) )
- except Exception:
- pass
+ main.log.warn( "ONOS intents: " )
+ main.log.warn( json.dumps( json.loads( ONOSIntents[ 0 ] ),
+ sort_keys=True, indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Exception printing intents" )
+ main.log.warn( repr( ONOSIntents[0] ) )
sameIntents = main.FALSE
utilities.assert_equals(
expect=main.TRUE,
@@ -1591,12 +1678,8 @@
main.step( "Check the continuous pings to ensure that no packets " +
"were dropped during component failure" )
- # FIXME: This check is always failing. Investigate cause
- # NOTE: this may be something to do with file permsissions
- # or slight change in format
- main.Mininet2.pingKill(
- main.params[ 'TESTONUSER' ],
- main.params[ 'TESTONIP' ] )
+ main.Mininet2.pingKill( main.params[ 'TESTONUSER' ],
+ main.params[ 'TESTONIP' ] )
LossInPings = main.FALSE
# NOTE: checkForLoss returns main.FALSE with 0% packet loss
for i in range( 8, 18 ):
@@ -1625,10 +1708,8 @@
# Test of LeadershipElection
leaderList = []
leaderResult = main.TRUE
- for controller in range( 1, numControllers + 1 ):
- # loop through ONOScli handlers
- node = getattr( main, ( 'ONOScli' + str( controller ) ) )
- leaderN = node.electionTestLeader()
+ for cli in CLIs:
+ leaderN = cli.electionTestLeader()
leaderList.append( leaderN )
if leaderN == main.FALSE:
# error in response
@@ -1637,7 +1718,7 @@
" error logs" )
leaderResult = main.FALSE
elif leaderN is None:
- main.log.report( "ONOS" + str( controller ) +
+ main.log.report( cli.name +
" shows no leader for the election-app was" +
" elected after the old one died" )
leaderResult = main.FALSE
@@ -1676,28 +1757,21 @@
from sts.topology.teston_topology import TestONTopology
import json
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
description = "Compare ONOS Topology view to Mininet topology"
main.case( description )
main.log.report( description )
main.step( "Create TestONTopology object" )
ctrls = []
- count = 1
- while True:
- temp = ()
- if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
- temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
- temp = temp + ( "ONOS" + str( count ), )
- temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
- temp = temp + \
- ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
- ctrls.append( temp )
- count = count + 1
- else:
- break
- MNTopo = TestONTopology(
- main.Mininet1,
- ctrls ) # can also add Intent API info for intent operations
+ for node in nodes:
+ temp = ( node, node.name, node.ip_address, 6633 )
+ ctrls.append( temp )
+ MNTopo = TestONTopology( main.Mininet1, ctrls )
main.step( "Comparing ONOS topology to MN" )
devicesResults = main.TRUE
@@ -1711,28 +1785,40 @@
startTime = time.time()
# Give time for Gossip to work
while topoResult == main.FALSE and elapsed < 60:
- count = count + 1
+ count += 1
if count > 1:
- # TODO: Depricate STS usage
+ # TODO: Deprecate STS usage
MNTopo = TestONTopology( main.Mininet1, ctrls )
cliStart = time.time()
devices = []
- devices.append( main.ONOScli1.devices() )
- devices.append( main.ONOScli2.devices() )
- devices.append( main.ONOScli3.devices() )
- devices.append( main.ONOScli4.devices() )
- devices.append( main.ONOScli5.devices() )
- devices.append( main.ONOScli6.devices() )
- devices.append( main.ONOScli7.devices() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].devices,
+ name="devices-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ devices.append( t.result )
hosts = []
- hosts.append( json.loads( main.ONOScli1.hosts() ) )
- hosts.append( json.loads( main.ONOScli2.hosts() ) )
- hosts.append( json.loads( main.ONOScli3.hosts() ) )
- hosts.append( json.loads( main.ONOScli4.hosts() ) )
- hosts.append( json.loads( main.ONOScli5.hosts() ) )
- hosts.append( json.loads( main.ONOScli6.hosts() ) )
- hosts.append( json.loads( main.ONOScli7.hosts() ) )
ipResult = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].hosts,
+ name="hosts-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ try:
+ hosts.append( json.loads( t.result ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing hosts results" )
+ main.log.error( repr( t.result ) )
for controller in range( 0, len( hosts ) ):
controllerStr = str( controller + 1 )
for host in hosts[ controller ]:
@@ -1742,29 +1828,41 @@
controllerStr + ": " + str( host ) )
ipResult = main.FALSE
ports = []
- ports.append( main.ONOScli1.ports() )
- ports.append( main.ONOScli2.ports() )
- ports.append( main.ONOScli3.ports() )
- ports.append( main.ONOScli4.ports() )
- ports.append( main.ONOScli5.ports() )
- ports.append( main.ONOScli6.ports() )
- ports.append( main.ONOScli7.ports() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].ports,
+ name="ports-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ports.append( t.result )
links = []
- links.append( main.ONOScli1.links() )
- links.append( main.ONOScli2.links() )
- links.append( main.ONOScli3.links() )
- links.append( main.ONOScli4.links() )
- links.append( main.ONOScli5.links() )
- links.append( main.ONOScli6.links() )
- links.append( main.ONOScli7.links() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].links,
+ name="links-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ links.append( t.result )
clusters = []
- clusters.append( main.ONOScli1.clusters() )
- clusters.append( main.ONOScli2.clusters() )
- clusters.append( main.ONOScli3.clusters() )
- clusters.append( main.ONOScli4.clusters() )
- clusters.append( main.ONOScli5.clusters() )
- clusters.append( main.ONOScli6.clusters() )
- clusters.append( main.ONOScli7.clusters() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].clusters,
+ name="clusters-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ clusters.append( t.result )
elapsed = time.time() - startTime
cliTime = time.time() - cliStart
@@ -1883,7 +1981,11 @@
onpass="Clusters view is consistent across all ONOS nodes",
onfail="ONOS nodes have different views of clusters" )
# there should always only be one cluster
- numClusters = len( json.loads( clusters[ 0 ] ) )
+ try:
+ numClusters = len( json.loads( clusters[ 0 ] ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing clusters[0]: " +
+ repr( clusters[0] ) )
clusterResults = main.FALSE
if numClusters == 1:
clusterResults = main.TRUE
@@ -1912,11 +2014,50 @@
if topoResult == main.TRUE:
main.log.report( "ONOS topology view matches Mininet topology" )
+ # FIXME: move this to an ONOS state case
+ main.step( "Checking ONOS nodes" )
+ nodesOutput = []
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].nodes,
+ name="nodes-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ nodesOutput.append( t.result )
+ ips = [ node.ip_address for node in nodes ]
+ for i in nodesOutput:
+ try:
+ current = json.loads( i )
+ for node in current:
+ if node['ip'] in ips: # node in nodes() output is in cell
+ if node['state'] == 'ACTIVE':
+ pass # as it should be
+ else:
+ main.log.error( "Error in ONOS node availability" )
+ main.log.error(
+ json.dumps( current,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ break
+ except ( ValueError, TypeError ):
+ main.log.error( "Error parsing nodes output" )
+ main.log.warn( repr( i ) )
+
def CASE9( self, main ):
"""
Link s3-s28 down
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# NOTE: You should probably run a topology check after this
linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
@@ -1932,7 +2073,7 @@
" seconds for link down to be discovered" )
time.sleep( linkSleep )
utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
- onpass="Link down succesful",
+ onpass="Link down successful",
onfail="Failed to bring link down" )
# TODO do some sort of check here
@@ -1941,6 +2082,11 @@
Link s3-s28 up
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# NOTE: You should probably run a topology check after this
linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
@@ -1956,7 +2102,7 @@
" seconds for link up to be discovered" )
time.sleep( linkSleep )
utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
- onpass="Link up succesful",
+ onpass="Link up successful",
onfail="Failed to bring link up" )
# TODO do some sort of check here
@@ -1966,6 +2112,11 @@
"""
# NOTE: You should probably run a topology check after this
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
@@ -1989,7 +2140,7 @@
if device and device[ 'available' ] is False:
result = main.TRUE
utilities.assert_equals( expect=main.TRUE, actual=result,
- onpass="Kill switch succesful",
+ onpass="Kill switch successful",
onfail="Failed to kill switch?" )
def CASE12( self, main ):
@@ -1998,6 +2149,18 @@
"""
# NOTE: You should probably run a topology check after this
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
+ assert ONOS1Port, "ONOS1Port not defined"
+ assert ONOS2Port, "ONOS2Port not defined"
+ assert ONOS3Port, "ONOS3Port not defined"
+ assert ONOS4Port, "ONOS4Port not defined"
+ assert ONOS5Port, "ONOS5Port not defined"
+ assert ONOS6Port, "ONOS6Port not defined"
+ assert ONOS7Port, "ONOS7Port not defined"
switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
switch = main.params[ 'kill' ][ 'switch' ]
@@ -2010,24 +2173,23 @@
main.step( "Add back " + switch )
main.log.report( "Adding back " + switch )
main.Mininet1.addSwitch( switch, dpid=switchDPID )
- # TODO: New dpid or same? Ask Thomas?
for peer in links:
main.Mininet1.addLink( switch, peer )
main.Mininet1.assignSwController( sw=switch.split( 's' )[ 1 ],
count=numControllers,
- ip1=ONOS1Ip,
+ ip1=nodes[ 0 ].ip_address,
port1=ONOS1Port,
- ip2=ONOS2Ip,
+ ip2=nodes[ 1 ].ip_address,
port2=ONOS2Port,
- ip3=ONOS3Ip,
+ ip3=nodes[ 2 ].ip_address,
port3=ONOS3Port,
- ip4=ONOS4Ip,
+ ip4=nodes[ 3 ].ip_address,
port4=ONOS4Port,
- ip5=ONOS5Ip,
+ ip5=nodes[ 4 ].ip_address,
port5=ONOS5Port,
- ip6=ONOS6Ip,
+ ip6=nodes[ 5 ].ip_address,
port6=ONOS6Port,
- ip7=ONOS7Ip,
+ ip7=nodes[ 6 ].ip_address,
port7=ONOS7Port )
main.log.info( "Waiting " + str( switchSleep ) +
" seconds for switch up to be discovered" )
@@ -2039,7 +2201,7 @@
if device and device[ 'available' ]:
result = main.TRUE
utilities.assert_equals( expect=main.TRUE, actual=result,
- onpass="add switch succesful",
+ onpass="add switch successful",
onfail="Failed to add switch?" )
def CASE13( self, main ):
@@ -2048,37 +2210,22 @@
"""
import os
import time
- # TODO: make use of this elsewhere
- ips = []
- ips.append( ONOS1Ip )
- ips.append( ONOS2Ip )
- ips.append( ONOS3Ip )
- ips.append( ONOS4Ip )
- ips.append( ONOS5Ip )
- ips.append( ONOS6Ip )
- ips.append( ONOS7Ip )
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# printing colors to terminal
- colors = {}
- colors[ 'cyan' ] = '\033[96m'
- colors[ 'purple' ] = '\033[95m'
- colors[ 'blue' ] = '\033[94m'
- colors[ 'green' ] = '\033[92m'
- colors[ 'yellow' ] = '\033[93m'
- colors[ 'red' ] = '\033[91m'
- colors[ 'end' ] = '\033[0m'
+ colors = { 'cyan': '\033[96m', 'purple': '\033[95m',
+ 'blue': '\033[94m', 'green': '\033[92m',
+ 'yellow': '\033[93m', 'red': '\033[91m', 'end': '\033[0m' }
description = "Test Cleanup"
main.log.report( description )
main.case( description )
main.step( "Killing tcpdumps" )
main.Mininet2.stopTcpdump()
- main.step( "Checking ONOS Logs for errors" )
- for i in range( 7 ):
- print colors[ 'purple' ] + "Checking logs for errors on " + \
- "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
- print main.ONOSbench.checkLogs( ips[ i ] )
-
main.step( "Copying MN pcap and ONOS log files to test station" )
testname = main.TEST
teststationUser = main.params[ 'TESTONUSER' ]
@@ -2094,14 +2241,13 @@
# NOTE: must end in /
dstDir = "~/packet_captures/"
for f in logFiles:
- for i in range( 7 ):
- main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
- logFolder + f + " " +
+ for node in nodes:
+ main.ONOSbench.handle.sendline( "scp sdn@" + node.ip_address +
+ ":" + logFolder + f + " " +
teststationUser + "@" +
teststationIP + ":" +
dstDir + str( testname ) +
- "-ONOS" + str( i + 1 ) + "-" +
- f )
+ "-" + node.name + "-" + f )
main.ONOSbench.handle.expect( "\$" )
# std*.log's
@@ -2111,18 +2257,26 @@
# NOTE: must end in /
dstDir = "~/packet_captures/"
for f in logFiles:
- for i in range( 7 ):
- main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
- logFolder + f + " " +
+ for node in nodes:
+ main.ONOSbench.handle.sendline( "scp sdn@" + node.ip_address +
+ ":" + logFolder + f + " " +
teststationUser + "@" +
teststationIP + ":" +
dstDir + str( testname ) +
- "-ONOS" + str( i + 1 ) + "-" +
- f )
+ "-" + node.name + "-" + f )
main.ONOSbench.handle.expect( "\$" )
# sleep so scp can finish
time.sleep( 10 )
+
+ main.step( "Stopping Mininet" )
main.Mininet1.stopNet()
+
+ main.step( "Checking ONOS Logs for errors" )
+ for node in nodes:
+ print colors[ 'purple' ] + "Checking logs for errors on " + \
+ node.name + ":" + colors[ 'end' ]
+ print main.ONOSbench.checkLogs( node.ip_address )
+
main.step( "Packing and rotating pcap archives" )
os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
@@ -2135,62 +2289,29 @@
"""
start election app on all onos nodes
"""
- leaderResult = main.TRUE
- # install app on onos 1
- main.log.info( "Install leadership election app" )
- main.ONOScli1.featureInstall( "onos-app-election" )
- # wait for election
- # check for leader
- leader = main.ONOScli1.electionTestLeader()
- # verify leader is ONOS1
- if leader == ONOS1Ip:
- # all is well
- pass
- elif leader is None:
- # No leader elected
- main.log.report( "No leader was elected" )
- leaderResult = main.FALSE
- elif leader == main.FALSE:
- # error in response
- # TODO: add check for "Command not found:" in the driver, this
- # means the app isn't loaded
- main.log.report( "Something is wrong with electionTestLeader" +
- " function, check the error logs" )
- leaderResult = main.FALSE
- else:
- # error in response
- main.log.report(
- "Unexpected response from electionTestLeader function:'" +
- str( leader ) +
- "'" )
- leaderResult = main.FALSE
+ import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
- # install on other nodes and check for leader.
- # Should be onos1 and each app should show the same leader
- for controller in range( 2, numControllers + 1 ):
- # loop through ONOScli handlers
- node = getattr( main, ( 'ONOScli' + str( controller ) ) )
- node.featureInstall( "onos-app-election" )
- leaderN = node.electionTestLeader()
- # verify leader is ONOS1
- if leaderN == ONOS1Ip:
- # all is well
- pass
- elif leaderN == main.FALSE:
- # error in response
- # TODO: add check for "Command not found:" in the driver, this
- # means the app isn't loaded
- main.log.report( "Something is wrong with " +
- "electionTestLeader function, check the" +
- " error logs" )
+ leaderResult = main.TRUE
+ main.log.info( "Install leadership election app" )
+ main.ONOScli1.activateApp( "org.onosproject.election" )
+ leaders = []
+ for cli in CLIs:
+ leader = cli.electionTestLeader()
+ if leader is None or leader == main.FALSE:
+ main.log.report( cli.name + ": Leader for the election app " +
+ "should be an ONOS node, instead got '" +
+ str( leader ) + "'" )
leaderResult = main.FALSE
- elif leader != leaderN:
- leaderResult = main.FALSE
- main.log.report( "ONOS" + str( controller ) + " sees " +
- str( leaderN ) +
- " as the leader of the election app. Leader" +
- " should be " +
- str( leader ) )
+ leaders.append( leader )
+ if len( set( leaders ) ) != 1:
+ leaderResult = main.FALSE
+ main.log.error( "Results of electionTestLeader is order of CLIs:" +
+ str( leaders ) )
if leaderResult:
main.log.report( "Leadership election tests passed( consistent " +
"view of leader across listeners and a leader " +
@@ -2205,36 +2326,32 @@
"""
Check that Leadership Election is still functional
"""
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
+
leaderResult = main.TRUE
description = "Check that Leadership Election is still functional"
main.log.report( description )
main.case( description )
main.step( "Find current leader and withdraw" )
leader = main.ONOScli1.electionTestLeader()
- # TODO: do some sanity checking on leader before using it
+ # do some sanity checking on leader before using it
withdrawResult = main.FALSE
- if leader == ONOS1Ip:
- oldLeader = getattr( main, "ONOScli1" )
- elif leader == ONOS2Ip:
- oldLeader = getattr( main, "ONOScli2" )
- elif leader == ONOS3Ip:
- oldLeader = getattr( main, "ONOScli3" )
- elif leader == ONOS4Ip:
- oldLeader = getattr( main, "ONOScli4" )
- elif leader == ONOS5Ip:
- oldLeader = getattr( main, "ONOScli5" )
- elif leader == ONOS6Ip:
- oldLeader = getattr( main, "ONOScli6" )
- elif leader == ONOS7Ip:
- oldLeader = getattr( main, "ONOScli7" )
- elif leader is None or leader == main.FALSE:
+ if leader is None or leader == main.FALSE:
main.log.report(
"Leader for the election app should be an ONOS node," +
"instead got '" + str( leader ) + "'" )
leaderResult = main.FALSE
oldLeader = None
- else:
- main.log.error( "Leader election --- why am I HERE?!?")
+ for i in range( len( CLIs ) ):
+ if leader == nodes[ i ].ip_address:
+ oldLeader = CLIs[ i ]
+ break
+ else: # FOR/ELSE statement
+ main.log.error( "Leader election, could not find current leader" )
if oldLeader:
withdrawResult = oldLeader.electionTestWithdraw()
utilities.assert_equals(
@@ -2244,26 +2361,28 @@
onfail="App was not withdrawn from election" )
main.step( "Make sure new leader is elected" )
+ # FIXME: use threads
leaderList = []
- for controller in range( 1, numControllers + 1 ):
- # loop through ONOScli handlers
- node = getattr( main, ( 'ONOScli' + str( controller ) ) )
- leaderList.append( node.electionTestLeader() )
- for leaderN in leaderList:
+ for cli in CLIs:
+ leaderN = cli.electionTestLeader()
+ leaderList.append( leaderN )
if leaderN == leader:
- main.log.report(
- "ONOS" + str( controller ) +
- " still sees " + str( leader ) +
- " as leader after they withdrew" )
+ main.log.report( cli.name + " still sees " + str( leader ) +
+ " as leader after they withdrew" )
leaderResult = main.FALSE
elif leaderN == main.FALSE:
# error in response
# TODO: add check for "Command not found:" in the driver, this
- # means the app isn't loaded
+ # means the app isn't loaded
main.log.report( "Something is wrong with " +
"electionTestLeader function, " +
"check the error logs" )
leaderResult = main.FALSE
+ elif leaderN is None:
+ # node may not have recieved the event yet
+ leaderN = cli.electionTestLeader()
+ leaderList.pop()
+ leaderList.append( leaderN )
consistentLeader = main.FALSE
if len( set( leaderList ) ) == 1:
main.log.info( "Each Election-app sees '" +
@@ -2276,6 +2395,7 @@
for n in range( len( leaderList ) ):
main.log.report( "ONOS" + str( n + 1 ) + " response: " +
str( leaderList[ n ] ) )
+ leaderResult = leaderResult and consistentLeader
if leaderResult:
main.log.report( "Leadership election tests passed( consistent " +
"view of leader across listeners and a new " +
diff --git a/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py b/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py
index 3e7de57..43dd995 100644
--- a/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py
+++ b/TestON/tests/HATestMinorityRestart/HATestMinorityRestart.py
@@ -49,7 +49,7 @@
main.case( "Setting up test environment" )
# TODO: save all the timers and output them for plotting
- # load some vairables from the params file
+ # load some variables from the params file
PULLCODE = False
if main.params[ 'Git' ] == 'True':
PULLCODE = True
@@ -57,38 +57,34 @@
cellName = main.params[ 'ENV' ][ 'cellName' ]
# set global variables
- global ONOS1Ip
global ONOS1Port
- global ONOS2Ip
global ONOS2Port
- global ONOS3Ip
global ONOS3Port
- global ONOS4Ip
global ONOS4Port
- global ONOS5Ip
global ONOS5Port
- global ONOS6Ip
global ONOS6Port
- global ONOS7Ip
global ONOS7Port
global numControllers
-
- ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
- ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
- ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
- ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
- ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
- ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
- ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
- ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
- ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
- ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
- ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
- ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
- ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
- ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
numControllers = int( main.params[ 'num_controllers' ] )
+ # FIXME: just get controller port from params?
+ # TODO: do we really need all these?
+ ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+ ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+ ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
+ ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
+ ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
+ ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
+ ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
+
+ global CLIs
+ CLIs = []
+ global nodes
+ nodes = []
+ for i in range( 1, numControllers + 1 ):
+ CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+ nodes.append( getattr( main, 'ONOS' + str( i ) ) )
+
main.step( "Applying cell variable to environment" )
cellResult = main.ONOSbench.setCell( cellName )
verifyResult = main.ONOSbench.verifyCell()
@@ -96,14 +92,10 @@
# FIXME:this is short term fix
main.log.report( "Removing raft logs" )
main.ONOSbench.onosRemoveRaftLogs()
+
main.log.report( "Uninstalling ONOS" )
- main.ONOSbench.onosUninstall( ONOS1Ip )
- main.ONOSbench.onosUninstall( ONOS2Ip )
- main.ONOSbench.onosUninstall( ONOS3Ip )
- main.ONOSbench.onosUninstall( ONOS4Ip )
- main.ONOSbench.onosUninstall( ONOS5Ip )
- main.ONOSbench.onosUninstall( ONOS6Ip )
- main.ONOSbench.onosUninstall( ONOS7Ip )
+ for node in nodes:
+ main.ONOSbench.onosUninstall( node.ip_address )
cleanInstallResult = main.TRUE
gitPullResult = main.TRUE
@@ -116,6 +108,8 @@
main.step( "Git checkout and pull " + gitBranch )
main.ONOSbench.gitCheckout( gitBranch )
gitPullResult = main.ONOSbench.gitPull()
+ if gitPullResult == main.ERROR:
+ main.log.error( "Error pulling git branch" )
main.step( "Using mvn clean & install" )
cleanInstallResult = main.ONOSbench.cleanInstall()
@@ -128,76 +122,38 @@
packageResult = main.ONOSbench.onosPackage()
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 )
- onos4InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS4Ip )
- onos5InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS5Ip )
- onos6InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS6Ip )
- onos7InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS7Ip )
- onosInstallResult = onos1InstallResult and onos2InstallResult\
- and onos3InstallResult and onos4InstallResult\
- and onos5InstallResult and onos6InstallResult\
- and onos7InstallResult
+ onosInstallResult = main.TRUE
+ for node in nodes:
+ tmpResult = main.ONOSbench.onosInstall( options="-f",
+ node=node.ip_address )
+ onosInstallResult = onosInstallResult and tmpResult
main.step( "Checking if ONOS is up yet" )
for i in range( 2 ):
- onos1Isup = main.ONOSbench.isup( ONOS1Ip )
- if not onos1Isup:
- main.log.report( "ONOS1 didn't start!" )
- main.ONOSbench.onosStop( ONOS1Ip )
- main.ONOSbench.onosStart( ONOS1Ip )
- onos2Isup = main.ONOSbench.isup( ONOS2Ip )
- if not onos2Isup:
- main.log.report( "ONOS2 didn't start!" )
- main.ONOSbench.onosStop( ONOS2Ip )
- main.ONOSbench.onosStart( ONOS2Ip )
- onos3Isup = main.ONOSbench.isup( ONOS3Ip )
- if not onos3Isup:
- main.log.report( "ONOS3 didn't start!" )
- main.ONOSbench.onosStop( ONOS3Ip )
- main.ONOSbench.onosStart( ONOS3Ip )
- onos4Isup = main.ONOSbench.isup( ONOS4Ip )
- if not onos4Isup:
- main.log.report( "ONOS4 didn't start!" )
- main.ONOSbench.onosStop( ONOS4Ip )
- main.ONOSbench.onosStart( ONOS4Ip )
- onos5Isup = main.ONOSbench.isup( ONOS5Ip )
- if not onos5Isup:
- main.log.report( "ONOS5 didn't start!" )
- main.ONOSbench.onosStop( ONOS5Ip )
- main.ONOSbench.onosStart( ONOS5Ip )
- onos6Isup = main.ONOSbench.isup( ONOS6Ip )
- if not onos6Isup:
- main.log.report( "ONOS6 didn't start!" )
- main.ONOSbench.onosStop( ONOS6Ip )
- main.ONOSbench.onosStart( ONOS6Ip )
- onos7Isup = main.ONOSbench.isup( ONOS7Ip )
- if not onos7Isup:
- main.log.report( "ONOS7 didn't start!" )
- main.ONOSbench.onosStop( ONOS7Ip )
- main.ONOSbench.onosStart( ONOS7Ip )
- onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
- and onos4Isup and onos5Isup and onos6Isup and onos7Isup
+ onosIsupResult = main.TRUE
+ for node in nodes:
+ started = main.ONOSbench.isup( node.ip_address )
+ if not started:
+ main.log.report( node.name + " didn't start!" )
+ main.ONOSbench.onosStop( node.ip_address )
+ main.ONOSbench.onosStart( node.ip_address )
+ onosIsupResult = onosIsupResult and started
if onosIsupResult == main.TRUE:
break
- cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
- cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
- cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
- cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
- cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
- cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
- cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
- cliResults = cliResult1 and cliResult2 and cliResult3 and\
- cliResult4 and cliResult5 and cliResult6 and cliResult7
+ main.log.step( "Starting ONOS CLI sessions" )
+ cliResults = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].startOnosCli,
+ name="startOnosCli-" + str( i ),
+ args=[nodes[i].ip_address] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ cliResults = cliResults and t.result
main.step( "Start Packet Capture MN" )
main.Mininet2.startTcpdump(
@@ -206,9 +162,28 @@
intf=main.params[ 'MNtcpdump' ][ 'intf' ],
port=main.params[ 'MNtcpdump' ][ 'port' ] )
+ appCheck = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].appToIDCheck,
+ name="appToIDCheck-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ appCheck = appCheck and t.result
+ utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+ onpass="App Ids seem to be correct",
+ onfail="Something is wrong with app Ids" )
+ if appCheck != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
+
case1Result = ( cleanInstallResult and packageResult and
cellResult and verifyResult and onosInstallResult
- and onosIsupResult and cliResults )
+ and onosIsupResult and cliResults and appCheck)
utilities.assert_equals( expect=main.TRUE, actual=case1Result,
onpass="Test startup successful",
@@ -223,22 +198,36 @@
Assign mastership to controllers
"""
import re
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
+ assert ONOS1Port, "ONOS1Port not defined"
+ assert ONOS2Port, "ONOS2Port not defined"
+ assert ONOS3Port, "ONOS3Port not defined"
+ assert ONOS4Port, "ONOS4Port not defined"
+ assert ONOS5Port, "ONOS5Port not defined"
+ assert ONOS6Port, "ONOS6Port not defined"
+ assert ONOS7Port, "ONOS7Port not defined"
main.log.report( "Assigning switches to controllers" )
main.case( "Assigning Controllers" )
main.step( "Assign switches to controllers" )
+ # TODO: rewrite this function to take lists of ips and ports?
+ # or list of tuples?
for i in range( 1, 29 ):
main.Mininet1.assignSwController(
sw=str( i ),
count=numControllers,
- ip1=ONOS1Ip, port1=ONOS1Port,
- ip2=ONOS2Ip, port2=ONOS2Port,
- ip3=ONOS3Ip, port3=ONOS3Port,
- ip4=ONOS4Ip, port4=ONOS4Port,
- ip5=ONOS5Ip, port5=ONOS5Port,
- ip6=ONOS6Ip, port6=ONOS6Port,
- ip7=ONOS7Ip, port7=ONOS7Port )
+ ip1=nodes[ 0 ].ip_address, port1=ONOS1Port,
+ ip2=nodes[ 1 ].ip_address, port2=ONOS2Port,
+ ip3=nodes[ 2 ].ip_address, port3=ONOS3Port,
+ ip4=nodes[ 3 ].ip_address, port4=ONOS4Port,
+ ip5=nodes[ 4 ].ip_address, port5=ONOS5Port,
+ ip6=nodes[ 5 ].ip_address, port6=ONOS6Port,
+ ip7=nodes[ 6 ].ip_address, port7=ONOS7Port )
mastershipCheck = main.TRUE
for i in range( 1, 29 ):
@@ -247,16 +236,14 @@
main.log.info( str( response ) )
except Exception:
main.log.info( repr( response ) )
- if re.search( "tcp:" + ONOS1Ip, response )\
- and re.search( "tcp:" + ONOS2Ip, response )\
- and re.search( "tcp:" + ONOS3Ip, response )\
- and re.search( "tcp:" + ONOS4Ip, response )\
- and re.search( "tcp:" + ONOS5Ip, response )\
- and re.search( "tcp:" + ONOS6Ip, response )\
- and re.search( "tcp:" + ONOS7Ip, response ):
- mastershipCheck = mastershipCheck and main.TRUE
- else:
- mastershipCheck = main.FALSE
+ for node in nodes:
+ if re.search( "tcp:" + node.ip_address, response ):
+ mastershipCheck = mastershipCheck and main.TRUE
+ else:
+ main.log.error( "Error, node " + node.ip_address + " is " +
+ "not in the list of controllers s" +
+ str( i ) + " is connecting to." )
+ mastershipCheck = main.FALSE
if mastershipCheck == main.TRUE:
main.log.report( "Switch mastership assigned correctly" )
utilities.assert_equals(
@@ -264,135 +251,65 @@
actual=mastershipCheck,
onpass="Switch mastership assigned correctly",
onfail="Switches not assigned correctly to controllers" )
-
# Manually assign mastership to the controller we want
roleCall = main.TRUE
roleCheck = main.TRUE
try:
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
- assert deviceId, "No device id for s1 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS1Ip )
- # Check assignment
- if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
- assert deviceId, "No device id for s28 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS1Ip )
- # Check assignment
- if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
- assert deviceId, "No device id for s2 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS2Ip )
- # Check assignment
- if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
- assert deviceId, "No device id for s3 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS2Ip )
- # Check assignment
- if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
- assert deviceId, "No device id for s5 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS3Ip )
- # Check assignment
- if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
- assert deviceId, "No device id for s6 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS3Ip )
- # Check assignment
- if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
- assert deviceId, "No device id for s4 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS4Ip )
- # Check assignment
- if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- for i in range( 8, 18 ):
- dpid = '3' + str( i ).zfill( 3 )
- deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
- assert deviceId, "No device id for s%i in ONOS" % i
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS5Ip )
+ for i in range( 1, 29 ): # switches 1 through 28
+ # set up correct variables:
+ if i == 1:
+ ip = nodes[ 0 ].ip_address # ONOS1
+ deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+ elif i == 2:
+ ip = nodes[ 1 ].ip_address # ONOS2
+ deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+ elif i == 3:
+ ip = nodes[ 1 ].ip_address # ONOS2
+ deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+ elif i == 4:
+ ip = nodes[ 3 ].ip_address # ONOS4
+ deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+ elif i == 5:
+ ip = nodes[ 2 ].ip_address # ONOS3
+ deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+ elif i == 6:
+ ip = nodes[ 2 ].ip_address # ONOS3
+ deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+ elif i == 7:
+ ip = nodes[ 5 ].ip_address # ONOS6
+ deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+ elif i >= 8 and i <= 17:
+ ip = nodes[ 4 ].ip_address # ONOS5
+ dpid = '3' + str( i ).zfill( 3 )
+ deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+ elif i >= 18 and i <= 27:
+ ip = nodes[ 6 ].ip_address # ONOS7
+ dpid = '6' + str( i ).zfill( 3 )
+ deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+ elif i == 28:
+ ip = nodes[ 0 ].ip_address # ONOS1
+ deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+ else:
+ main.log.error( "You didn't write an else statement for " +
+ "switch s" + str( i ) )
+ # Assign switch
+ assert deviceId, "No device id for s" + str( i ) + " in ONOS"
+ # TODO: make this controller dynamic
+ roleCall = roleCall and main.ONOScli1.deviceRole( deviceId,
+ ip )
# Check assignment
- if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+ master = main.ONOScli1.getRole( deviceId ).get( 'master' )
+ if ip in master:
roleCheck = roleCheck and main.TRUE
else:
roleCheck = roleCheck and main.FALSE
-
- deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
- assert deviceId, "No device id for s7 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS6Ip )
- # Check assignment
- if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- for i in range( 18, 28 ):
- dpid = '6' + str( i ).zfill( 3 )
- deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
- assert deviceId, "No device id for s%i in ONOS" % i
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS7Ip )
- # Check assignment
- if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
+ main.log.error( "Error, controller " + ip + " is not" +
+ " master " + "of device " +
+ str( deviceId ) + ". Master is " +
+ repr( master ) + "." )
except ( AttributeError, AssertionError ):
main.log.exception( "Something is wrong with ONOS device view" )
main.log.info( main.ONOScli1.devices() )
-
utilities.assert_equals(
expect=main.TRUE,
actual=roleCall,
@@ -417,6 +334,11 @@
"""
import time
import json
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
main.log.report( "Adding host intents" )
main.case( "Adding host Intents" )
@@ -425,39 +347,66 @@
# install onos-app-fwd
main.log.info( "Install reactive forwarding app" )
- main.ONOScli1.featureInstall( "onos-app-fwd" )
- main.ONOScli2.featureInstall( "onos-app-fwd" )
- main.ONOScli3.featureInstall( "onos-app-fwd" )
- main.ONOScli4.featureInstall( "onos-app-fwd" )
- main.ONOScli5.featureInstall( "onos-app-fwd" )
- main.ONOScli6.featureInstall( "onos-app-fwd" )
- main.ONOScli7.featureInstall( "onos-app-fwd" )
+ appResults = CLIs[0].activateApp( "org.onosproject.fwd" )
+
+ # FIXME: add this to asserts
+ appCheck = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].appToIDCheck,
+ name="appToIDCheck-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ appCheck = appCheck and t.result
+ utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+ onpass="App Ids seem to be correct",
+ onfail="Something is wrong with app Ids" )
+ if appCheck != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
# REACTIVE FWD test
pingResult = main.FALSE
- time1 = time.time()
- pingResult = main.Mininet1.pingall()
- utilities.assert_equals(
- expect=main.TRUE,
- actual=pingResult,
- onpass="Reactive Pingall test passed",
- onfail="Reactive Pingall failed, one or more ping pairs failed" )
- time2 = time.time()
- main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
+ for i in range(2): # Retry if pingall fails first time
+ time1 = time.time()
+ pingResult = main.Mininet1.pingall()
+ utilities.assert_equals(
+ expect=main.TRUE,
+ actual=pingResult,
+ onpass="Reactive Pingall test passed",
+ onfail="Reactive Pingall failed, one or more ping pairs failed" )
+ time2 = time.time()
+ main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
# uninstall onos-app-fwd
main.log.info( "Uninstall reactive forwarding app" )
- main.ONOScli1.featureUninstall( "onos-app-fwd" )
- main.ONOScli2.featureUninstall( "onos-app-fwd" )
- main.ONOScli3.featureUninstall( "onos-app-fwd" )
- main.ONOScli4.featureUninstall( "onos-app-fwd" )
- main.ONOScli5.featureUninstall( "onos-app-fwd" )
- main.ONOScli6.featureUninstall( "onos-app-fwd" )
- main.ONOScli7.featureUninstall( "onos-app-fwd" )
- # timeout for fwd flows
- time.sleep( 10 )
+ appResults = appResults and CLIs[0].deactivateApp( "org.onosproject.fwd" )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].appToIDCheck,
+ name="appToIDCheck-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
- main.step( "Add host intents" )
+ for t in threads:
+ t.join()
+ appCheck = appCheck and t.result
+ utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+ onpass="App Ids seem to be correct",
+ onfail="Something is wrong with app Ids" )
+ if appCheck != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
+
+ # timeout for fwd flows
+ time.sleep( 11 )
+
+ main.step( "Add host intents" )
intentIds = []
# TODO: move the host numbers to params
# Maybe look at all the paths we ping?
@@ -479,42 +428,57 @@
host1Id = host1Dict.get( 'id', None )
host2Id = host2Dict.get( 'id', None )
if host1Id and host2Id:
- # Changed onos node to test something
- tmpId = main.ONOScli4.addHostIntent(
- host1Id,
- host2Id )
+ nodeNum = ( i % 7 )
+ tmpId = CLIs[ nodeNum ].addHostIntent( host1Id, host2Id )
if tmpId:
main.log.info( "Added intent with id: " + tmpId )
intentIds.append( tmpId )
else:
- main.log.error( "addHostIntent reutrned None" )
+ main.log.error( "addHostIntent returned: " +
+ repr( tmpId ) )
else:
- main.log.error( "Error, getHost() failed" )
- main.log.warn( json.dumps( json.loads( main.ONOScli1.hosts() ),
- sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ main.log.error( "Error, getHost() failed for h" + str( i ) +
+ " and/or h" + str( i + 10 ) )
+ hosts = CLIs[ 0 ].hosts()
+ main.log.warn( "Hosts output: " )
+ try:
+ main.log.warn( json.dumps( json.loads( hosts ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( hosts ) )
hostResult = main.FALSE
+ # FIXME: DEBUG
+ intentStart = time.time()
onosIds = main.ONOScli1.getAllIntentsId()
main.log.info( "Submitted intents: " + str( intentIds ) )
main.log.info( "Intents in ONOS: " + str( onosIds ) )
for intent in intentIds:
if intent in onosIds:
- pass # intent submitted is still in onos
+ pass # intent submitted is in onos
else:
intentAddResult = False
+ # FIXME: DEBUG
+ if intentAddResult:
+ intentStop = time.time()
+ else:
+ intentStop = None
# Print the intent states
intents = main.ONOScli1.intents()
intentStates = []
- installedCheck = True
+ installedCheck = True
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
- for intent in json.loads( intents ): # Iter through intents of a node
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents" )
# add submitted intents not in the store
tmplist = [ i for i, s in intentStates ]
missingIntents = False
@@ -527,17 +491,59 @@
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- # for node in nodes:
- # node.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
pendingMap = main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
+
intentAddResult = bool( pingResult and hostResult and intentAddResult
and not missingIntents and installedCheck )
utilities.assert_equals(
@@ -545,6 +551,29 @@
actual=intentAddResult,
onpass="Pushed host intents to ONOS",
onfail="Error in pushing host intents to ONOS" )
+ for i in range(100):
+ onosIds = main.ONOScli1.getAllIntentsId()
+ main.log.info( "Submitted intents: " + str( sorted( intentIds ) ) )
+ main.log.info( "Intents in ONOS: " + str( sorted( onosIds ) ) )
+ if sorted(onosIds) == sorted(intentIds):
+ break
+ else:
+ time.sleep(1)
+ # FIXME: DEBUG
+ if not intentStop:
+ intentStop = time.time()
+ gossipTime = intentStop - intentStart
+ main.log.info( "It took about " + str( gossipTime ) +
+ " seconds for all intents to appear on ONOS1" )
+ # FIXME: make this time configurable/calculate based off of number of
+ # nodes and gossip rounds
+ utilities.assert_greater_equals(
+ expect=30, actual=gossipTime,
+ onpass="ECM anti-entropy for intents worked within " +
+ "expected time",
+ onfail="Intent ECM anti-entropy took too long" )
+ if gossipTime <= 30:
+ intentAddResult = True
if not intentAddResult or "key" in pendingMap:
import time
@@ -559,13 +588,16 @@
intentStates = []
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
- for intent in json.loads( intents ):
- # Iter through intents of a node
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ # Iter through intents of a node
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents" )
# add submitted intents not in the store
tmplist = [ i for i, s in intentStates ]
for i in intentIds:
@@ -576,20 +608,73 @@
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
def CASE4( self, main ):
"""
Ping across added host intents
"""
import json
+ import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
description = " Ping across added host intents"
main.log.report( description )
main.case( description )
@@ -608,11 +693,15 @@
main.log.report(
"Intents have not been installed correctly, pings failed." )
# TODO: pretty print
- main.log.warn( "ONSO1 intents: " )
- main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
- sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ main.log.warn( "ONOS1 intents: " )
+ try:
+ tmpIntents = main.ONOScli1.intents()
+ main.log.warn( json.dumps( json.loads( tmpIntents ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( tmpIntents ) )
if PingResult == main.TRUE:
main.log.report(
"Intents have been installed correctly and verified by pings" )
@@ -630,28 +719,79 @@
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
# Iter through intents of a node
- for intent in json.loads( intents ):
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents." )
intentStates.sort()
for i, s in intentStates:
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
+
if not installedCheck:
- main.log.info( "Waiting 60 seconds to see if intent states change" )
+ main.log.info( "Waiting 60 seconds to see if the state of " +
+ "intents change" )
time.sleep( 60 )
# Print the intent states
intents = main.ONOScli1.intents()
@@ -659,32 +799,87 @@
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
# Iter through intents of a node
- for intent in json.loads( intents ):
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents." )
intentStates.sort()
for i, s in intentStates:
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
def CASE5( self, main ):
"""
Reading state of ONOS
"""
import json
+ import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# assumes that sts is already in you PYTHONPATH
from sts.topology.teston_topology import TestONTopology
@@ -692,344 +887,232 @@
main.case( "Setting up and gathering data for current state" )
# The general idea for this test case is to pull the state of
# ( intents,flows, topology,... ) from each ONOS node
- # We can then compare them with eachother and also with past states
+ # We can then compare them with each other and also with past states
- main.step( "Get the Mastership of each switch from each controller" )
+ main.step( "Check that each switch has a master" )
global mastershipState
- mastershipState = []
+ mastershipState = '[]'
# Assert that each device has a master
- ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
- ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
- ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
- ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
- ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
- ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
- ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
- rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
- ONOS3MasterNotNull and ONOS4MasterNotNull and\
- ONOS5MasterNotNull and ONOS6MasterNotNull and\
- ONOS7MasterNotNull
+ rolesNotNull = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].rolesNotNull,
+ name="rolesNotNull-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ rolesNotNull = rolesNotNull and t.result
utilities.assert_equals(
expect=main.TRUE,
actual=rolesNotNull,
onpass="Each device has a master",
onfail="Some devices don't have a master assigned" )
- ONOS1Mastership = main.ONOScli1.roles()
- ONOS2Mastership = main.ONOScli2.roles()
- ONOS3Mastership = main.ONOScli3.roles()
- ONOS4Mastership = main.ONOScli4.roles()
- ONOS5Mastership = main.ONOScli5.roles()
- ONOS6Mastership = main.ONOScli6.roles()
- ONOS7Mastership = main.ONOScli7.roles()
- if "Error" in ONOS1Mastership or not ONOS1Mastership\
- or "Error" in ONOS2Mastership or not ONOS2Mastership\
- or "Error" in ONOS3Mastership or not ONOS3Mastership\
- or "Error" in ONOS4Mastership or not ONOS4Mastership\
- or "Error" in ONOS5Mastership or not ONOS5Mastership\
- or "Error" in ONOS6Mastership or not ONOS6Mastership\
- or "Error" in ONOS7Mastership or not ONOS7Mastership:
- main.log.report( "Error in getting ONOS roles" )
- main.log.warn(
- "ONOS1 mastership response: " +
- repr( ONOS1Mastership ) )
- main.log.warn(
- "ONOS2 mastership response: " +
- repr( ONOS2Mastership ) )
- main.log.warn(
- "ONOS3 mastership response: " +
- repr( ONOS3Mastership ) )
- main.log.warn(
- "ONOS4 mastership response: " +
- repr( ONOS4Mastership ) )
- main.log.warn(
- "ONOS5 mastership response: " +
- repr( ONOS5Mastership ) )
- main.log.warn(
- "ONOS6 mastership response: " +
- repr( ONOS6Mastership ) )
- main.log.warn(
- "ONOS7 mastership response: " +
- repr( ONOS7Mastership ) )
- consistentMastership = main.FALSE
- elif ONOS1Mastership == ONOS2Mastership\
- and ONOS1Mastership == ONOS3Mastership\
- and ONOS1Mastership == ONOS4Mastership\
- and ONOS1Mastership == ONOS5Mastership\
- and ONOS1Mastership == ONOS6Mastership\
- and ONOS1Mastership == ONOS7Mastership:
- mastershipState = ONOS1Mastership
- consistentMastership = main.TRUE
+ main.step( "Get the Mastership of each switch from each controller" )
+ ONOSMastership = []
+ mastershipCheck = main.FALSE
+ consistentMastership = True
+ rolesResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].roles,
+ name="roles-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSMastership.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSMastership[i] or "Error" in ONOSMastership[i]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " roles" )
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " mastership response: " +
+ repr( ONOSMastership[i] ) )
+ rolesResults = False
+ utilities.assert_equals(
+ expect=True,
+ actual=rolesResults,
+ onpass="No error in reading roles output",
+ onfail="Error in reading roles from ONOS" )
+
+ main.step( "Check for consistency in roles from each controller" )
+ if all([ i == ONOSMastership[ 0 ] for i in ONOSMastership ] ):
main.log.report(
"Switch roles are consistent across all ONOS nodes" )
else:
- main.log.warn(
- "ONOS1 roles: ",
- json.dumps(
- json.loads( ONOS1Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS2 roles: ",
- json.dumps(
- json.loads( ONOS2Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS3 roles: ",
- json.dumps(
- json.loads( ONOS3Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS4 roles: ",
- json.dumps(
- json.loads( ONOS4Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS5 roles: ",
- json.dumps(
- json.loads( ONOS5Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS6 roles: ",
- json.dumps(
- json.loads( ONOS6Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS7 roles: ",
- json.dumps(
- json.loads( ONOS7Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- consistentMastership = main.FALSE
+ consistentMastership = False
utilities.assert_equals(
- expect=main.TRUE,
+ expect=True,
actual=consistentMastership,
onpass="Switch roles are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of switch roles" )
+ if rolesResults and not consistentMastership:
+ for i in range( numControllers ):
+ try:
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " roles: ",
+ json.dumps(
+ json.loads( ONOSMastership[ i ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( ONOSMastership[ i ] ) )
+ elif rolesResults and consistentMastership:
+ mastershipCheck = main.TRUE
+ mastershipState = ONOSMastership[ 0 ]
+
main.step( "Get the intents from each controller" )
global intentState
intentState = []
- ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
- ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
- ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
- ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
- ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
- ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
- ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+ ONOSIntents = []
intentCheck = main.FALSE
- if "Error" in ONOS1Intents or not ONOS1Intents\
- or "Error" in ONOS2Intents or not ONOS2Intents\
- or "Error" in ONOS3Intents or not ONOS3Intents\
- or "Error" in ONOS4Intents or not ONOS4Intents\
- or "Error" in ONOS5Intents or not ONOS5Intents\
- or "Error" in ONOS6Intents or not ONOS6Intents\
- or "Error" in ONOS7Intents or not ONOS7Intents:
- main.log.report( "Error in getting ONOS intents" )
- main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
- main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
- main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
- main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
- main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
- main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
- main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
- elif ONOS1Intents == ONOS2Intents\
- and ONOS1Intents == ONOS3Intents\
- and ONOS1Intents == ONOS4Intents\
- and ONOS1Intents == ONOS5Intents\
- and ONOS1Intents == ONOS6Intents\
- and ONOS1Intents == ONOS7Intents:
- intentState = ONOS1Intents
- intentCheck = main.TRUE
- main.log.report( "Intents are consistent across all ONOS nodes" )
- else:
- main.log.warn(
- "ONOS1 intents: ",
- json.dumps(
- json.loads( ONOS1Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS2 intents: ",
- json.dumps(
- json.loads( ONOS2Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS3 intents: ",
- json.dumps(
- json.loads( ONOS3Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS4 intents: ",
- json.dumps(
- json.loads( ONOS4Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS5 intents: ",
- json.dumps(
- json.loads( ONOS5Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS6 intents: ",
- json.dumps(
- json.loads( ONOS6Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS7 intents: ",
- json.dumps(
- json.loads( ONOS7Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
+ consistentIntents = True
+ intentsResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].intents,
+ name="intents-" + str( i ),
+ args=[],
+ kwargs={ 'jsonFormat': True } )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSIntents.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSIntents[ i ] or "Error" in ONOSIntents[ i ]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " intents" )
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents response: " +
+ repr( ONOSIntents[ i ] ) )
+ intentsResults = False
utilities.assert_equals(
- expect=main.TRUE,
- actual=intentCheck,
+ expect=True,
+ actual=intentsResults,
+ onpass="No error in reading intents output",
+ onfail="Error in reading intents from ONOS" )
+
+ main.step( "Check for consistency in Intents from each controller" )
+ if all([ sorted( i ) == sorted( ONOSIntents[ 0 ] ) for i in ONOSIntents ] ):
+ main.log.report( "Intents are consistent across all ONOS " +
+ "nodes" )
+ else:
+ consistentIntents = False
+ main.log.report( "Intents not consistent" )
+ utilities.assert_equals(
+ expect=True,
+ actual=consistentIntents,
onpass="Intents are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of intents" )
+ if intentsResults and not consistentIntents:
+ n = len(ONOSIntents)
+ main.log.warn( "ONOS" + str( n ) + " intents: " )
+ main.log.warn( json.dumps( json.loads( ONOSIntents[ -1 ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ for i in range( numControllers ):
+ if ONOSIntents[ i ] != ONOSIntents[ -1 ]:
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents: " )
+ main.log.warn( json.dumps( json.loads( ONOSIntents[i] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ else:
+ main.log.warn( nodes[ i ].name + " intents match ONOS" +
+ str( n ) + " intents" )
+ elif intentsResults and consistentIntents:
+ intentCheck = main.TRUE
+ intentState = ONOSIntents[ 0 ]
+
main.step( "Get the flows from each controller" )
global flowState
flowState = []
+ ONOSFlows = []
+ ONOSFlowsJson = []
flowCheck = main.FALSE
- try:
- ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
- ONOS2Flows = main.ONOScli2.flows( jsonFormat=True )
- ONOS3Flows = main.ONOScli3.flows( jsonFormat=True )
- ONOS4Flows = main.ONOScli4.flows( jsonFormat=True )
- ONOS5Flows = main.ONOScli5.flows( jsonFormat=True )
- ONOS6Flows = main.ONOScli6.flows( jsonFormat=True )
- ONOS7Flows = main.ONOScli7.flows( jsonFormat=True )
- assert ONOS1Flows, "ONOS1 Flows should not be empty"
- assert ONOS2Flows, "ONOS2 Flows should not be empty"
- assert ONOS3Flows, "ONOS3 Flows should not be empty"
- assert ONOS4Flows, "ONOS4 Flows should not be empty"
- assert ONOS5Flows, "ONOS5 Flows should not be empty"
- assert ONOS6Flows, "ONOS6 Flows should not be empty"
- assert ONOS7Flows, "ONOS7 Flows should not be empty"
- assert "Error" not in ONOS1Flows, "ONOS1 Flows contains 'Error'"
- assert "Error" not in ONOS2Flows, "ONOS2 Flows contains 'Error'"
- assert "Error" not in ONOS3Flows, "ONOS3 Flows contains 'Error'"
- assert "Error" not in ONOS4Flows, "ONOS4 Flows contains 'Error'"
- assert "Error" not in ONOS5Flows, "ONOS5 Flows contains 'Error'"
- assert "Error" not in ONOS6Flows, "ONOS6 Flows contains 'Error'"
- assert "Error" not in ONOS7Flows, "ONOS7 Flows contains 'Error'"
- ONOS1FlowsJson = json.loads( ONOS1Flows )
- ONOS2FlowsJson = json.loads( ONOS2Flows )
- ONOS3FlowsJson = json.loads( ONOS3Flows )
- ONOS4FlowsJson = json.loads( ONOS4Flows )
- ONOS5FlowsJson = json.loads( ONOS5Flows )
- ONOS6FlowsJson = json.loads( ONOS6Flows )
- ONOS7FlowsJson = json.loads( ONOS7Flows )
- except ( ValueError, AssertionError ): # From json.loads, or asserts
- main.log.exception( "One or more 'flows' responses from " +
- "ONOS couldn't be decoded." )
- main.log.warn( "ONOS1 flows repsponse: " + ONOS1Flows )
- main.log.warn( "ONOS2 flows repsponse: " + ONOS2Flows )
- main.log.warn( "ONOS3 flows repsponse: " + ONOS3Flows )
- main.log.warn( "ONOS4 flows repsponse: " + ONOS4Flows )
- main.log.warn( "ONOS5 flows repsponse: " + ONOS5Flows )
- main.log.warn( "ONOS6 flows repsponse: " + ONOS6Flows )
- main.log.warn( "ONOS7 flows repsponse: " + ONOS7Flows )
- else: # No exceptions
- if len( ONOS1FlowsJson ) == len( ONOS2FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS3FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS4FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS5FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS6FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS7FlowsJson ):
- # TODO: Do a better check, maybe compare flows on switches?
- # NOTE Possible issue with this not always being set?
- flowState = ONOS1Flows
- flowCheck = main.TRUE
- main.log.report( "Flow count is consistent across all" +
- " ONOS nodes" )
+ consistentFlows = True
+ flowsResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].flows,
+ name="flows-" + str( i ),
+ args=[],
+ kwargs={ 'jsonFormat': True } )
+ threads.append( t )
+ t.start()
+
+ # NOTE: Flows command can take some time to run
+ time.sleep(30)
+ for t in threads:
+ t.join()
+ result = t.result
+ ONOSFlows.append( result )
+
+ for i in range( numControllers ):
+ num = str( i + 1 )
+ if not ONOSFlows[ i ] or "Error" in ONOSFlows[ i ]:
+ main.log.report( "Error in getting ONOS" + num + " flows" )
+ main.log.warn( "ONOS" + num + " flows response: " +
+ repr( ONOSFlows[ i ] ) )
+ flowsResults = False
+ ONOSFlowsJson.append( None )
else:
- main.log.warn( "ONOS1 flows: " +
- json.dumps( ONOS1FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS2 flows: " +
- json.dumps( ONOS2FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS3 flows: " +
- json.dumps( ONOS3FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS4 flows: " +
- json.dumps( ONOS4FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS5 flows: " +
- json.dumps( ONOS5FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS6 flows: " +
- json.dumps( ONOS6FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS7 flows: " +
- json.dumps( ONOS7FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ try:
+ ONOSFlowsJson.append( json.loads( ONOSFlows[ i ] ) )
+ except ( ValueError, TypeError ):
+ # FIXME: change this to log.error?
+ main.log.exception( "Error in parsing ONOS" + num +
+ " response as json." )
+ main.log.error( repr( ONOSFlows[ i ] ) )
+ ONOSFlowsJson.append( None )
+ flowsResults = False
utilities.assert_equals(
- expect=main.TRUE,
- actual=flowCheck,
+ expect=True,
+ actual=flowsResults,
+ onpass="No error in reading flows output",
+ onfail="Error in reading flows from ONOS" )
+
+ main.step( "Check for consistency in Flows from each controller" )
+ tmp = [ len( i ) == len( ONOSFlowsJson[ 0 ] ) for i in ONOSFlowsJson ]
+ if all( tmp ):
+ main.log.report( "Flow count is consistent across all ONOS nodes" )
+ else:
+ consistentFlows = False
+ utilities.assert_equals(
+ expect=True,
+ actual=consistentFlows,
onpass="The flow count is consistent across all ONOS nodes",
onfail="ONOS nodes have different flow counts" )
+ if flowsResults and not consistentFlows:
+ for i in range( numControllers ):
+ try:
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " flows: " +
+ json.dumps( json.loads( ONOSFlows[i] ), sort_keys=True,
+ indent=4, separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " flows: " +
+ repr( ONOSFlows[ i ] ) )
+ elif flowsResults and consistentFlows:
+ flowCheck = main.TRUE
+ flowState = ONOSFlows[ 0 ]
+
main.step( "Get the OF Table entries" )
global flows
flows = []
@@ -1084,64 +1167,80 @@
main.step( "Create TestONTopology object" )
ctrls = []
- count = 1
- while True:
- temp = ()
- if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
- temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
- temp = temp + ( "ONOS" + str( count ), )
- temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
- temp = temp + \
- ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
- ctrls.append( temp )
- count = count + 1
- else:
- break
- MNTopo = TestONTopology(
- main.Mininet1,
- ctrls ) # can also add Intent API info for intent operations
+ for node in nodes:
+ temp = ( node, node.name, node.ip_address, 6633 )
+ ctrls.append( temp )
+ MNTopo = TestONTopology( main.Mininet1, ctrls )
main.step( "Collecting topology information from ONOS" )
devices = []
- devices.append( main.ONOScli1.devices() )
- devices.append( main.ONOScli2.devices() )
- devices.append( main.ONOScli3.devices() )
- devices.append( main.ONOScli4.devices() )
- devices.append( main.ONOScli5.devices() )
- devices.append( main.ONOScli6.devices() )
- devices.append( main.ONOScli7.devices() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].devices,
+ name="devices-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ devices.append( t.result )
hosts = []
- hosts.append( json.loads( main.ONOScli1.hosts() ) )
- hosts.append( json.loads( main.ONOScli2.hosts() ) )
- hosts.append( json.loads( main.ONOScli3.hosts() ) )
- hosts.append( json.loads( main.ONOScli4.hosts() ) )
- hosts.append( json.loads( main.ONOScli5.hosts() ) )
- hosts.append( json.loads( main.ONOScli6.hosts() ) )
- hosts.append( json.loads( main.ONOScli7.hosts() ) )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].hosts,
+ name="hosts-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ try:
+ hosts.append( json.loads( t.result ) )
+ except ( ValueError, TypeError ):
+ # FIXME: better handling of this, print which node
+ # Maybe use thread name?
+ main.log.exception( "Error parsing json output of hosts" )
+ # FIXME: should this be an empty json object instead?
+ hosts.append( None )
+
ports = []
- ports.append( main.ONOScli1.ports() )
- ports.append( main.ONOScli2.ports() )
- ports.append( main.ONOScli3.ports() )
- ports.append( main.ONOScli4.ports() )
- ports.append( main.ONOScli5.ports() )
- ports.append( main.ONOScli6.ports() )
- ports.append( main.ONOScli7.ports() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].ports,
+ name="ports-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ports.append( t.result )
links = []
- links.append( main.ONOScli1.links() )
- links.append( main.ONOScli2.links() )
- links.append( main.ONOScli3.links() )
- links.append( main.ONOScli4.links() )
- links.append( main.ONOScli5.links() )
- links.append( main.ONOScli6.links() )
- links.append( main.ONOScli7.links() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].links,
+ name="links-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ links.append( t.result )
clusters = []
- clusters.append( main.ONOScli1.clusters() )
- clusters.append( main.ONOScli2.clusters() )
- clusters.append( main.ONOScli3.clusters() )
- clusters.append( main.ONOScli4.clusters() )
- clusters.append( main.ONOScli5.clusters() )
- clusters.append( main.ONOScli6.clusters() )
- clusters.append( main.ONOScli7.clusters() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].clusters,
+ name="clusters-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ clusters.append( t.result )
# Compare json objects for hosts and dataplane clusters
# hosts
@@ -1175,10 +1274,9 @@
for controller in range( 0, len( hosts ) ):
controllerStr = str( controller + 1 )
for host in hosts[ controller ]:
- if host.get( 'ips', [] ) == []:
- main.log.error(
- "DEBUG:Error with host ips on controller" +
- controllerStr + ": " + str( host ) )
+ if not host.get( 'ips', [ ] ):
+ main.log.error( "DEBUG:Error with host ips on controller" +
+ controllerStr + ": " + str( host ) )
ipResult = main.FALSE
utilities.assert_equals(
expect=main.TRUE,
@@ -1189,12 +1287,12 @@
# Strongly connected clusters of devices
consistentClustersResult = main.TRUE
for controller in range( len( clusters ) ):
+ controllerStr = str( controller + 1 )
if "Error" not in clusters[ controller ]:
if clusters[ controller ] == clusters[ 0 ]:
continue
else: # clusters not consistent
- main.log.report( "clusters from ONOS" +
- controllerStr +
+ main.log.report( "clusters from ONOS" + controllerStr +
" is inconsistent with ONOS1" )
consistentClustersResult = main.FALSE
@@ -1211,7 +1309,11 @@
onpass="Clusters view is consistent across all ONOS nodes",
onfail="ONOS nodes have different views of clusters" )
# there should always only be one cluster
- numClusters = len( json.loads( clusters[ 0 ] ) )
+ try:
+ numClusters = len( json.loads( clusters[ 0 ] ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing clusters[0]: " +
+ repr( clusters[ 0 ] ) )
clusterResults = main.FALSE
if numClusters == 1:
clusterResults = main.TRUE
@@ -1230,8 +1332,7 @@
if devices[ controller ] or "Error" not in devices[ controller ]:
currentDevicesResult = main.Mininet1.compareSwitches(
MNTopo,
- json.loads(
- devices[ controller ] ) )
+ json.loads( devices[ controller ] ) )
else:
currentDevicesResult = main.FALSE
utilities.assert_equals( expect=main.TRUE,
@@ -1244,8 +1345,7 @@
if ports[ controller ] or "Error" not in ports[ controller ]:
currentPortsResult = main.Mininet1.comparePorts(
MNTopo,
- json.loads(
- ports[ controller ] ) )
+ json.loads( ports[ controller ] ) )
else:
currentPortsResult = main.FALSE
utilities.assert_equals( expect=main.TRUE,
@@ -1258,8 +1358,7 @@
if links[ controller ] or "Error" not in links[ controller ]:
currentLinksResult = main.Mininet1.compareLinks(
MNTopo,
- json.loads(
- links[ controller ] ) )
+ json.loads( links[ controller ] ) )
else:
currentLinksResult = main.FALSE
utilities.assert_equals( expect=main.TRUE,
@@ -1273,16 +1372,17 @@
portsResults = portsResults and currentPortsResult
linksResults = linksResults and currentLinksResult
- topoResult = devicesResults and portsResults and linksResults\
- and consistentHostsResult and consistentClustersResult\
- and clusterResults and ipResult
+ topoResult = ( devicesResults and portsResults and linksResults
+ and consistentHostsResult and consistentClustersResult
+ and clusterResults and ipResult )
utilities.assert_equals( expect=main.TRUE, actual=topoResult,
onpass="Topology Check Test successful",
onfail="Topology Check Test NOT successful" )
finalAssert = main.TRUE
- finalAssert = finalAssert and topoResult and flowCheck \
- and intentCheck and consistentMastership and rolesNotNull
+ finalAssert = ( finalAssert and topoResult and flowCheck
+ and intentCheck and consistentMastership
+ and mastershipCheck and rolesNotNull )
utilities.assert_equals( expect=main.TRUE, actual=finalAssert,
onpass="State check successful",
onfail="State check NOT successful" )
@@ -1292,29 +1392,35 @@
The Failure case.
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
main.log.report( "Killing 3 ONOS nodes" )
- main.log.case( "Restart minority of ONOS nodes" )
+ main.case( "Restart minority of ONOS nodes" )
# TODO: Randomize these nodes
- main.ONOSbench.onosKill( ONOS1Ip )
+ # TODO: use threads in this case
+ main.ONOSbench.onosKill( nodes[0].ip_address )
time.sleep( 10 )
- main.ONOSbench.onosKill( ONOS2Ip )
+ main.ONOSbench.onosKill( nodes[1].ip_address )
time.sleep( 10 )
- main.ONOSbench.onosKill( ONOS3Ip )
+ main.ONOSbench.onosKill( nodes[2].ip_address )
main.step( "Checking if ONOS is up yet" )
count = 0
onosIsupResult = main.FALSE
while onosIsupResult == main.FALSE and count < 10:
- onos1Isup = main.ONOSbench.isup( ONOS1Ip )
- onos2Isup = main.ONOSbench.isup( ONOS2Ip )
- onos3Isup = main.ONOSbench.isup( ONOS3Ip )
+ onos1Isup = main.ONOSbench.isup( nodes[0].ip_address )
+ onos2Isup = main.ONOSbench.isup( nodes[1].ip_address )
+ onos3Isup = main.ONOSbench.isup( nodes[2].ip_address )
onosIsupResult = onos1Isup and onos2Isup and onos3Isup
count = count + 1
# TODO: if it becomes an issue, we can retry this step a few times
- cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
- cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
- cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
+ cliResult1 = main.ONOScli1.startOnosCli( nodes[0].ip_address )
+ cliResult2 = main.ONOScli2.startOnosCli( nodes[1].ip_address )
+ cliResult3 = main.ONOScli3.startOnosCli( nodes[2].ip_address )
cliResults = cliResult1 and cliResult2 and cliResult3
# Grab the time of restart so we chan check how long the gossip
@@ -1330,108 +1436,103 @@
Check state after ONOS failure
"""
import json
- import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
main.case( "Running ONOS Constant State Tests" )
+ main.step( "Check that each switch has a master" )
# Assert that each device has a master
- ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
- ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
- ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
- ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
- ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
- ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
- ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
- rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
- ONOS3MasterNotNull and ONOS4MasterNotNull and\
- ONOS5MasterNotNull and ONOS6MasterNotNull and\
- ONOS7MasterNotNull
+ rolesNotNull = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].rolesNotNull,
+ name="rolesNotNull-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ rolesNotNull = rolesNotNull and t.result
utilities.assert_equals(
expect=main.TRUE,
actual=rolesNotNull,
onpass="Each device has a master",
onfail="Some devices don't have a master assigned" )
- main.step( "Check if switch roles are consistent across all nodes" )
- ONOS1Mastership = main.ONOScli1.roles()
- ONOS2Mastership = main.ONOScli2.roles()
- ONOS3Mastership = main.ONOScli3.roles()
- ONOS4Mastership = main.ONOScli4.roles()
- ONOS5Mastership = main.ONOScli5.roles()
- ONOS6Mastership = main.ONOScli6.roles()
- ONOS7Mastership = main.ONOScli7.roles()
- if "Error" in ONOS1Mastership or not ONOS1Mastership\
- or "Error" in ONOS2Mastership or not ONOS2Mastership\
- or "Error" in ONOS3Mastership or not ONOS3Mastership\
- or "Error" in ONOS4Mastership or not ONOS4Mastership\
- or "Error" in ONOS5Mastership or not ONOS5Mastership\
- or "Error" in ONOS6Mastership or not ONOS6Mastership\
- or "Error" in ONOS7Mastership or not ONOS7Mastership:
- main.log.error( "Error in getting ONOS mastership" )
- main.log.warn( "ONOS1 mastership response: " +
- repr( ONOS1Mastership ) )
- main.log.warn( "ONOS2 mastership response: " +
- repr( ONOS2Mastership ) )
- main.log.warn( "ONOS3 mastership response: " +
- repr( ONOS3Mastership ) )
- main.log.warn( "ONOS4 mastership response: " +
- repr( ONOS4Mastership ) )
- main.log.warn( "ONOS5 mastership response: " +
- repr( ONOS5Mastership ) )
- main.log.warn( "ONOS6 mastership response: " +
- repr( ONOS6Mastership ) )
- main.log.warn( "ONOS7 mastership response: " +
- repr( ONOS7Mastership ) )
- consistentMastership = main.FALSE
- elif ONOS1Mastership == ONOS2Mastership\
- and ONOS1Mastership == ONOS3Mastership\
- and ONOS1Mastership == ONOS4Mastership\
- and ONOS1Mastership == ONOS5Mastership\
- and ONOS1Mastership == ONOS6Mastership\
- and ONOS1Mastership == ONOS7Mastership:
- consistentMastership = main.TRUE
+ ONOSMastership = []
+ mastershipCheck = main.FALSE
+ consistentMastership = True
+ rolesResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].roles,
+ name="roles-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSMastership.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSMastership[i] or "Error" in ONOSMastership[i]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " roles" )
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " mastership response: " +
+ repr( ONOSMastership[i] ) )
+ rolesResults = False
+ utilities.assert_equals(
+ expect=True,
+ actual=rolesResults,
+ onpass="No error in reading roles output",
+ onfail="Error in reading roles from ONOS" )
+
+ main.step( "Check for consistency in roles from each controller" )
+ if all([ i == ONOSMastership[ 0 ] for i in ONOSMastership ] ):
main.log.report(
"Switch roles are consistent across all ONOS nodes" )
else:
- main.log.warn( "ONOS1 roles: ", json.dumps(
- json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS2 roles: ", json.dumps(
- json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS3 roles: ", json.dumps(
- json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS4 roles: ", json.dumps(
- json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS5 roles: ", json.dumps(
- json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS6 roles: ", json.dumps(
- json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS7 roles: ", json.dumps(
- json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- consistentMastership = main.FALSE
+ consistentMastership = False
utilities.assert_equals(
- expect=main.TRUE,
+ expect=True,
actual=consistentMastership,
onpass="Switch roles are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of switch roles" )
+ if rolesResults and not consistentMastership:
+ for i in range( numControllers ):
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " roles: ",
+ json.dumps(
+ json.loads( ONOSMastership[ i ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ elif rolesResults and not consistentMastership:
+ mastershipCheck = main.TRUE
+
description2 = "Compare switch roles from before failure"
main.step( description2 )
-
- currentJson = json.loads( ONOS1Mastership )
- oldJson = json.loads( mastershipState )
+ try:
+ currentJson = json.loads( ONOSMastership[0] )
+ oldJson = json.loads( mastershipState )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Something is wrong with parsing " +
+ "ONOSMastership[0] or mastershipState" )
+ main.log.error( "ONOSMastership[0]: " + repr( ONOSMastership[0] ) )
+ main.log.error( "mastershipState" + repr( mastershipState ) )
+ main.cleanup()
+ main.exit()
mastershipCheck = main.TRUE
for i in range( 1, 29 ):
switchDPID = str(
- main.Mininet1.getSwitchDPID(
- switch="s" +
- str( i ) ) )
-
+ main.Mininet1.getSwitchDPID( switch="s" + str( i ) ) )
current = [ switch[ 'master' ] for switch in currentJson
if switchDPID in switch[ 'id' ] ]
old = [ switch[ 'master' ] for switch in oldJson
@@ -1452,102 +1553,92 @@
mastershipCheck = consistentMastership
main.step( "Get the intents and compare across all nodes" )
- ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
- ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
- ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
- ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
- ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
- ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
- ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+ ONOSIntents = []
intentCheck = main.FALSE
- if "Error" in ONOS1Intents or not ONOS1Intents\
- or "Error" in ONOS2Intents or not ONOS2Intents\
- or "Error" in ONOS3Intents or not ONOS3Intents\
- or "Error" in ONOS4Intents or not ONOS4Intents\
- or "Error" in ONOS5Intents or not ONOS5Intents\
- or "Error" in ONOS6Intents or not ONOS6Intents\
- or "Error" in ONOS7Intents or not ONOS7Intents:
- main.log.report( "Error in getting ONOS intents" )
- main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
- main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
- main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
- main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
- main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
- main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
- main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
- elif ONOS1Intents == ONOS2Intents\
- and ONOS1Intents == ONOS3Intents\
- and ONOS1Intents == ONOS4Intents\
- and ONOS1Intents == ONOS5Intents\
- and ONOS1Intents == ONOS6Intents\
- and ONOS1Intents == ONOS7Intents:
- intentCheck = main.TRUE
- main.log.report( "Intents are consistent across all ONOS nodes" )
- else:
- main.log.warn( "ONOS1 intents: " )
- print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS2 intents: " )
- print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS3 intents: " )
- print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS4 intents: " )
- print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS5 intents: " )
- print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS6 intents: " )
- print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS7 intents: " )
- print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
+ consistentIntents = True
+ intentsResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].intents,
+ name="intents-" + str( i ),
+ args=[],
+ kwargs={ 'jsonFormat': True } )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSIntents.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSIntents[ i ] or "Error" in ONOSIntents[ i ]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " intents" )
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents response: " +
+ repr( ONOSIntents[ i ] ) )
+ intentsResults = False
utilities.assert_equals(
- expect=main.TRUE,
- actual=intentCheck,
+ expect=True,
+ actual=intentsResults,
+ onpass="No error in reading intents output",
+ onfail="Error in reading intents from ONOS" )
+
+ main.step( "Check for consistency in Intents from each controller" )
+ if all([ sorted( i ) == sorted( ONOSIntents[ 0 ] ) for i in ONOSIntents ] ):
+ main.log.report( "Intents are consistent across all ONOS " +
+ "nodes" )
+ else:
+ consistentIntents = False
+ utilities.assert_equals(
+ expect=True,
+ actual=consistentIntents,
onpass="Intents are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of intents" )
- # Print the intent states
- intents = []
- intents.append( ONOS1Intents )
- intents.append( ONOS2Intents )
- intents.append( ONOS3Intents )
- intents.append( ONOS4Intents )
- intents.append( ONOS5Intents )
- intents.append( ONOS6Intents )
- intents.append( ONOS7Intents )
intentStates = []
- for node in intents: # Iter through ONOS nodes
+ for node in ONOSIntents: # Iter through ONOS nodes
nodeStates = []
# Iter through intents of a node
- for intent in json.loads( node ):
- nodeStates.append( intent[ 'state' ] )
+ try:
+ for intent in json.loads( node ):
+ nodeStates.append( intent[ 'state' ] )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error in parsing intents" )
+ main.log.error( repr( node ) )
intentStates.append( nodeStates )
out = [ (i, nodeStates.count( i ) ) for i in set( nodeStates ) ]
main.log.info( dict( out ) )
+ if intentsResults and not consistentIntents:
+ for i in range( numControllers ):
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents: " )
+ main.log.warn( json.dumps(
+ json.loads( ONOSIntents[ i ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ elif intentsResults and consistentIntents:
+ intentCheck = main.TRUE
+
# NOTE: Store has no durability, so intents are lost across system
# restarts
main.step( "Compare current intents with intents before the failure" )
# NOTE: this requires case 5 to pass for intentState to be set.
# maybe we should stop the test if that fails?
sameIntents = main.TRUE
- if intentState and intentState == ONOS1Intents:
+ if intentState and intentState == ONOSIntents[ 0 ]:
sameIntents = main.TRUE
main.log.report( "Intents are consistent with before failure" )
# TODO: possibly the states have changed? we may need to figure out
- # what the aceptable states are
+ # what the acceptable states are
else:
try:
- main.log.warn( "ONOS1 intents: " )
- print json.dumps( json.loads( ONOS1Intents ),
- sort_keys=True, indent=4,
- separators=( ',', ': ' ) )
- except Exception:
- pass
+ main.log.warn( "ONOS intents: " )
+ main.log.warn( json.dumps( json.loads( ONOSIntents[ 0 ] ),
+ sort_keys=True, indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Exception printing intents" )
+ main.log.warn( repr( ONOSIntents[0] ) )
sameIntents = main.FALSE
utilities.assert_equals(
expect=main.TRUE,
@@ -1581,12 +1672,8 @@
main.step( "Check the continuous pings to ensure that no packets " +
"were dropped during component failure" )
- # FIXME: This check is always failing. Investigate cause
- # NOTE: this may be something to do with file permsissions
- # or slight change in format
- main.Mininet2.pingKill(
- main.params[ 'TESTONUSER' ],
- main.params[ 'TESTONIP' ] )
+ main.Mininet2.pingKill( main.params[ 'TESTONUSER' ],
+ main.params[ 'TESTONIP' ] )
LossInPings = main.FALSE
# NOTE: checkForLoss returns main.FALSE with 0% packet loss
for i in range( 8, 18 ):
@@ -1611,11 +1698,13 @@
# Test of LeadershipElection
leaderList = []
+ # FIXME: make sure this matches nodes that were restarted
+ restarted = [ nodes[0].ip_address, nodes[1].ip_address,
+ nodes[2].ip_address ]
+
leaderResult = main.TRUE
- for controller in range( 1, numControllers + 1 ):
- # loop through ONOScli handlers
- node = getattr( main, ( 'ONOScli' + str( controller ) ) )
- leaderN = node.electionTestLeader()
+ for cli in CLIs:
+ leaderN = cli.electionTestLeader()
leaderList.append( leaderN )
if leaderN == main.FALSE:
# error in response
@@ -1624,14 +1713,12 @@
" error logs" )
leaderResult = main.FALSE
elif leaderN is None:
- main.log.report( "ONOS" + str( controller ) +
+ main.log.report( cli.name +
" shows no leader for the election-app was" +
" elected after the old one died" )
leaderResult = main.FALSE
- elif leaderN == ONOS1Ip or leaderN == ONOS2Ip or\
- leaderN == ONOS3Ip:
- main.log.report( "ONOS" + str( controller ) +
- " shows " + str( leaderN ) +
+ elif leaderN in restarted:
+ main.log.report( cli.name + " shows " + str( leaderN ) +
" as leader for the election-app, but it " +
"was restarted" )
leaderResult = main.FALSE
@@ -1670,28 +1757,21 @@
from sts.topology.teston_topology import TestONTopology
import json
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
description = "Compare ONOS Topology view to Mininet topology"
main.case( description )
main.log.report( description )
main.step( "Create TestONTopology object" )
ctrls = []
- count = 1
- while True:
- temp = ()
- if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
- temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
- temp = temp + ( "ONOS" + str( count ), )
- temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
- temp = temp + \
- ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
- ctrls.append( temp )
- count = count + 1
- else:
- break
- MNTopo = TestONTopology(
- main.Mininet1,
- ctrls ) # can also add Intent API info for intent operations
+ for node in nodes:
+ temp = ( node, node.name, node.ip_address, 6633 )
+ ctrls.append( temp )
+ MNTopo = TestONTopology( main.Mininet1, ctrls )
main.step( "Comparing ONOS topology to MN" )
devicesResults = main.TRUE
@@ -1705,28 +1785,40 @@
startTime = time.time()
# Give time for Gossip to work
while topoResult == main.FALSE and elapsed < 60:
- count = count + 1
+ count += 1
if count > 1:
- # TODO: Depricate STS usage
+ # TODO: Deprecate STS usage
MNTopo = TestONTopology( main.Mininet1, ctrls )
cliStart = time.time()
devices = []
- devices.append( main.ONOScli1.devices() )
- devices.append( main.ONOScli2.devices() )
- devices.append( main.ONOScli3.devices() )
- devices.append( main.ONOScli4.devices() )
- devices.append( main.ONOScli5.devices() )
- devices.append( main.ONOScli6.devices() )
- devices.append( main.ONOScli7.devices() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].devices,
+ name="devices-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ devices.append( t.result )
hosts = []
- hosts.append( json.loads( main.ONOScli1.hosts() ) )
- hosts.append( json.loads( main.ONOScli2.hosts() ) )
- hosts.append( json.loads( main.ONOScli3.hosts() ) )
- hosts.append( json.loads( main.ONOScli4.hosts() ) )
- hosts.append( json.loads( main.ONOScli5.hosts() ) )
- hosts.append( json.loads( main.ONOScli6.hosts() ) )
- hosts.append( json.loads( main.ONOScli7.hosts() ) )
ipResult = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].hosts,
+ name="hosts-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ try:
+ hosts.append( json.loads( t.result ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing hosts results" )
+ main.log.error( repr( t.result ) )
for controller in range( 0, len( hosts ) ):
controllerStr = str( controller + 1 )
for host in hosts[ controller ]:
@@ -1736,29 +1828,41 @@
controllerStr + ": " + str( host ) )
ipResult = main.FALSE
ports = []
- ports.append( main.ONOScli1.ports() )
- ports.append( main.ONOScli2.ports() )
- ports.append( main.ONOScli3.ports() )
- ports.append( main.ONOScli4.ports() )
- ports.append( main.ONOScli5.ports() )
- ports.append( main.ONOScli6.ports() )
- ports.append( main.ONOScli7.ports() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].ports,
+ name="ports-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ports.append( t.result )
links = []
- links.append( main.ONOScli1.links() )
- links.append( main.ONOScli2.links() )
- links.append( main.ONOScli3.links() )
- links.append( main.ONOScli4.links() )
- links.append( main.ONOScli5.links() )
- links.append( main.ONOScli6.links() )
- links.append( main.ONOScli7.links() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].links,
+ name="links-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ links.append( t.result )
clusters = []
- clusters.append( main.ONOScli1.clusters() )
- clusters.append( main.ONOScli2.clusters() )
- clusters.append( main.ONOScli3.clusters() )
- clusters.append( main.ONOScli4.clusters() )
- clusters.append( main.ONOScli5.clusters() )
- clusters.append( main.ONOScli6.clusters() )
- clusters.append( main.ONOScli7.clusters() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].clusters,
+ name="clusters-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ clusters.append( t.result )
elapsed = time.time() - startTime
cliTime = time.time() - cliStart
@@ -1877,7 +1981,11 @@
onpass="Clusters view is consistent across all ONOS nodes",
onfail="ONOS nodes have different views of clusters" )
# there should always only be one cluster
- numClusters = len( json.loads( clusters[ 0 ] ) )
+ try:
+ numClusters = len( json.loads( clusters[ 0 ] ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing clusters[0]: " +
+ repr( clusters[0] ) )
clusterResults = main.FALSE
if numClusters == 1:
clusterResults = main.TRUE
@@ -1906,11 +2014,50 @@
if topoResult == main.TRUE:
main.log.report( "ONOS topology view matches Mininet topology" )
+ # FIXME: move this to an ONOS state case
+ main.step( "Checking ONOS nodes" )
+ nodesOutput = []
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].nodes,
+ name="nodes-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ nodesOutput.append( t.result )
+ ips = [ node.ip_address for node in nodes ]
+ for i in nodesOutput:
+ try:
+ current = json.loads( i )
+ for node in current:
+ if node['ip'] in ips: # node in nodes() output is in cell
+ if node['state'] == 'ACTIVE':
+ pass # as it should be
+ else:
+ main.log.error( "Error in ONOS node availability" )
+ main.log.error(
+ json.dumps( current,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ break
+ except ( ValueError, TypeError ):
+ main.log.error( "Error parsing nodes output" )
+ main.log.warn( repr( i ) )
+
def CASE9( self, main ):
"""
Link s3-s28 down
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# NOTE: You should probably run a topology check after this
linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
@@ -1926,7 +2073,7 @@
" seconds for link down to be discovered" )
time.sleep( linkSleep )
utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
- onpass="Link down succesful",
+ onpass="Link down successful",
onfail="Failed to bring link down" )
# TODO do some sort of check here
@@ -1935,6 +2082,11 @@
Link s3-s28 up
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# NOTE: You should probably run a topology check after this
linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
@@ -1950,7 +2102,7 @@
" seconds for link up to be discovered" )
time.sleep( linkSleep )
utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
- onpass="Link up succesful",
+ onpass="Link up successful",
onfail="Failed to bring link up" )
# TODO do some sort of check here
@@ -1960,6 +2112,11 @@
"""
# NOTE: You should probably run a topology check after this
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
@@ -1983,7 +2140,7 @@
if device and device[ 'available' ] is False:
result = main.TRUE
utilities.assert_equals( expect=main.TRUE, actual=result,
- onpass="Kill switch succesful",
+ onpass="Kill switch successful",
onfail="Failed to kill switch?" )
def CASE12( self, main ):
@@ -1992,6 +2149,18 @@
"""
# NOTE: You should probably run a topology check after this
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
+ assert ONOS1Port, "ONOS1Port not defined"
+ assert ONOS2Port, "ONOS2Port not defined"
+ assert ONOS3Port, "ONOS3Port not defined"
+ assert ONOS4Port, "ONOS4Port not defined"
+ assert ONOS5Port, "ONOS5Port not defined"
+ assert ONOS6Port, "ONOS6Port not defined"
+ assert ONOS7Port, "ONOS7Port not defined"
switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
switch = main.params[ 'kill' ][ 'switch' ]
@@ -2004,24 +2173,23 @@
main.step( "Add back " + switch )
main.log.report( "Adding back " + switch )
main.Mininet1.addSwitch( switch, dpid=switchDPID )
- # TODO: New dpid or same? Ask Thomas?
for peer in links:
main.Mininet1.addLink( switch, peer )
main.Mininet1.assignSwController( sw=switch.split( 's' )[ 1 ],
count=numControllers,
- ip1=ONOS1Ip,
+ ip1=nodes[ 0 ].ip_address,
port1=ONOS1Port,
- ip2=ONOS2Ip,
+ ip2=nodes[ 1 ].ip_address,
port2=ONOS2Port,
- ip3=ONOS3Ip,
+ ip3=nodes[ 2 ].ip_address,
port3=ONOS3Port,
- ip4=ONOS4Ip,
+ ip4=nodes[ 3 ].ip_address,
port4=ONOS4Port,
- ip5=ONOS5Ip,
+ ip5=nodes[ 4 ].ip_address,
port5=ONOS5Port,
- ip6=ONOS6Ip,
+ ip6=nodes[ 5 ].ip_address,
port6=ONOS6Port,
- ip7=ONOS7Ip,
+ ip7=nodes[ 6 ].ip_address,
port7=ONOS7Port )
main.log.info( "Waiting " + str( switchSleep ) +
" seconds for switch up to be discovered" )
@@ -2033,7 +2201,7 @@
if device and device[ 'available' ]:
result = main.TRUE
utilities.assert_equals( expect=main.TRUE, actual=result,
- onpass="add switch succesful",
+ onpass="add switch successful",
onfail="Failed to add switch?" )
def CASE13( self, main ):
@@ -2042,37 +2210,22 @@
"""
import os
import time
- # TODO: make use of this elsewhere
- ips = []
- ips.append( ONOS1Ip )
- ips.append( ONOS2Ip )
- ips.append( ONOS3Ip )
- ips.append( ONOS4Ip )
- ips.append( ONOS5Ip )
- ips.append( ONOS6Ip )
- ips.append( ONOS7Ip )
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# printing colors to terminal
- colors = {}
- colors[ 'cyan' ] = '\033[96m'
- colors[ 'purple' ] = '\033[95m'
- colors[ 'blue' ] = '\033[94m'
- colors[ 'green' ] = '\033[92m'
- colors[ 'yellow' ] = '\033[93m'
- colors[ 'red' ] = '\033[91m'
- colors[ 'end' ] = '\033[0m'
+ colors = { 'cyan': '\033[96m', 'purple': '\033[95m',
+ 'blue': '\033[94m', 'green': '\033[92m',
+ 'yellow': '\033[93m', 'red': '\033[91m', 'end': '\033[0m' }
description = "Test Cleanup"
main.log.report( description )
main.case( description )
main.step( "Killing tcpdumps" )
main.Mininet2.stopTcpdump()
- main.step( "Checking ONOS Logs for errors" )
- for i in range( 7 ):
- print colors[ 'purple' ] + "Checking logs for errors on " + \
- "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
- print main.ONOSbench.checkLogs( ips[ i ] )
-
main.step( "Copying MN pcap and ONOS log files to test station" )
testname = main.TEST
teststationUser = main.params[ 'TESTONUSER' ]
@@ -2088,14 +2241,13 @@
# NOTE: must end in /
dstDir = "~/packet_captures/"
for f in logFiles:
- for i in range( 7 ):
- main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
- logFolder + f + " " +
+ for node in nodes:
+ main.ONOSbench.handle.sendline( "scp sdn@" + node.ip_address +
+ ":" + logFolder + f + " " +
teststationUser + "@" +
teststationIP + ":" +
dstDir + str( testname ) +
- "-ONOS" + str( i + 1 ) + "-" +
- f )
+ "-" + node.name + "-" + f )
main.ONOSbench.handle.expect( "\$" )
# std*.log's
@@ -2105,18 +2257,26 @@
# NOTE: must end in /
dstDir = "~/packet_captures/"
for f in logFiles:
- for i in range( 7 ):
- main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
- logFolder + f + " " +
+ for node in nodes:
+ main.ONOSbench.handle.sendline( "scp sdn@" + node.ip_address +
+ ":" + logFolder + f + " " +
teststationUser + "@" +
teststationIP + ":" +
dstDir + str( testname ) +
- "-ONOS" + str( i + 1 ) + "-" +
- f )
+ "-" + node.name + "-" + f )
main.ONOSbench.handle.expect( "\$" )
# sleep so scp can finish
time.sleep( 10 )
+
+ main.step( "Stopping Mininet" )
main.Mininet1.stopNet()
+
+ main.step( "Checking ONOS Logs for errors" )
+ for node in nodes:
+ print colors[ 'purple' ] + "Checking logs for errors on " + \
+ node.name + ":" + colors[ 'end' ]
+ print main.ONOSbench.checkLogs( node.ip_address )
+
main.step( "Packing and rotating pcap archives" )
os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
@@ -2129,62 +2289,29 @@
"""
start election app on all onos nodes
"""
- leaderResult = main.TRUE
- # install app on onos 1
- main.log.info( "Install leadership election app" )
- main.ONOScli1.featureInstall( "onos-app-election" )
- # wait for election
- # check for leader
- leader = main.ONOScli1.electionTestLeader()
- # verify leader is ONOS1
- if leader == ONOS1Ip:
- # all is well
- pass
- elif leader is None:
- # No leader elected
- main.log.report( "No leader was elected" )
- leaderResult = main.FALSE
- elif leader == main.FALSE:
- # error in response
- # TODO: add check for "Command not found:" in the driver, this
- # means the app isn't loaded
- main.log.report( "Something is wrong with electionTestLeader" +
- " function, check the error logs" )
- leaderResult = main.FALSE
- else:
- # error in response
- main.log.report(
- "Unexpected response from electionTestLeader function:'" +
- str( leader ) +
- "'" )
- leaderResult = main.FALSE
+ import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
- # install on other nodes and check for leader.
- # Should be onos1 and each app should show the same leader
- for controller in range( 2, numControllers + 1 ):
- # loop through ONOScli handlers
- node = getattr( main, ( 'ONOScli' + str( controller ) ) )
- node.featureInstall( "onos-app-election" )
- leaderN = node.electionTestLeader()
- # verify leader is ONOS1
- if leaderN == ONOS1Ip:
- # all is well
- pass
- elif leaderN == main.FALSE:
- # error in response
- # TODO: add check for "Command not found:" in the driver, this
- # means the app isn't loaded
- main.log.report( "Something is wrong with " +
- "electionTestLeader function, check the" +
- " error logs" )
+ leaderResult = main.TRUE
+ main.log.info( "Install leadership election app" )
+ main.ONOScli1.activateApp( "org.onosproject.election" )
+ leaders = []
+ for cli in CLIs:
+ leader = cli.electionTestLeader()
+ if leader is None or leader == main.FALSE:
+ main.log.report( cli.name + ": Leader for the election app " +
+ "should be an ONOS node, instead got '" +
+ str( leader ) + "'" )
leaderResult = main.FALSE
- elif leader != leaderN:
- leaderResult = main.FALSE
- main.log.report( "ONOS" + str( controller ) + " sees " +
- str( leaderN ) +
- " as the leader of the election app. Leader" +
- " should be " +
- str( leader ) )
+ leaders.append( leader )
+ if len( set( leaders ) ) != 1:
+ leaderResult = main.FALSE
+ main.log.error( "Results of electionTestLeader is order of CLIs:" +
+ str( leaders ) )
if leaderResult:
main.log.report( "Leadership election tests passed( consistent " +
"view of leader across listeners and a leader " +
@@ -2199,36 +2326,32 @@
"""
Check that Leadership Election is still functional
"""
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
+
leaderResult = main.TRUE
description = "Check that Leadership Election is still functional"
main.log.report( description )
main.case( description )
main.step( "Find current leader and withdraw" )
leader = main.ONOScli1.electionTestLeader()
- # TODO: do some sanity checking on leader before using it
+ # do some sanity checking on leader before using it
withdrawResult = main.FALSE
- if leader == ONOS1Ip:
- oldLeader = getattr( main, "ONOScli1" )
- elif leader == ONOS2Ip:
- oldLeader = getattr( main, "ONOScli2" )
- elif leader == ONOS3Ip:
- oldLeader = getattr( main, "ONOScli3" )
- elif leader == ONOS4Ip:
- oldLeader = getattr( main, "ONOScli4" )
- elif leader == ONOS5Ip:
- oldLeader = getattr( main, "ONOScli5" )
- elif leader == ONOS6Ip:
- oldLeader = getattr( main, "ONOScli6" )
- elif leader == ONOS7Ip:
- oldLeader = getattr( main, "ONOScli7" )
- elif leader is None or leader == main.FALSE:
+ if leader is None or leader == main.FALSE:
main.log.report(
"Leader for the election app should be an ONOS node," +
"instead got '" + str( leader ) + "'" )
leaderResult = main.FALSE
oldLeader = None
- else:
- main.log.error( "Leader election --- why am I HERE?!?")
+ for i in range( len( CLIs ) ):
+ if leader == nodes[ i ].ip_address:
+ oldLeader = CLIs[ i ]
+ break
+ else: # FOR/ELSE statement
+ main.log.error( "Leader election, could not find current leader" )
if oldLeader:
withdrawResult = oldLeader.electionTestWithdraw()
utilities.assert_equals(
@@ -2238,26 +2361,28 @@
onfail="App was not withdrawn from election" )
main.step( "Make sure new leader is elected" )
+ # FIXME: use threads
leaderList = []
- for controller in range( 1, numControllers + 1 ):
- # loop through ONOScli handlers
- node = getattr( main, ( 'ONOScli' + str( controller ) ) )
- leaderList.append( node.electionTestLeader() )
- for leaderN in leaderList:
+ for cli in CLIs:
+ leaderN = cli.electionTestLeader()
+ leaderList.append( leaderN )
if leaderN == leader:
- main.log.report(
- "ONOS" + str( controller ) +
- " still sees " + str( leader ) +
- " as leader after they withdrew" )
+ main.log.report( cli.name + " still sees " + str( leader ) +
+ " as leader after they withdrew" )
leaderResult = main.FALSE
elif leaderN == main.FALSE:
# error in response
# TODO: add check for "Command not found:" in the driver, this
- # means the app isn't loaded
+ # means the app isn't loaded
main.log.report( "Something is wrong with " +
"electionTestLeader function, " +
"check the error logs" )
leaderResult = main.FALSE
+ elif leaderN is None:
+ # node may not have recieved the event yet
+ leaderN = cli.electionTestLeader()
+ leaderList.pop()
+ leaderList.append( leaderN )
consistentLeader = main.FALSE
if len( set( leaderList ) ) == 1:
main.log.info( "Each Election-app sees '" +
@@ -2270,6 +2395,7 @@
for n in range( len( leaderList ) ):
main.log.report( "ONOS" + str( n + 1 ) + " response: " +
str( leaderList[ n ] ) )
+ leaderResult = leaderResult and consistentLeader
if leaderResult:
main.log.report( "Leadership election tests passed( consistent " +
"view of leader across listeners and a new " +
diff --git a/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.py b/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.py
index 99eb9e5..3c4541c 100644
--- a/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.py
+++ b/TestON/tests/HATestNetworkPartition/HATestNetworkPartition.py
@@ -415,6 +415,8 @@
# install onos-app-fwd
main.log.info( "Install reactive forwarding app" )
+ appResults = CLIs[0].activateApp( "org.onosproject.fwd" )
+ '''
main.ONOScli1.featureInstall( "onos-app-fwd" )
main.ONOScli2.featureInstall( "onos-app-fwd" )
main.ONOScli3.featureInstall( "onos-app-fwd" )
@@ -422,6 +424,7 @@
main.ONOScli5.featureInstall( "onos-app-fwd" )
main.ONOScli6.featureInstall( "onos-app-fwd" )
main.ONOScli7.featureInstall( "onos-app-fwd" )
+ '''
# REACTIVE FWD test
pingResult = main.FALSE
@@ -437,6 +440,8 @@
# uninstall onos-app-fwd
main.log.info( "Uninstall reactive forwarding app" )
+ appResults = appResults and CLIs[0].deactivateApp( "org.onosproject.fwd" )
+ '''
main.ONOScli1.featureUninstall( "onos-app-fwd" )
main.ONOScli2.featureUninstall( "onos-app-fwd" )
main.ONOScli3.featureUninstall( "onos-app-fwd" )
@@ -444,6 +449,7 @@
main.ONOScli5.featureUninstall( "onos-app-fwd" )
main.ONOScli6.featureUninstall( "onos-app-fwd" )
main.ONOScli7.featureUninstall( "onos-app-fwd" )
+ '''
# timeout for fwd flows
time.sleep( 10 )
@@ -529,7 +535,7 @@
if PingResult == main.FALSE:
main.log.report(
"Intents have not been installed correctly, pings failed." )
- main.log.warn( "ONSO1 intents: " )
+ main.log.warn( "ONOS1 intents: " )
main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
sort_keys=True,
indent=4,
diff --git a/TestON/tests/HATestSanity/HATestSanity.py b/TestON/tests/HATestSanity/HATestSanity.py
index 9ba287d..20f6cc8 100644
--- a/TestON/tests/HATestSanity/HATestSanity.py
+++ b/TestON/tests/HATestSanity/HATestSanity.py
@@ -49,7 +49,7 @@
main.case( "Setting up test environment" )
# TODO: save all the timers and output them for plotting
- # load some vairables from the params file
+ # load some variables from the params file
PULLCODE = False
if main.params[ 'Git' ] == 'True':
PULLCODE = True
@@ -57,38 +57,34 @@
cellName = main.params[ 'ENV' ][ 'cellName' ]
# set global variables
- global ONOS1Ip
global ONOS1Port
- global ONOS2Ip
global ONOS2Port
- global ONOS3Ip
global ONOS3Port
- global ONOS4Ip
global ONOS4Port
- global ONOS5Ip
global ONOS5Port
- global ONOS6Ip
global ONOS6Port
- global ONOS7Ip
global ONOS7Port
global numControllers
-
- ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
- ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
- ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
- ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
- ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
- ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
- ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
- ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
- ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
- ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
- ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
- ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
- ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
- ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
numControllers = int( main.params[ 'num_controllers' ] )
+ # FIXME: just get controller port from params?
+ # TODO: do we really need all these?
+ ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
+ ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
+ ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
+ ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
+ ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
+ ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
+ ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
+
+ global CLIs
+ CLIs = []
+ global nodes
+ nodes = []
+ for i in range( 1, numControllers + 1 ):
+ CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+ nodes.append( getattr( main, 'ONOS' + str( i ) ) )
+
main.step( "Applying cell variable to environment" )
cellResult = main.ONOSbench.setCell( cellName )
verifyResult = main.ONOSbench.verifyCell()
@@ -96,14 +92,10 @@
# FIXME:this is short term fix
main.log.report( "Removing raft logs" )
main.ONOSbench.onosRemoveRaftLogs()
+
main.log.report( "Uninstalling ONOS" )
- main.ONOSbench.onosUninstall( ONOS1Ip )
- main.ONOSbench.onosUninstall( ONOS2Ip )
- main.ONOSbench.onosUninstall( ONOS3Ip )
- main.ONOSbench.onosUninstall( ONOS4Ip )
- main.ONOSbench.onosUninstall( ONOS5Ip )
- main.ONOSbench.onosUninstall( ONOS6Ip )
- main.ONOSbench.onosUninstall( ONOS7Ip )
+ for node in nodes:
+ main.ONOSbench.onosUninstall( node.ip_address )
cleanInstallResult = main.TRUE
gitPullResult = main.TRUE
@@ -116,6 +108,8 @@
main.step( "Git checkout and pull " + gitBranch )
main.ONOSbench.gitCheckout( gitBranch )
gitPullResult = main.ONOSbench.gitPull()
+ if gitPullResult == main.ERROR:
+ main.log.error( "Error pulling git branch" )
main.step( "Using mvn clean & install" )
cleanInstallResult = main.ONOSbench.cleanInstall()
@@ -128,76 +122,38 @@
packageResult = main.ONOSbench.onosPackage()
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 )
- onos4InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS4Ip )
- onos5InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS5Ip )
- onos6InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS6Ip )
- onos7InstallResult = main.ONOSbench.onosInstall( options="-f",
- node=ONOS7Ip )
- onosInstallResult = onos1InstallResult and onos2InstallResult\
- and onos3InstallResult and onos4InstallResult\
- and onos5InstallResult and onos6InstallResult\
- and onos7InstallResult
+ onosInstallResult = main.TRUE
+ for node in nodes:
+ tmpResult = main.ONOSbench.onosInstall( options="-f",
+ node=node.ip_address )
+ onosInstallResult = onosInstallResult and tmpResult
main.step( "Checking if ONOS is up yet" )
for i in range( 2 ):
- onos1Isup = main.ONOSbench.isup( ONOS1Ip )
- if not onos1Isup:
- main.log.report( "ONOS1 didn't start!" )
- main.ONOSbench.onosStop( ONOS1Ip )
- main.ONOSbench.onosStart( ONOS1Ip )
- onos2Isup = main.ONOSbench.isup( ONOS2Ip )
- if not onos2Isup:
- main.log.report( "ONOS2 didn't start!" )
- main.ONOSbench.onosStop( ONOS2Ip )
- main.ONOSbench.onosStart( ONOS2Ip )
- onos3Isup = main.ONOSbench.isup( ONOS3Ip )
- if not onos3Isup:
- main.log.report( "ONOS3 didn't start!" )
- main.ONOSbench.onosStop( ONOS3Ip )
- main.ONOSbench.onosStart( ONOS3Ip )
- onos4Isup = main.ONOSbench.isup( ONOS4Ip )
- if not onos4Isup:
- main.log.report( "ONOS4 didn't start!" )
- main.ONOSbench.onosStop( ONOS4Ip )
- main.ONOSbench.onosStart( ONOS4Ip )
- onos5Isup = main.ONOSbench.isup( ONOS5Ip )
- if not onos5Isup:
- main.log.report( "ONOS5 didn't start!" )
- main.ONOSbench.onosStop( ONOS5Ip )
- main.ONOSbench.onosStart( ONOS5Ip )
- onos6Isup = main.ONOSbench.isup( ONOS6Ip )
- if not onos6Isup:
- main.log.report( "ONOS6 didn't start!" )
- main.ONOSbench.onosStop( ONOS6Ip )
- main.ONOSbench.onosStart( ONOS6Ip )
- onos7Isup = main.ONOSbench.isup( ONOS7Ip )
- if not onos7Isup:
- main.log.report( "ONOS7 didn't start!" )
- main.ONOSbench.onosStop( ONOS7Ip )
- main.ONOSbench.onosStart( ONOS7Ip )
- onosIsupResult = onos1Isup and onos2Isup and onos3Isup\
- and onos4Isup and onos5Isup and onos6Isup and onos7Isup
+ onosIsupResult = main.TRUE
+ for node in nodes:
+ started = main.ONOSbench.isup( node.ip_address )
+ if not started:
+ main.log.report( node.name + " didn't start!" )
+ main.ONOSbench.onosStop( node.ip_address )
+ main.ONOSbench.onosStart( node.ip_address )
+ onosIsupResult = onosIsupResult and started
if onosIsupResult == main.TRUE:
break
- cliResult1 = main.ONOScli1.startOnosCli( ONOS1Ip )
- cliResult2 = main.ONOScli2.startOnosCli( ONOS2Ip )
- cliResult3 = main.ONOScli3.startOnosCli( ONOS3Ip )
- cliResult4 = main.ONOScli4.startOnosCli( ONOS4Ip )
- cliResult5 = main.ONOScli5.startOnosCli( ONOS5Ip )
- cliResult6 = main.ONOScli6.startOnosCli( ONOS6Ip )
- cliResult7 = main.ONOScli7.startOnosCli( ONOS7Ip )
- cliResults = cliResult1 and cliResult2 and cliResult3 and\
- cliResult4 and cliResult5 and cliResult6 and cliResult7
+ main.log.step( "Starting ONOS CLI sessions" )
+ cliResults = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].startOnosCli,
+ name="startOnosCli-" + str( i ),
+ args=[nodes[i].ip_address] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ cliResults = cliResults and t.result
main.step( "Start Packet Capture MN" )
main.Mininet2.startTcpdump(
@@ -206,9 +162,28 @@
intf=main.params[ 'MNtcpdump' ][ 'intf' ],
port=main.params[ 'MNtcpdump' ][ 'port' ] )
+ appCheck = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].appToIDCheck,
+ name="appToIDCheck-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ appCheck = appCheck and t.result
+ utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+ onpass="App Ids seem to be correct",
+ onfail="Something is wrong with app Ids" )
+ if appCheck != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
+
case1Result = ( cleanInstallResult and packageResult and
cellResult and verifyResult and onosInstallResult
- and onosIsupResult and cliResults )
+ and onosIsupResult and cliResults and appCheck)
utilities.assert_equals( expect=main.TRUE, actual=case1Result,
onpass="Test startup successful",
@@ -223,22 +198,36 @@
Assign mastership to controllers
"""
import re
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
+ assert ONOS1Port, "ONOS1Port not defined"
+ assert ONOS2Port, "ONOS2Port not defined"
+ assert ONOS3Port, "ONOS3Port not defined"
+ assert ONOS4Port, "ONOS4Port not defined"
+ assert ONOS5Port, "ONOS5Port not defined"
+ assert ONOS6Port, "ONOS6Port not defined"
+ assert ONOS7Port, "ONOS7Port not defined"
main.log.report( "Assigning switches to controllers" )
main.case( "Assigning Controllers" )
main.step( "Assign switches to controllers" )
+ # TODO: rewrite this function to take lists of ips and ports?
+ # or list of tuples?
for i in range( 1, 29 ):
main.Mininet1.assignSwController(
sw=str( i ),
count=numControllers,
- ip1=ONOS1Ip, port1=ONOS1Port,
- ip2=ONOS2Ip, port2=ONOS2Port,
- ip3=ONOS3Ip, port3=ONOS3Port,
- ip4=ONOS4Ip, port4=ONOS4Port,
- ip5=ONOS5Ip, port5=ONOS5Port,
- ip6=ONOS6Ip, port6=ONOS6Port,
- ip7=ONOS7Ip, port7=ONOS7Port )
+ ip1=nodes[ 0 ].ip_address, port1=ONOS1Port,
+ ip2=nodes[ 1 ].ip_address, port2=ONOS2Port,
+ ip3=nodes[ 2 ].ip_address, port3=ONOS3Port,
+ ip4=nodes[ 3 ].ip_address, port4=ONOS4Port,
+ ip5=nodes[ 4 ].ip_address, port5=ONOS5Port,
+ ip6=nodes[ 5 ].ip_address, port6=ONOS6Port,
+ ip7=nodes[ 6 ].ip_address, port7=ONOS7Port )
mastershipCheck = main.TRUE
for i in range( 1, 29 ):
@@ -247,16 +236,14 @@
main.log.info( str( response ) )
except Exception:
main.log.info( repr( response ) )
- if re.search( "tcp:" + ONOS1Ip, response )\
- and re.search( "tcp:" + ONOS2Ip, response )\
- and re.search( "tcp:" + ONOS3Ip, response )\
- and re.search( "tcp:" + ONOS4Ip, response )\
- and re.search( "tcp:" + ONOS5Ip, response )\
- and re.search( "tcp:" + ONOS6Ip, response )\
- and re.search( "tcp:" + ONOS7Ip, response ):
- mastershipCheck = mastershipCheck and main.TRUE
- else:
- mastershipCheck = main.FALSE
+ for node in nodes:
+ if re.search( "tcp:" + node.ip_address, response ):
+ mastershipCheck = mastershipCheck and main.TRUE
+ else:
+ main.log.error( "Error, node " + node.ip_address + " is " +
+ "not in the list of controllers s" +
+ str( i ) + " is connecting to." )
+ mastershipCheck = main.FALSE
if mastershipCheck == main.TRUE:
main.log.report( "Switch mastership assigned correctly" )
utilities.assert_equals(
@@ -264,135 +251,65 @@
actual=mastershipCheck,
onpass="Switch mastership assigned correctly",
onfail="Switches not assigned correctly to controllers" )
-
# Manually assign mastership to the controller we want
roleCall = main.TRUE
roleCheck = main.TRUE
try:
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
- assert deviceId, "No device id for s1 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS1Ip )
- # Check assignment
- if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
- assert deviceId, "No device id for s28 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS1Ip )
- # Check assignment
- if ONOS1Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
- assert deviceId, "No device id for s2 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS2Ip )
- # Check assignment
- if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
- assert deviceId, "No device id for s3 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS2Ip )
- # Check assignment
- if ONOS2Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
- assert deviceId, "No device id for s5 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS3Ip )
- # Check assignment
- if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
- assert deviceId, "No device id for s6 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS3Ip )
- # Check assignment
- if ONOS3Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- # Assign switch
- deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
- assert deviceId, "No device id for s4 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS4Ip )
- # Check assignment
- if ONOS4Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- for i in range( 8, 18 ):
- dpid = '3' + str( i ).zfill( 3 )
- deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
- assert deviceId, "No device id for s%i in ONOS" % i
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS5Ip )
+ for i in range( 1, 29 ): # switches 1 through 28
+ # set up correct variables:
+ if i == 1:
+ ip = nodes[ 0 ].ip_address # ONOS1
+ deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+ elif i == 2:
+ ip = nodes[ 1 ].ip_address # ONOS2
+ deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+ elif i == 3:
+ ip = nodes[ 1 ].ip_address # ONOS2
+ deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+ elif i == 4:
+ ip = nodes[ 3 ].ip_address # ONOS4
+ deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+ elif i == 5:
+ ip = nodes[ 2 ].ip_address # ONOS3
+ deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+ elif i == 6:
+ ip = nodes[ 2 ].ip_address # ONOS3
+ deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+ elif i == 7:
+ ip = nodes[ 5 ].ip_address # ONOS6
+ deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+ elif i >= 8 and i <= 17:
+ ip = nodes[ 4 ].ip_address # ONOS5
+ dpid = '3' + str( i ).zfill( 3 )
+ deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+ elif i >= 18 and i <= 27:
+ ip = nodes[ 6 ].ip_address # ONOS7
+ dpid = '6' + str( i ).zfill( 3 )
+ deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+ elif i == 28:
+ ip = nodes[ 0 ].ip_address # ONOS1
+ deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+ else:
+ main.log.error( "You didn't write an else statement for " +
+ "switch s" + str( i ) )
+ # Assign switch
+ assert deviceId, "No device id for s" + str( i ) + " in ONOS"
+ # TODO: make this controller dynamic
+ roleCall = roleCall and main.ONOScli1.deviceRole( deviceId,
+ ip )
# Check assignment
- if ONOS5Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
+ master = main.ONOScli1.getRole( deviceId ).get( 'master' )
+ if ip in master:
roleCheck = roleCheck and main.TRUE
else:
roleCheck = roleCheck and main.FALSE
-
- deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
- assert deviceId, "No device id for s7 in ONOS"
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS6Ip )
- # Check assignment
- if ONOS6Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
-
- for i in range( 18, 28 ):
- dpid = '6' + str( i ).zfill( 3 )
- deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
- assert deviceId, "No device id for s%i in ONOS" % i
- roleCall = roleCall and main.ONOScli1.deviceRole(
- deviceId,
- ONOS7Ip )
- # Check assignment
- if ONOS7Ip in main.ONOScli1.getRole( deviceId ).get( 'master' ):
- roleCheck = roleCheck and main.TRUE
- else:
- roleCheck = roleCheck and main.FALSE
+ main.log.error( "Error, controller " + ip + " is not" +
+ " master " + "of device " +
+ str( deviceId ) + ". Master is " +
+ repr( master ) + "." )
except ( AttributeError, AssertionError ):
main.log.exception( "Something is wrong with ONOS device view" )
main.log.info( main.ONOScli1.devices() )
-
utilities.assert_equals(
expect=main.TRUE,
actual=roleCall,
@@ -417,6 +334,11 @@
"""
import time
import json
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
main.log.report( "Adding host intents" )
main.case( "Adding host Intents" )
@@ -425,39 +347,66 @@
# install onos-app-fwd
main.log.info( "Install reactive forwarding app" )
- main.ONOScli1.featureInstall( "onos-app-fwd" )
- main.ONOScli2.featureInstall( "onos-app-fwd" )
- main.ONOScli3.featureInstall( "onos-app-fwd" )
- main.ONOScli4.featureInstall( "onos-app-fwd" )
- main.ONOScli5.featureInstall( "onos-app-fwd" )
- main.ONOScli6.featureInstall( "onos-app-fwd" )
- main.ONOScli7.featureInstall( "onos-app-fwd" )
+ appResults = CLIs[0].activateApp( "org.onosproject.fwd" )
+
+ # FIXME: add this to asserts
+ appCheck = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].appToIDCheck,
+ name="appToIDCheck-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ appCheck = appCheck and t.result
+ utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+ onpass="App Ids seem to be correct",
+ onfail="Something is wrong with app Ids" )
+ if appCheck != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
# REACTIVE FWD test
pingResult = main.FALSE
- time1 = time.time()
- pingResult = main.Mininet1.pingall()
- utilities.assert_equals(
- expect=main.TRUE,
- actual=pingResult,
- onpass="Reactive Pingall test passed",
- onfail="Reactive Pingall failed, one or more ping pairs failed" )
- time2 = time.time()
- main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
+ for i in range(2): # Retry if pingall fails first time
+ time1 = time.time()
+ pingResult = main.Mininet1.pingall()
+ utilities.assert_equals(
+ expect=main.TRUE,
+ actual=pingResult,
+ onpass="Reactive Pingall test passed",
+ onfail="Reactive Pingall failed, one or more ping pairs failed" )
+ time2 = time.time()
+ main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
# uninstall onos-app-fwd
main.log.info( "Uninstall reactive forwarding app" )
- main.ONOScli1.featureUninstall( "onos-app-fwd" )
- main.ONOScli2.featureUninstall( "onos-app-fwd" )
- main.ONOScli3.featureUninstall( "onos-app-fwd" )
- main.ONOScli4.featureUninstall( "onos-app-fwd" )
- main.ONOScli5.featureUninstall( "onos-app-fwd" )
- main.ONOScli6.featureUninstall( "onos-app-fwd" )
- main.ONOScli7.featureUninstall( "onos-app-fwd" )
- # timeout for fwd flows
- time.sleep( 10 )
+ appResults = appResults and CLIs[0].deactivateApp( "org.onosproject.fwd" )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].appToIDCheck,
+ name="appToIDCheck-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
- main.step( "Add host intents" )
+ for t in threads:
+ t.join()
+ appCheck = appCheck and t.result
+ utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+ onpass="App Ids seem to be correct",
+ onfail="Something is wrong with app Ids" )
+ if appCheck != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
+
+ # timeout for fwd flows
+ time.sleep( 11 )
+
+ main.step( "Add host intents" )
intentIds = []
# TODO: move the host numbers to params
# Maybe look at all the paths we ping?
@@ -479,43 +428,57 @@
host1Id = host1Dict.get( 'id', None )
host2Id = host2Dict.get( 'id', None )
if host1Id and host2Id:
- nodeNum = ( i % 7 ) + 1
- node = getattr( main, ( 'ONOScli' + str( nodeNum ) ) )
- tmpId = node.addHostIntent(
- host1Id,
- host2Id )
+ nodeNum = ( i % 7 )
+ tmpId = CLIs[ nodeNum ].addHostIntent( host1Id, host2Id )
if tmpId:
main.log.info( "Added intent with id: " + tmpId )
intentIds.append( tmpId )
else:
- main.log.error( "addHostIntent reutrned None" )
+ main.log.error( "addHostIntent returned: " +
+ repr( tmpId ) )
else:
- main.log.error( "Error, getHost() failed" )
- main.log.warn( json.dumps( json.loads( main.ONOScli1.hosts() ),
- sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ main.log.error( "Error, getHost() failed for h" + str( i ) +
+ " and/or h" + str( i + 10 ) )
+ hosts = CLIs[ 0 ].hosts()
+ main.log.warn( "Hosts output: " )
+ try:
+ main.log.warn( json.dumps( json.loads( hosts ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( hosts ) )
hostResult = main.FALSE
+ # FIXME: DEBUG
+ intentStart = time.time()
onosIds = main.ONOScli1.getAllIntentsId()
main.log.info( "Submitted intents: " + str( intentIds ) )
main.log.info( "Intents in ONOS: " + str( onosIds ) )
for intent in intentIds:
if intent in onosIds:
- pass # intent submitted is still in onos
+ pass # intent submitted is in onos
else:
intentAddResult = False
+ # FIXME: DEBUG
+ if intentAddResult:
+ intentStop = time.time()
+ else:
+ intentStop = None
# Print the intent states
intents = main.ONOScli1.intents()
intentStates = []
- installedCheck = True
+ installedCheck = True
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
- for intent in json.loads( intents ): # Iter through intents of a node
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents" )
# add submitted intents not in the store
tmplist = [ i for i, s in intentStates ]
missingIntents = False
@@ -528,17 +491,59 @@
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- # for node in nodes:
- # node.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
pendingMap = main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
+
intentAddResult = bool( pingResult and hostResult and intentAddResult
and not missingIntents and installedCheck )
utilities.assert_equals(
@@ -546,6 +551,29 @@
actual=intentAddResult,
onpass="Pushed host intents to ONOS",
onfail="Error in pushing host intents to ONOS" )
+ for i in range(100):
+ onosIds = main.ONOScli1.getAllIntentsId()
+ main.log.info( "Submitted intents: " + str( sorted( intentIds ) ) )
+ main.log.info( "Intents in ONOS: " + str( sorted( onosIds ) ) )
+ if sorted(onosIds) == sorted(intentIds):
+ break
+ else:
+ time.sleep(1)
+ # FIXME: DEBUG
+ if not intentStop:
+ intentStop = time.time()
+ gossipTime = intentStop - intentStart
+ main.log.info( "It took about " + str( gossipTime ) +
+ " seconds for all intents to appear on ONOS1" )
+ # FIXME: make this time configurable/calculate based off of number of
+ # nodes and gossip rounds
+ utilities.assert_greater_equals(
+ expect=30, actual=gossipTime,
+ onpass="ECM anti-entropy for intents worked within " +
+ "expected time",
+ onfail="Intent ECM anti-entropy took too long" )
+ if gossipTime <= 30:
+ intentAddResult = True
if not intentAddResult or "key" in pendingMap:
import time
@@ -560,13 +588,16 @@
intentStates = []
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
- for intent in json.loads( intents ):
- # Iter through intents of a node
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ # Iter through intents of a node
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents" )
# add submitted intents not in the store
tmplist = [ i for i, s in intentStates ]
for i in intentIds:
@@ -577,20 +608,73 @@
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
def CASE4( self, main ):
"""
Ping across added host intents
"""
import json
+ import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
description = " Ping across added host intents"
main.log.report( description )
main.case( description )
@@ -609,11 +693,15 @@
main.log.report(
"Intents have not been installed correctly, pings failed." )
# TODO: pretty print
- main.log.warn( "ONSO1 intents: " )
- main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
- sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ main.log.warn( "ONOS1 intents: " )
+ try:
+ tmpIntents = main.ONOScli1.intents()
+ main.log.warn( json.dumps( json.loads( tmpIntents ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( tmpIntents ) )
if PingResult == main.TRUE:
main.log.report(
"Intents have been installed correctly and verified by pings" )
@@ -631,28 +719,79 @@
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
# Iter through intents of a node
- for intent in json.loads( intents ):
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents." )
intentStates.sort()
for i, s in intentStates:
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
+
if not installedCheck:
- main.log.info( "Waiting 60 seconds to see if intent states change" )
+ main.log.info( "Waiting 60 seconds to see if the state of " +
+ "intents change" )
time.sleep( 60 )
# Print the intent states
intents = main.ONOScli1.intents()
@@ -660,32 +799,87 @@
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
# Iter through intents of a node
- for intent in json.loads( intents ):
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents." )
intentStates.sort()
for i, s in intentStates:
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- main.ONOScli1.pendingMap()
- main.ONOScli2.pendingMap()
- main.ONOScli3.pendingMap()
- main.ONOScli4.pendingMap()
- main.ONOScli5.pendingMap()
- main.ONOScli6.pendingMap()
- main.ONOScli7.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
def CASE5( self, main ):
"""
Reading state of ONOS
"""
import json
+ import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# assumes that sts is already in you PYTHONPATH
from sts.topology.teston_topology import TestONTopology
@@ -693,344 +887,232 @@
main.case( "Setting up and gathering data for current state" )
# The general idea for this test case is to pull the state of
# ( intents,flows, topology,... ) from each ONOS node
- # We can then compare them with eachother and also with past states
+ # We can then compare them with each other and also with past states
- main.step( "Get the Mastership of each switch from each controller" )
+ main.step( "Check that each switch has a master" )
global mastershipState
- mastershipState = []
+ mastershipState = '[]'
# Assert that each device has a master
- ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
- ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
- ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
- ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
- ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
- ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
- ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
- rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
- ONOS3MasterNotNull and ONOS4MasterNotNull and\
- ONOS5MasterNotNull and ONOS6MasterNotNull and\
- ONOS7MasterNotNull
+ rolesNotNull = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].rolesNotNull,
+ name="rolesNotNull-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ rolesNotNull = rolesNotNull and t.result
utilities.assert_equals(
expect=main.TRUE,
actual=rolesNotNull,
onpass="Each device has a master",
onfail="Some devices don't have a master assigned" )
- ONOS1Mastership = main.ONOScli1.roles()
- ONOS2Mastership = main.ONOScli2.roles()
- ONOS3Mastership = main.ONOScli3.roles()
- ONOS4Mastership = main.ONOScli4.roles()
- ONOS5Mastership = main.ONOScli5.roles()
- ONOS6Mastership = main.ONOScli6.roles()
- ONOS7Mastership = main.ONOScli7.roles()
- if "Error" in ONOS1Mastership or not ONOS1Mastership\
- or "Error" in ONOS2Mastership or not ONOS2Mastership\
- or "Error" in ONOS3Mastership or not ONOS3Mastership\
- or "Error" in ONOS4Mastership or not ONOS4Mastership\
- or "Error" in ONOS5Mastership or not ONOS5Mastership\
- or "Error" in ONOS6Mastership or not ONOS6Mastership\
- or "Error" in ONOS7Mastership or not ONOS7Mastership:
- main.log.report( "Error in getting ONOS roles" )
- main.log.warn(
- "ONOS1 mastership response: " +
- repr( ONOS1Mastership ) )
- main.log.warn(
- "ONOS2 mastership response: " +
- repr( ONOS2Mastership ) )
- main.log.warn(
- "ONOS3 mastership response: " +
- repr( ONOS3Mastership ) )
- main.log.warn(
- "ONOS4 mastership response: " +
- repr( ONOS4Mastership ) )
- main.log.warn(
- "ONOS5 mastership response: " +
- repr( ONOS5Mastership ) )
- main.log.warn(
- "ONOS6 mastership response: " +
- repr( ONOS6Mastership ) )
- main.log.warn(
- "ONOS7 mastership response: " +
- repr( ONOS7Mastership ) )
- consistentMastership = main.FALSE
- elif ONOS1Mastership == ONOS2Mastership\
- and ONOS1Mastership == ONOS3Mastership\
- and ONOS1Mastership == ONOS4Mastership\
- and ONOS1Mastership == ONOS5Mastership\
- and ONOS1Mastership == ONOS6Mastership\
- and ONOS1Mastership == ONOS7Mastership:
- mastershipState = ONOS1Mastership
- consistentMastership = main.TRUE
+ main.step( "Get the Mastership of each switch from each controller" )
+ ONOSMastership = []
+ mastershipCheck = main.FALSE
+ consistentMastership = True
+ rolesResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].roles,
+ name="roles-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSMastership.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSMastership[i] or "Error" in ONOSMastership[i]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " roles" )
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " mastership response: " +
+ repr( ONOSMastership[i] ) )
+ rolesResults = False
+ utilities.assert_equals(
+ expect=True,
+ actual=rolesResults,
+ onpass="No error in reading roles output",
+ onfail="Error in reading roles from ONOS" )
+
+ main.step( "Check for consistency in roles from each controller" )
+ if all([ i == ONOSMastership[ 0 ] for i in ONOSMastership ] ):
main.log.report(
"Switch roles are consistent across all ONOS nodes" )
else:
- main.log.warn(
- "ONOS1 roles: ",
- json.dumps(
- json.loads( ONOS1Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS2 roles: ",
- json.dumps(
- json.loads( ONOS2Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS3 roles: ",
- json.dumps(
- json.loads( ONOS3Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS4 roles: ",
- json.dumps(
- json.loads( ONOS4Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS5 roles: ",
- json.dumps(
- json.loads( ONOS5Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS6 roles: ",
- json.dumps(
- json.loads( ONOS6Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS7 roles: ",
- json.dumps(
- json.loads( ONOS7Mastership ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- consistentMastership = main.FALSE
+ consistentMastership = False
utilities.assert_equals(
- expect=main.TRUE,
+ expect=True,
actual=consistentMastership,
onpass="Switch roles are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of switch roles" )
+ if rolesResults and not consistentMastership:
+ for i in range( numControllers ):
+ try:
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " roles: ",
+ json.dumps(
+ json.loads( ONOSMastership[ i ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( ONOSMastership[ i ] ) )
+ elif rolesResults and consistentMastership:
+ mastershipCheck = main.TRUE
+ mastershipState = ONOSMastership[ 0 ]
+
main.step( "Get the intents from each controller" )
global intentState
intentState = []
- ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
- ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
- ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
- ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
- ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
- ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
- ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+ ONOSIntents = []
intentCheck = main.FALSE
- if "Error" in ONOS1Intents or not ONOS1Intents\
- or "Error" in ONOS2Intents or not ONOS2Intents\
- or "Error" in ONOS3Intents or not ONOS3Intents\
- or "Error" in ONOS4Intents or not ONOS4Intents\
- or "Error" in ONOS5Intents or not ONOS5Intents\
- or "Error" in ONOS6Intents or not ONOS6Intents\
- or "Error" in ONOS7Intents or not ONOS7Intents:
- main.log.report( "Error in getting ONOS intents" )
- main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
- main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
- main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
- main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
- main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
- main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
- main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
- elif ONOS1Intents == ONOS2Intents\
- and ONOS1Intents == ONOS3Intents\
- and ONOS1Intents == ONOS4Intents\
- and ONOS1Intents == ONOS5Intents\
- and ONOS1Intents == ONOS6Intents\
- and ONOS1Intents == ONOS7Intents:
- intentState = ONOS1Intents
- intentCheck = main.TRUE
- main.log.report( "Intents are consistent across all ONOS nodes" )
- else:
- main.log.warn(
- "ONOS1 intents: ",
- json.dumps(
- json.loads( ONOS1Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS2 intents: ",
- json.dumps(
- json.loads( ONOS2Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS3 intents: ",
- json.dumps(
- json.loads( ONOS3Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS4 intents: ",
- json.dumps(
- json.loads( ONOS4Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS5 intents: ",
- json.dumps(
- json.loads( ONOS5Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS6 intents: ",
- json.dumps(
- json.loads( ONOS6Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
- main.log.warn(
- "ONOS7 intents: ",
- json.dumps(
- json.loads( ONOS7Intents ),
- sort_keys=True,
- indent=4,
- separators=(
- ',',
- ': ' ) ) )
+ consistentIntents = True
+ intentsResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].intents,
+ name="intents-" + str( i ),
+ args=[],
+ kwargs={ 'jsonFormat': True } )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSIntents.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSIntents[ i ] or "Error" in ONOSIntents[ i ]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " intents" )
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents response: " +
+ repr( ONOSIntents[ i ] ) )
+ intentsResults = False
utilities.assert_equals(
- expect=main.TRUE,
- actual=intentCheck,
+ expect=True,
+ actual=intentsResults,
+ onpass="No error in reading intents output",
+ onfail="Error in reading intents from ONOS" )
+
+ main.step( "Check for consistency in Intents from each controller" )
+ if all([ sorted( i ) == sorted( ONOSIntents[ 0 ] ) for i in ONOSIntents ] ):
+ main.log.report( "Intents are consistent across all ONOS " +
+ "nodes" )
+ else:
+ consistentIntents = False
+ main.log.report( "Intents not consistent" )
+ utilities.assert_equals(
+ expect=True,
+ actual=consistentIntents,
onpass="Intents are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of intents" )
+ if intentsResults and not consistentIntents:
+ n = len(ONOSIntents)
+ main.log.warn( "ONOS" + str( n ) + " intents: " )
+ main.log.warn( json.dumps( json.loads( ONOSIntents[ -1 ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ for i in range( numControllers ):
+ if ONOSIntents[ i ] != ONOSIntents[ -1 ]:
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents: " )
+ main.log.warn( json.dumps( json.loads( ONOSIntents[i] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ else:
+ main.log.warn( nodes[ i ].name + " intents match ONOS" +
+ str( n ) + " intents" )
+ elif intentsResults and consistentIntents:
+ intentCheck = main.TRUE
+ intentState = ONOSIntents[ 0 ]
+
main.step( "Get the flows from each controller" )
global flowState
flowState = []
+ ONOSFlows = []
+ ONOSFlowsJson = []
flowCheck = main.FALSE
- try:
- ONOS1Flows = main.ONOScli1.flows( jsonFormat=True )
- ONOS2Flows = main.ONOScli2.flows( jsonFormat=True )
- ONOS3Flows = main.ONOScli3.flows( jsonFormat=True )
- ONOS4Flows = main.ONOScli4.flows( jsonFormat=True )
- ONOS5Flows = main.ONOScli5.flows( jsonFormat=True )
- ONOS6Flows = main.ONOScli6.flows( jsonFormat=True )
- ONOS7Flows = main.ONOScli7.flows( jsonFormat=True )
- assert ONOS1Flows, "ONOS1 Flows should not be empty"
- assert ONOS2Flows, "ONOS2 Flows should not be empty"
- assert ONOS3Flows, "ONOS3 Flows should not be empty"
- assert ONOS4Flows, "ONOS4 Flows should not be empty"
- assert ONOS5Flows, "ONOS5 Flows should not be empty"
- assert ONOS6Flows, "ONOS6 Flows should not be empty"
- assert ONOS7Flows, "ONOS7 Flows should not be empty"
- assert "Error" not in ONOS1Flows, "ONOS1 Flows contains 'Error'"
- assert "Error" not in ONOS2Flows, "ONOS2 Flows contains 'Error'"
- assert "Error" not in ONOS3Flows, "ONOS3 Flows contains 'Error'"
- assert "Error" not in ONOS4Flows, "ONOS4 Flows contains 'Error'"
- assert "Error" not in ONOS5Flows, "ONOS5 Flows contains 'Error'"
- assert "Error" not in ONOS6Flows, "ONOS6 Flows contains 'Error'"
- assert "Error" not in ONOS7Flows, "ONOS7 Flows contains 'Error'"
- ONOS1FlowsJson = json.loads( ONOS1Flows )
- ONOS2FlowsJson = json.loads( ONOS2Flows )
- ONOS3FlowsJson = json.loads( ONOS3Flows )
- ONOS4FlowsJson = json.loads( ONOS4Flows )
- ONOS5FlowsJson = json.loads( ONOS5Flows )
- ONOS6FlowsJson = json.loads( ONOS6Flows )
- ONOS7FlowsJson = json.loads( ONOS7Flows )
- except ( ValueError, AssertionError ): # From json.loads, or asserts
- main.log.exception( "One or more 'flows' responses from " +
- "ONOS couldn't be decoded." )
- main.log.warn( "ONOS1 flows repsponse: " + ONOS1Flows )
- main.log.warn( "ONOS2 flows repsponse: " + ONOS2Flows )
- main.log.warn( "ONOS3 flows repsponse: " + ONOS3Flows )
- main.log.warn( "ONOS4 flows repsponse: " + ONOS4Flows )
- main.log.warn( "ONOS5 flows repsponse: " + ONOS5Flows )
- main.log.warn( "ONOS6 flows repsponse: " + ONOS6Flows )
- main.log.warn( "ONOS7 flows repsponse: " + ONOS7Flows )
- else: # No exceptions
- if len( ONOS1FlowsJson ) == len( ONOS2FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS3FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS4FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS5FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS6FlowsJson )\
- and len( ONOS1FlowsJson ) == len( ONOS7FlowsJson ):
- # TODO: Do a better check, maybe compare flows on switches?
- # NOTE Possible issue with this not always being set?
- flowState = ONOS1Flows
- flowCheck = main.TRUE
- main.log.report( "Flow count is consistent across all" +
- " ONOS nodes" )
+ consistentFlows = True
+ flowsResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].flows,
+ name="flows-" + str( i ),
+ args=[],
+ kwargs={ 'jsonFormat': True } )
+ threads.append( t )
+ t.start()
+
+ # NOTE: Flows command can take some time to run
+ time.sleep(30)
+ for t in threads:
+ t.join()
+ result = t.result
+ ONOSFlows.append( result )
+
+ for i in range( numControllers ):
+ num = str( i + 1 )
+ if not ONOSFlows[ i ] or "Error" in ONOSFlows[ i ]:
+ main.log.report( "Error in getting ONOS" + num + " flows" )
+ main.log.warn( "ONOS" + num + " flows response: " +
+ repr( ONOSFlows[ i ] ) )
+ flowsResults = False
+ ONOSFlowsJson.append( None )
else:
- main.log.warn( "ONOS1 flows: " +
- json.dumps( ONOS1FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS2 flows: " +
- json.dumps( ONOS2FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS3 flows: " +
- json.dumps( ONOS3FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS4 flows: " +
- json.dumps( ONOS4FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS5 flows: " +
- json.dumps( ONOS5FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS6 flows: " +
- json.dumps( ONOS6FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS7 flows: " +
- json.dumps( ONOS7FlowsJson, sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ try:
+ ONOSFlowsJson.append( json.loads( ONOSFlows[ i ] ) )
+ except ( ValueError, TypeError ):
+ # FIXME: change this to log.error?
+ main.log.exception( "Error in parsing ONOS" + num +
+ " response as json." )
+ main.log.error( repr( ONOSFlows[ i ] ) )
+ ONOSFlowsJson.append( None )
+ flowsResults = False
utilities.assert_equals(
- expect=main.TRUE,
- actual=flowCheck,
+ expect=True,
+ actual=flowsResults,
+ onpass="No error in reading flows output",
+ onfail="Error in reading flows from ONOS" )
+
+ main.step( "Check for consistency in Flows from each controller" )
+ tmp = [ len( i ) == len( ONOSFlowsJson[ 0 ] ) for i in ONOSFlowsJson ]
+ if all( tmp ):
+ main.log.report( "Flow count is consistent across all ONOS nodes" )
+ else:
+ consistentFlows = False
+ utilities.assert_equals(
+ expect=True,
+ actual=consistentFlows,
onpass="The flow count is consistent across all ONOS nodes",
onfail="ONOS nodes have different flow counts" )
+ if flowsResults and not consistentFlows:
+ for i in range( numControllers ):
+ try:
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " flows: " +
+ json.dumps( json.loads( ONOSFlows[i] ), sort_keys=True,
+ indent=4, separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " flows: " +
+ repr( ONOSFlows[ i ] ) )
+ elif flowsResults and consistentFlows:
+ flowCheck = main.TRUE
+ flowState = ONOSFlows[ 0 ]
+
main.step( "Get the OF Table entries" )
global flows
flows = []
@@ -1085,64 +1167,80 @@
main.step( "Create TestONTopology object" )
ctrls = []
- count = 1
- while True:
- temp = ()
- if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
- temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
- temp = temp + ( "ONOS" + str( count ), )
- temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
- temp = temp + \
- ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
- ctrls.append( temp )
- count = count + 1
- else:
- break
- MNTopo = TestONTopology(
- main.Mininet1,
- ctrls ) # can also add Intent API info for intent operations
+ for node in nodes:
+ temp = ( node, node.name, node.ip_address, 6633 )
+ ctrls.append( temp )
+ MNTopo = TestONTopology( main.Mininet1, ctrls )
main.step( "Collecting topology information from ONOS" )
devices = []
- devices.append( main.ONOScli1.devices() )
- devices.append( main.ONOScli2.devices() )
- devices.append( main.ONOScli3.devices() )
- devices.append( main.ONOScli4.devices() )
- devices.append( main.ONOScli5.devices() )
- devices.append( main.ONOScli6.devices() )
- devices.append( main.ONOScli7.devices() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].devices,
+ name="devices-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ devices.append( t.result )
hosts = []
- hosts.append( json.loads( main.ONOScli1.hosts() ) )
- hosts.append( json.loads( main.ONOScli2.hosts() ) )
- hosts.append( json.loads( main.ONOScli3.hosts() ) )
- hosts.append( json.loads( main.ONOScli4.hosts() ) )
- hosts.append( json.loads( main.ONOScli5.hosts() ) )
- hosts.append( json.loads( main.ONOScli6.hosts() ) )
- hosts.append( json.loads( main.ONOScli7.hosts() ) )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].hosts,
+ name="hosts-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ try:
+ hosts.append( json.loads( t.result ) )
+ except ( ValueError, TypeError ):
+ # FIXME: better handling of this, print which node
+ # Maybe use thread name?
+ main.log.exception( "Error parsing json output of hosts" )
+ # FIXME: should this be an empty json object instead?
+ hosts.append( None )
+
ports = []
- ports.append( main.ONOScli1.ports() )
- ports.append( main.ONOScli2.ports() )
- ports.append( main.ONOScli3.ports() )
- ports.append( main.ONOScli4.ports() )
- ports.append( main.ONOScli5.ports() )
- ports.append( main.ONOScli6.ports() )
- ports.append( main.ONOScli7.ports() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].ports,
+ name="ports-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ports.append( t.result )
links = []
- links.append( main.ONOScli1.links() )
- links.append( main.ONOScli2.links() )
- links.append( main.ONOScli3.links() )
- links.append( main.ONOScli4.links() )
- links.append( main.ONOScli5.links() )
- links.append( main.ONOScli6.links() )
- links.append( main.ONOScli7.links() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].links,
+ name="links-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ links.append( t.result )
clusters = []
- clusters.append( main.ONOScli1.clusters() )
- clusters.append( main.ONOScli2.clusters() )
- clusters.append( main.ONOScli3.clusters() )
- clusters.append( main.ONOScli4.clusters() )
- clusters.append( main.ONOScli5.clusters() )
- clusters.append( main.ONOScli6.clusters() )
- clusters.append( main.ONOScli7.clusters() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].clusters,
+ name="clusters-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ clusters.append( t.result )
# Compare json objects for hosts and dataplane clusters
# hosts
@@ -1176,10 +1274,9 @@
for controller in range( 0, len( hosts ) ):
controllerStr = str( controller + 1 )
for host in hosts[ controller ]:
- if host.get( 'ips', [] ) == []:
- main.log.error(
- "DEBUG:Error with host ips on controller" +
- controllerStr + ": " + str( host ) )
+ if not host.get( 'ips', [ ] ):
+ main.log.error( "DEBUG:Error with host ips on controller" +
+ controllerStr + ": " + str( host ) )
ipResult = main.FALSE
utilities.assert_equals(
expect=main.TRUE,
@@ -1190,12 +1287,12 @@
# Strongly connected clusters of devices
consistentClustersResult = main.TRUE
for controller in range( len( clusters ) ):
+ controllerStr = str( controller + 1 )
if "Error" not in clusters[ controller ]:
if clusters[ controller ] == clusters[ 0 ]:
continue
else: # clusters not consistent
- main.log.report( "clusters from ONOS" +
- controllerStr +
+ main.log.report( "clusters from ONOS" + controllerStr +
" is inconsistent with ONOS1" )
consistentClustersResult = main.FALSE
@@ -1212,7 +1309,11 @@
onpass="Clusters view is consistent across all ONOS nodes",
onfail="ONOS nodes have different views of clusters" )
# there should always only be one cluster
- numClusters = len( json.loads( clusters[ 0 ] ) )
+ try:
+ numClusters = len( json.loads( clusters[ 0 ] ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing clusters[0]: " +
+ repr( clusters[ 0 ] ) )
clusterResults = main.FALSE
if numClusters == 1:
clusterResults = main.TRUE
@@ -1231,8 +1332,7 @@
if devices[ controller ] or "Error" not in devices[ controller ]:
currentDevicesResult = main.Mininet1.compareSwitches(
MNTopo,
- json.loads(
- devices[ controller ] ) )
+ json.loads( devices[ controller ] ) )
else:
currentDevicesResult = main.FALSE
utilities.assert_equals( expect=main.TRUE,
@@ -1245,8 +1345,7 @@
if ports[ controller ] or "Error" not in ports[ controller ]:
currentPortsResult = main.Mininet1.comparePorts(
MNTopo,
- json.loads(
- ports[ controller ] ) )
+ json.loads( ports[ controller ] ) )
else:
currentPortsResult = main.FALSE
utilities.assert_equals( expect=main.TRUE,
@@ -1259,8 +1358,7 @@
if links[ controller ] or "Error" not in links[ controller ]:
currentLinksResult = main.Mininet1.compareLinks(
MNTopo,
- json.loads(
- links[ controller ] ) )
+ json.loads( links[ controller ] ) )
else:
currentLinksResult = main.FALSE
utilities.assert_equals( expect=main.TRUE,
@@ -1274,16 +1372,17 @@
portsResults = portsResults and currentPortsResult
linksResults = linksResults and currentLinksResult
- topoResult = devicesResults and portsResults and linksResults\
- and consistentHostsResult and consistentClustersResult\
- and clusterResults and ipResult
+ topoResult = ( devicesResults and portsResults and linksResults
+ and consistentHostsResult and consistentClustersResult
+ and clusterResults and ipResult )
utilities.assert_equals( expect=main.TRUE, actual=topoResult,
onpass="Topology Check Test successful",
onfail="Topology Check Test NOT successful" )
finalAssert = main.TRUE
- finalAssert = finalAssert and topoResult and flowCheck \
- and intentCheck and consistentMastership and rolesNotNull
+ finalAssert = ( finalAssert and topoResult and flowCheck
+ and intentCheck and consistentMastership
+ and mastershipCheck and rolesNotNull )
utilities.assert_equals( expect=main.TRUE, actual=finalAssert,
onpass="State check successful",
onfail="State check NOT successful" )
@@ -1293,6 +1392,11 @@
The Failure case. Since this is the Sanity test, we do nothing.
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
main.log.report( "Wait 60 seconds instead of inducing a failure" )
time.sleep( 60 )
utilities.assert_equals(
@@ -1306,107 +1410,103 @@
Check state after ONOS failure
"""
import json
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
main.case( "Running ONOS Constant State Tests" )
+ main.step( "Check that each switch has a master" )
# Assert that each device has a master
- ONOS1MasterNotNull = main.ONOScli1.rolesNotNull()
- ONOS2MasterNotNull = main.ONOScli2.rolesNotNull()
- ONOS3MasterNotNull = main.ONOScli3.rolesNotNull()
- ONOS4MasterNotNull = main.ONOScli4.rolesNotNull()
- ONOS5MasterNotNull = main.ONOScli5.rolesNotNull()
- ONOS6MasterNotNull = main.ONOScli6.rolesNotNull()
- ONOS7MasterNotNull = main.ONOScli7.rolesNotNull()
- rolesNotNull = ONOS1MasterNotNull and ONOS2MasterNotNull and\
- ONOS3MasterNotNull and ONOS4MasterNotNull and\
- ONOS5MasterNotNull and ONOS6MasterNotNull and\
- ONOS7MasterNotNull
+ rolesNotNull = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].rolesNotNull,
+ name="rolesNotNull-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ rolesNotNull = rolesNotNull and t.result
utilities.assert_equals(
expect=main.TRUE,
actual=rolesNotNull,
onpass="Each device has a master",
onfail="Some devices don't have a master assigned" )
- main.step( "Check if switch roles are consistent across all nodes" )
- ONOS1Mastership = main.ONOScli1.roles()
- ONOS2Mastership = main.ONOScli2.roles()
- ONOS3Mastership = main.ONOScli3.roles()
- ONOS4Mastership = main.ONOScli4.roles()
- ONOS5Mastership = main.ONOScli5.roles()
- ONOS6Mastership = main.ONOScli6.roles()
- ONOS7Mastership = main.ONOScli7.roles()
- if "Error" in ONOS1Mastership or not ONOS1Mastership\
- or "Error" in ONOS2Mastership or not ONOS2Mastership\
- or "Error" in ONOS3Mastership or not ONOS3Mastership\
- or "Error" in ONOS4Mastership or not ONOS4Mastership\
- or "Error" in ONOS5Mastership or not ONOS5Mastership\
- or "Error" in ONOS6Mastership or not ONOS6Mastership\
- or "Error" in ONOS7Mastership or not ONOS7Mastership:
- main.log.error( "Error in getting ONOS mastership" )
- main.log.warn( "ONOS1 mastership response: " +
- repr( ONOS1Mastership ) )
- main.log.warn( "ONOS2 mastership response: " +
- repr( ONOS2Mastership ) )
- main.log.warn( "ONOS3 mastership response: " +
- repr( ONOS3Mastership ) )
- main.log.warn( "ONOS4 mastership response: " +
- repr( ONOS4Mastership ) )
- main.log.warn( "ONOS5 mastership response: " +
- repr( ONOS5Mastership ) )
- main.log.warn( "ONOS6 mastership response: " +
- repr( ONOS6Mastership ) )
- main.log.warn( "ONOS7 mastership response: " +
- repr( ONOS7Mastership ) )
- consistentMastership = main.FALSE
- elif ONOS1Mastership == ONOS2Mastership\
- and ONOS1Mastership == ONOS3Mastership\
- and ONOS1Mastership == ONOS4Mastership\
- and ONOS1Mastership == ONOS5Mastership\
- and ONOS1Mastership == ONOS6Mastership\
- and ONOS1Mastership == ONOS7Mastership:
- consistentMastership = main.TRUE
+ ONOSMastership = []
+ mastershipCheck = main.FALSE
+ consistentMastership = True
+ rolesResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].roles,
+ name="roles-" + str( i ),
+ args=[] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSMastership.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSMastership[i] or "Error" in ONOSMastership[i]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " roles" )
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " mastership response: " +
+ repr( ONOSMastership[i] ) )
+ rolesResults = False
+ utilities.assert_equals(
+ expect=True,
+ actual=rolesResults,
+ onpass="No error in reading roles output",
+ onfail="Error in reading roles from ONOS" )
+
+ main.step( "Check for consistency in roles from each controller" )
+ if all([ i == ONOSMastership[ 0 ] for i in ONOSMastership ] ):
main.log.report(
"Switch roles are consistent across all ONOS nodes" )
else:
- main.log.warn( "ONOS1 roles: ", json.dumps(
- json.loads( ONOS1Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS2 roles: ", json.dumps(
- json.loads( ONOS2Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS3 roles: ", json.dumps(
- json.loads( ONOS3Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS4 roles: ", json.dumps(
- json.loads( ONOS4Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS5 roles: ", json.dumps(
- json.loads( ONOS5Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS6 roles: ", json.dumps(
- json.loads( ONOS6Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- main.log.warn( "ONOS7 roles: ", json.dumps(
- json.loads( ONOS7Mastership ), sort_keys=True, indent=4,
- separators=( ',', ': ' ) ) )
- consistentMastership = main.FALSE
+ consistentMastership = False
utilities.assert_equals(
- expect=main.TRUE,
+ expect=True,
actual=consistentMastership,
onpass="Switch roles are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of switch roles" )
+ if rolesResults and not consistentMastership:
+ for i in range( numControllers ):
+ main.log.warn(
+ "ONOS" + str( i + 1 ) + " roles: ",
+ json.dumps(
+ json.loads( ONOSMastership[ i ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ elif rolesResults and not consistentMastership:
+ mastershipCheck = main.TRUE
+
description2 = "Compare switch roles from before failure"
main.step( description2 )
-
- currentJson = json.loads( ONOS1Mastership )
- oldJson = json.loads( mastershipState )
+ try:
+ currentJson = json.loads( ONOSMastership[0] )
+ oldJson = json.loads( mastershipState )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Something is wrong with parsing " +
+ "ONOSMastership[0] or mastershipState" )
+ main.log.error( "ONOSMastership[0]: " + repr( ONOSMastership[0] ) )
+ main.log.error( "mastershipState" + repr( mastershipState ) )
+ main.cleanup()
+ main.exit()
mastershipCheck = main.TRUE
for i in range( 1, 29 ):
switchDPID = str(
- main.Mininet1.getSwitchDPID(
- switch="s" +
- str( i ) ) )
-
+ main.Mininet1.getSwitchDPID( switch="s" + str( i ) ) )
current = [ switch[ 'master' ] for switch in currentJson
if switchDPID in switch[ 'id' ] ]
old = [ switch[ 'master' ] for switch in oldJson
@@ -1426,102 +1526,92 @@
mastershipCheck = mastershipCheck and consistentMastership
main.step( "Get the intents and compare across all nodes" )
- ONOS1Intents = main.ONOScli1.intents( jsonFormat=True )
- ONOS2Intents = main.ONOScli2.intents( jsonFormat=True )
- ONOS3Intents = main.ONOScli3.intents( jsonFormat=True )
- ONOS4Intents = main.ONOScli4.intents( jsonFormat=True )
- ONOS5Intents = main.ONOScli5.intents( jsonFormat=True )
- ONOS6Intents = main.ONOScli6.intents( jsonFormat=True )
- ONOS7Intents = main.ONOScli7.intents( jsonFormat=True )
+ ONOSIntents = []
intentCheck = main.FALSE
- if "Error" in ONOS1Intents or not ONOS1Intents\
- or "Error" in ONOS2Intents or not ONOS2Intents\
- or "Error" in ONOS3Intents or not ONOS3Intents\
- or "Error" in ONOS4Intents or not ONOS4Intents\
- or "Error" in ONOS5Intents or not ONOS5Intents\
- or "Error" in ONOS6Intents or not ONOS6Intents\
- or "Error" in ONOS7Intents or not ONOS7Intents:
- main.log.report( "Error in getting ONOS intents" )
- main.log.warn( "ONOS1 intents response: " + repr( ONOS1Intents ) )
- main.log.warn( "ONOS2 intents response: " + repr( ONOS2Intents ) )
- main.log.warn( "ONOS3 intents response: " + repr( ONOS3Intents ) )
- main.log.warn( "ONOS4 intents response: " + repr( ONOS4Intents ) )
- main.log.warn( "ONOS5 intents response: " + repr( ONOS5Intents ) )
- main.log.warn( "ONOS6 intents response: " + repr( ONOS6Intents ) )
- main.log.warn( "ONOS7 intents response: " + repr( ONOS7Intents ) )
- elif ONOS1Intents == ONOS2Intents\
- and ONOS1Intents == ONOS3Intents\
- and ONOS1Intents == ONOS4Intents\
- and ONOS1Intents == ONOS5Intents\
- and ONOS1Intents == ONOS6Intents\
- and ONOS1Intents == ONOS7Intents:
- intentCheck = main.TRUE
- main.log.report( "Intents are consistent across all ONOS nodes" )
- else:
- main.log.warn( "ONOS1 intents: " )
- print json.dumps( json.loads( ONOS1Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS2 intents: " )
- print json.dumps( json.loads( ONOS2Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS3 intents: " )
- print json.dumps( json.loads( ONOS3Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS4 intents: " )
- print json.dumps( json.loads( ONOS4Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS5 intents: " )
- print json.dumps( json.loads( ONOS5Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS6 intents: " )
- print json.dumps( json.loads( ONOS6Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
- main.log.warn( "ONOS7 intents: " )
- print json.dumps( json.loads( ONOS7Intents ), sort_keys=True,
- indent=4, separators=( ',', ': ' ) )
+ consistentIntents = True
+ intentsResults = True
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].intents,
+ name="intents-" + str( i ),
+ args=[],
+ kwargs={ 'jsonFormat': True } )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ONOSIntents.append( t.result )
+
+ for i in range( numControllers ):
+ if not ONOSIntents[ i ] or "Error" in ONOSIntents[ i ]:
+ main.log.report( "Error in getting ONOS" + str( i + 1 ) +
+ " intents" )
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents response: " +
+ repr( ONOSIntents[ i ] ) )
+ intentsResults = False
utilities.assert_equals(
- expect=main.TRUE,
- actual=intentCheck,
+ expect=True,
+ actual=intentsResults,
+ onpass="No error in reading intents output",
+ onfail="Error in reading intents from ONOS" )
+
+ main.step( "Check for consistency in Intents from each controller" )
+ if all([ sorted( i ) == sorted( ONOSIntents[ 0 ] ) for i in ONOSIntents ] ):
+ main.log.report( "Intents are consistent across all ONOS " +
+ "nodes" )
+ else:
+ consistentIntents = False
+ utilities.assert_equals(
+ expect=True,
+ actual=consistentIntents,
onpass="Intents are consistent across all ONOS nodes",
onfail="ONOS nodes have different views of intents" )
- # Print the intent states
- intents = []
- intents.append( ONOS1Intents )
- intents.append( ONOS2Intents )
- intents.append( ONOS3Intents )
- intents.append( ONOS4Intents )
- intents.append( ONOS5Intents )
- intents.append( ONOS6Intents )
- intents.append( ONOS7Intents )
intentStates = []
- for node in intents: # Iter through ONOS nodes
+ for node in ONOSIntents: # Iter through ONOS nodes
nodeStates = []
# Iter through intents of a node
- for intent in json.loads( node ):
- nodeStates.append( intent[ 'state' ] )
+ try:
+ for intent in json.loads( node ):
+ nodeStates.append( intent[ 'state' ] )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error in parsing intents" )
+ main.log.error( repr( node ) )
intentStates.append( nodeStates )
out = [ (i, nodeStates.count( i ) ) for i in set( nodeStates ) ]
main.log.info( dict( out ) )
+ if intentsResults and not consistentIntents:
+ for i in range( numControllers ):
+ main.log.warn( "ONOS" + str( i + 1 ) + " intents: " )
+ main.log.warn( json.dumps(
+ json.loads( ONOSIntents[ i ] ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ elif intentsResults and consistentIntents:
+ intentCheck = main.TRUE
+
# NOTE: Store has no durability, so intents are lost across system
# restarts
main.step( "Compare current intents with intents before the failure" )
# NOTE: this requires case 5 to pass for intentState to be set.
# maybe we should stop the test if that fails?
sameIntents = main.TRUE
- if intentState and intentState == ONOS1Intents:
+ if intentState and intentState == ONOSIntents[ 0 ]:
sameIntents = main.TRUE
main.log.report( "Intents are consistent with before failure" )
# TODO: possibly the states have changed? we may need to figure out
- # what the aceptable states are
+ # what the acceptable states are
else:
try:
- main.log.warn( "ONOS1 intents: " )
- print json.dumps( json.loads( ONOS1Intents ),
- sort_keys=True, indent=4,
- separators=( ',', ': ' ) )
- except Exception:
- pass
+ main.log.warn( "ONOS intents: " )
+ main.log.warn( json.dumps( json.loads( ONOSIntents[ 0 ] ),
+ sort_keys=True, indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Exception printing intents" )
+ main.log.warn( repr( ONOSIntents[0] ) )
sameIntents = main.FALSE
utilities.assert_equals(
expect=main.TRUE,
@@ -1555,12 +1645,8 @@
main.step( "Check the continuous pings to ensure that no packets " +
"were dropped during component failure" )
- # FIXME: This check is always failing. Investigate cause
- # NOTE: this may be something to do with file permsissions
- # or slight change in format
- main.Mininet2.pingKill(
- main.params[ 'TESTONUSER' ],
- main.params[ 'TESTONIP' ] )
+ main.Mininet2.pingKill( main.params[ 'TESTONUSER' ],
+ main.params[ 'TESTONIP' ] )
LossInPings = main.FALSE
# NOTE: checkForLoss returns main.FALSE with 0% packet loss
for i in range( 8, 18 ):
@@ -1586,12 +1672,10 @@
# Test of LeadershipElection
# NOTE: this only works for the sanity test. In case of failures,
# leader will likely change
- leader = ONOS1Ip
+ leader = nodes[ 0 ].ip_address
leaderResult = main.TRUE
- for controller in range( 1, numControllers + 1 ):
- # loop through ONOScli handlers
- node = getattr( main, ( 'ONOScli' + str( controller ) ) )
- leaderN = node.electionTestLeader()
+ for cli in CLIs:
+ leaderN = cli.electionTestLeader()
# verify leader is ONOS1
if leaderN == leader:
# all is well
@@ -1599,15 +1683,14 @@
# check != ONOS1
pass
elif leaderN == main.FALSE:
- # error in response
+ # error in response
main.log.report( "Something is wrong with " +
"electionTestLeader function, check the" +
" error logs" )
leaderResult = main.FALSE
elif leader != leaderN:
leaderResult = main.FALSE
- main.log.report( "ONOS" + str( controller ) + " sees " +
- str( leaderN ) +
+ main.log.report( cli.name + " sees " + str( leaderN ) +
" as the leader of the election app. " +
"Leader should be " + str( leader ) )
if leaderResult:
@@ -1640,28 +1723,21 @@
from sts.topology.teston_topology import TestONTopology
import json
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
description = "Compare ONOS Topology view to Mininet topology"
main.case( description )
main.log.report( description )
main.step( "Create TestONTopology object" )
ctrls = []
- count = 1
- while True:
- temp = ()
- if ( 'ip' + str( count ) ) in main.params[ 'CTRL' ]:
- temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
- temp = temp + ( "ONOS" + str( count ), )
- temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
- temp = temp + \
- ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
- ctrls.append( temp )
- count = count + 1
- else:
- break
- MNTopo = TestONTopology(
- main.Mininet1,
- ctrls ) # can also add Intent API info for intent operations
+ for node in nodes:
+ temp = ( node, node.name, node.ip_address, 6633 )
+ ctrls.append( temp )
+ MNTopo = TestONTopology( main.Mininet1, ctrls )
main.step( "Comparing ONOS topology to MN" )
devicesResults = main.TRUE
@@ -1675,28 +1751,40 @@
startTime = time.time()
# Give time for Gossip to work
while topoResult == main.FALSE and elapsed < 60:
- count = count + 1
+ count += 1
if count > 1:
- # TODO: Depricate STS usage
+ # TODO: Deprecate STS usage
MNTopo = TestONTopology( main.Mininet1, ctrls )
cliStart = time.time()
devices = []
- devices.append( main.ONOScli1.devices() )
- devices.append( main.ONOScli2.devices() )
- devices.append( main.ONOScli3.devices() )
- devices.append( main.ONOScli4.devices() )
- devices.append( main.ONOScli5.devices() )
- devices.append( main.ONOScli6.devices() )
- devices.append( main.ONOScli7.devices() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].devices,
+ name="devices-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ devices.append( t.result )
hosts = []
- hosts.append( json.loads( main.ONOScli1.hosts() ) )
- hosts.append( json.loads( main.ONOScli2.hosts() ) )
- hosts.append( json.loads( main.ONOScli3.hosts() ) )
- hosts.append( json.loads( main.ONOScli4.hosts() ) )
- hosts.append( json.loads( main.ONOScli5.hosts() ) )
- hosts.append( json.loads( main.ONOScli6.hosts() ) )
- hosts.append( json.loads( main.ONOScli7.hosts() ) )
ipResult = main.TRUE
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].hosts,
+ name="hosts-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ try:
+ hosts.append( json.loads( t.result ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing hosts results" )
+ main.log.error( repr( t.result ) )
for controller in range( 0, len( hosts ) ):
controllerStr = str( controller + 1 )
for host in hosts[ controller ]:
@@ -1706,29 +1794,41 @@
controllerStr + ": " + str( host ) )
ipResult = main.FALSE
ports = []
- ports.append( main.ONOScli1.ports() )
- ports.append( main.ONOScli2.ports() )
- ports.append( main.ONOScli3.ports() )
- ports.append( main.ONOScli4.ports() )
- ports.append( main.ONOScli5.ports() )
- ports.append( main.ONOScli6.ports() )
- ports.append( main.ONOScli7.ports() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].ports,
+ name="ports-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ports.append( t.result )
links = []
- links.append( main.ONOScli1.links() )
- links.append( main.ONOScli2.links() )
- links.append( main.ONOScli3.links() )
- links.append( main.ONOScli4.links() )
- links.append( main.ONOScli5.links() )
- links.append( main.ONOScli6.links() )
- links.append( main.ONOScli7.links() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].links,
+ name="links-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ links.append( t.result )
clusters = []
- clusters.append( main.ONOScli1.clusters() )
- clusters.append( main.ONOScli2.clusters() )
- clusters.append( main.ONOScli3.clusters() )
- clusters.append( main.ONOScli4.clusters() )
- clusters.append( main.ONOScli5.clusters() )
- clusters.append( main.ONOScli6.clusters() )
- clusters.append( main.ONOScli7.clusters() )
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].clusters,
+ name="clusters-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ clusters.append( t.result )
elapsed = time.time() - startTime
cliTime = time.time() - cliStart
@@ -1847,7 +1947,11 @@
onpass="Clusters view is consistent across all ONOS nodes",
onfail="ONOS nodes have different views of clusters" )
# there should always only be one cluster
- numClusters = len( json.loads( clusters[ 0 ] ) )
+ try:
+ numClusters = len( json.loads( clusters[ 0 ] ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing clusters[0]: " +
+ repr( clusters[0] ) )
clusterResults = main.FALSE
if numClusters == 1:
clusterResults = main.TRUE
@@ -1876,11 +1980,50 @@
if topoResult == main.TRUE:
main.log.report( "ONOS topology view matches Mininet topology" )
+ # FIXME: move this to an ONOS state case
+ main.step( "Checking ONOS nodes" )
+ nodesOutput = []
+ threads = []
+ for i in range( numControllers ):
+ t = main.Thread( target=CLIs[i].nodes,
+ name="nodes-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ nodesOutput.append( t.result )
+ ips = [ node.ip_address for node in nodes ]
+ for i in nodesOutput:
+ try:
+ current = json.loads( i )
+ for node in current:
+ if node['ip'] in ips: # node in nodes() output is in cell
+ if node['state'] == 'ACTIVE':
+ pass # as it should be
+ else:
+ main.log.error( "Error in ONOS node availability" )
+ main.log.error(
+ json.dumps( current,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ break
+ except ( ValueError, TypeError ):
+ main.log.error( "Error parsing nodes output" )
+ main.log.warn( repr( i ) )
+
def CASE9( self, main ):
"""
Link s3-s28 down
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# NOTE: You should probably run a topology check after this
linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
@@ -1896,7 +2039,7 @@
" seconds for link down to be discovered" )
time.sleep( linkSleep )
utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
- onpass="Link down succesful",
+ onpass="Link down successful",
onfail="Failed to bring link down" )
# TODO do some sort of check here
@@ -1905,6 +2048,11 @@
Link s3-s28 up
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# NOTE: You should probably run a topology check after this
linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
@@ -1920,7 +2068,7 @@
" seconds for link up to be discovered" )
time.sleep( linkSleep )
utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
- onpass="Link up succesful",
+ onpass="Link up successful",
onfail="Failed to bring link up" )
# TODO do some sort of check here
@@ -1930,6 +2078,11 @@
"""
# NOTE: You should probably run a topology check after this
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
@@ -1953,7 +2106,7 @@
if device and device[ 'available' ] is False:
result = main.TRUE
utilities.assert_equals( expect=main.TRUE, actual=result,
- onpass="Kill switch succesful",
+ onpass="Kill switch successful",
onfail="Failed to kill switch?" )
def CASE12( self, main ):
@@ -1962,6 +2115,18 @@
"""
# NOTE: You should probably run a topology check after this
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
+ assert ONOS1Port, "ONOS1Port not defined"
+ assert ONOS2Port, "ONOS2Port not defined"
+ assert ONOS3Port, "ONOS3Port not defined"
+ assert ONOS4Port, "ONOS4Port not defined"
+ assert ONOS5Port, "ONOS5Port not defined"
+ assert ONOS6Port, "ONOS6Port not defined"
+ assert ONOS7Port, "ONOS7Port not defined"
switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
switch = main.params[ 'kill' ][ 'switch' ]
@@ -1974,24 +2139,23 @@
main.step( "Add back " + switch )
main.log.report( "Adding back " + switch )
main.Mininet1.addSwitch( switch, dpid=switchDPID )
- # TODO: New dpid or same? Ask Thomas?
for peer in links:
main.Mininet1.addLink( switch, peer )
main.Mininet1.assignSwController( sw=switch.split( 's' )[ 1 ],
count=numControllers,
- ip1=ONOS1Ip,
+ ip1=nodes[ 0 ].ip_address,
port1=ONOS1Port,
- ip2=ONOS2Ip,
+ ip2=nodes[ 1 ].ip_address,
port2=ONOS2Port,
- ip3=ONOS3Ip,
+ ip3=nodes[ 2 ].ip_address,
port3=ONOS3Port,
- ip4=ONOS4Ip,
+ ip4=nodes[ 3 ].ip_address,
port4=ONOS4Port,
- ip5=ONOS5Ip,
+ ip5=nodes[ 4 ].ip_address,
port5=ONOS5Port,
- ip6=ONOS6Ip,
+ ip6=nodes[ 5 ].ip_address,
port6=ONOS6Port,
- ip7=ONOS7Ip,
+ ip7=nodes[ 6 ].ip_address,
port7=ONOS7Port )
main.log.info( "Waiting " + str( switchSleep ) +
" seconds for switch up to be discovered" )
@@ -2003,7 +2167,7 @@
if device and device[ 'available' ]:
result = main.TRUE
utilities.assert_equals( expect=main.TRUE, actual=result,
- onpass="add switch succesful",
+ onpass="add switch successful",
onfail="Failed to add switch?" )
def CASE13( self, main ):
@@ -2012,37 +2176,22 @@
"""
import os
import time
- # TODO: make use of this elsewhere
- ips = []
- ips.append( ONOS1Ip )
- ips.append( ONOS2Ip )
- ips.append( ONOS3Ip )
- ips.append( ONOS4Ip )
- ips.append( ONOS5Ip )
- ips.append( ONOS6Ip )
- ips.append( ONOS7Ip )
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
# printing colors to terminal
- colors = {}
- colors[ 'cyan' ] = '\033[96m'
- colors[ 'purple' ] = '\033[95m'
- colors[ 'blue' ] = '\033[94m'
- colors[ 'green' ] = '\033[92m'
- colors[ 'yellow' ] = '\033[93m'
- colors[ 'red' ] = '\033[91m'
- colors[ 'end' ] = '\033[0m'
+ colors = { 'cyan': '\033[96m', 'purple': '\033[95m',
+ 'blue': '\033[94m', 'green': '\033[92m',
+ 'yellow': '\033[93m', 'red': '\033[91m', 'end': '\033[0m' }
description = "Test Cleanup"
main.log.report( description )
main.case( description )
main.step( "Killing tcpdumps" )
main.Mininet2.stopTcpdump()
- main.step( "Checking ONOS Logs for errors" )
- for i in range( 7 ):
- print colors[ 'purple' ] + "Checking logs for errors on " + \
- "ONOS" + str( i + 1 ) + ":" + colors[ 'end' ]
- print main.ONOSbench.checkLogs( ips[ i ] )
-
main.step( "Copying MN pcap and ONOS log files to test station" )
testname = main.TEST
teststationUser = main.params[ 'TESTONUSER' ]
@@ -2058,14 +2207,13 @@
# NOTE: must end in /
dstDir = "~/packet_captures/"
for f in logFiles:
- for i in range( 7 ):
- main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
- logFolder + f + " " +
+ for node in nodes:
+ main.ONOSbench.handle.sendline( "scp sdn@" + node.ip_address +
+ ":" + logFolder + f + " " +
teststationUser + "@" +
teststationIP + ":" +
dstDir + str( testname ) +
- "-ONOS" + str( i + 1 ) + "-" +
- f )
+ "-" + node.name + "-" + f )
main.ONOSbench.handle.expect( "\$" )
# std*.log's
@@ -2075,18 +2223,26 @@
# NOTE: must end in /
dstDir = "~/packet_captures/"
for f in logFiles:
- for i in range( 7 ):
- main.ONOSbench.handle.sendline( "scp sdn@" + ips[ i ] + ":" +
- logFolder + f + " " +
+ for node in nodes:
+ main.ONOSbench.handle.sendline( "scp sdn@" + node.ip_address +
+ ":" + logFolder + f + " " +
teststationUser + "@" +
teststationIP + ":" +
dstDir + str( testname ) +
- "-ONOS" + str( i + 1 ) + "-" +
- f )
+ "-" + node.name + "-" + f )
main.ONOSbench.handle.expect( "\$" )
# sleep so scp can finish
time.sleep( 10 )
+
+ main.step( "Stopping Mininet" )
main.Mininet1.stopNet()
+
+ main.step( "Checking ONOS Logs for errors" )
+ for node in nodes:
+ print colors[ 'purple' ] + "Checking logs for errors on " + \
+ node.name + ":" + colors[ 'end' ]
+ print main.ONOSbench.checkLogs( node.ip_address )
+
main.step( "Packing and rotating pcap archives" )
os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
@@ -2099,62 +2255,29 @@
"""
start election app on all onos nodes
"""
- leaderResult = main.TRUE
- # install app on onos 1
- main.log.info( "Install leadership election app" )
- main.ONOScli1.featureInstall( "onos-app-election" )
- # wait for election
- # check for leader
- leader = main.ONOScli1.electionTestLeader()
- # verify leader is ONOS1
- if leader == ONOS1Ip:
- # all is well
- pass
- elif leader is None:
- # No leader elected
- main.log.report( "No leader was elected" )
- leaderResult = main.FALSE
- elif leader == main.FALSE:
- # error in response
- # TODO: add check for "Command not found:" in the driver, this
- # means the app isn't loaded
- main.log.report( "Something is wrong with electionTestLeader" +
- " function, check the error logs" )
- leaderResult = main.FALSE
- else:
- # error in response
- main.log.report(
- "Unexpected response from electionTestLeader function:'" +
- str( leader ) +
- "'" )
- leaderResult = main.FALSE
+ import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
- # install on other nodes and check for leader.
- # Should be onos1 and each app should show the same leader
- for controller in range( 2, numControllers + 1 ):
- # loop through ONOScli handlers
- node = getattr( main, ( 'ONOScli' + str( controller ) ) )
- node.featureInstall( "onos-app-election" )
- leaderN = node.electionTestLeader()
- # verify leader is ONOS1
- if leaderN == ONOS1Ip:
- # all is well
- pass
- elif leaderN == main.FALSE:
- # error in response
- # TODO: add check for "Command not found:" in the driver, this
- # means the app isn't loaded
- main.log.report( "Something is wrong with " +
- "electionTestLeader function, check the" +
- " error logs" )
+ leaderResult = main.TRUE
+ main.log.info( "Install leadership election app" )
+ main.ONOScli1.activateApp( "org.onosproject.election" )
+ leaders = []
+ for cli in CLIs:
+ leader = cli.electionTestLeader()
+ if leader is None or leader == main.FALSE:
+ main.log.report( cli.name + ": Leader for the election app " +
+ "should be an ONOS node, instead got '" +
+ str( leader ) + "'" )
leaderResult = main.FALSE
- elif leader != leaderN:
- leaderResult = main.FALSE
- main.log.report( "ONOS" + str( controller ) + " sees " +
- str( leaderN ) +
- " as the leader of the election app. Leader" +
- " should be " +
- str( leader ) )
+ leaders.append( leader )
+ if len( set( leaders ) ) != 1:
+ leaderResult = main.FALSE
+ main.log.error( "Results of electionTestLeader is order of CLIs:" +
+ str( leaders ) )
if leaderResult:
main.log.report( "Leadership election tests passed( consistent " +
"view of leader across listeners and a leader " +
@@ -2169,36 +2292,32 @@
"""
Check that Leadership Election is still functional
"""
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert CLIs, "CLIs not defined"
+ assert nodes, "nodes not defined"
+
leaderResult = main.TRUE
description = "Check that Leadership Election is still functional"
main.log.report( description )
main.case( description )
main.step( "Find current leader and withdraw" )
leader = main.ONOScli1.electionTestLeader()
- # TODO: do some sanity checking on leader before using it
+ # do some sanity checking on leader before using it
withdrawResult = main.FALSE
- if leader == ONOS1Ip:
- oldLeader = getattr( main, "ONOScli1" )
- elif leader == ONOS2Ip:
- oldLeader = getattr( main, "ONOScli2" )
- elif leader == ONOS3Ip:
- oldLeader = getattr( main, "ONOScli3" )
- elif leader == ONOS4Ip:
- oldLeader = getattr( main, "ONOScli4" )
- elif leader == ONOS5Ip:
- oldLeader = getattr( main, "ONOScli5" )
- elif leader == ONOS6Ip:
- oldLeader = getattr( main, "ONOScli6" )
- elif leader == ONOS7Ip:
- oldLeader = getattr( main, "ONOScli7" )
- elif leader is None or leader == main.FALSE:
+ if leader is None or leader == main.FALSE:
main.log.report(
"Leader for the election app should be an ONOS node," +
"instead got '" + str( leader ) + "'" )
leaderResult = main.FALSE
oldLeader = None
- else:
- main.log.error( "Leader election --- why am I HERE?!?")
+ for i in range( len( CLIs ) ):
+ if leader == nodes[ i ].ip_address:
+ oldLeader = CLIs[ i ]
+ break
+ else: # FOR/ELSE statement
+ main.log.error( "Leader election, could not find current leader" )
if oldLeader:
withdrawResult = oldLeader.electionTestWithdraw()
utilities.assert_equals(
@@ -2208,26 +2327,28 @@
onfail="App was not withdrawn from election" )
main.step( "Make sure new leader is elected" )
+ # FIXME: use threads
leaderList = []
- for controller in range( 1, numControllers + 1 ):
- # loop through ONOScli handlers
- node = getattr( main, ( 'ONOScli' + str( controller ) ) )
- leaderList.append( node.electionTestLeader() )
- for leaderN in leaderList:
+ for cli in CLIs:
+ leaderN = cli.electionTestLeader()
+ leaderList.append( leaderN )
if leaderN == leader:
- main.log.report(
- "ONOS" + str( controller ) +
- " still sees " + str( leader ) +
- " as leader after they withdrew" )
+ main.log.report( cli.name + " still sees " + str( leader ) +
+ " as leader after they withdrew" )
leaderResult = main.FALSE
elif leaderN == main.FALSE:
# error in response
# TODO: add check for "Command not found:" in the driver, this
- # means the app isn't loaded
+ # means the app isn't loaded
main.log.report( "Something is wrong with " +
"electionTestLeader function, " +
"check the error logs" )
leaderResult = main.FALSE
+ elif leaderN is None:
+ # node may not have recieved the event yet
+ leaderN = cli.electionTestLeader()
+ leaderList.pop()
+ leaderList.append( leaderN )
consistentLeader = main.FALSE
if len( set( leaderList ) ) == 1:
main.log.info( "Each Election-app sees '" +
@@ -2240,6 +2361,7 @@
for n in range( len( leaderList ) ):
main.log.report( "ONOS" + str( n + 1 ) + " response: " +
str( leaderList[ n ] ) )
+ leaderResult = leaderResult and consistentLeader
if leaderResult:
main.log.report( "Leadership election tests passed( consistent " +
"view of leader across listeners and a new " +
diff --git a/TestON/tests/HATestSanity/HATestSanity.topo b/TestON/tests/HATestSanity/HATestSanity.topo
index 9305025..0855d4e 100644
--- a/TestON/tests/HATestSanity/HATestSanity.topo
+++ b/TestON/tests/HATestSanity/HATestSanity.topo
@@ -7,7 +7,8 @@
<password>onos_test</password>
<type>OnosDriver</type>
<connect_order>1</connect_order>
- <COMPONENTS> </COMPONENTS>
+ <COMPONENTS>
+ </COMPONENTS>
</ONOSbench>
<ONOScli1>
diff --git a/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py b/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py
index 9d9a3fa..d2f0bc9 100644
--- a/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py
+++ b/TestON/tests/HATestSingleInstanceRestart/HATestSingleInstanceRestart.py
@@ -49,7 +49,7 @@
main.case( "Setting up test environment" )
# TODO: save all the timers and output them for plotting
- # load some vairables from the params file
+ # load some variables from the params file
PULLCODE = False
if main.params[ 'Git' ] == 'True':
PULLCODE = True
@@ -59,35 +59,31 @@
# set global variables
global ONOS1Ip
global ONOS1Port
- global ONOS2Ip
global ONOS2Port
- global ONOS3Ip
global ONOS3Port
- global ONOS4Ip
global ONOS4Port
- global ONOS5Ip
global ONOS5Port
- global ONOS6Ip
global ONOS6Port
- global ONOS7Ip
global ONOS7Port
global numControllers
+ numControllers = int( main.params[ 'num_controllers' ] )
ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
ONOS1Port = main.params[ 'CTRL' ][ 'port1' ]
- ONOS2Ip = main.params[ 'CTRL' ][ 'ip2' ]
ONOS2Port = main.params[ 'CTRL' ][ 'port2' ]
- ONOS3Ip = main.params[ 'CTRL' ][ 'ip3' ]
ONOS3Port = main.params[ 'CTRL' ][ 'port3' ]
- ONOS4Ip = main.params[ 'CTRL' ][ 'ip4' ]
ONOS4Port = main.params[ 'CTRL' ][ 'port4' ]
- ONOS5Ip = main.params[ 'CTRL' ][ 'ip5' ]
ONOS5Port = main.params[ 'CTRL' ][ 'port5' ]
- ONOS6Ip = main.params[ 'CTRL' ][ 'ip6' ]
ONOS6Port = main.params[ 'CTRL' ][ 'port6' ]
- ONOS7Ip = main.params[ 'CTRL' ][ 'ip7' ]
ONOS7Port = main.params[ 'CTRL' ][ 'port7' ]
- numControllers = int( main.params[ 'num_controllers' ] )
+
+ global CLIs
+ CLIs = []
+ global nodes
+ nodes = []
+ for i in range( 1, numControllers + 1 ):
+ CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+ nodes.append( getattr( main, 'ONOS' + str( i ) ) )
main.step( "Applying cell variable to environment" )
cellResult = main.ONOSbench.setCell( cellName )
@@ -96,14 +92,10 @@
# FIXME:this is short term fix
main.log.report( "Removing raft logs" )
main.ONOSbench.onosRemoveRaftLogs()
+
main.log.report( "Uninstalling ONOS" )
- main.ONOSbench.onosUninstall( ONOS1Ip )
- main.ONOSbench.onosUninstall( ONOS2Ip )
- main.ONOSbench.onosUninstall( ONOS3Ip )
- main.ONOSbench.onosUninstall( ONOS4Ip )
- main.ONOSbench.onosUninstall( ONOS5Ip )
- main.ONOSbench.onosUninstall( ONOS6Ip )
- main.ONOSbench.onosUninstall( ONOS7Ip )
+ for node in nodes:
+ main.ONOSbench.onosUninstall( node.ip_address )
cleanInstallResult = main.TRUE
gitPullResult = main.TRUE
@@ -116,6 +108,8 @@
main.step( "Git checkout and pull " + gitBranch )
main.ONOSbench.gitCheckout( gitBranch )
gitPullResult = main.ONOSbench.gitPull()
+ if gitPullResult == main.ERROR:
+ main.log.error( "Error pulling git branch" )
main.step( "Using mvn clean & install" )
cleanInstallResult = main.ONOSbench.cleanInstall()
@@ -167,6 +161,16 @@
Assign mastership to controllers
"""
import re
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert ONOS1Port, "ONOS1Port not defined"
+ assert ONOS2Port, "ONOS2Port not defined"
+ assert ONOS3Port, "ONOS3Port not defined"
+ assert ONOS4Port, "ONOS4Port not defined"
+ assert ONOS5Port, "ONOS5Port not defined"
+ assert ONOS6Port, "ONOS6Port not defined"
+ assert ONOS7Port, "ONOS7Port not defined"
main.log.report( "Assigning switches to controllers" )
main.case( "Assigning Controllers" )
@@ -196,12 +200,82 @@
onpass="Switch mastership assigned correctly",
onfail="Switches not assigned correctly to controllers" )
+ roleCall = main.TRUE
+ roleCheck = main.TRUE
+ try:
+ for i in range( 1, 29 ): # switches 1 through 28
+ ip = nodes[ 0 ].ip_address # ONOS1
+ # set up correct variables:
+ if i == 1:
+ deviceId = main.ONOScli1.getDevice( "1000" ).get( 'id' )
+ elif i == 2:
+ deviceId = main.ONOScli1.getDevice( "2000" ).get( 'id' )
+ elif i == 3:
+ deviceId = main.ONOScli1.getDevice( "3000" ).get( 'id' )
+ elif i == 4:
+ deviceId = main.ONOScli1.getDevice( "3004" ).get( 'id' )
+ elif i == 5:
+ deviceId = main.ONOScli1.getDevice( "5000" ).get( 'id' )
+ elif i == 6:
+ deviceId = main.ONOScli1.getDevice( "6000" ).get( 'id' )
+ elif i == 7:
+ deviceId = main.ONOScli1.getDevice( "6007" ).get( 'id' )
+ elif i >= 8 and i <= 17:
+ dpid = '3' + str( i ).zfill( 3 )
+ deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+ elif i >= 18 and i <= 27:
+ dpid = '6' + str( i ).zfill( 3 )
+ deviceId = main.ONOScli1.getDevice( dpid ).get( 'id' )
+ elif i == 28:
+ deviceId = main.ONOScli1.getDevice( "2800" ).get( 'id' )
+ else:
+ main.log.error( "You didn't write an else statement for " +
+ "switch s" + str( i ) )
+ # Assign switch
+ assert deviceId, "No device id for s" + str( i ) + " in ONOS"
+ # TODO: make this controller dynamic
+ roleCall = roleCall and main.ONOScli1.deviceRole( deviceId,
+ ip )
+ # Check assignment
+ master = main.ONOScli1.getRole( deviceId ).get( 'master' )
+ if ip in master:
+ roleCheck = roleCheck and main.TRUE
+ else:
+ roleCheck = roleCheck and main.FALSE
+ main.log.error( "Error, controller " + ip + " is not" +
+ " master " + "of device " +
+ str( deviceId ) + ". Master is " +
+ repr( master ) + "." )
+ except ( AttributeError, AssertionError ):
+ main.log.exception( "Something is wrong with ONOS device view" )
+ main.log.info( main.ONOScli1.devices() )
+ utilities.assert_equals(
+ expect=main.TRUE,
+ actual=roleCall,
+ onpass="Re-assigned switch mastership to designated controller",
+ onfail="Something wrong with deviceRole calls" )
+
+ utilities.assert_equals(
+ expect=main.TRUE,
+ actual=roleCheck,
+ onpass="Switches were successfully reassigned to designated " +
+ "controller",
+ onfail="Switches were not successfully reassigned" )
+ mastershipCheck = mastershipCheck and roleCall and roleCheck
+ utilities.assert_equals( expect=main.TRUE, actual=mastershipCheck,
+ onpass="Switch mastership correctly assigned",
+ onfail="Error in (re)assigning switch" +
+ " mastership" )
+
def CASE3( self, main ):
"""
Assign intents
"""
import time
import json
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
# FIXME: we must reinstall intents until we have a persistant
# datastore!
main.log.report( "Adding host intents" )
@@ -212,27 +286,39 @@
# install onos-app-fwd
main.log.info( "Install reactive forwarding app" )
- main.ONOScli1.featureInstall( "onos-app-fwd" )
+ appResults = main.ONOScli1.activateApp( "org.onosproject.fwd" )
+
+ # FIXME: add this to asserts
+ appCheck = main.ONOScli1.appToIDCheck()
+ if appCheck != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
# REACTIVE FWD test
pingResult = main.FALSE
- time1 = time.time()
- pingResult = main.Mininet1.pingall()
- utilities.assert_equals(
- expect=main.TRUE,
- actual=pingResult,
- onpass="Reactive Pingall test passed",
- onfail="Reactive Pingall failed, one or more ping pairs failed" )
- time2 = time.time()
- main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
+ for i in range(2): # Retry if pingall fails first time
+ time1 = time.time()
+ pingResult = main.Mininet1.pingall()
+ utilities.assert_equals(
+ expect=main.TRUE,
+ actual=pingResult,
+ onpass="Reactive Pingall test passed",
+ onfail="Reactive Pingall failed, one or more ping pairs failed" )
+ time2 = time.time()
+ main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
# uninstall onos-app-fwd
main.log.info( "Uninstall reactive forwarding app" )
- main.ONOScli1.featureUninstall( "onos-app-fwd" )
- # timeout for fwd flows
- time.sleep( 10 )
+ appResults = appResults and main.ONOScli1.deactivateApp( "org.onosproject.fwd" )
+ appCheck2 = main.ONOScli1.appToIDCheck()
+ if appCheck2 != main.TRUE:
+ main.log.warn( CLIs[0].apps() )
+ main.log.warn( CLIs[0].appIDs() )
- main.step( "Add host intents" )
+ # timeout for fwd flows
+ time.sleep( 11 )
+
+ main.step( "Add host intents" )
intentIds = []
# TODO: move the host numbers to params
# Maybe look at all the paths we ping?
@@ -254,41 +340,56 @@
host1Id = host1Dict.get( 'id', None )
host2Id = host2Dict.get( 'id', None )
if host1Id and host2Id:
- tmpId = main.ONOScli1.addHostIntent(
- host1Id,
- host2Id )
+ tmpId = main.ONOScli1.addHostIntent( host1Id, host2Id )
if tmpId:
main.log.info( "Added intent with id: " + tmpId )
intentIds.append( tmpId )
else:
- main.log.error( "addHostIntent reutrned None" )
+ main.log.error( "addHostIntent returned: " +
+ repr( tmpId ) )
else:
- main.log.error( "Error, getHost() failed" )
- main.log.warn( json.dumps( json.loads( main.ONOScli1.hosts() ),
- sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ main.log.error( "Error, getHost() failed for h" + str( i ) +
+ " and/or h" + str( i + 10 ) )
+ hosts = main.ONOScli1.hosts()
+ main.log.warn( "Hosts output: " )
+ try:
+ main.log.warn( json.dumps( json.loads( hosts ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( hosts ) )
hostResult = main.FALSE
+ # FIXME: DEBUG
+ intentStart = time.time()
onosIds = main.ONOScli1.getAllIntentsId()
main.log.info( "Submitted intents: " + str( intentIds ) )
main.log.info( "Intents in ONOS: " + str( onosIds ) )
for intent in intentIds:
if intent in onosIds:
- pass # intent submitted is still in onos
+ pass # intent submitted is in onos
else:
intentAddResult = False
+ # FIXME: DEBUG
+ if intentAddResult:
+ intentStop = time.time()
+ else:
+ intentStop = None
# Print the intent states
intents = main.ONOScli1.intents()
intentStates = []
- installedCheck = True
+ installedCheck = True
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
- for intent in json.loads( intents ): # Iter through intents of a node
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents" )
# add submitted intents not in the store
tmplist = [ i for i, s in intentStates ]
missingIntents = False
@@ -301,11 +402,59 @@
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- # for node in nodes:
- # node.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
+
intentAddResult = bool( pingResult and hostResult and intentAddResult
and not missingIntents and installedCheck )
utilities.assert_equals(
@@ -327,13 +476,16 @@
intentStates = []
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
- for intent in json.loads( intents ):
- # Iter through intents of a node
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ # Iter through intents of a node
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents" )
# add submitted intents not in the store
tmplist = [ i for i, s in intentStates ]
for i in intentIds:
@@ -344,14 +496,71 @@
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
def CASE4( self, main ):
"""
Ping across added host intents
"""
import json
+ import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
description = " Ping across added host intents"
main.log.report( description )
main.case( description )
@@ -370,11 +579,15 @@
main.log.report(
"Intents have not been installed correctly, pings failed." )
# TODO: pretty print
- main.log.warn( "ONSO1 intents: " )
- main.log.warn( json.dumps( json.loads( main.ONOScli1.intents() ),
- sort_keys=True,
- indent=4,
- separators=( ',', ': ' ) ) )
+ main.log.warn( "ONOS1 intents: " )
+ try:
+ tmpIntents = main.ONOScli1.intents()
+ main.log.warn( json.dumps( json.loads( tmpIntents ),
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ except ( ValueError, TypeError ):
+ main.log.warn( repr( tmpIntents ) )
if PingResult == main.TRUE:
main.log.report(
"Intents have been installed correctly and verified by pings" )
@@ -392,21 +605,79 @@
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
# Iter through intents of a node
- for intent in json.loads( intents ):
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents." )
intentStates.sort()
for i, s in intentStates:
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
+
if not installedCheck:
- main.log.info( "Waiting 60 seconds to see if intent states change" )
+ main.log.info( "Waiting 60 seconds to see if the state of " +
+ "intents change" )
time.sleep( 60 )
# Print the intent states
intents = main.ONOScli1.intents()
@@ -414,26 +685,84 @@
main.log.info( "%-6s%-15s%-15s" % ( 'Count', 'ID', 'State' ) )
count = 0
# Iter through intents of a node
- for intent in json.loads( intents ):
- state = intent.get( 'state', None )
- if "INSTALLED" not in state:
- installedCheck = False
- intentId = intent.get( 'id', None )
- intentStates.append( ( intentId, state ) )
+ try:
+ for intent in json.loads( intents ):
+ state = intent.get( 'state', None )
+ if "INSTALLED" not in state:
+ installedCheck = False
+ intentId = intent.get( 'id', None )
+ intentStates.append( ( intentId, state ) )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing intents." )
intentStates.sort()
for i, s in intentStates:
count += 1
main.log.info( "%-6s%-15s%-15s" %
( str( count ), str( i ), str( s ) ) )
- main.ONOScli1.leaders()
- main.ONOScli1.partitions()
- main.ONOScli1.pendingMap()
+ leaders = main.ONOScli1.leaders()
+ try:
+ if leaders:
+ parsedLeaders = json.loads( leaders )
+ main.log.warn( json.dumps( parsedLeaders,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # check for all intent partitions
+ # check for election
+ topics = []
+ for i in range( 14 ):
+ topics.append( "intent-partition-" + str( i ) )
+ # FIXME: this should only be after we start the app
+ topics.append( "org.onosproject.election" )
+ main.log.debug( topics )
+ ONOStopics = [ j['topic'] for j in parsedLeaders ]
+ for topic in topics:
+ if topic not in ONOStopics:
+ main.log.error( "Error: " + topic +
+ " not in leaders" )
+ else:
+ main.log.error( "leaders() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing leaders" )
+ main.log.error( repr( leaders ) )
+ partitions = main.ONOScli1.partitions()
+ try:
+ if partitions :
+ parsedPartitions = json.loads( partitions )
+ main.log.warn( json.dumps( parsedPartitions,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check for a leader in all paritions
+ # TODO check for consistency among nodes
+ else:
+ main.log.error( "partitions() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing partitions" )
+ main.log.error( repr( partitions ) )
+ pendingMap = main.ONOScli1.pendingMap()
+ try:
+ if pendingMap :
+ parsedPending = json.loads( pendingMap )
+ main.log.warn( json.dumps( parsedPending,
+ sort_keys=True,
+ indent=4,
+ separators=( ',', ': ' ) ) )
+ # TODO check something here?
+ else:
+ main.log.error( "pendingMap() returned None" )
+ except ( ValueError, TypeError ):
+ main.log.exception( "Error parsing pending map" )
+ main.log.error( repr( pendingMap ) )
def CASE5( self, main ):
"""
Reading state of ONOS
"""
import json
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
# assumes that sts is already in you PYTHONPATH
from sts.topology.teston_topology import TestONTopology
@@ -441,11 +770,11 @@
main.case( "Setting up and gathering data for current state" )
# The general idea for this test case is to pull the state of
# ( intents,flows, topology,... ) from each ONOS node
- # We can then compare them with eachother and also with past states
+ # We can then compare them with each other and also with past states
- main.step( "Get the Mastership of each switch from each controller" )
+ main.step( "Check that each switch has a master" )
global mastershipState
- mastershipState = []
+ mastershipState = '[]'
# Assert that each device has a master
rolesNotNull = main.ONOScli1.rolesNotNull()
@@ -628,6 +957,9 @@
The Failure case.
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
main.log.report( "Restart ONOS node" )
main.log.case( "Restart ONOS node" )
@@ -660,6 +992,9 @@
Check state after ONOS failure
"""
import json
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
main.case( "Running ONOS Constant State Tests" )
# Assert that each device has a master
@@ -850,23 +1185,19 @@
from sts.topology.teston_topology import TestONTopology
import json
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
description = "Compare ONOS Topology view to Mininet topology"
main.case( description )
main.log.report( description )
main.step( "Create TestONTopology object" )
ctrls = []
- count = 1
- temp = ()
- temp = temp + ( getattr( main, ( 'ONOS' + str( count ) ) ), )
- temp = temp + ( "ONOS" + str( count ), )
- temp = temp + ( main.params[ 'CTRL' ][ 'ip' + str( count ) ], )
- temp = temp + \
- ( eval( main.params[ 'CTRL' ][ 'port' + str( count ) ] ), )
+ node = main.ONOS1
+ temp = ( node, node.name, node.ip_address, 6633 )
ctrls.append( temp )
- MNTopo = TestONTopology(
- main.Mininet1,
- ctrls ) # can also add Intent API info for intent operations
+ MNTopo = TestONTopology( main.Mininet1, ctrls )
main.step( "Comparing ONOS topology to MN" )
devicesResults = main.TRUE
@@ -880,9 +1211,9 @@
startTime = time.time()
# Give time for Gossip to work
while topoResult == main.FALSE and elapsed < 60:
- count = count + 1
+ count += 1
if count > 1:
- # TODO: Depricate STS usage
+ # TODO: Deprecate STS usage
MNTopo = TestONTopology( main.Mininet1, ctrls )
cliStart = time.time()
devices = []
@@ -1002,6 +1333,9 @@
Link s3-s28 down
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
# NOTE: You should probably run a topology check after this
linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
@@ -1017,7 +1351,7 @@
" seconds for link down to be discovered" )
time.sleep( linkSleep )
utilities.assert_equals( expect=main.TRUE, actual=LinkDown,
- onpass="Link down succesful",
+ onpass="Link down successful",
onfail="Failed to bring link down" )
# TODO do some sort of check here
@@ -1026,6 +1360,9 @@
Link s3-s28 up
"""
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
# NOTE: You should probably run a topology check after this
linkSleep = float( main.params[ 'timers' ][ 'LinkDiscovery' ] )
@@ -1041,7 +1378,7 @@
" seconds for link up to be discovered" )
time.sleep( linkSleep )
utilities.assert_equals( expect=main.TRUE, actual=LinkUp,
- onpass="Link up succesful",
+ onpass="Link up successful",
onfail="Failed to bring link up" )
# TODO do some sort of check here
@@ -1051,6 +1388,9 @@
"""
# NOTE: You should probably run a topology check after this
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
@@ -1074,7 +1414,7 @@
if device and device[ 'available' ] is False:
result = main.TRUE
utilities.assert_equals( expect=main.TRUE, actual=result,
- onpass="Kill switch succesful",
+ onpass="Kill switch successful",
onfail="Failed to kill switch?" )
def CASE12( self, main ):
@@ -1083,6 +1423,16 @@
"""
# NOTE: You should probably run a topology check after this
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+ assert ONOS1Port, "ONOS1Port not defined"
+ assert ONOS2Port, "ONOS2Port not defined"
+ assert ONOS3Port, "ONOS3Port not defined"
+ assert ONOS4Port, "ONOS4Port not defined"
+ assert ONOS5Port, "ONOS5Port not defined"
+ assert ONOS6Port, "ONOS6Port not defined"
+ assert ONOS7Port, "ONOS7Port not defined"
switchSleep = float( main.params[ 'timers' ][ 'SwitchDiscovery' ] )
switch = main.params[ 'kill' ][ 'switch' ]
@@ -1095,7 +1445,6 @@
main.step( "Add back " + switch )
main.log.report( "Adding back " + switch )
main.Mininet1.addSwitch( switch, dpid=switchDPID )
- # TODO: New dpid or same? Ask Thomas?
for peer in links:
main.Mininet1.addLink( switch, peer )
main.Mininet1.assignSwController( sw=switch.split( 's' )[ 1 ],
@@ -1111,7 +1460,7 @@
if device and device[ 'available' ]:
result = main.TRUE
utilities.assert_equals( expect=main.TRUE, actual=result,
- onpass="add switch succesful",
+ onpass="add switch successful",
onfail="Failed to add switch?" )
def CASE13( self, main ):
@@ -1120,25 +1469,19 @@
"""
import os
import time
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
# printing colors to terminal
- colors = {}
- colors[ 'cyan' ] = '\033[96m'
- colors[ 'purple' ] = '\033[95m'
- colors[ 'blue' ] = '\033[94m'
- colors[ 'green' ] = '\033[92m'
- colors[ 'yellow' ] = '\033[93m'
- colors[ 'red' ] = '\033[91m'
- colors[ 'end' ] = '\033[0m'
+ colors = { 'cyan': '\033[96m', 'purple': '\033[95m',
+ 'blue': '\033[94m', 'green': '\033[92m',
+ 'yellow': '\033[93m', 'red': '\033[91m', 'end': '\033[0m' }
description = "Test Cleanup"
main.log.report( description )
main.case( description )
main.step( "Killing tcpdumps" )
main.Mininet2.stopTcpdump()
- main.step( "Checking ONOS Logs for errors" )
- print colors[ 'purple' ] + "Checking logs for errors on ONOS1:" + \
- colors[ 'end' ]
- print main.ONOSbench.checkLogs( ONOS1Ip )
main.step( "Copying MN pcap and ONOS log files to test station" )
testname = main.TEST
teststationUser = main.params[ 'TESTONUSER' ]
@@ -1176,7 +1519,15 @@
main.ONOSbench.handle.expect( "\$" )
# sleep so scp can finish
time.sleep( 10 )
+
+ main.step( "Stopping Mininet" )
main.Mininet1.stopNet()
+
+ main.step( "Checking ONOS Logs for errors" )
+ print colors[ 'purple' ] + "Checking logs for errors on ONOS1:" + \
+ colors[ 'end' ]
+ print main.ONOSbench.checkLogs( ONOS1Ip )
+
main.step( "Packing and rotating pcap archives" )
os.system( "~/TestON/dependencies/rotate.sh " + str( testname ) )
@@ -1189,11 +1540,13 @@
"""
start election app on all onos nodes
"""
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
+
leaderResult = main.TRUE
- # install app on onos 1
main.log.info( "Install leadership election app" )
- main.ONOScli1.featureInstall( "onos-app-election" )
- # wait for election
+ main.ONOScli1.activateApp( "org.onosproject.election" )
# check for leader
leader = main.ONOScli1.electionTestLeader()
# verify leader is ONOS1
@@ -1219,32 +1572,6 @@
"'" )
leaderResult = main.FALSE
- # install on other nodes and check for leader.
- # Should be onos1 and each app should show the same leader
- for controller in range( 2, numControllers + 1 ):
- # loop through ONOScli handlers
- node = getattr( main, ( 'ONOScli' + str( controller ) ) )
- node.featureInstall( "onos-app-election" )
- leaderN = node.electionTestLeader()
- # verify leader is ONOS1
- if leaderN == ONOS1Ip:
- # all is well
- pass
- elif leaderN == main.FALSE:
- # error in response
- # TODO: add check for "Command not found:" in the driver, this
- # means the app isn't loaded
- main.log.report( "Something is wrong with " +
- "electionTestLeader function, check the" +
- " error logs" )
- leaderResult = main.FALSE
- elif leader != leaderN:
- leaderResult = main.FALSE
- main.log.report( "ONOS" + str( controller ) + " sees " +
- str( leaderN ) +
- " as the leader of the election app. Leader" +
- " should be " +
- str( leader ) )
if leaderResult:
main.log.report( "Leadership election tests passed( consistent " +
"view of leader across listeners and a leader " +
@@ -1259,13 +1586,16 @@
"""
Check that Leadership Election is still functional
"""
+ assert numControllers, "numControllers not defined"
+ assert main, "main not defined"
+ assert utilities.assert_equals, "utilities.assert_equals not defined"
leaderResult = main.TRUE
description = "Check that Leadership Election is still functional"
main.log.report( description )
main.case( description )
main.step( "Find current leader and withdraw" )
leader = main.ONOScli1.electionTestLeader()
- # TODO: do some sanity checking on leader before using it
+ # do some sanity checking on leader before using it
withdrawResult = main.FALSE
if leader == ONOS1Ip:
oldLeader = getattr( main, "ONOScli1" )
@@ -1286,7 +1616,6 @@
onfail="App was not withdrawn from election" )
main.step( "Make sure new leader is elected" )
- leaderList = []
leaderN = main.ONOScli1.electionTestLeader()
if leaderN == leader:
main.log.report( "ONOS still sees " + str( leaderN ) +
diff --git a/TestON/tests/IntentEventTP/IntentEventTP.params b/TestON/tests/IntentEventTP/IntentEventTP.params
index d5dd65c..7f355dc 100644
--- a/TestON/tests/IntentEventTP/IntentEventTP.params
+++ b/TestON/tests/IntentEventTP/IntentEventTP.params
@@ -20,41 +20,41 @@
<CTRL>
<USER>admin</USER>
- <ip1>10.128.5.51</ip1>
+ <ip1>10.254.1.201</ip1>
<port1>6633</port1>
- <ip2>10.128.5.52</ip2>
+ <ip2>10.254.1.202</ip2>
<port2>6633</port2>
- <ip3>10.128.5.53</ip3>
+ <ip3>10.254.1.203</ip3>
<port3>6633</port3>
- <ip4>10.128.5.54</ip4>
+ <ip4>10.254.1.204</ip4>
<port4>6633</port4>
- <ip5>10.128.5.65</ip5>
+ <ip5>10.254.1.205</ip5>
<port5>6633</port5>
- <ip6>10.128.5.66</ip6>
+ <ip6>10.254.1.206</ip6>
<port6>6633</port6>
- <ip7>10.128.5.67</ip7>
+ <ip7>10.254.1.207</ip7>
<port7>6633</port7>
</CTRL>
- <MN><ip1>10.128.5.55</ip1></MN>
+ <MN><ip1>10.254.1.200</ip1></MN>
<BENCH>
<user>admin</user>
- <ip1>10.128.5.55</ip1>
+ <ip1>10.254.1.200</ip1>
</BENCH>
<TEST>
- <loadFrom>1,0,0,0,0,0,0</loadFrom> #generate load on server, 1 = generator on
- <numSwitches>35</numSwitches>
+ <loadFrom>1,1,1,1,1,1,1</loadFrom> #generate load on server, 1 = generator on
+ <numSwitches>10,10,10,10,10,10,10</numSwitches>
<skipCleanInstall>yes</skipCleanInstall>
- <duration>60</duration>
- <log_interval>5</log_interval>
+ <duration>600</duration>
+ <log_interval>20</log_interval>
</TEST>
<METRICS>
diff --git a/TestON/tests/IntentEventTP/IntentEventTP.py b/TestON/tests/IntentEventTP/IntentEventTP.py
index b1f0e91..863599c 100644
--- a/TestON/tests/IntentEventTP/IntentEventTP.py
+++ b/TestON/tests/IntentEventTP/IntentEventTP.py
@@ -33,7 +33,7 @@
maxNodes = int(main.params[ 'availableNodes' ])
MNip = main.params[ 'MN' ][ 'ip1' ]
skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
- numSwitches = main.params[ 'TEST' ][ 'numSwitches' ]
+ numSwitches = (main.params[ 'TEST' ][ 'numSwitches' ]).split(",")
homeDir = os.path.expanduser('~')
@@ -83,68 +83,26 @@
if skipMvn != "yes":
mvnResult = main.ONOSbench.cleanInstall()
- #configure null device provider
- switchList = [0,int(numSwitches),0,0,0,0,0,0]
- devicesString = ""
- for node in range(1, maxNodes + 1):
- devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
- if node < maxNodes:
- devicesString += (",")
+ #null link
+ #null provider
+ #linkgraph
+ #intentPerf
- main.log.info("Configuring device provider: ONOS 1 with " + (numSwitches) + " switches")
- localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
- filePath = homeDir + localPath
- main.log.info(filePath)
+ myDistribution = []
+ for node in range (1, clusterCount + 1):
+ myDistribution.append(numSwitches[node-1])
- configFile = open(filePath, 'w+')
- configFile.write("devConfigs = " + devicesString + "\n")
- configFile.write("#numPorts = 8")
- configFile.close()
- main.log.info("DevConfig = " + devicesString)
- main.log.info("Device provider file written and closed")
+ main.ONOSbench.createLinkGraphFile( BENCHIp,cellIp,myDistribution)
+ main.ONOSbench.createNullDevProviderFile( BENCHIp, cellIp, myDistribution)
+ main.ONOSbench.createNullLinkProviderFile(BENCHIp)
- ## configuring null link provider
- main.log.info(" Configuring null provider to disable flicker" )
- homeDir = os.path.expanduser('~')
- main.log.info(homeDir)
- localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
- filePath = homeDir + localPath
- main.log.info(filePath)
-
- neighborsString = ""
- for node in range(1, maxNodes + 1):
- neighborsString += ONOSIp[node]
- if node < maxNodes:
- neighborsString += ","
-
- configFile = open(filePath, 'w+')
- configFile.write("#eventRate =\n")
- configFile.write("#cfgFile = /tmp/foo.cfg #If enabled, points to the full path to the topology file.\n")
- configFile.write("#neighbors = ")
- configFile.close()
- main.log.info("Configuration completed")
+ main.log.step("Writing IntentPerf config file")
+ intentPerfConfig = open( homeDir + "/onos/tools/package/etc/org.onosproject.intentperf.IntentPerfInstaller.cfg", "w+")
+ intentPerfConfig.write("numKeys = 40000\n")
+ intentPerfConfig.write("cyclePeriod = 1000\n")
+ intentPerfConfig.write("numNeighors = 0\n")
+ intentPerfConfig.close()
- main.log.info("Writing link graph configuration file..." )
- homeDir = os.path.expanduser('~')
- localPath = "/onos/tools/package/etc/linkGraph.cfg"
- filePath = homeDir + localPath
- linkGraph = open(filePath, 'w+')
- linkGraph.write("# NullLinkProvider topology description (config file).\n")
- linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
- linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
-
- myPort = 6
- for node in range(1, clusterCount+1):
- linkGraph.write("graph " + ONOSIp[node] + " {\n")
- for switch in range (0, switchList[node]-1):
- line = ""
- line = ("\t" + str(switch) + ":" + str(myPort))
- line += " -- "
- line += (str(switch+1) + ":" + str(myPort-1) + "\n")
- linkGraph.write(line)
- linkGraph.write("}")
- linkGraph.close()
-
main.step( "Creating ONOS package" )
packageResult = main.ONOSbench.onosPackage()
@@ -170,7 +128,7 @@
main.ONOSbench.handle.expect(":~")
clusterCheck = ((main.ONOSbench.handle.before).splitlines())[3]
print("\nBefore: " + str(clusterCheck))
- if "SCC(s)=1," in clusterCheck and ("devices=" + str(numSwitches)) in clusterCheck: #check for links and devices too
+ if "SCC(s)=1," in clusterCheck:
break
if clusterCheck != lastOutput:
sameOutput = False
@@ -205,7 +163,7 @@
cellName = main.params[ 'ENV' ][ 'cellName' ]
MNip = main.params[ 'MN' ][ 'ip1' ]
BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
- numSwitches = int(main.params[ 'TEST' ][ 'numSwitches' ])
+ numSwitches = (main.params[ 'TEST' ][ 'numSwitches' ]).split(",")
scale = int( main.params[ 'SCALE' ] )
maxNodes = int(main.params[ 'availableNodes' ])
clusterCount += scale
@@ -234,53 +192,23 @@
main.step( "Set Cell" )
main.ONOSbench.setCell(cellName)
- baselineSwitchCount = numSwitches/clusterCount
- switchList = [0,0,0,0,0,0,0,0]
-
- for node in range(1, clusterCount + 1):
- switchList[node] = baselineSwitchCount
-
- for node in range(1, (numSwitches%clusterCount)+1):
- switchList[node] += 1
-
- devicesString = ""
- for node in range(1, maxNodes + 1):
- devicesString += (ONOSIp[node] + ":" + str(switchList[node] ))
- if node < maxNodes:
- devicesString += (",")
+ myDistribution = []
+ for node in range (1, clusterCount + 1):
+ myDistribution.append(numSwitches[node-1])
- main.log.info("Configuring device provider")
- localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
- filePath = homeDir + localPath
- main.log.info(filePath)
+ main.ONOSbench.createLinkGraphFile( BENCHIp, cellIp, myDistribution)
+ main.ONOSbench.createNullDevProviderFile( BENCHIp, cellIp, myDistribution)
+ main.ONOSbench.createNullLinkProviderFile( BENCHIp )
- configFile = open(filePath, 'w+')
- configFile.write("devConfigs = " + devicesString +"\n")
- configFile.write("# numPorts = 8")
- configFile.close()
- main.log.info("DevConfig = " + devicesString)
- main.log.info("Device provider file written and closed")
+ #neighbors = max(1, clusterCount-1)
+ neighbors = 0
- main.log.info("Writing link graph configuration file..." )
- homeDir = os.path.expanduser('~')
- localPath = "/onos/tools/package/etc/linkGraph.cfg"
- filePath = homeDir + localPath
- linkGraph = open(filePath, 'w+')
- linkGraph.write("# NullLinkProvider topology description (config file).\n")
- linkGraph.write("# The NodeId is only added if the destination is another node's device.\n")
- linkGraph.write("# Bugs: Comments cannot be appended to a line to be read.\n")
-
- myPort = 6
- for node in range(1, clusterCount+1):
- linkGraph.write("graph " + ONOSIp[node] + " {\n")
- for switch in range (0, switchList[node]-1):
- line = ""
- line = ("\t" + str(switch) + ":" + str(myPort))
- line += " -- "
- line += (str(switch+1) + ":" + str(myPort-1) + "\n")
- linkGraph.write(line)
- linkGraph.write("}\n")
- linkGraph.close()
+ main.log.step("Writing IntentPerf config file")
+ intentPerfConfig = open( homeDir + "/onos/tools/package/etc/org.onosproject.intentperf.IntentPerfInstaller.cfg", "w+")
+ intentPerfConfig.write("numKeys = 40000\n")
+ intentPerfConfig.write("cyclePeriod = 1000\n")
+ intentPerfConfig.write("numNeighors = " + str(neighbors) + "\n")
+ intentPerfConfig.close()
main.step( "Creating ONOS package, preparing to reinstall" )
packageResult = main.ONOSbench.onosPackage()
@@ -306,7 +234,7 @@
main.ONOSbench.handle.expect(":~")
clusterCheck = ((main.ONOSbench.handle.before).splitlines())[3]
print("\nBefore: " + str(clusterCheck))
- if "SCC(s)=1," in clusterCheck and ("nodes=" + str(clusterCount)) in clusterCheck and ("devices=" + str(numSwitches)) in clusterCheck:
+ if ("SCC(s)=1,") in clusterCheck:
break
if clusterCheck != lastOutput:
sameOutput = False
@@ -326,6 +254,7 @@
import json
import string
import csv
+ import numpy
main.log.info("Cluster Count = " + str(clusterCount))
@@ -338,7 +267,7 @@
metricList = [intentsRate, intentsWithdrawn, intentsFailed]
- tempsleep =40
+ tempsleep =20
main.log.info("sleeping " + str(tempsleep))
time.sleep(tempsleep)
@@ -351,47 +280,59 @@
main.ONOSbench.handle.sendline(cmd)
main.ONOSbench.handle.expect(":~")
main.log.info("Load initiated on node " + str(node))
-
+
+ time.sleep(5)
+ actcmd = "onos $OC" + str(node) + " intent-perf-start"
+ main.ONOSbench.handle.sendline(actcmd)
+ main.ONOSbench.handle.expect(":~")
+ main.log.info("Starting ONOS " + str(node) + " intent-perf...")
+
main.log.info( "Starting test loop for " + str(testDuration) + " seconds...\n" )
stop = time.time() + float( testDuration )
while time.time() < stop:
time.sleep( float( logInterval ) )
+ groupResult = []
for node in range (1, clusterCount + 1):
- myResults = ['0','0','0']
- for metric in metricList:
-
- onosEnv = "onos $OC" + str(node)
- cmd = onosEnv + " " + metric
- main.log.info("COMMAND: " + cmd)
- main.ONOSbench.handle.sendline( cmd )
- time.sleep(10)
- main.ONOSbench.handle.expect(":~")
- rawResult = main.ONOSbench.handle.before
- rawResult = (rawResult.splitlines())
-
- tempResult = "--"
- for word in rawResult:
- if debug: print("word: " + word)
- if "m1" in str(word):
- tempResult = word
- break
-
- if tempResult == "--":
- main.log.error("WRONG pexepct.before data\n" + str(rawResult))
- main.log.info("retrying command... ")
- main.ONOSbench.handle.sendline(cmd)
- main.ONOSbench.handle.expect(":~")
- test = main.ONOSbench.handle.before
- print ("\n\n" + str(test))
-
- tempResult = round(float(tempResult.replace("m1=","")),1)
- tempResult = str(tempResult) # easy way to clean up number/prep to log
- resultIndex = metricList.index(metric)
- myResults[resultIndex] = tempResult
+ if loadFrom[node] == "0": continue
+ groupResult.append(0)
- main.log.info("\tNode " + str(node))
- main.log.info("Installed\tWithdrawn\tFailed")
- main.log.info(myResults[0] + "\t\t " + myResults[1] + "\t\t" + myResults[2] + "\n")
-
+ cmd = " onos-ssh $OC" + str(node) + """ cat /opt/onos/log/karaf.log | grep "SNAPSHOT | Throughput" | tail -1 """
+ main.log.info("COMMAND: " + str(cmd))
+
+ x = 0
+ while True:
+ main.ONOSbench.handle.sendline(cmd)
+ main.ONOSbench.handle.expect(":~")
+ raw = main.ONOSbench.handle.before
+ if "OVERALL=" in raw:
+ break
+ x += 1
+ if x > 10:
+ main.log.error("Expected output not being recieved... continuing")
+ break
+ time.sleep(2)
+ raw = raw.splitlines()
+ splitResults = []
+ for line in raw:
+ splitResults.extend(line.split(" "))
+
+ myResult = "--"
+ for field in splitResults:
+ if "OVERALL" in field:
+ myResult = field
+
+ if myResult == "--":
+ main.log.error("Parsing/Pexpect error\n" + str(splitResults))
+
+ myResult = myResult.replace(";", "")
+ myResult = myResult.replace("OVERALL=","")
+ myResult = float(myResult)
+ groupResult[len(groupResult) -1] = myResult
+
+ main.log.info("Node " + str(node) + " overall rate: " + str(myResult))
+
+ main.log.report("Results from this round of polling: " + str(groupResult))
+ main.log.report("Cluster Total: " + str(numpy.sum(groupResult)) + "\n")
+
diff --git a/TestON/tests/IntentEventTP/IntentEventTP.topo b/TestON/tests/IntentEventTP/IntentEventTP.topo
index 30a1467..0e45e0f 100644
--- a/TestON/tests/IntentEventTP/IntentEventTP.topo
+++ b/TestON/tests/IntentEventTP/IntentEventTP.topo
@@ -3,7 +3,7 @@
<COMPONENT>
<ONOSbench>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosDriver</type>
@@ -12,7 +12,7 @@
</ONOSbench>
<ONOS1cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -21,7 +21,7 @@
</ONOS1cli>
<ONOS2cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -30,7 +30,7 @@
</ONOS2cli>
<ONOS3cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -39,7 +39,7 @@
</ONOS3cli>
<ONOS4cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -48,7 +48,7 @@
</ONOS4cli>
<ONOS5cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -57,7 +57,7 @@
</ONOS5cli>
<ONOS6cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -66,7 +66,7 @@
</ONOS6cli>
<ONOS7cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -75,7 +75,7 @@
</ONOS7cli>
<ONOS1>
- <host>10.128.5.51</host>
+ <host>10.254.1.201</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -84,7 +84,7 @@
</ONOS1>
<ONOS2>
- <host>10.128.5.52</host>
+ <host>10.254.1.202</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -93,7 +93,7 @@
</ONOS2>
<ONOS3>
- <host>10.128.5.53</host>
+ <host>10.254.1.203</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -102,7 +102,7 @@
</ONOS3>
<ONOS4>
- <host>10.128.5.54</host>
+ <host>10.254.1.204</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -112,7 +112,7 @@
<ONOS5>
- <host>10.128.5.65</host>
+ <host>10.254.1.205</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -121,7 +121,7 @@
</ONOS5>
<ONOS6>
- <host>10.128.5.66</host>
+ <host>10.254.1.206</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -130,7 +130,7 @@
</ONOS6>
<ONOS7>
- <host>10.128.5.67</host>
+ <host>10.254.1.207</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
diff --git a/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.params b/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.params
index 194a783..f01f017 100644
--- a/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.params
+++ b/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.params
@@ -1,5 +1,5 @@
<PARAMS>
- <testcases>1,2,3,4,2,3,4,2,3,4,2,3</testcases>
+ <testcases>1,2,4,2,4,2,4,2</testcases>
<ENV>
<cellName>intent_perf_test</cellName>
@@ -49,6 +49,7 @@
<numMult>1</numMult>
#Interface to bring down for intent reroute case
<intfs>s3-eth2</intfs>
+ <cellStr>webconsole,onos-core,onos-api,onos-app-metrics,onos-app-gui,onos-cli,onos-openflow</cellStr>
</TEST>
<DB>
diff --git a/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.py b/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.py
index 8f23b29..32477a6 100644
--- a/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.py
+++ b/TestON/tests/IntentPerfNextBM/IntentPerfNextBM.py
@@ -23,6 +23,7 @@
gitPull = main.params['GIT']['autoPull']
checkoutBranch = main.params['GIT']['checkout']
intentFilePath = main.params['DB']['intentFilePath']
+ cellStr = main.params[ 'TEST' ][ 'cellStr' ]
ONOSIp = []
for i in range(1, 8):
@@ -39,7 +40,8 @@
main.step('Starting mininet topology')
main.Mininet1.startNet()
main.step('Creating cell file')
- cellFileResult = main.TRUE
+ cellFileResult = main.ONOSbench.createCellFile(
+ BENCHIp, cellName, MN1Ip, cellStr, ONOSIp[0])
main.step('Applying cell file to environment')
cellApplyResult = main.ONOSbench.setCell(cellName)
verifyCellResult = main.ONOSbench.verifyCell()
@@ -151,7 +153,6 @@
time.sleep(20)
- batchResultList = []
deviceIdList = []
batchInstallLat = []
batchWithdrawLat = []
@@ -165,6 +166,9 @@
for device in jsonObj:
deviceIdList.append(device['id'])
+ if not jsonObj:
+ main.log.warn( "Devices not found, check topology" )
+
sleepTime = 10
baseDir = '/tmp/'
for batch in range(0, 5):
@@ -283,6 +287,7 @@
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')
@@ -293,6 +298,7 @@
str(avgWithdrawLat) + ' ms')
main.log.report('Std Deviation of batch withdraw latency ' +
': ' + str(round(numpy.std(maxWithdrawLat), 2)) + ' 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 ' +
@@ -302,6 +308,7 @@
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) + ',' +\
@@ -680,27 +687,28 @@
import time
import json
- cellName = main.params[ 'ENV' ][ 'cellName' ]
- features = main.params[ 'ENV' ][ 'cellFeatures' ]
- benchIp = main.params[ 'BENCH' ][ 'ip' ]
- mininetIp = main.params[ 'TEST' ][ 'MN' ]
-
clusterCount += 2
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ features = main.params[ 'TEST' ][ 'cellStr' ]
+ benchIp = main.params[ 'BENCH' ][ 'ip' ]
+ mininetIp = main.params[ 'MN' ][ 'ip1' ]
+
main.log.report('Increasing cluster size to ' + str(clusterCount))
ONOSIp = []
for i in range( 1, 8 ):
- ONOSIp.append( main.params[ 'CTRL' ][ 'ip'+str(i) ]
+ ONOSIp.append( main.params[ 'CTRL' ][ 'ip'+str(i) ] )
main.step( "Cleaning environment" )
- for i in range( 1, 8 ):
+ for i in range( 0, 7 ):
main.ONOSbench.onosDie( ONOSIp[i] )
- main.log.info( "Uninstalling ONOS "+str(i) )
+ main.log.info( "Uninstalling ONOS "+str(i+1) )
main.ONOSbench.onosUninstall( ONOSIp[i] )
main.step( "Creating new cell file" )
cellIp = []
- for node in range( 1, clusterCount + 1 )
+ for node in range( 1, clusterCount + 1 ):
cellIp.append( ONOSIp[node] )
main.ONOSbench.createCellFile( benchIp, cellName,
mininetIp, str(features), *cellIp )
@@ -712,12 +720,9 @@
main.ONOSbench.onosPackage()
for node in range( 1, clusterCount + 1 ):
- time.sleep(10)
- main.log.info( "Starting ONOS "+str(node) +
- " at IP: "+ONOSIp[node] )
- main.ONOSbench.onosInstall( ONOSIp[node] )
- exec "a = main.ONOS%scli.startOnosCli" %str(node)
- a( ONOSIp[node] )
+ main.ONOSbench.onosInstall( node = ONOSIp[node] )
+
+ time.sleep( 20 )
for node in range( 1, clusterCount + 1 ):
for i in range( 2 ):
@@ -729,6 +734,12 @@
if not isup:
main.log.info( "ONOS" + str(node) + " did not start")
+ for node in range( 1, clusterCount + 1 ):
+ exec "a = main.ONOS%scli.startOnosCli" %str(node)
+ a( ONOSIp[node] )
+
+ time.sleep(30)
+
utilities.assert_equals(expect=main.TRUE, actual=assertion,
onpass='Scale out to ' + str(clusterCount) + ' nodes successful',
onfail='Scale out to ' + str(clusterCount) + ' nodes failed')
diff --git a/TestON/tests/IntentReroute/IntentReroute.params b/TestON/tests/IntentReroute/IntentReroute.params
new file mode 100644
index 0000000..4139613
--- /dev/null
+++ b/TestON/tests/IntentReroute/IntentReroute.params
@@ -0,0 +1,78 @@
+<PARAMS>
+
+ <testcases>1,3,2,3,2,3,2,3</testcases>
+
+ <SCALE>2</SCALE>
+ <availableNodes>7</availableNodes>
+
+ <ENV>
+ <cellName>intentRerouteCell</cellName>
+ <cellFeatures>webconsole,onos-core,onos-api,onos-cli,onos-null,onos-gui,onos-rest,onos-app-metrics,onos-app-metrics-intent,onos-app-metrics-topology </cellFeatures>
+ <scale1switches>8,</scale1switches>
+ <scale3switches>2,3,3</scale3switches>
+ <scale5switches>2,3,1,1,1</scale5switches>
+ <scale7switches>1,1,2,1,1,1,1</scale7switches>
+
+ </ENV>
+
+ <TEST>
+ <skipCleanInstall>yes</skipCleanInstall>
+ <warmUp>4</warmUp>
+ <sampleSize>20</sampleSize>
+ <wait></wait>
+ <intents>1,100,1000,5000</intents> #list format, will be split on ','
+ <debug>True</debug>
+ </TEST>
+
+ <METRICS>
+ <Submitted>0</Submitted>
+ <Installed>1</Installed>
+ <Failed>0</Failed>
+ <Withdraw>0</Withdraw>
+ <Withdrawn>0</Withdrawn>
+ </METRICS>
+
+ <GIT>
+ <autopull>on</autopull>
+ <checkout>master</checkout>
+ </GIT>
+
+ <CTRL>
+ <USER>admin</USER>
+
+ <ip1>10.254.1.201</ip1>
+ <port1>6633</port1>
+
+ <ip2>10.254.1.202</ip2>
+ <port2>6633</port2>
+
+ <ip3>10.254.1.203</ip3>
+ <port3>6633</port3>
+
+ <ip4>10.254.1.204</ip4>
+ <port4>6633</port4>
+
+ <ip5>10.254.1.205</ip5>
+ <port5>6633</port5>
+
+ <ip6>10.254.1.206</ip6>
+ <port6>6633</port6>
+
+ <ip7>10.254.1.207</ip7>
+ <port7>6633</port7>
+
+ </CTRL>
+
+ <MN>
+ <ip1>10.254.1.200</ip1>
+ </MN>
+
+ <BENCH>
+ <user>admin</user>
+ <ip1>10.254.1.200</ip1>
+ </BENCH>
+
+ <JSON>
+ </JSON>
+
+</PARAMS>
diff --git a/TestON/tests/IntentReroute/IntentReroute.py b/TestON/tests/IntentReroute/IntentReroute.py
new file mode 100644
index 0000000..4a778f8
--- /dev/null
+++ b/TestON/tests/IntentReroute/IntentReroute.py
@@ -0,0 +1,468 @@
+# ScaleOutTemplate - IntentReroute
+#
+# CASE1 starts number of nodes specified in param file
+#
+# cameron@onlab.us
+
+import sys
+import os.path
+
+
+class IntentReroute:
+
+ def __init__( self ):
+ self.default = ''
+
+ def CASE1( self, main ): #This is the initialization case
+ #this case will clean up all nodes
+ import time #but only node 1 is started in this case
+ import os.path
+
+ global clusterCount #number of nodes running
+ global ONOSIp #list of ONOS IP addresses
+ clusterCount = 1
+ ONOSIp = [ 0 ]
+
+
+ #Load values from params file
+ checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
+ gitPull = main.params[ 'GIT' ][ 'autopull' ]
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ Features= main.params[ 'ENV' ][ 'cellFeatures' ]
+ BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
+ BENCHUser = main.params[ 'BENCH' ][ 'user' ]
+ MN1Ip = main.params[ 'MN' ][ 'ip1' ]
+ maxNodes = int(main.params[ 'availableNodes' ])
+ Features = main.params[ 'ENV' ][ 'cellFeatures' ]
+ skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
+ switchCount = (main.params[ 'ENV' ][ 'scale1switches' ]).split(",")
+ homeDir = os.path.expanduser('~')
+
+ #Populate ONOSIp with ips from params
+ for i in range(1, maxNodes + 1):
+ ipString = 'ip' + str(i)
+ ONOSIp.append(main.params[ 'CTRL' ][ ipString ])
+
+ tempIp = []
+ for node in range( 1, clusterCount + 1):
+ tempIp.append(ONOSIp[node])
+
+ #kill off all onos processes
+ main.log.step("Safety check, killing all ONOS processes")
+ main.log.step("before initiating enviornment setup")
+ for node in range(1, maxNodes + 1):
+ main.ONOSbench.onosDie(ONOSIp[node])
+
+ #construct the cell file
+ main.log.info("Creating cell file")
+ exec "a = main.ONOSbench.createCellFile"
+ cellIp = []
+ for node in range (1, clusterCount + 1):
+ cellIp.append(ONOSIp[node])
+ a(BENCHIp,cellName,MN1Ip,str(Features), *cellIp)
+
+ main.step( "Applying cell file to environment" )
+ cellApplyResult = main.ONOSbench.setCell( cellName )
+
+ #Uninstall everywhere
+ main.log.step( "Cleaning Enviornment..." )
+ for i in range(1, maxNodes + 1):
+ main.log.info(" Uninstalling ONOS " + str(i) )
+ main.ONOSbench.onosUninstall( ONOSIp[i] )
+
+ #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
+ if skipMvn != "yes":
+ mvnResult = main.ONOSbench.cleanInstall()
+
+ #git
+ main.step( "Git checkout and pull " + checkoutBranch )
+ if gitPull == 'on':
+ checkoutResult = main.ONOSbench.gitCheckout( checkoutBranch )
+ pullResult = main.ONOSbench.gitPull()
+
+ else:
+ checkoutResult = main.TRUE
+ pullResult = main.TRUE
+ main.log.info( "Skipped git checkout and pull" )
+
+ main.ONOSbench.handle.sendline("cp ~/ONLabTest/TestON/dependencies/IntentRerouteTest/oneNode7linear.cfg ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.expect(":~")
+ main.ONOSbench.handle.sendline("cp ~/ONLabTest/TestON/dependencies/IntentRerouteTest/oneNode7linearCut.cfg ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.expect(":~")
+
+ main.ONOSbench.createNullDevProviderFile(BENCHIp, tempIp, switchCount)
+ main.ONOSbench.createNullLinkProviderFile(BENCHIp, fileName=("/opt/onos/apache-karaf-3.0.2/etc/oneNode7linear.cfg"))
+
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Installing ONOS package" )
+ install1Result = main.ONOSbench.onosInstall( node=ONOSIp[1] )
+
+ main.step( "verify cells" )
+ verifyCellResult = main.ONOSbench.verifyCell()
+
+ main.step( "Set cell for ONOS cli env" )
+ cli1 = main.ONOS1cli.startOnosCli( ONOSIp[1] )
+
+
+ def CASE2( self, main ):
+ # This case increases the cluster size by whatever scale is
+ # Note: 'scale' is the size of the step
+ # if scaling is not a part of your test, simply run this case
+ # once after CASE1 to set up your enviornment for your desired
+ # cluster size. If scaling is a part of you test call this case each time
+ # you want to increase cluster size
+
+ ''
+ 'Increase number of nodes and initiate CLI'
+ ''
+ import time
+ global clusterCount
+
+ BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
+ scale = int( main.params[ 'SCALE' ] )
+ clusterCount += scale
+ homeDir = os.path.expanduser('~')
+ switchParams = ("scale" + str(clusterCount) + "switches")
+ switchCount = (main.params[ 'ENV' ][ switchParams ]).split(",")
+
+ if clusterCount == 1:
+ temp = "one"
+ if clusterCount == 3:
+ temp = "three"
+ if clusterCount == 5:
+ temp = "five"
+ if clusterCount == 7:
+ temp = "seven"
+
+ lgfile = temp + "Node7linear.cfg"
+ main.ONOSbench.handle.sendline("cp ~/ONLabTest/TestON/dependencies/IntentRerouteTest/" + lgfile + " ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.expect(":~")
+ main.ONOSbench.handle.sendline("cp ~/ONLabTest/TestON/dependencies/IntentRerouteTest/" + temp + "Node7linearCut.cfg" + " ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.expect(":~")
+
+ main.log.info("Creating cell file")
+ exec "a = main.ONOSbench.createCellFile"
+ cellIp = []
+ for node in range (1, clusterCount + 1):
+ cellIp.append(ONOSIp[node])
+ a(BENCHIp,cellName,MN1Ip,str(Features), *cellIp)
+
+ main.step( "Applying cell file to environment" )
+ cellApplyResult = main.ONOSbench.setCell( cellName )
+
+ #Uninstall everywhere
+ main.log.step( "Cleaning Enviornment..." )
+ for node in range(1, maxNodes + 1):
+ main.ONOSbench.onosDie(ONOSIp[node])
+ main.log.info(" Uninstalling ONOS " + str(node) )
+ main.ONOSbench.onosUninstall( ONOSIp[node] )
+
+ tempIp = []
+ for node in range( 1, clusterCount + 1):
+ tempIp.append(ONOSIp[node])
+
+ main.ONOSbench.createNullDevProviderFile(BENCHIp, tempIp, switchCount)
+ main.ONOSbench.createNullLinkProviderFile(BENCHIp, fileName=("/opt/onos/apache-karaf-3.0.2/etc/" + lgfile))
+
+ main.ONOSbench.onosPackage()
+
+
+ main.log.report( "Increasing cluster size to " + str( clusterCount ) )
+ for node in range(1, clusterCount + 1):
+ main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
+ main.ONOSbench.onosInstall( node=ONOSIp[node])
+ if node == 1:
+ main.ONOS1cli.startOnosCli( ONOSIp[1] )
+
+ for node in range(1, clusterCount + 1):
+ for i in range( 2 ):
+ isup = main.ONOSbench.isup( ONOSIp[node] )
+ if isup:
+ main.log.info("ONOS " + str(node) + " is up\n")
+ break
+ if not isup:
+ main.log.report( "ONOS " + str(node) + " didn't start!" )
+
+ def CASE3( self, main ):
+
+ import time
+ import numpy
+ import datetime
+ #from scipy import stats
+
+ ts = time.time()
+ date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
+
+ sampleSize = int(main.params[ 'TEST' ][ 'sampleSize' ])
+ warmUp = int(main.params[ 'TEST' ][ 'warmUp' ])
+ intentsList = (main.params[ 'TEST' ][ 'intents' ]).split(",")
+ debug = main.params[ 'TEST' ][ 'debug' ]
+ for i in range(0,len(intentsList)):
+ intentsList[i] = int(intentsList[i])
+
+ timestampMetrics = []
+ if main.params['METRICS']['Submitted'] == "1":
+ timestampMetrics.append("Submitted")
+ if main.params['METRICS']['Installed'] == "1":
+ timestampMetrics.append("Installed")
+ if main.params['METRICS']['Failed'] == "1":
+ timestampMetrics.append("Failed")
+ if main.params['METRICS']['Withdraw'] == "1":
+ timestampMetrics.append("Withdraw")
+ if main.params['METRICS']['Withdrawn'] == "1":
+ timestampMetrics.append("Withdrawn")
+ if debug: main.log.info(timestampMetrics)
+
+ if debug == "True":
+ debug = True
+ else:
+ debug = False
+
+ if clusterCount == 1:
+ temp = "one"
+ if clusterCount == 3:
+ temp = "three"
+ if clusterCount == 5:
+ temp = "five"
+ if clusterCount == 7:
+ temp = "seven"
+
+ lgfile = temp + "Node7linear.cfg"
+ lgfileCut = temp + "Node7linearCut.cfg"
+ linkCount = 0
+
+ for i in range(0,15):
+ main.ONOSbench.handle.sendline("onos $OC1 links|wc -l")
+ main.ONOSbench.handle.expect(":~")
+ linkCount = main.ONOSbench.handle.before
+ if debug: main.log.info("Link Count check: " + linkCount)
+ if str(16) in linkCount:
+ break
+ time.sleep(3)
+ main.log.info("waiting for links")
+
+ links = "--"
+ while "=null:" not in links:
+ if debug: main.log.info("top of loop")
+ main.ONOSbench.handle.sendline("onos $OC1 links")
+ main.ONOSbench.handle.expect(":~")
+ links = main.ONOSbench.handle.before
+ if debug: main.log.info(str(links))
+ time.sleep(1)
+ links = links.splitlines()
+ templinks = links
+
+ tempDevices = []
+ for line in links:
+ temp = line.split(" ")
+ temp[0].replace("src=","")
+ temp[0] = (temp[0].split("/"))[0]
+ tempDevices.append(temp[0])
+
+ tempDevices.sort()
+ devices = []
+ for i in tempDevices:
+ if "src=null" in i:
+ devices.append(i.replace("src=", ""))
+ if debug: main.log.info(str(devices))
+
+ ingress = devices[0]
+ egress = devices.pop()
+ if debug: main.log.info("ingress: " + ingress)
+ if debug: main.log.info("egress: " + egress)
+
+
+ for intents in intentsList:
+ main.log.report("Intent Batch size: " + str(intents) + "\n ")
+ myResult = [["latency", "lastNode"] for x in range(sampleSize)]
+
+ for run in range(0, (warmUp + sampleSize)):
+ if run > warmUp:
+ main.log.info("Starting test iteration " + str(run-warmUp))
+
+ cmd = """onos $OC1 "push-test-intents -i """
+ cmd += ingress + "/0 "
+ cmd += egress + "/0 "
+ cmd += str(intents) +""" 1" """
+ if debug: main.log.info(cmd)
+
+ withdrawCmd = cmd.replace("intents -i", "intents -w ")
+
+ #push-test-intents
+ main.ONOSbench.handle.sendline(cmd)
+ main.ONOSbench.handle.expect(":~")
+ myRawResult = main.ONOSbench.handle.before
+
+ for i in range(0, 40):
+ main.ONOSbench.handle.sendline("onos $OC1 summary")
+ main.ONOSbench.handle.expect(":~")
+ linkCheck = main.ONOSbench.handle.before
+ if ("flows=" + str(8*intents) + ",") in linkCheck:
+ break
+ if i == 39:
+ main.log.error("Flow count incorrect, data invalid.")
+
+ #cut link
+ nodesLinksCut = []
+ if clusterCount == 1:
+ nodesLinksCut.append(1)
+ if clusterCount == 3 or clusterCount == 5:
+ nodesLinksCut.append(2)
+ if clusterCount == 7:
+ nodesLinksCut.append(3)
+ nodesLinksCut.append(4)
+
+ for node in nodesLinksCut:
+ exec "a = main.ONOS%s.createNullLinkProviderFile" %str(node)
+ a(ONOSIp[node], fileName=("/opt/onos/apache-karaf-3.0.2/etc/" + lgfileCut), onNode=True)
+
+ #collect timestamp from link cut
+ cmd = "onos-ssh $OC" + str(nodesLinksCut[len(nodesLinksCut)-1]) + " cat /opt/onos/log/karaf.log | grep " + lgfileCut + "| tail -1"
+ if debug: main.log.info("COMMAND: " + str(cmd))
+
+ for i in range(0,10):
+ main.ONOSbench.handle.sendline(cmd)
+ main.ONOSbench.handle.expect(":~")
+ raw = main.ONOSbench.handle.before
+ if "NullLinkProvider" in raw:
+ break
+ if i >= 9:
+ main.log.error("Expected output not being recieved... continuing")
+ main.log.info(raw)
+ break
+ time.sleep(2)
+
+ temp = raw.splitlines()
+ for line in temp:
+ if str(date) in line:
+ temp = line
+ break
+
+ cutTimestamp = (temp.split(" "))[0] + " " + (temp.split(" "))[1]
+
+ #validate link count and flow count
+ for i in range(0, 40):
+ main.ONOSbench.handle.sendline("onos $OC1 summary")
+ main.ONOSbench.handle.expect(":~")
+ linkCheck = main.ONOSbench.handle.before
+ if "links=14," in linkCheck and ("flows=" + str(7*intents) + ",") in linkCheck:
+ break
+ if i == 39:
+ main.log.error("Link or flow count incorrect, data invalid.")
+
+ #intents events metrics installed timestamp
+ IEMtimestamps = [0]*(clusterCount + 1)
+ installedTemp = [0]*(clusterCount + 1)
+ for node in range(1, clusterCount +1):
+ cmd = "onos $OC" + str(node) + " intents-events-metrics|grep Timestamp"
+ raw = ""
+ while "Timestamp" not in raw:
+ main.ONOSbench.handle.sendline(cmd)
+ main.ONOSbench.handle.expect(":~")
+ raw = main.ONOSbench.handle.before
+
+ intentsTimestamps = {}
+ rawTimestamps = raw.splitlines()
+ for line in rawTimestamps:
+ if "Timestamp" in line and "grep" not in line:
+ metricKey = (line.split(" "))[1]
+ metricTimestamp = (line.split(" ")[len(line.split(" ")) -1]).replace("epoch)=","")
+ metricTimestamp = float(metricTimestamp)
+ metricTimestamp = numpy.divide(metricTimestamp, 1000)
+ if debug: main.log.info(repr(metricTimestamp))
+ intentsTimestamps[metricKey] = metricTimestamp
+ if metricKey == "Installed":
+ installedTemp[node] = metricTimestamp
+
+ main.log.info("Node: " + str(node) + " Timestamps: " + str(intentsTimestamps))
+ IEMtimestamps[node] = intentsTimestamps
+
+ myMax = max(installedTemp)
+ indexOfMax = installedTemp.index(myMax)
+
+ #number crunch
+ for metric in timestampMetrics: #this is where we sould add support for computing other timestamp metrics
+ if metric == "Installed":
+ if run >= warmUp:
+ main.log.report("link cut timestamp: " + cutTimestamp)
+ #readableInstalledTimestamp = str(intentsTimestamps["Installed"])
+ readableInstalledTimestamp = str(myMax)
+
+ #main.log.report("Intent Installed timestamp: " + str(intentsTimestamps["Installed"]))
+ main.log.report("Intent Installed timestamp: " + str(myMax))
+
+ cutEpoch = time.mktime(time.strptime(cutTimestamp, "%Y-%m-%d %H:%M:%S,%f"))
+ if debug: main.log.info("cutEpoch=" + str(cutEpoch))
+ #rerouteLatency = float(intentsTimestamps["Installed"] - cutEpoch)
+ rerouteLatency = float(myMax - cutEpoch)
+
+ rerouteLatency = numpy.divide(rerouteLatency, 1000)
+ main.log.report("Reroute latency:" + str(rerouteLatency) + " (seconds)\n ")
+ myResult[run-warmUp][0] = rerouteLatency
+ myResult[run-warmUp][1] = indexOfMax
+ if debug: main.log.info("Latency: " + str(myResult[run-warmUp][0]))
+ if debug: main.log.info("last node: " + str(myResult[run-warmUp][1]))
+
+ #time.sleep(12)
+
+ #reset
+ for node in nodesLinksCut:
+ exec "a = main.ONOS%s.createNullLinkProviderFile" %str(node)
+ a(ONOSIp[node], fileName=("/opt/onos/apache-karaf-3.0.2/etc/" + lgfile), onNode=True)
+
+ #wait for intent withdraw
+ if debug: main.log.info(withdrawCmd)
+ main.ONOSbench.handle.sendline(withdrawCmd)
+ main.ONOSbench.handle.expect(":~")
+ main.ONOSbench.handle.sendline("onos $OC1 intents|grep WITHDRAWN|wc -l")
+ main.ONOSbench.handle.expect(":~")
+ intentWithdrawCheck = main.ONOSbench.handle.before
+ if (str(intents)) in intentWithdrawCheck:
+ main.log.info("intents withdrawn")
+ if debug: main.log.info(intentWithdrawCheck)
+
+ # wait for links to be reestablished
+ for i in range(0, 10):
+ main.ONOSbench.handle.sendline("onos $OC1 summary")
+ main.ONOSbench.handle.expect(":~")
+ linkCheck = main.ONOSbench.handle.before
+ if "links=16," in linkCheck:
+ break
+ time.sleep(1)
+ if i == 9:
+ main.log.info("Links Failed to reconnect, next iteration of data invalid.")
+
+ if run < warmUp:
+ main.log.info("Warm up run " + str(run+1) + " completed")
+
+ if debug: main.log.info(myResult)
+ latTemp = []
+ nodeTemp = []
+ for i in myResult:
+ latTemp.append(i[0])
+ nodeTemp.append(i[1])
+
+ mode = {}
+ for i in nodeTemp:
+ if i in mode:
+ mode[i] += 1
+ else:
+ mode[i] = 1
+
+ for i in mode.keys():
+ if mode[i] == max(mode.values()):
+ nodeMode = i
+
+ average = numpy.average(latTemp)
+ stdDev = numpy.std(latTemp)
+
+ main.log.report("Scale: " + str(clusterCount) + " \tIntent batch: " + str(intents))
+ main.log.report("Latency average:................" + str(average))
+ main.log.report("Latency standard deviation:....." + str(stdDev))
+ main.log.report("Mode of last node to respond:..." + str(nodeMode))
+ main.log.report("________________________________________________________")
+
+
+
diff --git a/TestON/tests/IntentReroute/IntentReroute.topo b/TestON/tests/IntentReroute/IntentReroute.topo
new file mode 100644
index 0000000..0e45e0f
--- /dev/null
+++ b/TestON/tests/IntentReroute/IntentReroute.topo
@@ -0,0 +1,146 @@
+<TOPOLOGY>
+
+ <COMPONENT>
+
+ <ONOSbench>
+ <host>10.254.1.200</host>
+ <user>admin</user>
+ <password>onos_test</password>
+ <type>OnosDriver</type>
+ <connect_order>1</connect_order>
+ <COMPONENTS><home>~/onos</home></COMPONENTS>
+ </ONOSbench>
+
+ <ONOS1cli>
+ <host>10.254.1.200</host>
+ <user>admin</user>
+ <password>onos_test</password>
+ <type>OnosCliDriver</type>
+ <connect_order>2</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS1cli>
+
+ <ONOS2cli>
+ <host>10.254.1.200</host>
+ <user>admin</user>
+ <password>onos_test</password>
+ <type>OnosCliDriver</type>
+ <connect_order>3</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS2cli>
+
+ <ONOS3cli>
+ <host>10.254.1.200</host>
+ <user>admin</user>
+ <password>onos_test</password>
+ <type>OnosCliDriver</type>
+ <connect_order>4</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS3cli>
+
+ <ONOS4cli>
+ <host>10.254.1.200</host>
+ <user>admin</user>
+ <password>onos_test</password>
+ <type>OnosCliDriver</type>
+ <connect_order>5</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS4cli>
+
+ <ONOS5cli>
+ <host>10.254.1.200</host>
+ <user>admin</user>
+ <password>onos_test</password>
+ <type>OnosCliDriver</type>
+ <connect_order>6</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS5cli>
+
+ <ONOS6cli>
+ <host>10.254.1.200</host>
+ <user>admin</user>
+ <password>onos_test</password>
+ <type>OnosCliDriver</type>
+ <connect_order>7</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS6cli>
+
+ <ONOS7cli>
+ <host>10.254.1.200</host>
+ <user>admin</user>
+ <password>onos_test</password>
+ <type>OnosCliDriver</type>
+ <connect_order>8</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS7cli>
+
+ <ONOS1>
+ <host>10.254.1.201</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosDriver</type>
+ <connect_order>9</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS1>
+
+ <ONOS2>
+ <host>10.254.1.202</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosDriver</type>
+ <connect_order>10</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS2>
+
+ <ONOS3>
+ <host>10.254.1.203</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosDriver</type>
+ <connect_order>11</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS3>
+
+ <ONOS4>
+ <host>10.254.1.204</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosDriver</type>
+ <connect_order>12</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS4>
+
+
+ <ONOS5>
+ <host>10.254.1.205</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosDriver</type>
+ <connect_order>13</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS5>
+
+ <ONOS6>
+ <host>10.254.1.206</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosDriver</type>
+ <connect_order>14</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS6>
+
+ <ONOS7>
+ <host>10.254.1.207</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosDriver</type>
+ <connect_order>15</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOS7>
+
+ </COMPONENT>
+
+</TOPOLOGY>
+
+
+
diff --git a/TestON/tests/IntentReroute/__init__.py b/TestON/tests/IntentReroute/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/IntentReroute/__init__.py
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.params b/TestON/tests/LinkEventTP/LinkEventTP.params
index b4d50e5..7a47a51 100644
--- a/TestON/tests/LinkEventTP/LinkEventTP.params
+++ b/TestON/tests/LinkEventTP/LinkEventTP.params
@@ -1,10 +1,14 @@
<PARAMS>
- <testcases>1,3,2,3,2,3,2,3</testcases>
+ <testcases>1,2,3</testcases>
+
<ENV>
- <cellName>network_tp_test</cellName>
- <cellFeatures>"webconsole,onos-core,onos-api,onos-cli,onos-null,onos-rest,onos-app-metrics,onos-app-metrics-intent,onos-app-metrics-topology"</cellFeatures>
+ <cellName>network_tp_test</cellName>
+ <cellFeatures>"webconsole,onos-core,onos-api,onos-cli,onos-null,onos-rest,onos-app-metrics,onos-app-metrics-intent,onos-app-metrics-topology"</cellFeatures>
+ <onBaremetal>true</onBaremetal> "true"
</ENV>
- <SCALE>2</SCALE>
+
+ <SCALE>6</SCALE>
+
<availableNodes>7</availableNodes>
<GIT>
@@ -26,7 +30,7 @@
<port5>6633</port5>
<ip6>10.254.1.206</ip6>
<port6>6633</port6>
- <ip7>10.254.1.207</ip7>
+ <ip7>10.254.1.207</ip7>
<port7>6633</port7>
</CTRL>
@@ -38,21 +42,21 @@
<TEST> # duration = time the test loop runs
# log_interval = how often the data is reported
# wait = time between tests, used to let the averages run down
-
- <flickerRates>1000,0,0,0,0,0,0</flickerRates>
- <devicesPerNode>20,0,0,0,0,0,0</devicesPerNode>
+ <configFile>/onos/tools/package/etc/org.onosproject.net.topology.impl.DefaultTopologyProvider.cfg</configFile>
+ <flickerRates>20000,20000,20000,20000,20000,20000,20000</flickerRates>
+ <devicesPerNode>40,40,40,40,40,40,40</devicesPerNode>
<flickerRate>1000</flickerRate>
<linkgraphdif>.03</linkgraphdif> # 0-1 indicated link/graph rate dif tolerance
- <duration>120</duration>
+ <duration>1800</duration>
<log_interval>15</log_interval>
<wait>60</wait>
<skipCleanInstall>yes</skipCleanInstall>
<MN>localhost</MN>
- <logFile>link_event_tp_results_LOG</logFile>
+ <logFile>link_event_tp_results_LOG</logFile>
</TEST>
<JSON>
<intents_rate>intentInstalledRate</intents_rate>
- </JSON>
+ </JSON>
</PARAMS>
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.py b/TestON/tests/LinkEventTP/LinkEventTP.py
index e7d2133..a4bc0aa 100644
--- a/TestON/tests/LinkEventTP/LinkEventTP.py
+++ b/TestON/tests/LinkEventTP/LinkEventTP.py
@@ -36,9 +36,12 @@
flickerRate = main.params[ 'TEST' ][ 'flickerRate']
deviceDistribution = (main.params[ 'TEST' ][ 'devicesPerNode']).split(",")
MNip = main.params[ 'TEST' ][ 'MN' ]
-
+ logFileName = main.params[ 'TEST' ][ 'logFile' ]
+ onBaremetal = main.params[ 'ENV' ][ 'onBaremetal' ]
+
main.ONOSbench.handle.sendline("export TERM=vt100")
main.ONOSbench.handle.expect(":~")
+ homeDir = os.path.expanduser('~')
#Populate ONOSIp with ips from params
for i in range(1, maxNodes + 1):
@@ -90,34 +93,6 @@
if skipMvn != "yes":
mvnResult = main.ONOSbench.cleanInstall()
- #configuring file to enable flicker
- main.log.step(" Configuring null provider to enable flicker. Flicker Rate = " + flickerRate )
- homeDir = os.path.expanduser('~')
- main.log.info(homeDir)
- localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.link.impl.NullLinkProvider.cfg"
- filePath = homeDir + localPath
- main.log.info(filePath)
-
- neighborsString = ""
- for node in range(1, maxNodes + 1):
- neighborsString += ONOSIp[node]
- if node < maxNodes:
- neighborsString += ","
-
- configFile = open(filePath, 'w+')
- main.log.info("File opened")
- configFile.write("# Sample configurations for the NullLinkProvider.\n")
- configFile.write("# \n")
- configFile.write("# If enabled, sets time between linkEvent generation\n")
- configFile.write("# in milliseconds.\n")
- configFile.write("#\n")
- configFile.write("eventRate = " + flickerRate)
- configFile.write("\n")
- configFile.write("#Set order of islands to chain together, in a line.\n")
- configFile.write("neighbors = " + neighborsString)
- configFile.close()
- main.log.info("Configuration completed")
-
### configure event rate file ###
main.log.step("Writing Default Topology Provider config file")
localPath = main.params[ 'TEST' ][ 'configFile' ]
@@ -129,29 +104,28 @@
configFile.write("maxIdleMs = 0\n")
configFile.write("maxBatchMs = 0\n")
main.log.info("File written and closed")
-
-
- devices_by_ip = ""
- for node in range(1, maxNodes + 1):
- devices_by_ip += (ONOSIp[node] + ":" + str(5))
- if node < maxNodes:
- devices_by_ip +=(",")
-
- main.log.step("Configuring device provider")
- localPath = "/onos/tools/package/etc/org.onosproject.provider.nil.device.impl.NullDeviceProvider.cfg"
- filePath = homeDir + localPath
- main.log.info(filePath)
- configFile = open(filePath, 'w+')
- main.log.info("Device config file opened")
- configFile.write("devConfigs = " + devices_by_ip)
configFile.close()
- main.log.info("File closed")
- logFileName = main.params[ 'TEST' ][ 'logFile' ]
logFile = open(logFileName, 'w+')
main.log.info("Created log File")
logFile.close()
+ if onBaremetal == "true":
+ filename = "/onos/tools/package/bin/onos-service"
+ serviceConfig = open(homeDir + filename, 'w+')
+ serviceConfig.write("#!/bin/bash\n ")
+ serviceConfig.write("#------------------------------------- \n ")
+ serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
+ serviceConfig.write("#------------------------------------- \n ")
+ serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
+ serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms256m -Xmx8G}" \n """)
+ serviceConfig.write("")
+ serviceConfig.write("ONOS_HOME=/opt/onos \n ")
+ serviceConfig.write("")
+ serviceConfig.write("[ -d $ONOS_HOME ] && cd $ONOS_HOME || ONOS_HOME=$(dirname $0)/..\n")
+ serviceConfig.write("""${ONOS_HOME}/apache-karaf-$KARAF_VERSION/bin/karaf "$@" \n """)
+ serviceConfig.close()
+
main.step( "Creating ONOS package" )
packageResult = main.ONOSbench.onosPackage()
@@ -212,11 +186,14 @@
main.step( "Set Cell" )
main.ONOSbench.setCell(cellName)
+ main.step( "Packaging" )
+ main.ONOSbench.onosPackage()
+
main.log.report( "Increasing cluster size to " + str( clusterCount ) )
for node in range(1, clusterCount + 1):
time.sleep(10)
main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
- main.ONOSbench.onosInstall( ONOSIp[node] )
+ main.ONOSbench.onosInstall( node=ONOSIp[node] )
exec "a = main.ONOS%scli.startOnosCli" %str(node)
a(ONOSIp[node])
@@ -245,8 +222,7 @@
linkResult = main.FALSE
scale = int( main.params[ 'SCALE' ] )
- testDelay = main.params[ 'TEST' ][ 'wait']
- time.sleep( float( testDelay ) )
+ testDelay = main.params[ 'TEST' ][ 'wait' ]
for node in range(1, clusterCount + 1):
main.log.info("Writing flicker file to node " + str(node))
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.pyc b/TestON/tests/LinkEventTP/LinkEventTP.pyc
index 08393ed..644df6d 100644
--- a/TestON/tests/LinkEventTP/LinkEventTP.pyc
+++ b/TestON/tests/LinkEventTP/LinkEventTP.pyc
Binary files differ
diff --git a/TestON/tests/LinkEventTP/LinkEventTP.topo b/TestON/tests/LinkEventTP/LinkEventTP.topo
index cf5fc94..3c24161 100644
--- a/TestON/tests/LinkEventTP/LinkEventTP.topo
+++ b/TestON/tests/LinkEventTP/LinkEventTP.topo
@@ -3,7 +3,7 @@
<COMPONENT>
<ONOSbench>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosDriver</type>
@@ -15,7 +15,7 @@
</ONOSbench>
<ONOS1cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -24,7 +24,7 @@
</ONOS1cli>
<ONOS2cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -33,7 +33,7 @@
</ONOS2cli>
<ONOS3cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -42,7 +42,7 @@
</ONOS3cli>
<ONOS4cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -51,7 +51,7 @@
</ONOS4cli>
<ONOS5cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -60,7 +60,7 @@
</ONOS5cli>
<ONOS6cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -69,7 +69,7 @@
</ONOS6cli>
<ONOS7cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -78,7 +78,7 @@
</ONOS7cli>
<ONOS1>
- <host>10.128.5.51</host>
+ <host>10.254.1.201</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -87,7 +87,7 @@
</ONOS1>
<ONOS2>
- <host>10.128.5.52</host>
+ <host>10.254.1.202</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -96,7 +96,7 @@
</ONOS2>
<ONOS3>
- <host>10.128.5.53</host>
+ <host>10.254.1.203</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -105,7 +105,7 @@
</ONOS3>
<ONOS4>
- <host>10.128.5.54</host>
+ <host>10.254.1.204</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -115,7 +115,7 @@
<ONOS5>
- <host>10.128.5.65</host>
+ <host>10.254.1.205</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -124,7 +124,7 @@
</ONOS5>
<ONOS6>
- <host>10.128.5.66</host>
+ <host>10.254.1.206</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -133,7 +133,7 @@
</ONOS6>
<ONOS7>
- <host>10.128.5.67</host>
+ <host>10.254.1.207</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
diff --git a/TestON/tests/LinkEventTP/__init__.pyc b/TestON/tests/LinkEventTP/__init__.pyc
index 5415a7b..62abfab 100644
--- a/TestON/tests/LinkEventTP/__init__.pyc
+++ b/TestON/tests/LinkEventTP/__init__.pyc
Binary files differ
diff --git a/TestON/tests/MultiProd/MultiProd.params b/TestON/tests/MultiProd/MultiProd.params
index 6e5c85e..4818d09 100755
--- a/TestON/tests/MultiProd/MultiProd.params
+++ b/TestON/tests/MultiProd/MultiProd.params
@@ -1,7 +1,6 @@
<PARAMS>
- <testcases>1,4,10,5,6,7,8,6,8,9,8,31,32,8,33,8</testcases>
-
+ <testcases>1,4,10,5,6,7,8,6,8,9,8,31,32,8,33,8</testcases>
#Environment variables
<ENV>
<cellName>multi_test</cellName>
diff --git a/TestON/tests/MultiProd/MultiProd.py b/TestON/tests/MultiProd/MultiProd.py
index e5abfab..eca4da5 100644
--- a/TestON/tests/MultiProd/MultiProd.py
+++ b/TestON/tests/MultiProd/MultiProd.py
@@ -637,10 +637,8 @@
main.step( "Determine the current number of switches and links" )
topologyOutput = main.ONOScli1.topology()
topologyResult = main.ONOSbench.getTopology( topologyOutput )
- activeSwitches = topologyResult[ 'devicesCount' ]
+ activeSwitches = topologyResult[ 'deviceCount' ]
links = topologyResult[ 'linkCount' ]
- print "activeSwitches = ", type( activeSwitches )
- print "links = ", type( links )
main.log.info(
"Currently there are %s switches and %s links" %
( str( activeSwitches ), str( links ) ) )
@@ -1535,39 +1533,54 @@
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(
- ingressDevice1=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
- ingressDevice2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
+ 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(
- ingressDevice1=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
- ingressDevice2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
+ ingressDeviceList,
egressDevice=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
ipDst=main.params[ 'MULTIPOINT_INTENT' ][ 'ip2' ],
setEthDst=main.params[ 'MULTIPOINT_INTENT' ][ 'mac2' ] )
- getIntentResult = main.ONOScli1.intents( jsonFormat=False )
- main.log.info( "intents = " + getIntentResult )
+ 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 )
+ time.sleep( 10 )
+ getFlowsResult = main.ONOScli1.flows( jsonFormat=False )
+ main.log.info( "flows = " + getFlowsResult )
- count = 1
- i = 8
- PingResult = main.TRUE
+ count = 1
+ i = 8
+ PingResult = main.TRUE
- main.log.info( "\n\nh" + str( i ) + " is Pinging h" + str( i + 2 ) )
- ping = main.Mininet1.pingHost(
+ 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" +
+ if ping == main.FALSE and count < 3:
+ count += 1
+ PingResult = main.FALSE
+ main.log.report( "Ping between h" +
str( i ) +
" and h" +
str( i +
@@ -1575,43 +1588,38 @@
" failed. Making attempt number " +
str( count ) +
" in 2 seconds" )
- time.sleep( 2 )
- elif ping == main.FALSE:
- main.log.report( "All ping attempts between h" +
+ 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" +
+ 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
+ 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 PingResult == main.FALSE:
+ main.log.report( "Ping test failed." )
+ # main.cleanup()
+ # main.exit()
+ if PingResult == main.TRUE:
+ main.log.report( "Ping all successful" )
- pIntentResult = pIntentResult1 and pIntentResult2
if pIntentResult == main.TRUE:
main.log.info(
"Multi point intent with rewrite mac " +
- "address installation successful" )
- else:
- main.log.info(
- "Multi point intent with rewrite mac" +
- " address installation failed" )
+ "address installation and ping successful" )
case33Result = pIntentResult and PingResult
utilities.assertEquals(
diff --git a/TestON/tests/MultiProd13/MultiProd13.py b/TestON/tests/MultiProd13/MultiProd13.py
index c68640e..6c0b8d7 100644
--- a/TestON/tests/MultiProd13/MultiProd13.py
+++ b/TestON/tests/MultiProd13/MultiProd13.py
@@ -637,10 +637,8 @@
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' ]
- print "activeSwitches = ", type( activeSwitches )
- print "links = ", type( links )
+ activeSwitches = topologyResult[ 'deviceCount' ]
+ links = topologyResult[ 'linkCount' ]
main.log.info(
"Currently there are %s switches and %s links" %
( str( activeSwitches ), str( links ) ) )
@@ -1535,39 +1533,54 @@
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(
- ingressDevice1=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
- ingressDevice2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
+ 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(
- ingressDevice1=main.params[ 'MULTIPOINT_INTENT' ][ 'device3' ],
- ingressDevice2=main.params[ 'MULTIPOINT_INTENT' ][ 'device2' ],
+ ingressDeviceList,
egressDevice=main.params[ 'MULTIPOINT_INTENT' ][ 'device1' ],
ipDst=main.params[ 'MULTIPOINT_INTENT' ][ 'ip2' ],
setEthDst=main.params[ 'MULTIPOINT_INTENT' ][ 'mac2' ] )
- getIntentResult = main.ONOScli1.intents( jsonFormat=False )
- main.log.info( "intents = " + getIntentResult )
+ 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 )
+ time.sleep( 10 )
+ getFlowsResult = main.ONOScli1.flows( jsonFormat=False )
+ main.log.info( "flows = " + getFlowsResult )
- count = 1
- i = 8
- PingResult = main.TRUE
+ count = 1
+ i = 8
+ PingResult = main.TRUE
- main.log.info( "\n\nh" + str( i ) + " is Pinging h" + str( i + 2 ) )
- ping = main.Mininet1.pingHost(
+ 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" +
+ if ping == main.FALSE and count < 3:
+ count += 1
+ PingResult = main.FALSE
+ main.log.report( "Ping between h" +
str( i ) +
" and h" +
str( i +
@@ -1575,43 +1588,38 @@
" failed. Making attempt number " +
str( count ) +
" in 2 seconds" )
- time.sleep( 2 )
- elif ping == main.FALSE:
- main.log.report( "All ping attempts between h" +
+ 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" +
+ 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
+ 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 PingResult == main.FALSE:
+ main.log.report( "Ping test failed." )
+ # main.cleanup()
+ # main.exit()
+ if PingResult == main.TRUE:
+ main.log.report( "Ping all successful" )
- pIntentResult = pIntentResult1 and pIntentResult2
if pIntentResult == main.TRUE:
main.log.info(
"Multi point intent with rewrite mac " +
- "address installation successful" )
- else:
- main.log.info(
- "Multi point intent with rewrite mac" +
- " address installation failed" )
+ "address installation and ping successful" )
case33Result = pIntentResult and PingResult
utilities.assertEquals(
diff --git a/TestON/tests/PeeringRouterTest/PeeringRouterTest.params b/TestON/tests/PeeringRouterTest/PeeringRouterTest.params
new file mode 100755
index 0000000..0c4af63
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/PeeringRouterTest.params
@@ -0,0 +1,26 @@
+<PARAMS>
+
+ <testcases>5,7,8,9,31,32</testcases>
+
+ #Environment variables
+ <ENV>
+ <cellName>sdnip_single_instance</cellName>
+ <home>/home/admin/ONLabTest/TestON/tests/PeeringRouterTest</home>
+ </ENV>
+
+ <CTRL>
+ <ip1>127.0.0.1</ip1>
+ <port1>6633</port1>
+ </CTRL>
+
+ <GIT>
+ <autoPull>off</autoPull>
+ <checkout>master</checkout>
+ </GIT>
+
+ <JSON>
+ <prefix>prefix</prefix>
+ <nextHop>nextHop</nextHop>
+ </JSON>
+
+</PARAMS>
diff --git a/TestON/tests/PeeringRouterTest/PeeringRouterTest.py b/TestON/tests/PeeringRouterTest/PeeringRouterTest.py
new file mode 100755
index 0000000..fec9365
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/PeeringRouterTest.py
@@ -0,0 +1,2537 @@
+# from cupshelpers.config import prefix
+
+# Testing the basic functionality of SDN-IP
+
+class PeeringRouterTest:
+
+ def __init__( self ):
+ self.default = ''
+
+
+ def CASE6 ( self, main):
+
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+ TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/vlan/mininet"
+ # Launch mininet topology for this case
+ MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouterMininetVlan.py"
+ main.step( "Launch mininet" )
+ main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+ main.step("waiting 20 secs for all switches and quagga instances to comeup")
+ time.sleep(20)
+ main.step( "Test whether Mininet is started" )
+
+ #============================= Ping Test ========================
+ main.log.info("Start ping test")
+
+ for m in range( 3, 6 ):
+ for n in range( 1, 11 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ pingTestResults = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+
+ def CASE4( self, main):
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+ TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/mininet"
+ SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/sdnip.json"
+ main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
+
+ # Copy the json files to config dir
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/addresses.json ~/onos/tools/package/config/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/sdnip.json ~/onos/tools/package/config/")
+
+ # Launch mininet topology for this case
+ MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouterMininet.py"
+ main.step( "Launch mininet" )
+ main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+ main.step("waiting 20 secs for all switches and quagga instances to comeup")
+ time.sleep(20)
+ main.step( "Test whether Mininet is started" )
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+
+ main.log.info( "Generate prefixes for host3" )
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host5" )
+ prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
+ main.log.info( prefixesHost5 )
+ for prefix in prefixesHost5:
+ allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ routeIntentsExpectedHost5 = \
+ main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+ prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4 + routeIntentsExpectedHost5
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+
+ main.ONOScli.startOnosCli( ONOS1Ip )
+
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing bgprouter feature" )
+ main.ONOScli.featureInstall( "onos-app-bgprouter" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+ main.log.info( "Login Quagga CLI on host5" )
+ main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+ main.log.info( "Enter configuration model of Quagga CLI on host5" )
+ main.QuaggaCliHost5.enterConfig( 64521 )
+ main.log.info( "Add routes to Quagga on host5" )
+ main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+ time.sleep( 30 )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllPass( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ #============================= Deleting Routes ==================
+ main.step( "Check deleting routes installed" )
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+ main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
+
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ main.log.info( "allRoutes_actual = " )
+ main.log.info( allRoutesActual )
+
+ utilities.assertEquals(
+ expect="[]", actual=str( allRoutesActual ),
+ onpass="***Route number in SDN-IP is 0, correct!***",
+ onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report( "***Routes in SDN-IP after deleting correct!***" )
+ else:
+ main.log.report( "***Routes in SDN-IP after deleting wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllFail( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="disconnect check PASS",
+ onfail="disconnect check FAIL")
+
+ main.ONOScli.logout()
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.Mininet.stopNet()
+ time.sleep(10)
+
+ def CASE5( self, main ):
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+ TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/vlan/mininet"
+ SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/vlan/sdnip.json"
+ main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
+
+ # Copy the json files to config dir
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/addresses.json ~/onos/tools/package/config/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/sdnip.json ~/onos/tools/package/config/")
+
+ # Launch mininet topology for this case
+ MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouterMininetVlan.py"
+ main.step( "Launch mininet" )
+ main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+ main.step("waiting 20 secs for all switches and quagga instances to comeup")
+ time.sleep(20)
+ main.step( "Test whether Mininet is started" )
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+
+ main.log.info( "Generate prefixes for host3" )
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host5" )
+ prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
+ main.log.info( prefixesHost5 )
+ for prefix in prefixesHost5:
+ allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ routeIntentsExpectedHost5 = \
+ main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+ prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4 + routeIntentsExpectedHost5
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ # Copy the cfg files to config dir
+ main.log.info("Copying two cfg files to onos etc folder")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+
+ main.ONOScli.startOnosCli( ONOS1Ip )
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing bgprouter feature" )
+ main.ONOScli.featureInstall( "onos-app-bgprouter" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+ main.log.info( "Login Quagga CLI on host5" )
+ main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+ main.log.info( "Enter configuration model of Quagga CLI on host5" )
+ main.QuaggaCliHost5.enterConfig( 64521 )
+ main.log.info( "Add routes to Quagga on host5" )
+ main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+ time.sleep( 30 )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ time.sleep(20)
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ sources = ["as2host", "as3host", "as6host"]
+ targets = ["192.168.10.101", "192.168.20.101", "192.168.30.101", "192.168.60.101"]
+ for source in sources:
+ for target in targets:
+ r = main.Mininet.pingHost(SRC=source, TARGET=target)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Router connectivity check PASS",
+ onfail="Router connectivity check FAIL")
+
+ pingTestResults = main.TRUE
+ for m in range( 3, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ time.sleep(20)
+ #============================= Deleting Routes ==================
+ main.step( "Check deleting routes installed" )
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+ main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
+
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ main.log.info( "allRoutes_actual = " )
+ main.log.info( allRoutesActual )
+
+ utilities.assertEquals(
+ expect="[]", actual=str( allRoutesActual ),
+ onpass="***Route number in SDN-IP is 0, correct!***",
+ onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report( "***Routes in SDN-IP after deleting correct!***" )
+ else:
+ main.log.report( "***Routes in SDN-IP after deleting wrong!***" )
+
+ time.sleep(10)
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ for m in range( 4, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.TRUE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="disconnect check PASS",
+ onfail="disconnect check FAIL")
+
+
+ time.sleep(20);
+
+ main.ONOScli.logout()
+ main.log.info("ONOS cli logout")
+ time.sleep(20);
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.log.info("onos stop")
+ time.sleep(20);
+ main.Mininet.stopNet()
+ main.log.info("mininet stop")
+ time.sleep(20)
+
+
+ def CASE7( self, main ):
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+ TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/vlan/mininet"
+ SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/vlan/sdnip.json"
+ main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
+
+ # Copy the json files to config dir
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/addresses.json ~/onos/tools/package/config/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/sdnip.json ~/onos/tools/package/config/")
+
+ # Launch mininet topology for this case
+ MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouterMininetVlan.py"
+ main.step( "Launch mininet" )
+ main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+ main.step("waiting 20 secs for all switches and quagga instances to comeup")
+ time.sleep(20)
+ main.step( "Test whether Mininet is started" )
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+
+ main.log.info( "Generate prefixes for host3" )
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 3500 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 3500 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host5" )
+ prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 3500 )
+ main.log.info( prefixesHost5 )
+ for prefix in prefixesHost5:
+ allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ routeIntentsExpectedHost5 = \
+ main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+ prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4 + routeIntentsExpectedHost5
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ # Copy the cfg files to config dir
+ main.log.info("Copying two cfg files to onos etc folder")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+
+ main.ONOScli.startOnosCli( ONOS1Ip )
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing bgprouter feature" )
+ main.ONOScli.featureInstall( "onos-app-bgprouter" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ time.sleep(20)
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+ time.sleep(20)
+
+ main.log.info( "Login Quagga CLI on host5" )
+ main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+ main.log.info( "Enter configuration model of Quagga CLI on host5" )
+ main.QuaggaCliHost5.enterConfig( 64521 )
+ main.log.info( "Add routes to Quagga on host5" )
+ main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+ time.sleep(60)
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ time.sleep(20)
+
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ for m in range( 3, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ time.sleep(10)
+
+ main.ONOScli.logout()
+ main.log.info("ONOS cli logout")
+ time.sleep(20);
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.log.info("onos stop")
+ time.sleep(20);
+ main.Mininet.stopNet()
+ main.log.info("mininet stop")
+ time.sleep(20)
+
+ # Route flap test (Add a route and detele it very fast 20 times) in VLAN configuration
+ def CASE8( self, main ):
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+ TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/vlan/mininet"
+ SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/vlan/sdnip.json"
+ main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
+
+ # Copy the json files to config dir
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/addresses.json ~/onos/tools/package/config/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/sdnip.json ~/onos/tools/package/config/")
+
+ # Launch mininet topology for this case
+ MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouterMininetVlan.py"
+ main.step( "Launch mininet" )
+ main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+ main.step("waiting 20 secs for all switches and quagga instances to comeup")
+ time.sleep(20)
+ main.step( "Test whether Mininet is started" )
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+
+ main.log.info( "Generate prefixes for host3" )
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 1 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host5" )
+ prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 1 )
+ main.log.info( prefixesHost5 )
+ for prefix in prefixesHost5:
+ allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ routeIntentsExpectedHost5 = \
+ main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+ prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost5
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ # Copy the cfg files to config dir
+ main.log.info("Copying two cfg files to onos etc folder")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+
+ main.ONOScli.startOnosCli( ONOS1Ip )
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing bgprouter feature" )
+ main.ONOScli.featureInstall( "onos-app-bgprouter" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host5" )
+ main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+ main.log.info( "Enter configuration model of Quagga CLI on host5" )
+ main.QuaggaCliHost5.enterConfig( 64521 )
+ main.log.info( "Add routes to Quagga on host5" )
+ main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add and delete a route to Quagga on host3 20 times" )
+ for i in range(0, 20):
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+ main.log.info("Add a route %s times", i)
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.log.info("Delete the route")
+ time.sleep(0.1)
+
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+ main.log.info("Add the route finally and wait for 10 sec")
+
+ #============================= Ping Test ========================
+ for j in range(0, 30):
+ r = main.Mininet.pingHost(SRC="as6host", TARGET="3.0.0.1")
+
+ utilities.assert_equals(expect=main.TRUE,actual=r,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ #time.sleep(20)
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add and delete a route to Quagga on host3 20 times" )
+ for i in range(0, 20):
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+ main.log.info("Add a route %s times", i)
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.log.info("Delete the route")
+ time.sleep(0.1)
+
+ main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = []
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+
+ for j in range(0, 5):
+ r = main.Mininet.pingHost(SRC="as6host", TARGET="3.0.0.1")
+
+ utilities.assert_equals(expect=main.FALSE,actual=r,
+ onpass="disconnectivity check PASS",
+ onfail="disconnectivity check FAIL")
+
+ main.ONOScli.logout()
+ main.log.info("ONOS cli logout")
+ time.sleep(20);
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.log.info("onos stop")
+ time.sleep(20);
+ main.Mininet.stopNet()
+ main.log.info("mininet stop")
+ time.sleep(20)
+
+ # Route flap test (change the next-hop very fast 20 times) in VLAN configuration
+ def CASE9( self, main):
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+ TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/vlan/routeconvergence/mininet"
+ SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/vlan/sdnip.json"
+ main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
+
+ # Copy the json files to config dir
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/addresses.json ~/onos/tools/package/config/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/sdnip.json ~/onos/tools/package/config/")
+
+ # Launch mininet topology for this case
+ MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouterConvergenceVlanMininet.py"
+ main.step( "Launch mininet" )
+ main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+ main.step("waiting 20 secs for all switches and quagga instances to comeup")
+ time.sleep(20)
+ main.step( "Test whether Mininet is started" )
+ main.log.info( "Login Quagga CLI on host3" )
+ result = main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ #if result is not main.TRUE:
+ # main.log.report("Mininet is not started...Aborting")
+ # main.Mininet.stopNet()
+ # main.cleanup()
+ # main.exit()
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+ main.log.info( "Generate prefixes for host3" )
+
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host5" )
+ prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
+ main.log.info( prefixesHost5 )
+ for prefix in prefixesHost5:
+ allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ routeIntentsExpectedHost5 = \
+ main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+ prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4 + routeIntentsExpectedHost5
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+ utilities.assert_equals(expect=main.TRUE,actual=verifyResult,onpass="Verify cell pass!",onfail="Verify cell failed...")
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ # Copy the cfg files to config dir
+ main.log.info("Copying two cfg files to onos etc folder")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+ if onos1InstallResult is not main.TRUE:
+ main.log.report("ONOS is not installed...Aborting")
+ main.Mininet.stopNet()
+ main.cleanup()
+ main.exit()
+
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if onos1Isup is not main.TRUE:
+ main.log.report("ONOS1 didn't start!...Aborting" )
+ main.Mininet.stopNet()
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.cleanup()
+ main.exit()
+
+ main.step( "Start ONOS-cli" )
+
+ result = main.ONOScli.startOnosCli( ONOS1Ip )
+ utilities.assert_equals(expect=main.TRUE,actual=result,onpass="ONOS CLI is up!",onfail="ONOS CLI is not up...")
+ if result is not main.TRUE:
+ main.log.report("ONOS1 didn't start!...Aborting" )
+ main.Mininet.stopNet()
+ main.ONOScli.logout()
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.cleanup()
+ main.exit()
+
+
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing bgprouter feature" )
+ main.ONOScli.featureInstall( "onos-app-bgprouter" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+ main.log.info( "Login Quagga CLI on host5" )
+ main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+ main.log.info( "Enter configuration model of Quagga CLI on host5" )
+ main.QuaggaCliHost5.enterConfig( 64521 )
+ main.log.info( "Add routes to Quagga on host5" )
+ main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+ time.sleep( 30 )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ #============= Flap the BGP session between QuaggaCliHost4 and ONOS ==================
+ main.log.info( "Disabling bgp session and enable it 20 times very fast between QuaggaCliHost4 and 192.168.30.101:" )
+ for i in range(0, 20):
+ main.log.info("Disable it %s times", i)
+ main.QuaggaCliHost4.disable_bgp_peer( "192.168.30.101", "64513")
+ main.log.info("Enable it again")
+ main.QuaggaCliHost4.enable_bgp_peer( "192.168.30.101", "64513" )
+ time.sleep(0.1)
+ main.log.info("Disable it finally")
+ main.QuaggaCliHost4.disable_bgp_peer( "192.168.30.101", "64513")
+
+ main.log.info( "Sleeping for 30 seconds for network to converge" )
+ time.sleep(30)
+ # get routes inside SDN-IP
+ main.log.info( "Getting Routes from ONOS CLI" )
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ newAllRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+ # Expected routes with changed next hop
+ newAllRoutesExpected = []
+ for prefix in prefixesHost3:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ for prefix in prefixesHost4:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ for prefix in prefixesHost5:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+ main.step( "Check routes installed after convergence-1" )
+ main.log.info( "Routes expected:" )
+ main.log.info( newAllRoutesStrExpected )
+ main.log.info( "Routes got from ONOS CLI after convergence-1:" )
+ main.log.info( newAllRoutesStrActual )
+ utilities.assertEquals(
+ expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct after convergence!***",
+ onfail="***Routes in SDN-IP are wrong after convergence!***" )
+ if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after convergence are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after convergence are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ for m in range( 3, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ #============= Flap the BGP session between QuaggaCliHost4 and ONOS ==================
+ main.log.info( "Disabling bgp session and enable it 20 times very fast between QuaggaCliHost4 and 192.168.30.101:" )
+ for i in range(0, 20):
+ main.log.info("Disable it %s times", i)
+ main.QuaggaCliHost4.disable_bgp_peer( "192.168.30.101", "64513")
+ main.log.info("Enable it again")
+ main.QuaggaCliHost4.enable_bgp_peer( "192.168.30.101", "64513" )
+ time.sleep(0.1)
+
+ main.log.info( "Sleeping for 30 seconds for network to converge" )
+ time.sleep(30)
+
+ # get routes inside SDN-IP
+ main.log.info( "Getting Routes from ONOS CLI" )
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ newAllRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+ # Expected routes with changed next hop
+ newAllRoutesExpected = []
+ for prefix in prefixesHost3:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ for prefix in prefixesHost4:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ for prefix in prefixesHost5:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+ main.step( "Check routes installed after convergence-2" )
+ main.log.info( "Routes expected:" )
+ main.log.info( newAllRoutesStrExpected )
+ main.log.info( "Routes got from ONOS CLI after convergence-2:" )
+ main.log.info( newAllRoutesStrActual )
+ utilities.assertEquals(
+ expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct after convergence!***",
+ onfail="***Routes in SDN-IP are wrong after convergence!***" )
+ if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after convergence are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after convergence are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ for m in range( 3, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ main.ONOScli.logout()
+ main.log.info("ONOS cli logout")
+ time.sleep(20);
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.log.info("onos stop")
+ time.sleep(20);
+ main.Mininet.stopNet()
+ main.log.info("mininet stop")
+ time.sleep(20)
+
+ # Route convergence and connectivity test
+ def CASE21( self, main):
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+ TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/routeconvergence/mininet"
+ SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/sdnip.json"
+ main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
+
+ # Copy the json files to config dir
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/addresses.json ~/onos/tools/package/config/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/sdnip.json ~/onos/tools/package/config/")
+
+ # Launch mininet topology for this case
+ MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouterConvergenceMininet.py"
+ main.step( "Launch mininet" )
+ main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+ main.step("waiting 20 secs for all switches and quagga instances to comeup")
+ time.sleep(20)
+ main.step( "Test whether Mininet is started" )
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+ main.log.info( "Generate prefixes for host3" )
+
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host5" )
+ prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
+ main.log.info( prefixesHost5 )
+ for prefix in prefixesHost5:
+ allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ routeIntentsExpectedHost5 = \
+ main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+ prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4 + routeIntentsExpectedHost5
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ # Copy the cfg files to config dir
+ main.log.info("Copying two cfg files to onos etc folder")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+
+ main.ONOScli.startOnosCli( ONOS1Ip )
+
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing gbprouter feature" )
+ main.ONOScli.featureInstall( "onos-app-bgprouter" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+ main.log.info( "Login Quagga CLI on host5" )
+ main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+ main.log.info( "Enter configuration model of Quagga CLI on host5" )
+ main.QuaggaCliHost5.enterConfig( 64521 )
+ main.log.info( "Add routes to Quagga on host5" )
+ main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+ time.sleep( 30 )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllPass( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ #============= Disconnect the BGP session between QuaggaCliHost4 and ONOS ==================
+ main.log.info( "Disabling bgp session between QuaggaCliHost4 and 192.168.30.101:" )
+ main.QuaggaCliHost4.disable_bgp_peer( "192.168.30.101", "64513" )
+ main.log.info( "Sleeping for 150 seconds for network to converge" )
+ time.sleep(150)
+ # get routes inside SDN-IP
+ main.log.info( "Getting Routes from ONOS CLI" )
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ newAllRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+ # Expected routes with changed next hop
+ newAllRoutesExpected = []
+ for prefix in prefixesHost3:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ for prefix in prefixesHost4:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ for prefix in prefixesHost5:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+ main.step( "Check routes installed after convergence-1" )
+ main.log.info( "Routes expected:" )
+ main.log.info( newAllRoutesStrExpected )
+ main.log.info( "Routes got from ONOS CLI after convergence-1:" )
+ main.log.info( newAllRoutesStrActual )
+ utilities.assertEquals(
+ expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct after convergence!***",
+ onfail="***Routes in SDN-IP are wrong after convergence!***" )
+ if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after convergence are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after convergence are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllPass( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ #============= Enabling the BGP session between QuaggaCliHost4 and ONOS ==================
+ main.log.info( "Enabling bgp session between QuaggaCliHost4 and 192.168.30.101:" )
+ main.QuaggaCliHost4.enable_bgp_peer( "192.168.30.101", "64513" )
+ main.log.info( "Sleeping for 150 seconds for network to converge" )
+ time.sleep(150)
+ # get routes inside SDN-IP
+ main.log.info( "Getting Routes from ONOS CLI" )
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ newAllRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+ # Expected routes with changed next hop
+ newAllRoutesExpected = []
+ for prefix in prefixesHost3:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ for prefix in prefixesHost4:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ for prefix in prefixesHost5:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+ main.step( "Check routes installed after convergence-2" )
+ main.log.info( "Routes expected:" )
+ main.log.info( newAllRoutesStrExpected )
+ main.log.info( "Routes got from ONOS CLI after convergence-2:" )
+ main.log.info( newAllRoutesStrActual )
+ utilities.assertEquals(
+ expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct after convergence!***",
+ onfail="***Routes in SDN-IP are wrong after convergence!***" )
+ if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after convergence are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after convergence are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllPass( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ #============================= Deleting Routes ==================
+ main.step( "Check deleting routes installed" )
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+ main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
+
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ main.log.info( "allRoutes_actual = " )
+ main.log.info( allRoutesActual )
+
+ utilities.assertEquals(
+ expect="[]", actual=str( allRoutesActual ),
+ onpass="***Route number in SDN-IP is 0, correct!***",
+ onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report( "***Routes in SDN-IP after deleting correct!***" )
+ else:
+ main.log.report( "***Routes in SDN-IP after deleting wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllFail( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="disconnect check PASS",
+ onfail="disconnect check FAIL")
+
+ main.ONOScli.logout()
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.Mininet.stopNet()
+ time.sleep(10)
+
+ # Route convergence and connectivity test with Route Server
+ def CASE22( self, main):
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+ TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/routeserver/mininet"
+ SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/routeserver/sdnip.json"
+ main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
+
+ # Copy the json files to config dir
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/routeserver/addresses.json ~/onos/tools/package/config/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/routeserver/sdnip.json ~/onos/tools/package/config/")
+
+ # Launch mininet topology for this case
+ MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouteServerMininet.py"
+ main.step( "Launch mininet" )
+ main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+ main.step("waiting 20 secs for all switches and quagga instances to comeup")
+ time.sleep(20)
+ main.step( "Test whether Mininet is started" )
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+ main.log.info( "Generate prefixes for host3" )
+
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host5" )
+ prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
+ main.log.info( prefixesHost5 )
+ for prefix in prefixesHost5:
+ allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ routeIntentsExpectedHost5 = \
+ main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+ prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4 + routeIntentsExpectedHost5
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ # Copy the cfg files to config dir
+ main.log.info("Copying two cfg files to onos etc folder")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+
+ main.ONOScli.startOnosCli( ONOS1Ip )
+
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing gbprouter feature" )
+ main.ONOScli.featureInstall( "onos-app-bgprouter" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+ main.log.info( "Login Quagga CLI on host5" )
+ main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+ main.log.info( "Enter configuration model of Quagga CLI on host5" )
+ main.QuaggaCliHost5.enterConfig( 64521 )
+ main.log.info( "Add routes to Quagga on host5" )
+ main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+ time.sleep( 60 )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllPass( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ #============= Disconnect the BGP session between QuaggaCliHost4 and ONOS ==================
+ main.log.info( "Disabling bgp session between QuaggaCliHost4 and 192.168.30.101:" )
+ main.QuaggaCliHost4.disable_bgp_peer( "192.168.30.101", "64513" )
+ main.log.info( "Sleeping for 150 seconds for network to converge" )
+ time.sleep(150)
+ # get routes inside SDN-IP
+ main.log.info( "Getting Routes from ONOS CLI" )
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ newAllRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+ # Expected routes with changed next hop
+ newAllRoutesExpected = []
+ for prefix in prefixesHost3:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ for prefix in prefixesHost4:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ for prefix in prefixesHost5:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+ main.step( "Check routes installed after convergence-1" )
+ main.log.info( "Routes expected:" )
+ main.log.info( newAllRoutesStrExpected )
+ main.log.info( "Routes got from ONOS CLI after convergence-1:" )
+ main.log.info( newAllRoutesStrActual )
+ utilities.assertEquals(
+ expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct after convergence!***",
+ onfail="***Routes in SDN-IP are wrong after convergence!***" )
+ if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after convergence are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after convergence are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllPass( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ #============= Enabling the BGP session between QuaggaCliHost4 and ONOS ==================
+ main.log.info( "Enabling bgp session between QuaggaCliHost4 and 192.168.30.101:" )
+ main.QuaggaCliHost4.enable_bgp_peer( "192.168.30.101", "64513" )
+ main.log.info( "Sleeping for 150 seconds for network to converge" )
+ time.sleep(150)
+ # get routes inside SDN-IP
+ main.log.info( "Getting Routes from ONOS CLI" )
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ newAllRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+ # Expected routes with changed next hop
+ newAllRoutesExpected = []
+ for prefix in prefixesHost3:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ for prefix in prefixesHost4:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ for prefix in prefixesHost5:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+ main.step( "Check routes installed after convergence-2" )
+ main.log.info( "Routes expected:" )
+ main.log.info( newAllRoutesStrExpected )
+ main.log.info( "Routes got from ONOS CLI after convergence-2:" )
+ main.log.info( newAllRoutesStrActual )
+ utilities.assertEquals(
+ expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct after convergence!***",
+ onfail="***Routes in SDN-IP are wrong after convergence!***" )
+ if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after convergence are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after convergence are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllPass( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ #============================= Deleting Routes ==================
+ main.step( "Check deleting routes installed" )
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+ main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
+
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ main.log.info( "allRoutes_actual = " )
+ main.log.info( allRoutesActual )
+
+ utilities.assertEquals(
+ expect="[]", actual=str( allRoutesActual ),
+ onpass="***Route number in SDN-IP is 0, correct!***",
+ onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report( "***Routes in SDN-IP after deleting correct!***" )
+ else:
+ main.log.report( "***Routes in SDN-IP after deleting wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllFail( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="disconnect check PASS",
+ onfail="disconnect check FAIL")
+
+ main.ONOScli.logout()
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.Mininet.stopNet()
+ time.sleep(10)
+
+ # Route convergence and connectivity test in VLAN configuration
+ def CASE31( self, main):
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+ TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/vlan/routeconvergence/mininet"
+ SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/vlan/sdnip.json"
+ main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
+
+ # Copy the json files to config dir
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/addresses.json ~/onos/tools/package/config/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/sdnip.json ~/onos/tools/package/config/")
+
+ # Launch mininet topology for this case
+ MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouterConvergenceVlanMininet.py"
+ main.step( "Launch mininet" )
+ main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+ main.step("waiting 20 secs for all switches and quagga instances to comeup")
+ time.sleep(20)
+ main.step( "Test whether Mininet is started" )
+ main.log.info( "Login Quagga CLI on host3" )
+ result = main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ #if result is not main.TRUE:
+ # main.log.report("Mininet is not started...Aborting")
+ # main.Mininet.stopNet()
+ # main.cleanup()
+ # main.exit()
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+ main.log.info( "Generate prefixes for host3" )
+
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host5" )
+ prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
+ main.log.info( prefixesHost5 )
+ for prefix in prefixesHost5:
+ allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ routeIntentsExpectedHost5 = \
+ main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+ prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4 + routeIntentsExpectedHost5
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+ utilities.assert_equals(expect=main.TRUE,actual=verifyResult,onpass="Verify cell pass!",onfail="Verify cell failed...")
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ # Copy the cfg files to config dir
+ main.log.info("Copying two cfg files to onos etc folder")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+ if onos1InstallResult is not main.TRUE:
+ main.log.report("ONOS is not installed...Aborting")
+ main.Mininet.stopNet()
+ main.cleanup()
+ main.exit()
+
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if onos1Isup is not main.TRUE:
+ main.log.report("ONOS1 didn't start!...Aborting" )
+ main.Mininet.stopNet()
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.cleanup()
+ main.exit()
+
+ main.step( "Start ONOS-cli" )
+
+ result = main.ONOScli.startOnosCli( ONOS1Ip )
+ utilities.assert_equals(expect=main.TRUE,actual=result,onpass="ONOS CLI is up!",onfail="ONOS CLI is not up...")
+ if result is not main.TRUE:
+ main.log.report("ONOS1 didn't start!...Aborting" )
+ main.Mininet.stopNet()
+ main.ONOScli.logout()
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.cleanup()
+ main.exit()
+
+
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing bgprouter feature" )
+ main.ONOScli.featureInstall( "onos-app-bgprouter" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+ main.log.info( "Login Quagga CLI on host5" )
+ main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+ main.log.info( "Enter configuration model of Quagga CLI on host5" )
+ main.QuaggaCliHost5.enterConfig( 64521 )
+ main.log.info( "Add routes to Quagga on host5" )
+ main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+ time.sleep( 30 )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ sources = ["as2host", "as3host", "as6host"]
+ targets = ["192.168.10.101", "192.168.20.101", "192.168.30.101", "192.168.60.101"]
+ for source in sources:
+ for target in targets:
+ r = main.Mininet.pingHost(SRC=source, TARGET=target)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Router connectivity check PASS",
+ onfail="Router connectivity check FAIL")
+
+ pingTestResults = main.TRUE
+ for m in range( 3, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ time.sleep(20)
+
+ #============= Disconnect the BGP session between QuaggaCliHost4 and ONOS ==================
+ main.log.info( "Disabling bgp session between QuaggaCliHost4 and 192.168.30.101:" )
+ main.QuaggaCliHost4.disable_bgp_peer( "192.168.30.101", "64513" )
+ main.log.info( "Sleeping for 150 seconds for network to converge" )
+ time.sleep(150)
+ # get routes inside SDN-IP
+ main.log.info( "Getting Routes from ONOS CLI" )
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ newAllRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+ # Expected routes with changed next hop
+ newAllRoutesExpected = []
+ for prefix in prefixesHost3:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ for prefix in prefixesHost4:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ for prefix in prefixesHost5:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+ main.step( "Check routes installed after convergence-1" )
+ main.log.info( "Routes expected:" )
+ main.log.info( newAllRoutesStrExpected )
+ main.log.info( "Routes got from ONOS CLI after convergence-1:" )
+ main.log.info( newAllRoutesStrActual )
+ utilities.assertEquals(
+ expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct after convergence!***",
+ onfail="***Routes in SDN-IP are wrong after convergence!***" )
+ if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after convergence are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after convergence are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ sources = ["as2host", "as3host", "as6host"]
+ targets = ["192.168.10.101", "192.168.20.101", "192.168.30.101", "192.168.60.101"]
+ for source in sources:
+ for target in targets:
+ r = main.Mininet.pingHost(SRC=source, TARGET=target)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Router connectivity check PASS",
+ onfail="Router connectivity check FAIL")
+
+ pingTestResults = main.TRUE
+ for m in range( 3, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ time.sleep(20)
+
+ #============= Enabling the BGP session between QuaggaCliHost4 and ONOS ==================
+ main.log.info( "Enabling bgp session between QuaggaCliHost4 and 192.168.30.101:" )
+ main.QuaggaCliHost4.enable_bgp_peer( "192.168.30.101", "64513" )
+ main.log.info( "Sleeping for 150 seconds for network to converge" )
+ time.sleep(150)
+ # get routes inside SDN-IP
+ main.log.info( "Getting Routes from ONOS CLI" )
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ newAllRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+ # Expected routes with changed next hop
+ newAllRoutesExpected = []
+ for prefix in prefixesHost3:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ for prefix in prefixesHost4:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ for prefix in prefixesHost5:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+ main.step( "Check routes installed after convergence-2" )
+ main.log.info( "Routes expected:" )
+ main.log.info( newAllRoutesStrExpected )
+ main.log.info( "Routes got from ONOS CLI after convergence-2:" )
+ main.log.info( newAllRoutesStrActual )
+ utilities.assertEquals(
+ expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct after convergence!***",
+ onfail="***Routes in SDN-IP are wrong after convergence!***" )
+ if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after convergence are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after convergence are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.QuaggaCliHost.pingTestAndCheckAllPass( "1.168.30.100" )
+ main.log.info("Ping test result")
+ if pingTestResults:
+ main.log.info("Test succeeded")
+ else:
+ main.log.info("Test failed")
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ #============================= Deleting Routes ==================
+ main.step( "Check deleting routes installed" )
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+ main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
+
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ main.log.info( "allRoutes_actual = " )
+ main.log.info( allRoutesActual )
+
+ utilities.assertEquals(
+ expect="[]", actual=str( allRoutesActual ),
+ onpass="***Route number in SDN-IP is 0, correct!***",
+ onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report( "***Routes in SDN-IP after deleting correct!***" )
+ else:
+ main.log.report( "***Routes in SDN-IP after deleting wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ for m in range( 4, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.TRUE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="disconnect check PASS",
+ onfail="disconnect check FAIL")
+
+ time.sleep(20);
+
+ main.ONOScli.logout()
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.Mininet.stopNet()
+ time.sleep(10)
+
+ # Route convergence and connectivity test with Route Server in VLAN tagged network
+ def CASE32( self, main):
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ TESTCASE_ROOT_PATH = main.params[ 'ENV' ][ 'home' ]
+ TESTCASE_MININET_ROOT_PATH = TESTCASE_ROOT_PATH + "/vlan/routeserver/mininet"
+ SDNIPJSONFILEPATH = TESTCASE_ROOT_PATH + "/vlan/routeserver/sdnip.json"
+ main.log.info("sdnip.json file path: "+ SDNIPJSONFILEPATH)
+
+ # Copy the json files to config dir
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/routeserver/addresses.json ~/onos/tools/package/config/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/vlan/routeserver/sdnip.json ~/onos/tools/package/config/")
+
+ # Launch mininet topology for this case
+ MININET_TOPO_FILE = TESTCASE_MININET_ROOT_PATH + "/PeeringRouteServerVlanMininet.py"
+ main.step( "Launch mininet" )
+ main.Mininet.handle.sendline("sudo python " + MININET_TOPO_FILE + " " + TESTCASE_MININET_ROOT_PATH)
+ main.step("waiting 20 secs for all switches and quagga instances to comeup")
+ time.sleep(20)
+ main.step( "Test whether Mininet is started" )
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+ main.log.info( "Generate prefixes for host3" )
+
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host5" )
+ prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
+ main.log.info( prefixesHost5 )
+ for prefix in prefixesHost5:
+ allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ routeIntentsExpectedHost5 = \
+ main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+ prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4 + routeIntentsExpectedHost5
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ # Copy the cfg files to config dir
+ main.log.info("Copying two cfg files to onos etc folder")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.ONOSbench.handle.sendline("cp " + TESTCASE_ROOT_PATH + "/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg ~/onos/tools/package/etc/")
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+
+ main.ONOScli.startOnosCli( ONOS1Ip )
+
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing gbprouter feature" )
+ main.ONOScli.featureInstall( "onos-app-bgprouter" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+ main.log.info( "Login Quagga CLI on host5" )
+ main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+ main.log.info( "Enter configuration model of Quagga CLI on host5" )
+ main.QuaggaCliHost5.enterConfig( 64521 )
+ main.log.info( "Add routes to Quagga on host5" )
+ main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+ time.sleep( 60 )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ sources = ["as2host", "as3host", "as6host"]
+ targets = ["192.168.10.101", "192.168.20.101", "192.168.30.101", "192.168.60.101"]
+ for source in sources:
+ for target in targets:
+ r = main.Mininet.pingHost(SRC=source, TARGET=target)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Router connectivity check PASS",
+ onfail="Router connectivity check FAIL")
+
+ pingTestResults = main.TRUE
+ for m in range( 3, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ time.sleep(20)
+
+ #============= Disconnect the BGP session between QuaggaCliHost4 and ONOS ==================
+ main.log.info( "Disabling bgp session between QuaggaCliHost4 and 192.168.30.101:" )
+ main.QuaggaCliHost4.disable_bgp_peer( "192.168.30.101", "64513" )
+ main.log.info( "Sleeping for 150 seconds for network to converge" )
+ time.sleep(150)
+ # get routes inside SDN-IP
+ main.log.info( "Getting Routes from ONOS CLI" )
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ newAllRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+ # Expected routes with changed next hop
+ newAllRoutesExpected = []
+ for prefix in prefixesHost3:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ for prefix in prefixesHost4:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ for prefix in prefixesHost5:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+ main.step( "Check routes installed after convergence-1" )
+ main.log.info( "Routes expected:" )
+ main.log.info( newAllRoutesStrExpected )
+ main.log.info( "Routes got from ONOS CLI after convergence-1:" )
+ main.log.info( newAllRoutesStrActual )
+ utilities.assertEquals(
+ expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct after convergence!***",
+ onfail="***Routes in SDN-IP are wrong after convergence!***" )
+ if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after convergence are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after convergence are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ sources = ["as2host", "as3host", "as6host"]
+ targets = ["192.168.10.101", "192.168.20.101", "192.168.30.101", "192.168.60.101"]
+ for source in sources:
+ for target in targets:
+ r = main.Mininet.pingHost(SRC=source, TARGET=target)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Router connectivity check PASS",
+ onfail="Router connectivity check FAIL")
+
+ pingTestResults = main.TRUE
+ for m in range( 3, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ time.sleep(20)
+
+ #============= Enabling the BGP session between QuaggaCliHost4 and ONOS ==================
+ main.log.info( "Enabling bgp session between QuaggaCliHost4 and 192.168.30.101:" )
+ main.QuaggaCliHost4.enable_bgp_peer( "192.168.30.101", "64513" )
+ main.log.info( "Sleeping for 150 seconds for network to converge" )
+ time.sleep(150)
+ # get routes inside SDN-IP
+ main.log.info( "Getting Routes from ONOS CLI" )
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ newAllRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ newAllRoutesStrActual = str( newAllRoutesActual ).replace( 'u', "" )
+
+ # Expected routes with changed next hop
+ newAllRoutesExpected = []
+ for prefix in prefixesHost3:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ for prefix in prefixesHost4:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ for prefix in prefixesHost5:
+ newAllRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ newAllRoutesStrExpected = str( sorted( newAllRoutesExpected ) )
+ main.step( "Check routes installed after convergence-2" )
+ main.log.info( "Routes expected:" )
+ main.log.info( newAllRoutesStrExpected )
+ main.log.info( "Routes got from ONOS CLI after convergence-2:" )
+ main.log.info( newAllRoutesStrActual )
+ utilities.assertEquals(
+ expect=newAllRoutesStrExpected, actual=newAllRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct after convergence!***",
+ onfail="***Routes in SDN-IP are wrong after convergence!***" )
+ if( eq( newAllRoutesStrExpected, newAllRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after convergence are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after convergence are wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ sources = ["as2host", "as3host", "as6host"]
+ targets = ["192.168.10.101", "192.168.20.101", "192.168.30.101", "192.168.60.101"]
+ for source in sources:
+ for target in targets:
+ r = main.Mininet.pingHost(SRC=source, TARGET=target)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Router connectivity check PASS",
+ onfail="Router connectivity check FAIL")
+
+ pingTestResults = main.TRUE
+ for m in range( 3, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.FALSE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="Default connectivity check PASS",
+ onfail="Default connectivity check FAIL")
+
+ time.sleep(20)
+
+ #============================= Deleting Routes ==================
+ main.step( "Check deleting routes installed" )
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+ main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
+
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ main.log.info( "allRoutes_actual = " )
+ main.log.info( allRoutesActual )
+
+ utilities.assertEquals(
+ expect="[]", actual=str( allRoutesActual ),
+ onpass="***Route number in SDN-IP is 0, correct!***",
+ onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report( "***Routes in SDN-IP after deleting correct!***" )
+ else:
+ main.log.report( "***Routes in SDN-IP after deleting wrong!***" )
+
+ #============================= Ping Test ========================
+ pingTestResults = main.TRUE
+ for m in range( 4, 6 ):
+ for n in range( 1, 10 ):
+ hostIp = str( m ) + ".0." + str( n ) + ".1"
+ r = main.Mininet.pingHost(SRC="as2host", TARGET=hostIp)
+ if r == main.TRUE:
+ pingTestResults = main.FALSE
+
+ utilities.assert_equals(expect=main.TRUE,actual=pingTestResults,
+ onpass="disconnect check PASS",
+ onfail="disconnect check FAIL")
+ time.sleep(20)
+
+ main.ONOScli.logout()
+ main.ONOSbench.onosStop(ONOS1Ip);
+ main.Mininet.stopNet()
+ time.sleep(10)
+
diff --git a/TestON/tests/PeeringRouterTest/PeeringRouterTest.topo b/TestON/tests/PeeringRouterTest/PeeringRouterTest.topo
new file mode 100755
index 0000000..a1e2c45
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/PeeringRouterTest.topo
@@ -0,0 +1,82 @@
+<TOPOLOGY>
+ <COMPONENT>
+
+ <Mininet>
+ <host>127.0.0.1</host>
+ <user>admin</user>
+ <password>onos_test</password>
+ <type>MininetCliDriver</type>
+ <connect_order>1</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </Mininet>
+
+ <ONOSbench>
+ <host>127.0.0.1</host>
+ <user>admin</user>
+ <password></password>
+ <type>OnosDriver</type>
+ <connect_order>2</connect_order>
+ <COMPONENTS>
+ <home>~/onos</home>
+ </COMPONENTS>
+ </ONOSbench>
+
+ <ONOScli>
+ <host>127.0.0.1</host>
+ <user>admin</user>
+ <password></password>
+ <type>OnosCliDriver</type>
+ <connect_order>3</connect_order>
+ <COMPONENTS>
+ <home>~/onos</home>
+ </COMPONENTS>
+ </ONOScli>
+
+ <ONOS1>
+ <host>127.0.0.1</host>
+ <user>admin</user>
+ <password></password>
+ <type>OnosDriver</type>
+ <connect_order>4</connect_order>
+ <COMPONENTS>
+ <home>~/onos</home>
+ </COMPONENTS>
+ </ONOS1>
+
+ <QuaggaCliHost3>
+ <host>1.168.30.2</host>
+ <user>admin</user>
+ <password></password>
+ <type>QuaggaCliDriver</type>
+ <connect_order>5</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </QuaggaCliHost3>
+ <QuaggaCliHost4>
+ <host>1.168.30.3</host>
+ <user>admin</user>
+ <password></password>
+ <type>QuaggaCliDriver</type>
+ <connect_order>6</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </QuaggaCliHost4>
+ <QuaggaCliHost5>
+ <host>1.168.30.5</host>
+ <user>admin</user>
+ <password></password>
+ <type>QuaggaCliDriver</type>
+ <connect_order>7</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </QuaggaCliHost5>
+ <QuaggaCliHost>
+ <host>1.168.30.100</host>
+ <user>admin</user>
+ <password></password>
+ <type>QuaggaCliDriver</type>
+ <connect_order>8</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </QuaggaCliHost>
+
+
+ </COMPONENT>
+</TOPOLOGY>
+
diff --git a/TestON/tests/PeeringRouterTest/README.md b/TestON/tests/PeeringRouterTest/README.md
new file mode 100644
index 0000000..002a0f1
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/README.md
@@ -0,0 +1,44 @@
+
+
+1) Install TestON framework from https://github.com/srikanthvavila/ONLabTest (Follow README instructions. Until forked repo is mrged back, use URL https://github.com/srikanthvavila/ONLabTest for cloning this repo. You can ignore Linc-OE and STS installation steps as we may not need them for now)
+
+2) Peering router testcases are under ~/TestON/tests/PeeringRouterTest folder:
+a) CASE4 - Basic Route advertisement and connectivity in untagged network
+b) CASE5 - Basic Route advertisement and connectivity in tagged network
+c) CASE7 - Scale test with 25k routes
+d) CASE8 - Flap a route 20 times with 100 msec interval
+e) CASE9 - Flap a next-hop 20 times with 100 msec interval
+f) CASE21 - Route convergence due to bgp peering session flapping in untagged network
+g) CASE22 - Basic Route advertisement and connectivity in untagged network with Route server
+h) CASE31 - Route convergence due to bgp peering session flapping in tagged network
+i) CASE32 - Basic Route advertisement and connectivity in tagged network with Route server
+
+3) Before running the testcases, ensure quagga is installed on the machine:
+a) "sudo apt-get install quagga"
+b) "Create a folder for /usr/local/var/run/quagga"
+c) "chmod 777" to quagga folder
+
+4) Test environment assumes the TestON, ONOS and Mininet all are running in the same VM. These testcases are not verified with the components running in separate VMs.
+
+5) Before running testcases, edit the following files and make necessary changes:
+a) ~/TestON/tests/PeeringRouterTest/PeeringRouterTest.params --> Edit "cellname", "test home folder" and "controller IP" fields
+b) ~/TestON/tests/PeeringRouterTest/PeeringRouterTest.topo --> Edit "host", "user", "password", "home" fields under "ONOSbench", "ONOSCli" and "ONOS1". Similalry edit "user" field under "QuaggaCliHost<>" (You can use the same user name as your mininet VM)
+d) ~/TestON/drivers/common/cli/onosclidriver.py --> Change the line "self.handle.expect( "ONOS_CELL=" + str( cellname ) )" to "self.handle.expect( "ONOS_CELL" )"
+
+6) Ensure the ONOS cell file has the following lines populated:
+OCI=127.0.0.1
+OC1=127.0.0.1
+OC2=127.0.0.1
+OCN=127.0.0.1
+ONOS_FEATURES=webconsole,onos-api,onos-core-trivial,onos-cli,onos-openflow,onos-gui,onos-rest,onos-app-config,onos-app-proxyarp
+ONOS_USER=<user>
+ONOS_GROUP=<user>
+ONOS_NIC=127.0.0.*
+
+7) Ensure KARAF_ROOT is set to "/opt/onos/apache-karaf-3.0.2"
+
+8) Ensure JAVA_HOME is unset before sourcing ~/onos/tools/dev/bash_profile
+
+9) Ensure "onos-package" operation is done before executing the test cases
+
+10) Update the testcases to be run in ~/TestON/tests/PeeringRouterTest/PeeringRouterTest.params and execute "./cly.py run PeeringRouterTest" from ~/TestON/bin folder.
diff --git a/TestON/tests/PeeringRouterTest/__init__.py b/TestON/tests/PeeringRouterTest/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/__init__.py
diff --git a/TestON/tests/PeeringRouterTest/addresses.json b/TestON/tests/PeeringRouterTest/addresses.json
new file mode 100644
index 0000000..8831f8d
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/addresses.json
@@ -0,0 +1,29 @@
+{
+ "addresses" : [
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "1",
+ "ips" : ["192.168.10.101/24"],
+ "mac" : "00:00:00:00:00:01"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "2",
+ "ips" : ["192.168.20.101/24"],
+ "mac" : "00:00:00:00:00:01"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "3",
+ "ips" : ["192.168.30.101/24"],
+ "mac" : "00:00:00:00:00:01"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "4",
+ "ips" : ["192.168.60.101/24"],
+ "mac" : "00:00:00:00:00:01"
+ }
+
+ ]
+}
diff --git a/TestON/tests/PeeringRouterTest/mininet/PeeringRouterMininet.py b/TestON/tests/PeeringRouterTest/mininet/PeeringRouterMininet.py
new file mode 100755
index 0000000..6991916
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/mininet/PeeringRouterMininet.py
@@ -0,0 +1,337 @@
+#!/usr/bin/python
+
+"""
+Start up the SDN-IP demo topology
+"""
+
+"""
+AS1 = 64513, (SDN AS)
+AS2 = 64514, reachable by 192.168.10.1, 192.168.20.1
+AS3 = 64516, reachable by 192.168.30.1
+AS4 = 64517, reachable by 192.168.40.1
+AS6 = 64520, reachable by 192.168.60.2, (route server 192.168.60.1)
+"""
+
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+
+import os.path
+import time
+import sys
+from subprocess import Popen, STDOUT, PIPE
+
+QUAGGA_DIR = '/usr/lib/quagga'
+#QUAGGA_DIR = '/usr/local/sbin'
+QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
+
+QUAGGA_CONFIG_FILE_DIR = '/home/tutorial1/ONLabTest/TestON/tests/PeeringRouterTest/mininet'
+
+class SDNIpModifiedTopo( Topo ):
+ "SDN Ip Modified Topology"
+
+ def __init__( self, *args, **kwargs ):
+ global numHost101
+ global numHost200
+ numHost101 = 101
+ numHost200 = 200
+ Topo.__init__( self, *args, **kwargs )
+ sw1 = self.addSwitch('sw1', dpid='0000000000000001')
+ sw2 = self.addSwitch('sw2', dpid='0000000000000002')
+ #sw3 = self.addSwitch('sw3', dpid='00000000000000a3')
+ #sw4 = self.addSwitch('sw4', dpid='00000000000000a4')
+ #sw5 = self.addSwitch('sw5', dpid='00000000000000a5')
+ #sw6 = self.addSwitch('sw6', dpid='00000000000000a6')
+ #add a switch for 3 quagga hosts
+ swTestOn = self.addSwitch('swTestOn', dpid='0000000000000102')
+ #Note this switch isn't part of the SDN topology
+ #We'll use the ovs-controller to turn this into a learning switch
+ as6sw = self.addSwitch('as6sw', dpid='00000000000000a7')
+
+ host1 = self.addHost( 'host1' )
+ root1 = self.addHost( 'root1', inNamespace=False , ip='0')
+ rootTestOn = self.addHost( 'rootTestOn', inNamespace=False, ip='0' )
+
+ #AS2 host
+ host3 = self.addHost( 'host3' )
+ as2host = self.addHost( 'as2host' )
+ #AS3 host
+ host4 = self.addHost( 'host4' )
+ as3host = self.addHost( 'as3host' )
+ #AS6 host
+ host5 = self.addHost( 'host5' )
+ as6host = self.addHost( 'as6host' )
+
+ self.addLink( host1, sw2 )
+ #Links to the multihomed AS
+ self.addLink( host3, sw1 )
+ self.addLink( host3, sw1 )
+ self.addLink( as2host, host3 )
+ #Single links to the remaining two ASes
+ self.addLink( host4, sw1 )
+ self.addLink( as3host, host4 )
+
+ #AS3-AS4 link
+ #self.addLink( host4, host5)
+ #Add new AS6 to its bridge
+ self.addLink( host5, as6sw )
+ self.addLink( as6host, host5 )
+ #test the host behind the router(behind the router server)
+# for i in range(1, 10):
+ # host = self.addHost('as6host%d' % i)
+ # self.addLink(host, as6router)
+
+ ## Internal Connection To Hosts ##
+ self.addLink( root1, host1 )
+
+ # self.addLink( sw1, sw2 )
+ # self.addLink( sw1, sw3 )
+ # self.addLink( sw2, sw4 )
+ # self.addLink( sw3, sw4 )
+ # self.addLink( sw3, sw5 )
+ # self.addLink( sw4, sw6 )
+ # self.addLink( sw5, sw6 )
+ self.addLink( as6sw, sw1 )
+
+
+ self.addLink(swTestOn, rootTestOn)
+ #self.addLink(swTestOn, host1)
+ self.addLink(swTestOn, host3)
+ self.addLink(swTestOn, host4)
+ self.addLink(swTestOn, host5)
+ self.addLink(swTestOn, as2host)
+
+
+ #self.addLink(rootTestOn, host4)
+
+def startsshd( host ):
+ "Start sshd on host"
+ info( '*** Starting sshd\n' )
+ name, intf, ip = host.name, host.defaultIntf(), host.IP()
+ banner = '/tmp/%s.banner' % name
+ host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
+ host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+ info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+ for h in hosts:
+ startsshd( h )
+
+def stopsshd( ):
+ "Stop *all* sshd processes with a custom banner"
+ info( '*** Shutting down stale sshd/Banner processes ',
+ quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def startquagga( host, num, config_file ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ print zebra_cmd
+ print quagga_cmd
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+def startquaggahost5( host, num ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+
+def stopquagga( ):
+ quietRun( 'sudo pkill -9 -f bgpd' )
+ quietRun( 'sudo pkill -9 -f zebra' )
+
+def sdn1net():
+ topo = SDNIpModifiedTopo()
+ info( '*** Creating network\n' )
+ net = Mininet( topo=topo, controller=RemoteController )
+ net = Mininet( topo=topo, controller=RemoteController )
+
+ host1, host3, host4, host5 = net.get( 'host1', 'host3', 'host4', 'host5' )
+
+ #host100.setIP('1.168.30.' + str(i), 24, str(host100) + "-eth2")
+
+ #host500.setMAC('00:00:00:00:04:%d' % (i-101), 'host%d-eth0' %(i))
+ #add IP prefixes
+ #for j in range(0,121):
+ #host100.cmd('sudo ip addr add %s.0.40.%s/24 dev host%s-eth0' %(i,j,i))
+
+ ## Adding 2nd, 3rd and 4th interface to host1 connected to sw1 (for another BGP peering)
+ #sw1 = net.get('sw1')
+ host1.setMAC('00:00:00:00:00:01', 'host1-eth0')
+ host1.cmd('ip addr add 192.168.20.101/24 dev host1-eth0')
+ host1.cmd('ip addr add 192.168.30.101/24 dev host1-eth0')
+ #host1.cmd('ip addr add 192.168.40.101/24 dev host1-eth0')
+ host1.cmd('ip addr add 192.168.60.101/24 dev host1-eth0')
+
+ # Net has to be start after adding the above link
+ net.start()
+
+ # Set up as6sw as a learning switch as quickly as possible so it
+ # hopefully doesn't connect to the actual controller
+ # TODO figure out how to change controller before starting switch
+ as6sw = net.get('as6sw')
+ as6sw.cmd('ovs-vsctl set-controller as6sw none')
+ as6sw.cmd('ovs-vsctl set-fail-mode as6sw standalone')
+
+
+ sw1 = net.get('sw1')
+ sw1.cmd('ovs-vsctl set-controller sw1 tcp:127.0.0.1:6633')
+# sw2.cmd('ovs-vsctl set-controller sw2 tcp:127.0.0.1:6633')
+# sw3.cmd('ovs-vsctl set-controller sw3 tcp:127.0.0.1:6633')
+# sw4.cmd('ovs-vsctl set-controller sw4 tcp:127.0.0.1:6633')
+# sw5.cmd('ovs-vsctl set-controller sw5 tcp:127.0.0.1:6633')
+# sw6.cmd('ovs-vsctl set-controller sw6 tcp:127.0.0.1:6633')
+
+
+ swTestOn = net.get('swTestOn')
+ swTestOn.cmd('ovs-vsctl set-controller swTestOn none')
+ swTestOn.cmd('ovs-vsctl set-fail-mode swTestOn standalone')
+
+ host1.defaultIntf().setIP('192.168.10.101/24')
+ # Run BGPd
+ #host1.cmd('%s -d -f %s' % (BGPD, BGPD_CONF))
+ #host1.cmd('/sbin/route add default gw 192.168.10.254 dev %s-eth0' % (host1.name))
+
+ # Configure new host interfaces
+ #host2.defaultIntf().setIP('172.16.10.2/24')
+ #host2.defaultIntf().setMAC('00:00:00:00:01:02')
+ #host2.cmd('/sbin/route add default gw 172.16.10.254 dev %s-eth0' % (host2.name))
+
+ # Set up AS2
+ host3.setIP('192.168.10.1', 24, 'host3-eth0')
+ #host3.cmd('sudo ip addr add 172.16.20.1/24 dev host3-eth0')
+ host3.setIP('192.168.20.1', 24, 'host3-eth1')
+ host3.setMAC('00:00:00:00:02:01', 'host3-eth0')
+ host3.setMAC('00:00:00:00:02:02', 'host3-eth1')
+ #host3.setIP('172.16.20.254', 24, 'host3-eth2')
+ host3.setIP('3.0.0.254', 8, 'host3-eth2')
+ host3.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+
+ host3.setIP('1.168.30.2', 24, 'host3-eth3')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_ignore=1')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_announce=1')
+ as2host = net.get('as2host')
+ #as2host.defaultIntf().setIP('172.16.20.1/24')
+ for i in range(0, 20):
+ as2host.cmd('sudo ip addr add 3.0.%d.1/24 dev as2host-eth0' %i)
+ as2host.setIP('1.168.30.100', 24, 'as2host-eth1')
+
+ as2host.cmd('ip route add default via 3.0.0.254')
+
+ # Set up AS3
+ host4.setIP('192.168.30.1', 24, 'host4-eth0')
+ host4.setMAC('00:00:00:00:03:01', 'host4-eth0')
+ host4.setIP('4.0.0.254', 8, 'host4-eth1')
+ host4.setMAC('00:00:00:00:03:99', 'host4-eth1')
+ host4.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ as3host = net.get('as3host')
+ for i in range(0, 20):
+ as3host.cmd('sudo ip addr add 4.0.%d.1/24 dev as3host-eth0' %i)
+ as3host.cmd('ip route add default via 4.0.0.254')
+
+ #root space
+ host4.setIP('1.168.30.3', 24, 'host4-eth2')
+ host4.setMAC('00:00:00:00:03:03', 'host4-eth2')
+
+ # Set up AS4
+ #as4host = net.get('as4host')
+ #as4host.defaultIntf().setIP('172.16.40.1/24')
+ #as4host.cmd('ip route add default via 172.16.40.254')
+
+ # setup interface address for 100 quagga hosts
+ time.sleep(10)
+ #for i in range(numHost101, numHost200 + 1):
+ #host100 = net.get('host' + str(i))
+ #host100.cmd(str(i)+'.0.1.254', 24, 'host'+str(i)+'-eth1')
+ #as4host100 = net.get('as4host%s' %(i))
+ #as4host100.defaultIntf().setIP(str(i) + '.0.0.1/24')
+ #as4host100.cmd('ip route add default via ' + str(i) + '.0.0.254')
+ #for j in range(0, 100):
+ #as4host100.cmd('sudo ip addr add %d.0.%d.1/24 dev %s-eth0' %(i, j, as4host100))
+
+ # Set up AS6 - This has a router and a route server
+ #as6rs, host5 = net.get('as6rs', 'host5')
+ host5 = net.get('host5')
+ #as6rs.setIP('192.168.60.1', 24, 'as6rs-eth0')
+ #as6rs.setMAC('00:00:00:00:06:01', 'as6rs-eth0')
+ host5.setIP('192.168.60.2', 24, 'host5-eth0')
+ host5.setMAC('00:00:00:00:06:02', 'host5-eth0')
+ #as6router.setIP('172.16.60.254', 24, 'as6router-eth1')
+ host5.setIP('5.0.0.254', 8, 'host5-eth1')
+ host5.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ host5.setIP('1.168.30.5', 24, 'host5-eth2')
+ host5.setMAC('00:00:00:00:06:05', 'host5-eth2')
+
+ as6host = net.get('as6host')
+ #as6host.defaultIntf().setIP('5.0.0.1/24')
+ for i in range(0, 10):
+ as6host.cmd('sudo ip addr add 5.0.%d.1/24 dev as6host-eth0' %i)
+ as6host.cmd('ip route add default via 5.0.0.254')
+
+ # test the host in the as6
+ #for i in range(1, 10):
+ # baseip = (i-1)*4
+ # host = net.get('as6host%d' % i)
+ # host.defaultIntf().setIP('172.16.70.%d/24' % (baseip+1))
+ # host.cmd('ip route add default via 172.16.70.%d' % (baseip+2))
+ # as6router.setIP('172.16.70.%d' % (baseip+2), 30, 'as6router-eth%d' % (i+1))
+
+ # Start Quagga on border routers
+ startquagga(host3, 1, QUAGGA_CONFIG_FILE_DIR + '/quagga1.conf')
+ startquagga(host4, 2, QUAGGA_CONFIG_FILE_DIR + '/quagga2.conf')
+ #for i in range(numHost101, numHost200 + 1):
+ #host100=net.get('host%d' % (i))
+ #startquaggahost5(host100, i)
+
+ #startquagga(as6rs, 4, 'quagga-as6-rs.conf')
+ startquagga(host5, 5, QUAGGA_CONFIG_FILE_DIR + '/quagga-as6.conf')
+
+ #root1, root2, rootTestOn = net.get( 'root1', 'root2', 'rootTestOn' )
+ root1, rootTestOn = net.get( 'root1', 'rootTestOn' )
+ host1.intf('host1-eth1').setIP('1.1.1.1/24')
+ root1.intf('root1-eth0').setIP('1.1.1.2/24')
+ #host2.intf('host2-eth1').setIP('1.1.2.1/24')
+ #root2.intf('root2-eth0').setIP('1.1.2.2/24')
+
+ #rootTestOn.cmd('ip addr add 1.168.30.102/24 dev rootTestOn-eth0')
+ rootTestOn.cmd('ip addr add 1.168.30.99/24 dev rootTestOn-eth0')
+
+ stopsshd()
+
+ startquagga(host1, 100, QUAGGA_CONFIG_FILE_DIR + '/quagga-sdn-modified.conf')
+ hosts = [ host1, host3, host4, host5, as2host ];
+ #sshdHosts = sshdHosts + hosts
+ startsshds( hosts )
+ #
+ onos1 = '127.0.0.1'
+ forwarding1 = '%s:2000:%s:2000' % ('1.1.1.2', onos1)
+ root1.cmd( 'ssh -nNT -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % (forwarding1, onos1) )
+
+ # Forward 2605 to root namespace for easier access to SDN domain BGPd
+ # If root can ssh to itself without a password this should work
+ root1.cmd('ssh -N -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -L 2605:1.1.1.1:2605 1.1.1.1 &')
+ #time.sleep(3000000000)
+ CLI( net )
+
+ # Close the ssh port forwarding
+ #quietRun('sudo pkill -f 1.1.1.1')
+
+ stopsshd()
+ stopquagga()
+ net.stop()
+
+if __name__ == '__main__':
+ setLogLevel( 'debug' )
+ if len(sys.argv) > 1:
+ QUAGGA_CONFIG_FILE_DIR = sys.argv[1]
+ sdn1net()
diff --git a/TestON/tests/PeeringRouterTest/mininet/quagga-as6-rs.conf b/TestON/tests/PeeringRouterTest/mininet/quagga-as6-rs.conf
new file mode 100644
index 0000000..1eac0dd
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/mininet/quagga-as6-rs.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64520
+ bgp router-id 192.168.60.1
+ neighbor 192.168.60.101 remote-as 64513
+ neighbor 192.168.60.101 route-server-client
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 route-server-client
+! network 172.16.60.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/mininet/quagga-as6.conf b/TestON/tests/PeeringRouterTest/mininet/quagga-as6.conf
new file mode 100644
index 0000000..434f983
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/mininet/quagga-as6.conf
@@ -0,0 +1,39 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64521
+ bgp router-id 192.168.60.2
+ neighbor 192.168.60.101 remote-as 64513
+! neighbor 192.168.60.1 remote-as 64520
+! neighbor 192.168.60.3 remote-as 64520
+! network 172.16.60.0/24
+! network 172.16.70.4/30
+ ! network 172.16.70.8/30
+ ! network 172.16.70.12/30
+ ! network 172.16.70.16/30
+ ! network 172.16.70.20/30
+ ! network 172.16.70.24/30
+ ! network 172.16.70.28/30
+ ! network 172.16.70.32/30
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/mininet/quagga-sdn-modified.conf b/TestON/tests/PeeringRouterTest/mininet/quagga-sdn-modified.conf
new file mode 100644
index 0000000..d334c2a
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/mininet/quagga-sdn-modified.conf
@@ -0,0 +1,49 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 ebgp-multihop
+ neighbor 192.168.60.2 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/mininet/quagga-sdn.conf b/TestON/tests/PeeringRouterTest/mininet/quagga-sdn.conf
new file mode 100644
index 0000000..77392a6
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/mininet/quagga-sdn.conf
@@ -0,0 +1,349 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.1 remote-as 64520
+ neighbor 192.168.60.1 ebgp-multihop
+ neighbor 192.168.60.1 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+neighbor 192.168.40.1 remote-as 65001
+neighbor 192.168.40.1 ebgp-multihop
+neighbor 192.168.40.1 timers connect 10
+neighbor 192.168.40.2 remote-as 65002
+neighbor 192.168.40.2 ebgp-multihop
+neighbor 192.168.40.2 timers connect 10
+neighbor 192.168.40.3 remote-as 65003
+neighbor 192.168.40.3 ebgp-multihop
+neighbor 192.168.40.3 timers connect 10
+neighbor 192.168.40.4 remote-as 65004
+neighbor 192.168.40.4 ebgp-multihop
+neighbor 192.168.40.4 timers connect 10
+neighbor 192.168.40.5 remote-as 65005
+neighbor 192.168.40.5 ebgp-multihop
+neighbor 192.168.40.5 timers connect 10
+neighbor 192.168.40.6 remote-as 65006
+neighbor 192.168.40.6 ebgp-multihop
+neighbor 192.168.40.6 timers connect 10
+neighbor 192.168.40.7 remote-as 65007
+neighbor 192.168.40.7 ebgp-multihop
+neighbor 192.168.40.7 timers connect 10
+neighbor 192.168.40.8 remote-as 65008
+neighbor 192.168.40.8 ebgp-multihop
+neighbor 192.168.40.8 timers connect 10
+neighbor 192.168.40.9 remote-as 65009
+neighbor 192.168.40.9 ebgp-multihop
+neighbor 192.168.40.9 timers connect 10
+neighbor 192.168.40.10 remote-as 65010
+neighbor 192.168.40.10 ebgp-multihop
+neighbor 192.168.40.10 timers connect 10
+neighbor 192.168.40.11 remote-as 65011
+neighbor 192.168.40.11 ebgp-multihop
+neighbor 192.168.40.11 timers connect 10
+neighbor 192.168.40.12 remote-as 65012
+neighbor 192.168.40.12 ebgp-multihop
+neighbor 192.168.40.12 timers connect 10
+neighbor 192.168.40.13 remote-as 65013
+neighbor 192.168.40.13 ebgp-multihop
+neighbor 192.168.40.13 timers connect 10
+neighbor 192.168.40.14 remote-as 65014
+neighbor 192.168.40.14 ebgp-multihop
+neighbor 192.168.40.14 timers connect 10
+neighbor 192.168.40.15 remote-as 65015
+neighbor 192.168.40.15 ebgp-multihop
+neighbor 192.168.40.15 timers connect 10
+neighbor 192.168.40.16 remote-as 65016
+neighbor 192.168.40.16 ebgp-multihop
+neighbor 192.168.40.16 timers connect 10
+neighbor 192.168.40.17 remote-as 65017
+neighbor 192.168.40.17 ebgp-multihop
+neighbor 192.168.40.17 timers connect 10
+neighbor 192.168.40.18 remote-as 65018
+neighbor 192.168.40.18 ebgp-multihop
+neighbor 192.168.40.18 timers connect 10
+neighbor 192.168.40.19 remote-as 65019
+neighbor 192.168.40.19 ebgp-multihop
+neighbor 192.168.40.19 timers connect 10
+neighbor 192.168.40.20 remote-as 65020
+neighbor 192.168.40.20 ebgp-multihop
+neighbor 192.168.40.20 timers connect 10
+neighbor 192.168.40.21 remote-as 65021
+neighbor 192.168.40.21 ebgp-multihop
+neighbor 192.168.40.21 timers connect 10
+neighbor 192.168.40.22 remote-as 65022
+neighbor 192.168.40.22 ebgp-multihop
+neighbor 192.168.40.22 timers connect 10
+neighbor 192.168.40.23 remote-as 65023
+neighbor 192.168.40.23 ebgp-multihop
+neighbor 192.168.40.23 timers connect 10
+neighbor 192.168.40.24 remote-as 65024
+neighbor 192.168.40.24 ebgp-multihop
+neighbor 192.168.40.24 timers connect 10
+neighbor 192.168.40.25 remote-as 65025
+neighbor 192.168.40.25 ebgp-multihop
+neighbor 192.168.40.25 timers connect 10
+neighbor 192.168.40.26 remote-as 65026
+neighbor 192.168.40.26 ebgp-multihop
+neighbor 192.168.40.26 timers connect 10
+neighbor 192.168.40.27 remote-as 65027
+neighbor 192.168.40.27 ebgp-multihop
+neighbor 192.168.40.27 timers connect 10
+neighbor 192.168.40.28 remote-as 65028
+neighbor 192.168.40.28 ebgp-multihop
+neighbor 192.168.40.28 timers connect 10
+neighbor 192.168.40.29 remote-as 65029
+neighbor 192.168.40.29 ebgp-multihop
+neighbor 192.168.40.29 timers connect 10
+neighbor 192.168.40.30 remote-as 65030
+neighbor 192.168.40.30 ebgp-multihop
+neighbor 192.168.40.30 timers connect 10
+neighbor 192.168.40.31 remote-as 65031
+neighbor 192.168.40.31 ebgp-multihop
+neighbor 192.168.40.31 timers connect 10
+neighbor 192.168.40.32 remote-as 65032
+neighbor 192.168.40.32 ebgp-multihop
+neighbor 192.168.40.32 timers connect 10
+neighbor 192.168.40.33 remote-as 65033
+neighbor 192.168.40.33 ebgp-multihop
+neighbor 192.168.40.33 timers connect 10
+neighbor 192.168.40.34 remote-as 65034
+neighbor 192.168.40.34 ebgp-multihop
+neighbor 192.168.40.34 timers connect 10
+neighbor 192.168.40.35 remote-as 65035
+neighbor 192.168.40.35 ebgp-multihop
+neighbor 192.168.40.35 timers connect 10
+neighbor 192.168.40.36 remote-as 65036
+neighbor 192.168.40.36 ebgp-multihop
+neighbor 192.168.40.36 timers connect 10
+neighbor 192.168.40.37 remote-as 65037
+neighbor 192.168.40.37 ebgp-multihop
+neighbor 192.168.40.37 timers connect 10
+neighbor 192.168.40.38 remote-as 65038
+neighbor 192.168.40.38 ebgp-multihop
+neighbor 192.168.40.38 timers connect 10
+neighbor 192.168.40.39 remote-as 65039
+neighbor 192.168.40.39 ebgp-multihop
+neighbor 192.168.40.39 timers connect 10
+neighbor 192.168.40.40 remote-as 65040
+neighbor 192.168.40.40 ebgp-multihop
+neighbor 192.168.40.40 timers connect 10
+neighbor 192.168.40.41 remote-as 65041
+neighbor 192.168.40.41 ebgp-multihop
+neighbor 192.168.40.41 timers connect 10
+neighbor 192.168.40.42 remote-as 65042
+neighbor 192.168.40.42 ebgp-multihop
+neighbor 192.168.40.42 timers connect 10
+neighbor 192.168.40.43 remote-as 65043
+neighbor 192.168.40.43 ebgp-multihop
+neighbor 192.168.40.43 timers connect 10
+neighbor 192.168.40.44 remote-as 65044
+neighbor 192.168.40.44 ebgp-multihop
+neighbor 192.168.40.44 timers connect 10
+neighbor 192.168.40.45 remote-as 65045
+neighbor 192.168.40.45 ebgp-multihop
+neighbor 192.168.40.45 timers connect 10
+neighbor 192.168.40.46 remote-as 65046
+neighbor 192.168.40.46 ebgp-multihop
+neighbor 192.168.40.46 timers connect 10
+neighbor 192.168.40.47 remote-as 65047
+neighbor 192.168.40.47 ebgp-multihop
+neighbor 192.168.40.47 timers connect 10
+neighbor 192.168.40.48 remote-as 65048
+neighbor 192.168.40.48 ebgp-multihop
+neighbor 192.168.40.48 timers connect 10
+neighbor 192.168.40.49 remote-as 65049
+neighbor 192.168.40.49 ebgp-multihop
+neighbor 192.168.40.49 timers connect 10
+neighbor 192.168.40.50 remote-as 65050
+neighbor 192.168.40.50 ebgp-multihop
+neighbor 192.168.40.50 timers connect 10
+neighbor 192.168.40.51 remote-as 65051
+neighbor 192.168.40.51 ebgp-multihop
+neighbor 192.168.40.51 timers connect 10
+neighbor 192.168.40.52 remote-as 65052
+neighbor 192.168.40.52 ebgp-multihop
+neighbor 192.168.40.52 timers connect 10
+neighbor 192.168.40.53 remote-as 65053
+neighbor 192.168.40.53 ebgp-multihop
+neighbor 192.168.40.53 timers connect 10
+neighbor 192.168.40.54 remote-as 65054
+neighbor 192.168.40.54 ebgp-multihop
+neighbor 192.168.40.54 timers connect 10
+neighbor 192.168.40.55 remote-as 65055
+neighbor 192.168.40.55 ebgp-multihop
+neighbor 192.168.40.55 timers connect 10
+neighbor 192.168.40.56 remote-as 65056
+neighbor 192.168.40.56 ebgp-multihop
+neighbor 192.168.40.56 timers connect 10
+neighbor 192.168.40.57 remote-as 65057
+neighbor 192.168.40.57 ebgp-multihop
+neighbor 192.168.40.57 timers connect 10
+neighbor 192.168.40.58 remote-as 65058
+neighbor 192.168.40.58 ebgp-multihop
+neighbor 192.168.40.58 timers connect 10
+neighbor 192.168.40.59 remote-as 65059
+neighbor 192.168.40.59 ebgp-multihop
+neighbor 192.168.40.59 timers connect 10
+neighbor 192.168.40.60 remote-as 65060
+neighbor 192.168.40.60 ebgp-multihop
+neighbor 192.168.40.60 timers connect 10
+neighbor 192.168.40.61 remote-as 65061
+neighbor 192.168.40.61 ebgp-multihop
+neighbor 192.168.40.61 timers connect 10
+neighbor 192.168.40.62 remote-as 65062
+neighbor 192.168.40.62 ebgp-multihop
+neighbor 192.168.40.62 timers connect 10
+neighbor 192.168.40.63 remote-as 65063
+neighbor 192.168.40.63 ebgp-multihop
+neighbor 192.168.40.63 timers connect 10
+neighbor 192.168.40.64 remote-as 65064
+neighbor 192.168.40.64 ebgp-multihop
+neighbor 192.168.40.64 timers connect 10
+neighbor 192.168.40.65 remote-as 65065
+neighbor 192.168.40.65 ebgp-multihop
+neighbor 192.168.40.65 timers connect 10
+neighbor 192.168.40.66 remote-as 65066
+neighbor 192.168.40.66 ebgp-multihop
+neighbor 192.168.40.66 timers connect 10
+neighbor 192.168.40.67 remote-as 65067
+neighbor 192.168.40.67 ebgp-multihop
+neighbor 192.168.40.67 timers connect 10
+neighbor 192.168.40.68 remote-as 65068
+neighbor 192.168.40.68 ebgp-multihop
+neighbor 192.168.40.68 timers connect 10
+neighbor 192.168.40.69 remote-as 65069
+neighbor 192.168.40.69 ebgp-multihop
+neighbor 192.168.40.69 timers connect 10
+neighbor 192.168.40.70 remote-as 65070
+neighbor 192.168.40.70 ebgp-multihop
+neighbor 192.168.40.70 timers connect 10
+neighbor 192.168.40.71 remote-as 65071
+neighbor 192.168.40.71 ebgp-multihop
+neighbor 192.168.40.71 timers connect 10
+neighbor 192.168.40.72 remote-as 65072
+neighbor 192.168.40.72 ebgp-multihop
+neighbor 192.168.40.72 timers connect 10
+neighbor 192.168.40.73 remote-as 65073
+neighbor 192.168.40.73 ebgp-multihop
+neighbor 192.168.40.73 timers connect 10
+neighbor 192.168.40.74 remote-as 65074
+neighbor 192.168.40.74 ebgp-multihop
+neighbor 192.168.40.74 timers connect 10
+neighbor 192.168.40.75 remote-as 65075
+neighbor 192.168.40.75 ebgp-multihop
+neighbor 192.168.40.75 timers connect 10
+neighbor 192.168.40.76 remote-as 65076
+neighbor 192.168.40.76 ebgp-multihop
+neighbor 192.168.40.76 timers connect 10
+neighbor 192.168.40.77 remote-as 65077
+neighbor 192.168.40.77 ebgp-multihop
+neighbor 192.168.40.77 timers connect 10
+neighbor 192.168.40.78 remote-as 65078
+neighbor 192.168.40.78 ebgp-multihop
+neighbor 192.168.40.78 timers connect 10
+neighbor 192.168.40.79 remote-as 65079
+neighbor 192.168.40.79 ebgp-multihop
+neighbor 192.168.40.79 timers connect 10
+neighbor 192.168.40.80 remote-as 65080
+neighbor 192.168.40.80 ebgp-multihop
+neighbor 192.168.40.80 timers connect 10
+neighbor 192.168.40.81 remote-as 65081
+neighbor 192.168.40.81 ebgp-multihop
+neighbor 192.168.40.81 timers connect 10
+neighbor 192.168.40.82 remote-as 65082
+neighbor 192.168.40.82 ebgp-multihop
+neighbor 192.168.40.82 timers connect 10
+neighbor 192.168.40.83 remote-as 65083
+neighbor 192.168.40.83 ebgp-multihop
+neighbor 192.168.40.83 timers connect 10
+neighbor 192.168.40.84 remote-as 65084
+neighbor 192.168.40.84 ebgp-multihop
+neighbor 192.168.40.84 timers connect 10
+neighbor 192.168.40.85 remote-as 65085
+neighbor 192.168.40.85 ebgp-multihop
+neighbor 192.168.40.85 timers connect 10
+neighbor 192.168.40.86 remote-as 65086
+neighbor 192.168.40.86 ebgp-multihop
+neighbor 192.168.40.86 timers connect 10
+neighbor 192.168.40.87 remote-as 65087
+neighbor 192.168.40.87 ebgp-multihop
+neighbor 192.168.40.87 timers connect 10
+neighbor 192.168.40.88 remote-as 65088
+neighbor 192.168.40.88 ebgp-multihop
+neighbor 192.168.40.88 timers connect 10
+neighbor 192.168.40.89 remote-as 65089
+neighbor 192.168.40.89 ebgp-multihop
+neighbor 192.168.40.89 timers connect 10
+neighbor 192.168.40.90 remote-as 65090
+neighbor 192.168.40.90 ebgp-multihop
+neighbor 192.168.40.90 timers connect 10
+neighbor 192.168.40.91 remote-as 65091
+neighbor 192.168.40.91 ebgp-multihop
+neighbor 192.168.40.91 timers connect 10
+neighbor 192.168.40.92 remote-as 65092
+neighbor 192.168.40.92 ebgp-multihop
+neighbor 192.168.40.92 timers connect 10
+neighbor 192.168.40.93 remote-as 65093
+neighbor 192.168.40.93 ebgp-multihop
+neighbor 192.168.40.93 timers connect 10
+neighbor 192.168.40.94 remote-as 65094
+neighbor 192.168.40.94 ebgp-multihop
+neighbor 192.168.40.94 timers connect 10
+neighbor 192.168.40.95 remote-as 65095
+neighbor 192.168.40.95 ebgp-multihop
+neighbor 192.168.40.95 timers connect 10
+neighbor 192.168.40.96 remote-as 65096
+neighbor 192.168.40.96 ebgp-multihop
+neighbor 192.168.40.96 timers connect 10
+neighbor 192.168.40.97 remote-as 65097
+neighbor 192.168.40.97 ebgp-multihop
+neighbor 192.168.40.97 timers connect 10
+neighbor 192.168.40.98 remote-as 65098
+neighbor 192.168.40.98 ebgp-multihop
+neighbor 192.168.40.98 timers connect 10
+neighbor 192.168.40.99 remote-as 65099
+neighbor 192.168.40.99 ebgp-multihop
+neighbor 192.168.40.99 timers connect 10
+neighbor 192.168.40.100 remote-as 65100
+neighbor 192.168.40.100 ebgp-multihop
+neighbor 192.168.40.100 timers connect 10
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/mininet/quagga1.conf b/TestON/tests/PeeringRouterTest/mininet/quagga1.conf
new file mode 100644
index 0000000..264f85e
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/mininet/quagga1.conf
@@ -0,0 +1,32 @@
+!
+! Zebra configuration saved from vty
+! 2014/11/25 11:22:24
+!
+hostname bgpd
+password hello
+log stdout
+!
+router bgp 64514
+ bgp router-id 192.168.10.1
+! network 3.0.0.0/24
+! network 3.0.1.0/24
+! network 3.0.2.0/24
+! network 3.0.3.0/24
+! network 3.0.4.0/24
+! network 3.0.5.0/24
+! network 3.0.6.0/24
+! network 3.0.7.0/24
+! network 3.0.8.0/24
+! network 3.0.9.0/24
+ neighbor 192.168.20.101 remote-as 64513
+ neighbor 192.168.20.101 route-map PREPEND2 in
+ neighbor 192.168.20.101 route-map PREPEND2 out
+!
+route-map PREPEND1 permit 1
+ set as-path prepend 64514
+!
+route-map PREPEND2 permit 2
+ set as-path prepend 64514 64514
+!
+line vty
+!
diff --git a/TestON/tests/PeeringRouterTest/mininet/quagga2.conf b/TestON/tests/PeeringRouterTest/mininet/quagga2.conf
new file mode 100644
index 0000000..20ca9e4
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/mininet/quagga2.conf
@@ -0,0 +1,31 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64516
+ bgp router-id 192.168.30.1
+! timers bgp 1 3
+ neighbor 192.168.30.101 remote-as 64513
+! neighbor 192.168.50.2 remote-as 65001
+! network 172.16.30.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/mininet/zebra.conf b/TestON/tests/PeeringRouterTest/mininet/zebra.conf
new file mode 100644
index 0000000..0f8e3a2
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/mininet/zebra.conf
@@ -0,0 +1,26 @@
+! -*- zebra -*-
+!
+! zebra sample configuration file
+!
+! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
+!
+hostname zebra
+password hello
+enable password 0fw0rk
+log stdout
+!
+! Interfaces description.
+!
+!interface lo
+! description test of desc.
+!
+!interface sit0
+! multicast
+
+!
+! Static default route sample.
+!
+!ip route 0.0.0.0/0 203.181.89.241
+!
+
+!log file /usr/local/var/log/quagga/zebra.log
diff --git a/TestON/tests/PeeringRouterTest/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg b/TestON/tests/PeeringRouterTest/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg
new file mode 100644
index 0000000..5feaf1d
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/org.onosproject.openflow.controller.impl.OpenFlowControllerImpl.cfg
@@ -0,0 +1 @@
+corsaDpid = 00:00:00:00:00:00:00:01
diff --git a/TestON/tests/PeeringRouterTest/org.onosproject.provider.lldp.impl.LLDPLinkProvider.cfg b/TestON/tests/PeeringRouterTest/org.onosproject.provider.lldp.impl.LLDPLinkProvider.cfg
new file mode 100644
index 0000000..65c7bf3
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/org.onosproject.provider.lldp.impl.LLDPLinkProvider.cfg
@@ -0,0 +1,19 @@
+# Sample configuration for link discovery
+# Note that this file location is required for packaging onos and launching it in another localtion.
+# If you are launching onos locally, this configuration file would be placed at: $(KARAF_ROOT)/etc
+
+#
+# Disable Link Dicovery Permanently (Note: changing this property at runtime will have NO effect)
+#
+disableLinkDiscovery = true
+
+#
+# Enable Broadcast Discovery Protocol
+#
+#useBDDP = false
+
+#
+# Disable LLDP's recieved from specific devices
+# Details of the devices are in the file configured below
+#
+#lldpSuppression =
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/PeeringRouterConvergenceMininet.py b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/PeeringRouterConvergenceMininet.py
new file mode 100755
index 0000000..13c66ac
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/PeeringRouterConvergenceMininet.py
@@ -0,0 +1,346 @@
+#!/usr/bin/python
+
+"""
+Start up the SDN-IP demo topology
+"""
+
+"""
+AS1 = 64513, (SDN AS)
+AS2 = 64514, reachable by 192.168.10.1, 192.168.20.1
+AS3 = 64516, reachable by 192.168.30.1
+AS4 = 64517, reachable by 192.168.40.1
+AS6 = 64520, reachable by 192.168.60.2, (route server 192.168.60.1)
+"""
+
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+
+import os.path
+import time
+import sys
+from subprocess import Popen, STDOUT, PIPE
+
+QUAGGA_DIR = '/usr/lib/quagga'
+#QUAGGA_DIR = '/usr/local/sbin'
+QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
+
+QUAGGA_CONFIG_FILE_DIR = '/home/tutorial1/ONLabTest/TestON/tests/PeeringRouterTest/mininet'
+
+class SDNIpModifiedTopo( Topo ):
+ "SDN Ip Modified Topology"
+
+ def __init__( self, *args, **kwargs ):
+ global numHost101
+ global numHost200
+ numHost101 = 101
+ numHost200 = 200
+ Topo.__init__( self, *args, **kwargs )
+ sw1 = self.addSwitch('sw1', dpid='0000000000000001')
+ sw2 = self.addSwitch('sw2', dpid='0000000000000002')
+ #sw3 = self.addSwitch('sw3', dpid='00000000000000a3')
+ #sw4 = self.addSwitch('sw4', dpid='00000000000000a4')
+ #sw5 = self.addSwitch('sw5', dpid='00000000000000a5')
+ #sw6 = self.addSwitch('sw6', dpid='00000000000000a6')
+ #add a switch for 3 quagga hosts
+ swTestOn = self.addSwitch('swTestOn', dpid='0000000000000102')
+ #Note this switch isn't part of the SDN topology
+ #We'll use the ovs-controller to turn this into a learning switch
+ as6sw = self.addSwitch('as6sw', dpid='00000000000000a7')
+
+ host1 = self.addHost( 'host1' )
+ root1 = self.addHost( 'root1', inNamespace=False , ip='0')
+ rootTestOn = self.addHost( 'rootTestOn', inNamespace=False, ip='0' )
+
+ #AS2 host
+ host3 = self.addHost( 'host3' )
+ as2host = self.addHost( 'as2host' )
+ #AS3 host
+ host4 = self.addHost( 'host4' )
+ as3host = self.addHost( 'as3host' )
+ #AS6 host
+ host5 = self.addHost( 'host5' )
+ as6host = self.addHost( 'as6host' )
+
+ self.addLink( host1, sw2 )
+ #Links to the multihomed AS
+ self.addLink( host3, sw1 )
+ self.addLink( host3, sw1 )
+ self.addLink( as2host, host3 )
+ #Single links to the remaining two ASes
+ self.addLink( host4, sw1 )
+ self.addLink( as3host, host4 )
+
+ #AS3-AS4 link
+ #self.addLink( host4, host5)
+ #Add new AS6 to its bridge
+ self.addLink( host5, as6sw )
+ self.addLink( as6host, host5 )
+
+ #Backup link from router5 to router4
+ self.addLink( host4, host5)
+
+ #test the host behind the router(behind the router server)
+# for i in range(1, 10):
+ # host = self.addHost('as6host%d' % i)
+ # self.addLink(host, as6router)
+
+ ## Internal Connection To Hosts ##
+ self.addLink( root1, host1 )
+
+ # self.addLink( sw1, sw2 )
+ # self.addLink( sw1, sw3 )
+ # self.addLink( sw2, sw4 )
+ # self.addLink( sw3, sw4 )
+ # self.addLink( sw3, sw5 )
+ # self.addLink( sw4, sw6 )
+ # self.addLink( sw5, sw6 )
+ self.addLink( as6sw, sw1 )
+
+
+ self.addLink(swTestOn, rootTestOn)
+ #self.addLink(swTestOn, host1)
+ self.addLink(swTestOn, host3)
+ self.addLink(swTestOn, host4)
+ self.addLink(swTestOn, host5)
+ self.addLink(swTestOn, as2host)
+
+
+ #self.addLink(rootTestOn, host4)
+
+def startsshd( host ):
+ "Start sshd on host"
+ info( '*** Starting sshd\n' )
+ name, intf, ip = host.name, host.defaultIntf(), host.IP()
+ banner = '/tmp/%s.banner' % name
+ host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
+ host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+ info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+ for h in hosts:
+ startsshd( h )
+
+def stopsshd( ):
+ "Stop *all* sshd processes with a custom banner"
+ info( '*** Shutting down stale sshd/Banner processes ',
+ quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def startquagga( host, num, config_file ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ print zebra_cmd
+ print quagga_cmd
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+def startquaggahost5( host, num ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+
+def stopquagga( ):
+ quietRun( 'sudo pkill -9 -f bgpd' )
+ quietRun( 'sudo pkill -9 -f zebra' )
+
+def sdn1net():
+ topo = SDNIpModifiedTopo()
+ info( '*** Creating network\n' )
+ net = Mininet( topo=topo, controller=RemoteController )
+ net = Mininet( topo=topo, controller=RemoteController )
+
+ host1, host3, host4, host5 = net.get( 'host1', 'host3', 'host4', 'host5' )
+
+ #host100.setIP('1.168.30.' + str(i), 24, str(host100) + "-eth2")
+
+ #host500.setMAC('00:00:00:00:04:%d' % (i-101), 'host%d-eth0' %(i))
+ #add IP prefixes
+ #for j in range(0,121):
+ #host100.cmd('sudo ip addr add %s.0.40.%s/24 dev host%s-eth0' %(i,j,i))
+
+ ## Adding 2nd, 3rd and 4th interface to host1 connected to sw1 (for another BGP peering)
+ #sw1 = net.get('sw1')
+ host1.setMAC('00:00:00:00:00:01', 'host1-eth0')
+ host1.cmd('ip addr add 192.168.20.101/24 dev host1-eth0')
+ host1.cmd('ip addr add 192.168.30.101/24 dev host1-eth0')
+ #host1.cmd('ip addr add 192.168.40.101/24 dev host1-eth0')
+ host1.cmd('ip addr add 192.168.60.101/24 dev host1-eth0')
+
+ # Net has to be start after adding the above link
+ net.start()
+
+ # Set up as6sw as a learning switch as quickly as possible so it
+ # hopefully doesn't connect to the actual controller
+ # TODO figure out how to change controller before starting switch
+ as6sw = net.get('as6sw')
+ as6sw.cmd('ovs-vsctl set-controller as6sw none')
+ as6sw.cmd('ovs-vsctl set-fail-mode as6sw standalone')
+
+
+ sw1 = net.get('sw1')
+ sw1.cmd('ovs-vsctl set-controller sw1 tcp:127.0.0.1:6633')
+# sw2.cmd('ovs-vsctl set-controller sw2 tcp:127.0.0.1:6633')
+# sw3.cmd('ovs-vsctl set-controller sw3 tcp:127.0.0.1:6633')
+# sw4.cmd('ovs-vsctl set-controller sw4 tcp:127.0.0.1:6633')
+# sw5.cmd('ovs-vsctl set-controller sw5 tcp:127.0.0.1:6633')
+# sw6.cmd('ovs-vsctl set-controller sw6 tcp:127.0.0.1:6633')
+
+
+ swTestOn = net.get('swTestOn')
+ swTestOn.cmd('ovs-vsctl set-controller swTestOn none')
+ swTestOn.cmd('ovs-vsctl set-fail-mode swTestOn standalone')
+
+ host1.defaultIntf().setIP('192.168.10.101/24')
+ # Run BGPd
+ #host1.cmd('%s -d -f %s' % (BGPD, BGPD_CONF))
+ #host1.cmd('/sbin/route add default gw 192.168.10.254 dev %s-eth0' % (host1.name))
+
+ # Configure new host interfaces
+ #host2.defaultIntf().setIP('172.16.10.2/24')
+ #host2.defaultIntf().setMAC('00:00:00:00:01:02')
+ #host2.cmd('/sbin/route add default gw 172.16.10.254 dev %s-eth0' % (host2.name))
+
+ # Set up AS2
+ host3.setIP('192.168.10.1', 24, 'host3-eth0')
+ #host3.cmd('sudo ip addr add 172.16.20.1/24 dev host3-eth0')
+ host3.setIP('192.168.20.1', 24, 'host3-eth1')
+ host3.setMAC('00:00:00:00:02:01', 'host3-eth0')
+ host3.setMAC('00:00:00:00:02:02', 'host3-eth1')
+ #host3.setIP('172.16.20.254', 24, 'host3-eth2')
+ host3.setIP('3.0.0.254', 8, 'host3-eth2')
+ host3.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+
+ host3.setIP('1.168.30.2', 24, 'host3-eth3')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_ignore=1')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_announce=1')
+ as2host = net.get('as2host')
+ #as2host.defaultIntf().setIP('172.16.20.1/24')
+ for i in range(0, 20):
+ as2host.cmd('sudo ip addr add 3.0.%d.1/24 dev as2host-eth0' %i)
+ as2host.setIP('1.168.30.100', 24, 'as2host-eth1')
+
+ as2host.cmd('ip route add default via 3.0.0.254')
+
+ # Set up AS3
+ host4.setIP('192.168.30.1', 24, 'host4-eth0')
+ host4.setMAC('00:00:00:00:03:01', 'host4-eth0')
+ host4.setIP('4.0.0.254', 8, 'host4-eth1')
+ host4.setMAC('00:00:00:00:03:99', 'host4-eth1')
+ host4.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ as3host = net.get('as3host')
+ for i in range(0, 20):
+ as3host.cmd('sudo ip addr add 4.0.%d.1/24 dev as3host-eth0' %i)
+ as3host.cmd('ip route add default via 4.0.0.254')
+
+ host4.setIP('10.0.0.4', 24, 'host4-eth2')
+ host4.setMAC('00:00:00:00:03:33', 'host4-eth2')
+
+ #root space
+ host4.setIP('1.168.30.3', 24, 'host4-eth3')
+ host4.setMAC('00:00:00:00:03:03', 'host4-eth3')
+
+ # Set up AS4
+ #as4host = net.get('as4host')
+ #as4host.defaultIntf().setIP('172.16.40.1/24')
+ #as4host.cmd('ip route add default via 172.16.40.254')
+
+ # setup interface address for 100 quagga hosts
+ time.sleep(10)
+ #for i in range(numHost101, numHost200 + 1):
+ #host100 = net.get('host' + str(i))
+ #host100.cmd(str(i)+'.0.1.254', 24, 'host'+str(i)+'-eth1')
+ #as4host100 = net.get('as4host%s' %(i))
+ #as4host100.defaultIntf().setIP(str(i) + '.0.0.1/24')
+ #as4host100.cmd('ip route add default via ' + str(i) + '.0.0.254')
+ #for j in range(0, 100):
+ #as4host100.cmd('sudo ip addr add %d.0.%d.1/24 dev %s-eth0' %(i, j, as4host100))
+
+ # Set up AS6 - This has a router and a route server
+ #as6rs, host5 = net.get('as6rs', 'host5')
+ host5 = net.get('host5')
+ #as6rs.setIP('192.168.60.1', 24, 'as6rs-eth0')
+ #as6rs.setMAC('00:00:00:00:06:01', 'as6rs-eth0')
+ host5.setIP('192.168.60.2', 24, 'host5-eth0')
+ host5.setMAC('00:00:00:00:06:02', 'host5-eth0')
+ #as6router.setIP('172.16.60.254', 24, 'as6router-eth1')
+ host5.setIP('5.0.0.254', 8, 'host5-eth1')
+ host5.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ host5.setIP('10.0.0.5', 24, 'host5-eth2')
+ host5.setMAC('00:00:00:00:06:66', 'host5-eth2')
+ host5.setIP('1.168.30.5', 24, 'host5-eth3')
+ host5.setMAC('00:00:00:00:06:05', 'host5-eth3')
+
+ as6host = net.get('as6host')
+ #as6host.defaultIntf().setIP('5.0.0.1/24')
+ for i in range(0, 10):
+ as6host.cmd('sudo ip addr add 5.0.%d.1/24 dev as6host-eth0' %i)
+ as6host.cmd('ip route add default via 5.0.0.254')
+
+ # test the host in the as6
+ #for i in range(1, 10):
+ # baseip = (i-1)*4
+ # host = net.get('as6host%d' % i)
+ # host.defaultIntf().setIP('172.16.70.%d/24' % (baseip+1))
+ # host.cmd('ip route add default via 172.16.70.%d' % (baseip+2))
+ # as6router.setIP('172.16.70.%d' % (baseip+2), 30, 'as6router-eth%d' % (i+1))
+
+ # Start Quagga on border routers
+ startquagga(host3, 1, QUAGGA_CONFIG_FILE_DIR + '/quagga1.conf')
+ startquagga(host4, 2, QUAGGA_CONFIG_FILE_DIR + '/quagga2.conf')
+ #for i in range(numHost101, numHost200 + 1):
+ #host100=net.get('host%d' % (i))
+ #startquaggahost5(host100, i)
+
+ #startquagga(as6rs, 4, 'quagga-as6-rs.conf')
+ startquagga(host5, 5, QUAGGA_CONFIG_FILE_DIR + '/quagga-as6.conf')
+
+ #root1, root2, rootTestOn = net.get( 'root1', 'root2', 'rootTestOn' )
+ root1, rootTestOn = net.get( 'root1', 'rootTestOn' )
+ host1.intf('host1-eth1').setIP('1.1.1.1/24')
+ root1.intf('root1-eth0').setIP('1.1.1.2/24')
+ #host2.intf('host2-eth1').setIP('1.1.2.1/24')
+ #root2.intf('root2-eth0').setIP('1.1.2.2/24')
+
+ #rootTestOn.cmd('ip addr add 1.168.30.102/24 dev rootTestOn-eth0')
+ rootTestOn.cmd('ip addr add 1.168.30.99/24 dev rootTestOn-eth0')
+
+ stopsshd()
+
+ startquagga(host1, 100, QUAGGA_CONFIG_FILE_DIR + '/quagga-sdn-modified.conf')
+ hosts = [ host1, host3, host4, host5, as2host ];
+ #sshdHosts = sshdHosts + hosts
+ startsshds( hosts )
+ #
+ onos1 = '127.0.0.1'
+ forwarding1 = '%s:2000:%s:2000' % ('1.1.1.2', onos1)
+ root1.cmd( 'ssh -nNT -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % (forwarding1, onos1) )
+
+ # Forward 2605 to root namespace for easier access to SDN domain BGPd
+ # If root can ssh to itself without a password this should work
+ root1.cmd('ssh -N -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -L 2605:1.1.1.1:2605 1.1.1.1 &')
+ #time.sleep(3000000000)
+ CLI( net )
+
+ # Close the ssh port forwarding
+ #quietRun('sudo pkill -f 1.1.1.1')
+
+ stopsshd()
+ stopquagga()
+ net.stop()
+
+if __name__ == '__main__':
+ setLogLevel( 'debug' )
+ if len(sys.argv) > 1:
+ QUAGGA_CONFIG_FILE_DIR = sys.argv[1]
+ sdn1net()
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-as6.conf b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-as6.conf
new file mode 100644
index 0000000..5e7028d
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-as6.conf
@@ -0,0 +1,39 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64521
+ bgp router-id 192.168.60.2
+ neighbor 192.168.60.101 remote-as 64513
+ neighbor 10.0.0.4 remote-as 64516
+! neighbor 192.168.60.3 remote-as 64520
+! network 172.16.60.0/24
+! network 172.16.70.4/30
+ ! network 172.16.70.8/30
+ ! network 172.16.70.12/30
+ ! network 172.16.70.16/30
+ ! network 172.16.70.20/30
+ ! network 172.16.70.24/30
+ ! network 172.16.70.28/30
+ ! network 172.16.70.32/30
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-sdn-modified.conf b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-sdn-modified.conf
new file mode 100644
index 0000000..d334c2a
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga-sdn-modified.conf
@@ -0,0 +1,49 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 ebgp-multihop
+ neighbor 192.168.60.2 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga1.conf b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga1.conf
new file mode 100644
index 0000000..264f85e
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga1.conf
@@ -0,0 +1,32 @@
+!
+! Zebra configuration saved from vty
+! 2014/11/25 11:22:24
+!
+hostname bgpd
+password hello
+log stdout
+!
+router bgp 64514
+ bgp router-id 192.168.10.1
+! network 3.0.0.0/24
+! network 3.0.1.0/24
+! network 3.0.2.0/24
+! network 3.0.3.0/24
+! network 3.0.4.0/24
+! network 3.0.5.0/24
+! network 3.0.6.0/24
+! network 3.0.7.0/24
+! network 3.0.8.0/24
+! network 3.0.9.0/24
+ neighbor 192.168.20.101 remote-as 64513
+ neighbor 192.168.20.101 route-map PREPEND2 in
+ neighbor 192.168.20.101 route-map PREPEND2 out
+!
+route-map PREPEND1 permit 1
+ set as-path prepend 64514
+!
+route-map PREPEND2 permit 2
+ set as-path prepend 64514 64514
+!
+line vty
+!
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga2.conf b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga2.conf
new file mode 100644
index 0000000..14c7d67
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/quagga2.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64516
+ bgp router-id 192.168.30.1
+! timers bgp 1 3
+ neighbor 192.168.30.101 remote-as 64513
+ neighbor 10.0.0.5 remote-as 64521
+! neighbor 192.168.50.2 remote-as 65001
+! network 172.16.30.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/routeconvergence/mininet/zebra.conf b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/zebra.conf
new file mode 100644
index 0000000..0f8e3a2
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeconvergence/mininet/zebra.conf
@@ -0,0 +1,26 @@
+! -*- zebra -*-
+!
+! zebra sample configuration file
+!
+! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
+!
+hostname zebra
+password hello
+enable password 0fw0rk
+log stdout
+!
+! Interfaces description.
+!
+!interface lo
+! description test of desc.
+!
+!interface sit0
+! multicast
+
+!
+! Static default route sample.
+!
+!ip route 0.0.0.0/0 203.181.89.241
+!
+
+!log file /usr/local/var/log/quagga/zebra.log
diff --git a/TestON/tests/PeeringRouterTest/routeserver/addresses.json b/TestON/tests/PeeringRouterTest/routeserver/addresses.json
new file mode 100644
index 0000000..ee83480
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeserver/addresses.json
@@ -0,0 +1,30 @@
+{
+ "addresses" : [
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "1",
+ "ips" : ["192.168.10.101/24"],
+ "mac" : "00:00:00:00:00:01"
+
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "2",
+ "ips" : ["192.168.20.101/24"],
+ "mac" : "00:00:00:00:00:01"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "3",
+ "ips" : ["192.168.30.101/24"],
+ "mac" : "00:00:00:00:00:01"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "4",
+ "ips" : ["192.168.60.101/24"],
+ "mac" : "00:00:00:00:00:01"
+ }
+
+ ]
+}
diff --git a/TestON/tests/PeeringRouterTest/routeserver/mininet/PeeringRouteServerMininet.py b/TestON/tests/PeeringRouterTest/routeserver/mininet/PeeringRouteServerMininet.py
new file mode 100755
index 0000000..0c8cb08
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeserver/mininet/PeeringRouteServerMininet.py
@@ -0,0 +1,352 @@
+#!/usr/bin/python
+
+"""
+Start up the SDN-IP demo topology
+"""
+
+"""
+AS1 = 64513, (SDN AS)
+AS2 = 64514, reachable by 192.168.10.1, 192.168.20.1
+AS3 = 64516, reachable by 192.168.30.1
+AS4 = 64517, reachable by 192.168.40.1
+AS6 = 64520, reachable by 192.168.60.2, (route server 192.168.60.1)
+"""
+
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+
+import os.path
+import time
+import sys
+from subprocess import Popen, STDOUT, PIPE
+
+QUAGGA_DIR = '/usr/lib/quagga'
+#QUAGGA_DIR = '/usr/local/sbin'
+QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
+
+QUAGGA_CONFIG_FILE_DIR = '/home/tutorial1/ONLabTest/TestON/tests/PeeringRouterTest/mininet'
+
+class SDNIpModifiedTopo( Topo ):
+ "SDN Ip Modified Topology"
+
+ def __init__( self, *args, **kwargs ):
+ global numHost101
+ global numHost200
+ numHost101 = 101
+ numHost200 = 200
+ Topo.__init__( self, *args, **kwargs )
+ sw1 = self.addSwitch('sw1', dpid='0000000000000001')
+ sw2 = self.addSwitch('sw2', dpid='0000000000000002')
+ #sw3 = self.addSwitch('sw3', dpid='00000000000000a3')
+ #sw4 = self.addSwitch('sw4', dpid='00000000000000a4')
+ #sw5 = self.addSwitch('sw5', dpid='00000000000000a5')
+ #sw6 = self.addSwitch('sw6', dpid='00000000000000a6')
+ #add a switch for 3 quagga hosts
+ swTestOn = self.addSwitch('swTestOn', dpid='0000000000000102')
+ #Note this switch isn't part of the SDN topology
+ #We'll use the ovs-controller to turn this into a learning switch
+ as6sw = self.addSwitch('as6sw', dpid='00000000000000a7')
+
+ host1 = self.addHost( 'host1' )
+ root1 = self.addHost( 'root1', inNamespace=False , ip='0')
+ rootTestOn = self.addHost( 'rootTestOn', inNamespace=False, ip='0' )
+
+ #AS2 host
+ host3 = self.addHost( 'host3' )
+ as2host = self.addHost( 'as2host' )
+ #AS3 host
+ host4 = self.addHost( 'host4' )
+ as3host = self.addHost( 'as3host' )
+ #AS6 host
+ as6rs = self.addHost( 'as6rs' )
+ host5 = self.addHost( 'host5' )
+ as6host = self.addHost( 'as6host' )
+
+ self.addLink( host1, sw2 )
+ #Links to the multihomed AS
+ self.addLink( host3, sw1 )
+ self.addLink( host3, sw1 )
+ self.addLink( as2host, host3 )
+ #Single links to the remaining two ASes
+ self.addLink( host4, sw1 )
+ self.addLink( as3host, host4 )
+
+ #AS3-AS4 link
+ #self.addLink( host4, host5)
+ #Add new AS6 to its bridge
+ self.addLink( as6rs, as6sw )
+ self.addLink( host5, as6sw )
+ self.addLink( as6host, host5 )
+
+ #Backup link from router5 to router4
+ self.addLink( host4, host5)
+
+ #test the host behind the router(behind the router server)
+# for i in range(1, 10):
+ # host = self.addHost('as6host%d' % i)
+ # self.addLink(host, as6router)
+
+ ## Internal Connection To Hosts ##
+ self.addLink( root1, host1 )
+
+ # self.addLink( sw1, sw2 )
+ # self.addLink( sw1, sw3 )
+ # self.addLink( sw2, sw4 )
+ # self.addLink( sw3, sw4 )
+ # self.addLink( sw3, sw5 )
+ # self.addLink( sw4, sw6 )
+ # self.addLink( sw5, sw6 )
+ self.addLink( as6sw, sw1 )
+
+
+ self.addLink(swTestOn, rootTestOn)
+ #self.addLink(swTestOn, host1)
+ self.addLink(swTestOn, host3)
+ self.addLink(swTestOn, host4)
+ self.addLink(swTestOn, host5)
+ self.addLink(swTestOn, as2host)
+ self.addLink(swTestOn, as6rs)
+
+
+ #self.addLink(rootTestOn, host4)
+
+def startsshd( host ):
+ "Start sshd on host"
+ info( '*** Starting sshd\n' )
+ name, intf, ip = host.name, host.defaultIntf(), host.IP()
+ banner = '/tmp/%s.banner' % name
+ host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
+ host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+ info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+ for h in hosts:
+ startsshd( h )
+
+def stopsshd( ):
+ "Stop *all* sshd processes with a custom banner"
+ info( '*** Shutting down stale sshd/Banner processes ',
+ quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def startquagga( host, num, config_file ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ print zebra_cmd
+ print quagga_cmd
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+def startquaggahost5( host, num ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+
+def stopquagga( ):
+ quietRun( 'sudo pkill -9 -f bgpd' )
+ quietRun( 'sudo pkill -9 -f zebra' )
+
+def sdn1net():
+ topo = SDNIpModifiedTopo()
+ info( '*** Creating network\n' )
+ net = Mininet( topo=topo, controller=RemoteController )
+ net = Mininet( topo=topo, controller=RemoteController )
+
+ host1, host3, host4, host5 = net.get( 'host1', 'host3', 'host4', 'host5' )
+
+ #host100.setIP('1.168.30.' + str(i), 24, str(host100) + "-eth2")
+
+ #host500.setMAC('00:00:00:00:04:%d' % (i-101), 'host%d-eth0' %(i))
+ #add IP prefixes
+ #for j in range(0,121):
+ #host100.cmd('sudo ip addr add %s.0.40.%s/24 dev host%s-eth0' %(i,j,i))
+
+ ## Adding 2nd, 3rd and 4th interface to host1 connected to sw1 (for another BGP peering)
+ #sw1 = net.get('sw1')
+ host1.setMAC('00:00:00:00:00:01', 'host1-eth0')
+ host1.cmd('ip addr add 192.168.20.101/24 dev host1-eth0')
+ host1.cmd('ip addr add 192.168.30.101/24 dev host1-eth0')
+ #host1.cmd('ip addr add 192.168.40.101/24 dev host1-eth0')
+ host1.cmd('ip addr add 192.168.60.101/24 dev host1-eth0')
+
+ # Net has to be start after adding the above link
+ net.start()
+
+ # Set up as6sw as a learning switch as quickly as possible so it
+ # hopefully doesn't connect to the actual controller
+ # TODO figure out how to change controller before starting switch
+ as6sw = net.get('as6sw')
+ as6sw.cmd('ovs-vsctl set-controller as6sw none')
+ as6sw.cmd('ovs-vsctl set-fail-mode as6sw standalone')
+
+
+ sw1 = net.get('sw1')
+ sw1.cmd('ovs-vsctl set-controller sw1 tcp:127.0.0.1:6633')
+# sw2.cmd('ovs-vsctl set-controller sw2 tcp:127.0.0.1:6633')
+# sw3.cmd('ovs-vsctl set-controller sw3 tcp:127.0.0.1:6633')
+# sw4.cmd('ovs-vsctl set-controller sw4 tcp:127.0.0.1:6633')
+# sw5.cmd('ovs-vsctl set-controller sw5 tcp:127.0.0.1:6633')
+# sw6.cmd('ovs-vsctl set-controller sw6 tcp:127.0.0.1:6633')
+
+
+ swTestOn = net.get('swTestOn')
+ swTestOn.cmd('ovs-vsctl set-controller swTestOn none')
+ swTestOn.cmd('ovs-vsctl set-fail-mode swTestOn standalone')
+
+ host1.defaultIntf().setIP('192.168.10.101/24')
+ # Run BGPd
+ #host1.cmd('%s -d -f %s' % (BGPD, BGPD_CONF))
+ #host1.cmd('/sbin/route add default gw 192.168.10.254 dev %s-eth0' % (host1.name))
+
+ # Configure new host interfaces
+ #host2.defaultIntf().setIP('172.16.10.2/24')
+ #host2.defaultIntf().setMAC('00:00:00:00:01:02')
+ #host2.cmd('/sbin/route add default gw 172.16.10.254 dev %s-eth0' % (host2.name))
+
+ # Set up AS2
+ host3.setIP('192.168.10.1', 24, 'host3-eth0')
+ #host3.cmd('sudo ip addr add 172.16.20.1/24 dev host3-eth0')
+ host3.setIP('192.168.20.1', 24, 'host3-eth1')
+ host3.setMAC('00:00:00:00:02:01', 'host3-eth0')
+ host3.setMAC('00:00:00:00:02:02', 'host3-eth1')
+ #host3.setIP('172.16.20.254', 24, 'host3-eth2')
+ host3.setIP('3.0.0.254', 8, 'host3-eth2')
+ host3.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+
+ host3.setIP('1.168.30.2', 24, 'host3-eth3')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_ignore=1')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_announce=1')
+ as2host = net.get('as2host')
+ #as2host.defaultIntf().setIP('172.16.20.1/24')
+ for i in range(0, 20):
+ as2host.cmd('sudo ip addr add 3.0.%d.1/24 dev as2host-eth0' %i)
+ as2host.setIP('1.168.30.100', 24, 'as2host-eth1')
+
+ as2host.cmd('ip route add default via 3.0.0.254')
+
+ # Set up AS3
+ host4.setIP('192.168.30.1', 24, 'host4-eth0')
+ host4.setMAC('00:00:00:00:03:01', 'host4-eth0')
+ host4.setIP('4.0.0.254', 8, 'host4-eth1')
+ host4.setMAC('00:00:00:00:03:99', 'host4-eth1')
+ host4.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ as3host = net.get('as3host')
+ for i in range(0, 20):
+ as3host.cmd('sudo ip addr add 4.0.%d.1/24 dev as3host-eth0' %i)
+ as3host.cmd('ip route add default via 4.0.0.254')
+
+ host4.setIP('10.0.0.4', 24, 'host4-eth2')
+ host4.setMAC('00:00:00:00:03:33', 'host4-eth2')
+
+ #root space
+ host4.setIP('1.168.30.3', 24, 'host4-eth3')
+ host4.setMAC('00:00:00:00:03:03', 'host4-eth3')
+
+ # Set up AS4
+ #as4host = net.get('as4host')
+ #as4host.defaultIntf().setIP('172.16.40.1/24')
+ #as4host.cmd('ip route add default via 172.16.40.254')
+
+ # setup interface address for 100 quagga hosts
+ #time.sleep(10)
+ #for i in range(numHost101, numHost200 + 1):
+ #host100 = net.get('host' + str(i))
+ #host100.cmd(str(i)+'.0.1.254', 24, 'host'+str(i)+'-eth1')
+ #as4host100 = net.get('as4host%s' %(i))
+ #as4host100.defaultIntf().setIP(str(i) + '.0.0.1/24')
+ #as4host100.cmd('ip route add default via ' + str(i) + '.0.0.254')
+ #for j in range(0, 100):
+ #as4host100.cmd('sudo ip addr add %d.0.%d.1/24 dev %s-eth0' %(i, j, as4host100))
+
+ # Set up AS6 - This has a router and a route server
+ as6rs, host5 = net.get('as6rs', 'host5')
+
+ as6rs.setIP('192.168.60.1', 24, 'as6rs-eth0')
+ as6rs.setMAC('00:00:00:06:06:01', 'as6rs-eth0')
+ as6rs.setIP('1.168.30.6', 24, 'as6rs-eth1')
+ as6rs.setMAC('00:00:00:06:06:06', 'as6rs-eth1')
+
+ host5.setIP('192.168.60.2', 24, 'host5-eth0')
+ host5.setMAC('00:00:00:00:06:02', 'host5-eth0')
+ #as6router.setIP('172.16.60.254', 24, 'as6router-eth1')
+ host5.setIP('5.0.0.254', 8, 'host5-eth1')
+ host5.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ host5.setIP('10.0.0.5', 24, 'host5-eth2')
+ host5.setMAC('00:00:00:00:06:66', 'host5-eth2')
+ host5.setIP('1.168.30.5', 24, 'host5-eth3')
+ host5.setMAC('00:00:00:00:06:05', 'host5-eth3')
+
+ as6host = net.get('as6host')
+ #as6host.defaultIntf().setIP('5.0.0.1/24')
+ for i in range(0, 10):
+ as6host.cmd('sudo ip addr add 5.0.%d.1/24 dev as6host-eth0' %i)
+ as6host.cmd('ip route add default via 5.0.0.254')
+
+ # test the host in the as6
+ #for i in range(1, 10):
+ # baseip = (i-1)*4
+ # host = net.get('as6host%d' % i)
+ # host.defaultIntf().setIP('172.16.70.%d/24' % (baseip+1))
+ # host.cmd('ip route add default via 172.16.70.%d' % (baseip+2))
+ # as6router.setIP('172.16.70.%d' % (baseip+2), 30, 'as6router-eth%d' % (i+1))
+
+ # Start Quagga on border routers
+ startquagga(host3, 1, QUAGGA_CONFIG_FILE_DIR + '/quagga1.conf')
+ startquagga(host4, 2, QUAGGA_CONFIG_FILE_DIR + '/quagga2.conf')
+ #for i in range(numHost101, numHost200 + 1):
+ #host100=net.get('host%d' % (i))
+ #startquaggahost5(host100, i)
+
+ startquagga(as6rs, 4, QUAGGA_CONFIG_FILE_DIR + '/quagga-as6-rs.conf')
+ startquagga(host5, 5, QUAGGA_CONFIG_FILE_DIR + '/quagga-as6.conf')
+
+ #root1, root2, rootTestOn = net.get( 'root1', 'root2', 'rootTestOn' )
+ root1, rootTestOn = net.get( 'root1', 'rootTestOn' )
+ host1.intf('host1-eth1').setIP('1.1.1.1/24')
+ root1.intf('root1-eth0').setIP('1.1.1.2/24')
+ #host2.intf('host2-eth1').setIP('1.1.2.1/24')
+ #root2.intf('root2-eth0').setIP('1.1.2.2/24')
+
+ #rootTestOn.cmd('ip addr add 1.168.30.102/24 dev rootTestOn-eth0')
+ rootTestOn.cmd('ip addr add 1.168.30.99/24 dev rootTestOn-eth0')
+
+ stopsshd()
+
+ startquagga(host1, 100, QUAGGA_CONFIG_FILE_DIR + '/quagga-sdn-modified.conf')
+ hosts = [ host1, host3, host4, host5, as2host, as6rs ];
+ #sshdHosts = sshdHosts + hosts
+ startsshds( hosts )
+ #
+ onos1 = '127.0.0.1'
+ forwarding1 = '%s:2000:%s:2000' % ('1.1.1.2', onos1)
+ root1.cmd( 'ssh -nNT -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % (forwarding1, onos1) )
+
+ # Forward 2605 to root namespace for easier access to SDN domain BGPd
+ # If root can ssh to itself without a password this should work
+ root1.cmd('ssh -N -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -L 2605:1.1.1.1:2605 1.1.1.1 &')
+ #time.sleep(3000000000)
+ CLI( net )
+
+ # Close the ssh port forwarding
+ #quietRun('sudo pkill -f 1.1.1.1')
+
+ stopsshd()
+ stopquagga()
+ net.stop()
+
+if __name__ == '__main__':
+ setLogLevel( 'debug' )
+ if len(sys.argv) > 1:
+ QUAGGA_CONFIG_FILE_DIR = sys.argv[1]
+ sdn1net()
diff --git a/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga-as6-rs.conf b/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga-as6-rs.conf
new file mode 100644
index 0000000..1eac0dd
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga-as6-rs.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64520
+ bgp router-id 192.168.60.1
+ neighbor 192.168.60.101 remote-as 64513
+ neighbor 192.168.60.101 route-server-client
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 route-server-client
+! network 172.16.60.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga-as6.conf b/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga-as6.conf
new file mode 100644
index 0000000..19cc140
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga-as6.conf
@@ -0,0 +1,39 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64521
+ bgp router-id 192.168.60.2
+ neighbor 192.168.60.1 remote-as 64520
+ neighbor 10.0.0.4 remote-as 64516
+! neighbor 192.168.60.3 remote-as 64520
+! network 172.16.60.0/24
+! network 172.16.70.4/30
+ ! network 172.16.70.8/30
+ ! network 172.16.70.12/30
+ ! network 172.16.70.16/30
+ ! network 172.16.70.20/30
+ ! network 172.16.70.24/30
+ ! network 172.16.70.28/30
+ ! network 172.16.70.32/30
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga-sdn-modified.conf b/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga-sdn-modified.conf
new file mode 100644
index 0000000..bf37a60
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga-sdn-modified.conf
@@ -0,0 +1,49 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.1 remote-as 64520
+ neighbor 192.168.60.1 ebgp-multihop
+ neighbor 192.168.60.1 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga1.conf b/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga1.conf
new file mode 100644
index 0000000..264f85e
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga1.conf
@@ -0,0 +1,32 @@
+!
+! Zebra configuration saved from vty
+! 2014/11/25 11:22:24
+!
+hostname bgpd
+password hello
+log stdout
+!
+router bgp 64514
+ bgp router-id 192.168.10.1
+! network 3.0.0.0/24
+! network 3.0.1.0/24
+! network 3.0.2.0/24
+! network 3.0.3.0/24
+! network 3.0.4.0/24
+! network 3.0.5.0/24
+! network 3.0.6.0/24
+! network 3.0.7.0/24
+! network 3.0.8.0/24
+! network 3.0.9.0/24
+ neighbor 192.168.20.101 remote-as 64513
+ neighbor 192.168.20.101 route-map PREPEND2 in
+ neighbor 192.168.20.101 route-map PREPEND2 out
+!
+route-map PREPEND1 permit 1
+ set as-path prepend 64514
+!
+route-map PREPEND2 permit 2
+ set as-path prepend 64514 64514
+!
+line vty
+!
diff --git a/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga2.conf b/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga2.conf
new file mode 100644
index 0000000..14c7d67
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeserver/mininet/quagga2.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64516
+ bgp router-id 192.168.30.1
+! timers bgp 1 3
+ neighbor 192.168.30.101 remote-as 64513
+ neighbor 10.0.0.5 remote-as 64521
+! neighbor 192.168.50.2 remote-as 65001
+! network 172.16.30.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/routeserver/mininet/zebra.conf b/TestON/tests/PeeringRouterTest/routeserver/mininet/zebra.conf
new file mode 100644
index 0000000..0f8e3a2
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeserver/mininet/zebra.conf
@@ -0,0 +1,26 @@
+! -*- zebra -*-
+!
+! zebra sample configuration file
+!
+! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
+!
+hostname zebra
+password hello
+enable password 0fw0rk
+log stdout
+!
+! Interfaces description.
+!
+!interface lo
+! description test of desc.
+!
+!interface sit0
+! multicast
+
+!
+! Static default route sample.
+!
+!ip route 0.0.0.0/0 203.181.89.241
+!
+
+!log file /usr/local/var/log/quagga/zebra.log
diff --git a/TestON/tests/PeeringRouterTest/routeserver/sdnip.json b/TestON/tests/PeeringRouterTest/routeserver/sdnip.json
new file mode 100644
index 0000000..1f0a80a
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/routeserver/sdnip.json
@@ -0,0 +1,59 @@
+{
+
+ "bgpPeers" : [
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "1",
+ "ipAddress" : "192.168.10.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "2",
+ "ipAddress" : "192.168.20.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "3",
+ "ipAddress" : "192.168.30.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "4",
+ "ipAddress" : "192.168.60.1"
+ }
+
+ ],
+ "bgpSpeakers" : [
+ {
+ "name" : "bgpSpeaker1",
+ "attachmentDpid" : "00:00:00:00:00:00:00:02",
+ "attachmentPort" : "1",
+ "macAddress" : "00:00:00:00:00:01",
+ "interfaceAddresses" : [
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "1",
+ "ipAddress" : "192.168.10.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "2",
+ "ipAddress" : "192.168.20.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "3",
+ "ipAddress" : "192.168.30.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "4",
+ "ipAddress" : "192.168.60.101"
+ }
+
+ ]
+
+ }
+
+ ]
+}
diff --git a/TestON/tests/PeeringRouterTest/sdnip.json b/TestON/tests/PeeringRouterTest/sdnip.json
new file mode 100644
index 0000000..5b61d05
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/sdnip.json
@@ -0,0 +1,59 @@
+{
+
+ "bgpPeers" : [
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "1",
+ "ipAddress" : "192.168.10.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "2",
+ "ipAddress" : "192.168.20.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "3",
+ "ipAddress" : "192.168.30.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "4",
+ "ipAddress" : "192.168.60.2"
+ }
+
+ ],
+ "bgpSpeakers" : [
+ {
+ "name" : "bgpSpeaker1",
+ "attachmentDpid" : "00:00:00:00:00:00:00:02",
+ "attachmentPort" : "1",
+ "macAddress" : "00:00:00:00:00:02",
+ "interfaceAddresses" : [
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "1",
+ "ipAddress" : "192.168.10.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "2",
+ "ipAddress" : "192.168.20.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "3",
+ "ipAddress" : "192.168.30.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "4",
+ "ipAddress" : "192.168.60.101"
+ }
+
+ ]
+
+ }
+
+ ]
+}
diff --git a/TestON/tests/PeeringRouterTest/vlan/addresses.json b/TestON/tests/PeeringRouterTest/vlan/addresses.json
new file mode 100644
index 0000000..f800c1f
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/addresses.json
@@ -0,0 +1,33 @@
+{
+ "addresses" : [
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "1",
+ "ips" : ["192.168.10.101/24"],
+ "mac" : "00:00:00:00:00:01",
+ "vlan" : "10"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "2",
+ "ips" : ["192.168.20.101/24"],
+ "mac" : "00:00:00:00:00:01",
+ "vlan" : "20"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "3",
+ "ips" : ["192.168.30.101/24"],
+ "mac" : "00:00:00:00:00:01",
+ "vlan" : "30"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "4",
+ "ips" : ["192.168.60.101/24"],
+ "mac" : "00:00:00:00:00:01",
+ "vlan" : "60"
+ }
+
+ ]
+}
diff --git a/TestON/tests/PeeringRouterTest/vlan/mininet/PeeringRouterMininetVlan.py b/TestON/tests/PeeringRouterTest/vlan/mininet/PeeringRouterMininetVlan.py
new file mode 100755
index 0000000..9cbfc6d
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/mininet/PeeringRouterMininetVlan.py
@@ -0,0 +1,376 @@
+#!/usr/bin/python
+
+"""
+Start up the SDN-IP demo topology
+"""
+
+"""
+AS1 = 64513, (SDN AS)
+AS2 = 64514, reachable by 192.168.10.1, 192.168.20.1
+AS3 = 64516, reachable by 192.168.30.1
+AS4 = 64517, reachable by 192.168.40.1
+AS6 = 64520, reachable by 192.168.60.2, (route server 192.168.60.1)
+"""
+
+from mininet.node import Host
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+
+import os.path
+import time
+import sys
+from subprocess import Popen, STDOUT, PIPE
+
+QUAGGA_DIR = '/usr/lib/quagga'
+#QUAGGA_DIR = '/usr/local/sbin'
+QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
+
+QUAGGA_CONFIG_FILE_DIR = '/home/admin/ONLabTest/TestON/tests/PeeringRouterTest/mininet'
+
+class VLANHost( Host ):
+ "Host connected to VLAN interface"
+
+ def config( self, vlan=10, intf2 = '', ip2 = 0, vlan2 = 0, **params):
+ """Configure VLANHost according to (optional) parameters:
+ vlan: VLAN ID for default interface"""
+
+ r = super( VLANHost, self ).config( **params )
+
+ intf = params['inf']
+ # remove IP from default, "physical" interface
+ self.cmd( 'ifconfig %s inet 0' % intf )
+ # create VLAN interface
+ self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
+ # assign the host's IP to the VLAN interface
+ self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+ # update the intf name and host's intf map
+ newName = '%s.%d' % ( intf, vlan )
+ # update the (Mininet) interface to refer to VLAN interface name
+ defaultIntf = self.defaultIntf()
+ defaultIntf.name = newName
+ # add VLAN interface to host's name to intf map
+ self.nameToIntf[ newName ] = defaultIntf
+
+ return r
+
+class SDNIpModifiedTopo( Topo ):
+ "SDN Ip Modified Topology"
+
+ def __init__( self, *args, **kwargs ):
+ global numHost101
+ global numHost200
+ numHost101 = 101
+ numHost200 = 200
+ Topo.__init__( self, *args, **kwargs )
+ sw1 = self.addSwitch('sw1', dpid='0000000000000001')
+ sw2 = self.addSwitch('sw2', dpid='0000000000000002')
+ #add a switch for 3 quagga hosts
+ swTestOn = self.addSwitch('swTestOn', dpid='0000000000000102')
+ #Note this switch isn't part of the SDN topology
+ #We'll use the ovs-controller to turn this into a learning switch
+ as6sw = self.addSwitch('as6sw', dpid='00000000000000a7')
+
+ host1 = self.addHost( 'host1' )
+ root1 = self.addHost( 'root1', inNamespace=False , ip='0')
+ rootTestOn = self.addHost( 'rootTestOn', inNamespace=False, ip='0' )
+
+ #AS2 host
+ host3 = self.addHost( 'host3', cls=VLANHost, vlan=10, inf="host3-eth0", ip="192.168.10.1")
+
+ as2host = self.addHost( 'as2host' )
+ #AS3 host
+ host4 = self.addHost( 'host4', cls=VLANHost, vlan=30, inf="host4-eth0", ip="192.168.30.1" )
+ as3host = self.addHost( 'as3host' )
+ #AS6 host
+ host5 = self.addHost( 'host5', cls=VLANHost, vlan=60, inf="host5-eth0", ip="192.168.60.2" )
+ as6host = self.addHost( 'as6host' )
+
+ self.addLink( host1, sw2 )
+ #Links to the multihomed AS
+ self.addLink( host3, sw1 )
+ self.addLink( host3, sw1 )
+ self.addLink( as2host, host3 )
+ #Single links to the remaining two ASes
+ self.addLink( host4, sw1 )
+ self.addLink( as3host, host4 )
+
+ #AS3-AS4 link
+ #self.addLink( host4, host5)
+ #Add new AS6 to its bridge
+ self.addLink( host5, as6sw )
+ self.addLink( as6host, host5 )
+ #test the host behind the router(behind the router server)
+# for i in range(1, 10):
+ # host = self.addHost('as6host%d' % i)
+ # self.addLink(host, as6router)
+
+ ## Internal Connection To Hosts ##
+ self.addLink( root1, host1 )
+
+ # self.addLink( sw1, sw2 )
+ # self.addLink( sw1, sw3 )
+ # self.addLink( sw2, sw4 )
+ # self.addLink( sw3, sw4 )
+ # self.addLink( sw3, sw5 )
+ # self.addLink( sw4, sw6 )
+ # self.addLink( sw5, sw6 )
+ self.addLink( as6sw, sw1 )
+
+
+ self.addLink(swTestOn, rootTestOn)
+ #self.addLink(swTestOn, host1)
+ self.addLink(swTestOn, host3)
+ self.addLink(swTestOn, host4)
+ self.addLink(swTestOn, host5)
+ self.addLink(swTestOn, as2host)
+
+
+ #self.addLink(rootTestOn, host4)
+
+def startsshd( host ):
+ "Start sshd on host"
+ info( '*** Starting sshd\n' )
+ name, intf, ip = host.name, host.defaultIntf(), host.IP()
+ banner = '/tmp/%s.banner' % name
+ host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
+ host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+ info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+ for h in hosts:
+ startsshd( h )
+
+def stopsshd( ):
+ "Stop *all* sshd processes with a custom banner"
+ info( '*** Shutting down stale sshd/Banner processes ',
+ quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def startquagga( host, num, config_file ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ print zebra_cmd
+ print quagga_cmd
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+def startquaggahost5( host, num ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+
+def stopquagga( ):
+ quietRun( 'sudo pkill -9 -f bgpd' )
+ quietRun( 'sudo pkill -9 -f zebra' )
+
+def sdn1net():
+ topo = SDNIpModifiedTopo()
+ info( '*** Creating network\n' )
+ net = Mininet( topo=topo, controller=RemoteController )
+ net = Mininet( topo=topo, controller=RemoteController )
+
+ host1, host3, host4, host5 = net.get( 'host1', 'host3', 'host4', 'host5' )
+
+ #host100.setIP('1.168.30.' + str(i), 24, str(host100) + "-eth2")
+
+ #host500.setMAC('00:00:00:00:04:%d' % (i-101), 'host%d-eth0' %(i))
+ #add IP prefixes
+ #for j in range(0,121):
+ #host100.cmd('sudo ip addr add %s.0.40.%s/24 dev host%s-eth0' %(i,j,i))
+
+ ## Adding 2nd, 3rd and 4th interface to host1 connected to sw1 (for another BGP peering)
+ #sw1 = net.get('sw1')
+ host1.setMAC('00:00:00:00:00:01', 'host1-eth0')
+ #host1.cmd('ip addr add 192.168.20.101/24 dev host1-eth0')
+ #host1.cmd('ip addr add 192.168.30.101/24 dev host1-eth0')
+ #host1.cmd('ip addr add 192.168.60.101/24 dev host1-eth0')
+
+ # Net has to be start after adding the above link
+ net.start()
+
+ # Set up as6sw as a learning switch as quickly as possible so it
+ # hopefully doesn't connect to the actual controller
+ # TODO figure out how to change controller before starting switch
+ as6sw = net.get('as6sw')
+ as6sw.cmd('ovs-vsctl set-controller as6sw none')
+ as6sw.cmd('ovs-vsctl set-fail-mode as6sw standalone')
+
+ as6sw.cmd( 'sudo ovs-vsctl set port as6sw-eth1 trunk=60')
+ as6sw.cmd( 'sudo ovs-vsctl set port as6sw-eth2 trunk=60')
+
+
+ sw1 = net.get('sw1')
+ sw1.cmd('ovs-vsctl set-controller sw1 tcp:127.0.0.1:6633')
+
+ swTestOn = net.get('swTestOn')
+ swTestOn.cmd('ovs-vsctl set-controller swTestOn none')
+ swTestOn.cmd('ovs-vsctl set-fail-mode swTestOn standalone')
+
+ #host1.defaultIntf().setIP('192.168.10.101/24')
+
+ host1.cmd( 'ifconfig host1-eth0 inet 0')
+ host1.cmd( 'vconfig add host1-eth0 10')
+ host1.cmd( 'ifconfig host1-eth0.10 inet 192.168.10.101')
+
+ host1.cmd( 'vconfig add host1-eth0 20')
+ host1.cmd( 'ifconfig host1-eth0.20 inet 192.168.20.101')
+
+ host1.cmd( 'vconfig add host1-eth0 30')
+ host1.cmd( 'ifconfig host1-eth0.30 inet 192.168.30.101')
+
+ host1.cmd( 'vconfig add host1-eth0 60')
+ host1.cmd( 'ifconfig host1-eth0.60 inet 192.168.60.101')
+
+ # Run BGPd
+ #host1.cmd('%s -d -f %s' % (BGPD, BGPD_CONF))
+ #host1.cmd('/sbin/route add default gw 192.168.10.254 dev %s-eth0' % (host1.name))
+
+ # Configure new host interfaces
+ #host2.defaultIntf().setIP('172.16.10.2/24')
+ #host2.defaultIntf().setMAC('00:00:00:00:01:02')
+ #host2.cmd('/sbin/route add default gw 172.16.10.254 dev %s-eth0' % (host2.name))
+
+ # Set up AS2
+ # add additional VLAN interface
+ host3.cmd( 'ifconfig host3-eth1 inet 0')
+ host3.cmd( 'vconfig add host3-eth1 20')
+ host3.cmd( 'ifconfig host3-eth1.20 inet 192.168.20.1')
+ # change the interface for the sencond connection to sw1 to vlan interface
+ newName = "host3-eth1.20"
+ secondIntf = host3.intf("host3-eth1")
+ secondIntf.name = newName
+ host3.nameToIntf[ newName ] = secondIntf
+
+ host3.setMAC('00:00:00:00:02:01', 'host3-eth0.10')
+ host3.setMAC('00:00:00:00:02:02', 'host3-eth1.20')
+
+ #host3.setIP('172.16.20.254', 24, 'host3-eth2')
+ host3.setIP('3.0.0.254', 8, 'host3-eth2')
+ host3.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+
+ host3.setIP('1.168.30.2', 24, 'host3-eth3')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_ignore=1')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_announce=1')
+ host3.cmd('ip route add default via 192.168.10.101')
+ as2host = net.get('as2host')
+ #as2host.defaultIntf().setIP('172.16.20.1/24')
+ for i in range(0, 20):
+ as2host.cmd('sudo ip addr add 3.0.%d.1/24 dev as2host-eth0' %i)
+ as2host.setIP('1.168.30.100', 24, 'as2host-eth1')
+
+ as2host.cmd('ip route add default via 3.0.0.254')
+
+ # Set up AS3
+ host4.setMAC('00:00:00:00:03:01', 'host4-eth0.30')
+ host4.setIP('4.0.0.254', 8, 'host4-eth1')
+ host4.setMAC('00:00:00:00:03:99', 'host4-eth1')
+ host4.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ host4.cmd('ip route add default via 192.168.30.101')
+ as3host = net.get('as3host')
+ for i in range(0, 20):
+ as3host.cmd('sudo ip addr add 4.0.%d.1/24 dev as3host-eth0' %i)
+ as3host.cmd('ip route add default via 4.0.0.254')
+
+ #root space
+ host4.setIP('1.168.30.3', 24, 'host4-eth2')
+ host4.setMAC('00:00:00:00:03:03', 'host4-eth2')
+
+ # Set up AS4
+ #as4host = net.get('as4host')
+ #as4host.defaultIntf().setIP('172.16.40.1/24')
+ #as4host.cmd('ip route add default via 172.16.40.254')
+
+ # setup interface address for 100 quagga hosts
+ time.sleep(10)
+ #for i in range(numHost101, numHost200 + 1):
+ #host100 = net.get('host' + str(i))
+ #host100.cmd(str(i)+'.0.1.254', 24, 'host'+str(i)+'-eth1')
+ #as4host100 = net.get('as4host%s' %(i))
+ #as4host100.defaultIntf().setIP(str(i) + '.0.0.1/24')
+ #as4host100.cmd('ip route add default via ' + str(i) + '.0.0.254')
+ #for j in range(0, 100):
+ #as4host100.cmd('sudo ip addr add %d.0.%d.1/24 dev %s-eth0' %(i, j, as4host100))
+
+ # Set up AS6 - This has a router and a route server
+ host5 = net.get('host5')
+ host5.setMAC('00:00:00:00:06:02', 'host5-eth0.60')
+ #as6router.setIP('172.16.60.254', 24, 'as6router-eth1')
+ host5.setIP('5.0.0.254', 8, 'host5-eth1')
+ host5.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ host5.setIP('1.168.30.5', 24, 'host5-eth2')
+ host5.setMAC('00:00:00:00:06:05', 'host5-eth2')
+ host5.cmd('ip route add default via 192.168.60.101')
+ as6host = net.get('as6host')
+ #as6host.defaultIntf().setIP('5.0.0.1/24')
+ for i in range(0, 10):
+ as6host.cmd('sudo ip addr add 5.0.%d.1/24 dev as6host-eth0' %i)
+ as6host.cmd('ip route add default via 5.0.0.254')
+
+ # test the host in the as6
+ #for i in range(1, 10):
+ # baseip = (i-1)*4
+ # host = net.get('as6host%d' % i)
+ # host.defaultIntf().setIP('172.16.70.%d/24' % (baseip+1))
+ # host.cmd('ip route add default via 172.16.70.%d' % (baseip+2))
+ # as6router.setIP('172.16.70.%d' % (baseip+2), 30, 'as6router-eth%d' % (i+1))
+
+ # Start Quagga on border routers
+ startquagga(host3, 1, QUAGGA_CONFIG_FILE_DIR + '/quagga1.conf')
+ startquagga(host4, 2, QUAGGA_CONFIG_FILE_DIR + '/quagga2.conf')
+ #for i in range(numHost101, numHost200 + 1):
+ #host100=net.get('host%d' % (i))
+ #startquaggahost5(host100, i)
+
+ #startquagga(as6rs, 4, 'quagga-as6-rs.conf')
+ startquagga(host5, 5, QUAGGA_CONFIG_FILE_DIR + '/quagga-as6.conf')
+
+ #root1, root2, rootTestOn = net.get( 'root1', 'root2', 'rootTestOn' )
+ root1, rootTestOn = net.get( 'root1', 'rootTestOn' )
+ host1.intf('host1-eth1').setIP('1.1.1.1/24')
+ root1.intf('root1-eth0').setIP('1.1.1.2/24')
+ #host2.intf('host2-eth1').setIP('1.1.2.1/24')
+ #root2.intf('root2-eth0').setIP('1.1.2.2/24')
+
+ #rootTestOn.cmd('ip addr add 1.168.30.102/24 dev rootTestOn-eth0')
+ rootTestOn.cmd('ip addr add 1.168.30.99/24 dev rootTestOn-eth0')
+
+ stopsshd()
+
+ startquagga(host1, 100, QUAGGA_CONFIG_FILE_DIR + '/quagga-sdn-modified.conf')
+ hosts = [ host1, host3, host4, host5, as2host ];
+ #sshdHosts = sshdHosts + hosts
+ startsshds( hosts )
+ #
+ onos1 = '127.0.0.1'
+ forwarding1 = '%s:2000:%s:2000' % ('1.1.1.2', onos1)
+ root1.cmd( 'ssh -nNT -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % (forwarding1, onos1) )
+
+ # Forward 2605 to root namespace for easier access to SDN domain BGPd
+ # If root can ssh to itself without a password this should work
+ root1.cmd('ssh -N -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -L 2605:1.1.1.1:2605 1.1.1.1 &')
+ #time.sleep(3000000000)
+ CLI( net )
+
+ # Close the ssh port forwarding
+ #quietRun('sudo pkill -f 1.1.1.1')
+
+ stopsshd()
+ stopquagga()
+ net.stop()
+
+if __name__ == '__main__':
+ setLogLevel( 'debug' )
+ if len(sys.argv) > 1:
+ QUAGGA_CONFIG_FILE_DIR = sys.argv[1]
+ sdn1net()
diff --git a/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-as6-rs.conf b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-as6-rs.conf
new file mode 100644
index 0000000..1eac0dd
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-as6-rs.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64520
+ bgp router-id 192.168.60.1
+ neighbor 192.168.60.101 remote-as 64513
+ neighbor 192.168.60.101 route-server-client
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 route-server-client
+! network 172.16.60.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-as6.conf b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-as6.conf
new file mode 100644
index 0000000..434f983
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-as6.conf
@@ -0,0 +1,39 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64521
+ bgp router-id 192.168.60.2
+ neighbor 192.168.60.101 remote-as 64513
+! neighbor 192.168.60.1 remote-as 64520
+! neighbor 192.168.60.3 remote-as 64520
+! network 172.16.60.0/24
+! network 172.16.70.4/30
+ ! network 172.16.70.8/30
+ ! network 172.16.70.12/30
+ ! network 172.16.70.16/30
+ ! network 172.16.70.20/30
+ ! network 172.16.70.24/30
+ ! network 172.16.70.28/30
+ ! network 172.16.70.32/30
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-sdn-modified.conf b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-sdn-modified.conf
new file mode 100644
index 0000000..d334c2a
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-sdn-modified.conf
@@ -0,0 +1,49 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 ebgp-multihop
+ neighbor 192.168.60.2 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-sdn.conf b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-sdn.conf
new file mode 100644
index 0000000..77392a6
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga-sdn.conf
@@ -0,0 +1,349 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.1 remote-as 64520
+ neighbor 192.168.60.1 ebgp-multihop
+ neighbor 192.168.60.1 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+neighbor 192.168.40.1 remote-as 65001
+neighbor 192.168.40.1 ebgp-multihop
+neighbor 192.168.40.1 timers connect 10
+neighbor 192.168.40.2 remote-as 65002
+neighbor 192.168.40.2 ebgp-multihop
+neighbor 192.168.40.2 timers connect 10
+neighbor 192.168.40.3 remote-as 65003
+neighbor 192.168.40.3 ebgp-multihop
+neighbor 192.168.40.3 timers connect 10
+neighbor 192.168.40.4 remote-as 65004
+neighbor 192.168.40.4 ebgp-multihop
+neighbor 192.168.40.4 timers connect 10
+neighbor 192.168.40.5 remote-as 65005
+neighbor 192.168.40.5 ebgp-multihop
+neighbor 192.168.40.5 timers connect 10
+neighbor 192.168.40.6 remote-as 65006
+neighbor 192.168.40.6 ebgp-multihop
+neighbor 192.168.40.6 timers connect 10
+neighbor 192.168.40.7 remote-as 65007
+neighbor 192.168.40.7 ebgp-multihop
+neighbor 192.168.40.7 timers connect 10
+neighbor 192.168.40.8 remote-as 65008
+neighbor 192.168.40.8 ebgp-multihop
+neighbor 192.168.40.8 timers connect 10
+neighbor 192.168.40.9 remote-as 65009
+neighbor 192.168.40.9 ebgp-multihop
+neighbor 192.168.40.9 timers connect 10
+neighbor 192.168.40.10 remote-as 65010
+neighbor 192.168.40.10 ebgp-multihop
+neighbor 192.168.40.10 timers connect 10
+neighbor 192.168.40.11 remote-as 65011
+neighbor 192.168.40.11 ebgp-multihop
+neighbor 192.168.40.11 timers connect 10
+neighbor 192.168.40.12 remote-as 65012
+neighbor 192.168.40.12 ebgp-multihop
+neighbor 192.168.40.12 timers connect 10
+neighbor 192.168.40.13 remote-as 65013
+neighbor 192.168.40.13 ebgp-multihop
+neighbor 192.168.40.13 timers connect 10
+neighbor 192.168.40.14 remote-as 65014
+neighbor 192.168.40.14 ebgp-multihop
+neighbor 192.168.40.14 timers connect 10
+neighbor 192.168.40.15 remote-as 65015
+neighbor 192.168.40.15 ebgp-multihop
+neighbor 192.168.40.15 timers connect 10
+neighbor 192.168.40.16 remote-as 65016
+neighbor 192.168.40.16 ebgp-multihop
+neighbor 192.168.40.16 timers connect 10
+neighbor 192.168.40.17 remote-as 65017
+neighbor 192.168.40.17 ebgp-multihop
+neighbor 192.168.40.17 timers connect 10
+neighbor 192.168.40.18 remote-as 65018
+neighbor 192.168.40.18 ebgp-multihop
+neighbor 192.168.40.18 timers connect 10
+neighbor 192.168.40.19 remote-as 65019
+neighbor 192.168.40.19 ebgp-multihop
+neighbor 192.168.40.19 timers connect 10
+neighbor 192.168.40.20 remote-as 65020
+neighbor 192.168.40.20 ebgp-multihop
+neighbor 192.168.40.20 timers connect 10
+neighbor 192.168.40.21 remote-as 65021
+neighbor 192.168.40.21 ebgp-multihop
+neighbor 192.168.40.21 timers connect 10
+neighbor 192.168.40.22 remote-as 65022
+neighbor 192.168.40.22 ebgp-multihop
+neighbor 192.168.40.22 timers connect 10
+neighbor 192.168.40.23 remote-as 65023
+neighbor 192.168.40.23 ebgp-multihop
+neighbor 192.168.40.23 timers connect 10
+neighbor 192.168.40.24 remote-as 65024
+neighbor 192.168.40.24 ebgp-multihop
+neighbor 192.168.40.24 timers connect 10
+neighbor 192.168.40.25 remote-as 65025
+neighbor 192.168.40.25 ebgp-multihop
+neighbor 192.168.40.25 timers connect 10
+neighbor 192.168.40.26 remote-as 65026
+neighbor 192.168.40.26 ebgp-multihop
+neighbor 192.168.40.26 timers connect 10
+neighbor 192.168.40.27 remote-as 65027
+neighbor 192.168.40.27 ebgp-multihop
+neighbor 192.168.40.27 timers connect 10
+neighbor 192.168.40.28 remote-as 65028
+neighbor 192.168.40.28 ebgp-multihop
+neighbor 192.168.40.28 timers connect 10
+neighbor 192.168.40.29 remote-as 65029
+neighbor 192.168.40.29 ebgp-multihop
+neighbor 192.168.40.29 timers connect 10
+neighbor 192.168.40.30 remote-as 65030
+neighbor 192.168.40.30 ebgp-multihop
+neighbor 192.168.40.30 timers connect 10
+neighbor 192.168.40.31 remote-as 65031
+neighbor 192.168.40.31 ebgp-multihop
+neighbor 192.168.40.31 timers connect 10
+neighbor 192.168.40.32 remote-as 65032
+neighbor 192.168.40.32 ebgp-multihop
+neighbor 192.168.40.32 timers connect 10
+neighbor 192.168.40.33 remote-as 65033
+neighbor 192.168.40.33 ebgp-multihop
+neighbor 192.168.40.33 timers connect 10
+neighbor 192.168.40.34 remote-as 65034
+neighbor 192.168.40.34 ebgp-multihop
+neighbor 192.168.40.34 timers connect 10
+neighbor 192.168.40.35 remote-as 65035
+neighbor 192.168.40.35 ebgp-multihop
+neighbor 192.168.40.35 timers connect 10
+neighbor 192.168.40.36 remote-as 65036
+neighbor 192.168.40.36 ebgp-multihop
+neighbor 192.168.40.36 timers connect 10
+neighbor 192.168.40.37 remote-as 65037
+neighbor 192.168.40.37 ebgp-multihop
+neighbor 192.168.40.37 timers connect 10
+neighbor 192.168.40.38 remote-as 65038
+neighbor 192.168.40.38 ebgp-multihop
+neighbor 192.168.40.38 timers connect 10
+neighbor 192.168.40.39 remote-as 65039
+neighbor 192.168.40.39 ebgp-multihop
+neighbor 192.168.40.39 timers connect 10
+neighbor 192.168.40.40 remote-as 65040
+neighbor 192.168.40.40 ebgp-multihop
+neighbor 192.168.40.40 timers connect 10
+neighbor 192.168.40.41 remote-as 65041
+neighbor 192.168.40.41 ebgp-multihop
+neighbor 192.168.40.41 timers connect 10
+neighbor 192.168.40.42 remote-as 65042
+neighbor 192.168.40.42 ebgp-multihop
+neighbor 192.168.40.42 timers connect 10
+neighbor 192.168.40.43 remote-as 65043
+neighbor 192.168.40.43 ebgp-multihop
+neighbor 192.168.40.43 timers connect 10
+neighbor 192.168.40.44 remote-as 65044
+neighbor 192.168.40.44 ebgp-multihop
+neighbor 192.168.40.44 timers connect 10
+neighbor 192.168.40.45 remote-as 65045
+neighbor 192.168.40.45 ebgp-multihop
+neighbor 192.168.40.45 timers connect 10
+neighbor 192.168.40.46 remote-as 65046
+neighbor 192.168.40.46 ebgp-multihop
+neighbor 192.168.40.46 timers connect 10
+neighbor 192.168.40.47 remote-as 65047
+neighbor 192.168.40.47 ebgp-multihop
+neighbor 192.168.40.47 timers connect 10
+neighbor 192.168.40.48 remote-as 65048
+neighbor 192.168.40.48 ebgp-multihop
+neighbor 192.168.40.48 timers connect 10
+neighbor 192.168.40.49 remote-as 65049
+neighbor 192.168.40.49 ebgp-multihop
+neighbor 192.168.40.49 timers connect 10
+neighbor 192.168.40.50 remote-as 65050
+neighbor 192.168.40.50 ebgp-multihop
+neighbor 192.168.40.50 timers connect 10
+neighbor 192.168.40.51 remote-as 65051
+neighbor 192.168.40.51 ebgp-multihop
+neighbor 192.168.40.51 timers connect 10
+neighbor 192.168.40.52 remote-as 65052
+neighbor 192.168.40.52 ebgp-multihop
+neighbor 192.168.40.52 timers connect 10
+neighbor 192.168.40.53 remote-as 65053
+neighbor 192.168.40.53 ebgp-multihop
+neighbor 192.168.40.53 timers connect 10
+neighbor 192.168.40.54 remote-as 65054
+neighbor 192.168.40.54 ebgp-multihop
+neighbor 192.168.40.54 timers connect 10
+neighbor 192.168.40.55 remote-as 65055
+neighbor 192.168.40.55 ebgp-multihop
+neighbor 192.168.40.55 timers connect 10
+neighbor 192.168.40.56 remote-as 65056
+neighbor 192.168.40.56 ebgp-multihop
+neighbor 192.168.40.56 timers connect 10
+neighbor 192.168.40.57 remote-as 65057
+neighbor 192.168.40.57 ebgp-multihop
+neighbor 192.168.40.57 timers connect 10
+neighbor 192.168.40.58 remote-as 65058
+neighbor 192.168.40.58 ebgp-multihop
+neighbor 192.168.40.58 timers connect 10
+neighbor 192.168.40.59 remote-as 65059
+neighbor 192.168.40.59 ebgp-multihop
+neighbor 192.168.40.59 timers connect 10
+neighbor 192.168.40.60 remote-as 65060
+neighbor 192.168.40.60 ebgp-multihop
+neighbor 192.168.40.60 timers connect 10
+neighbor 192.168.40.61 remote-as 65061
+neighbor 192.168.40.61 ebgp-multihop
+neighbor 192.168.40.61 timers connect 10
+neighbor 192.168.40.62 remote-as 65062
+neighbor 192.168.40.62 ebgp-multihop
+neighbor 192.168.40.62 timers connect 10
+neighbor 192.168.40.63 remote-as 65063
+neighbor 192.168.40.63 ebgp-multihop
+neighbor 192.168.40.63 timers connect 10
+neighbor 192.168.40.64 remote-as 65064
+neighbor 192.168.40.64 ebgp-multihop
+neighbor 192.168.40.64 timers connect 10
+neighbor 192.168.40.65 remote-as 65065
+neighbor 192.168.40.65 ebgp-multihop
+neighbor 192.168.40.65 timers connect 10
+neighbor 192.168.40.66 remote-as 65066
+neighbor 192.168.40.66 ebgp-multihop
+neighbor 192.168.40.66 timers connect 10
+neighbor 192.168.40.67 remote-as 65067
+neighbor 192.168.40.67 ebgp-multihop
+neighbor 192.168.40.67 timers connect 10
+neighbor 192.168.40.68 remote-as 65068
+neighbor 192.168.40.68 ebgp-multihop
+neighbor 192.168.40.68 timers connect 10
+neighbor 192.168.40.69 remote-as 65069
+neighbor 192.168.40.69 ebgp-multihop
+neighbor 192.168.40.69 timers connect 10
+neighbor 192.168.40.70 remote-as 65070
+neighbor 192.168.40.70 ebgp-multihop
+neighbor 192.168.40.70 timers connect 10
+neighbor 192.168.40.71 remote-as 65071
+neighbor 192.168.40.71 ebgp-multihop
+neighbor 192.168.40.71 timers connect 10
+neighbor 192.168.40.72 remote-as 65072
+neighbor 192.168.40.72 ebgp-multihop
+neighbor 192.168.40.72 timers connect 10
+neighbor 192.168.40.73 remote-as 65073
+neighbor 192.168.40.73 ebgp-multihop
+neighbor 192.168.40.73 timers connect 10
+neighbor 192.168.40.74 remote-as 65074
+neighbor 192.168.40.74 ebgp-multihop
+neighbor 192.168.40.74 timers connect 10
+neighbor 192.168.40.75 remote-as 65075
+neighbor 192.168.40.75 ebgp-multihop
+neighbor 192.168.40.75 timers connect 10
+neighbor 192.168.40.76 remote-as 65076
+neighbor 192.168.40.76 ebgp-multihop
+neighbor 192.168.40.76 timers connect 10
+neighbor 192.168.40.77 remote-as 65077
+neighbor 192.168.40.77 ebgp-multihop
+neighbor 192.168.40.77 timers connect 10
+neighbor 192.168.40.78 remote-as 65078
+neighbor 192.168.40.78 ebgp-multihop
+neighbor 192.168.40.78 timers connect 10
+neighbor 192.168.40.79 remote-as 65079
+neighbor 192.168.40.79 ebgp-multihop
+neighbor 192.168.40.79 timers connect 10
+neighbor 192.168.40.80 remote-as 65080
+neighbor 192.168.40.80 ebgp-multihop
+neighbor 192.168.40.80 timers connect 10
+neighbor 192.168.40.81 remote-as 65081
+neighbor 192.168.40.81 ebgp-multihop
+neighbor 192.168.40.81 timers connect 10
+neighbor 192.168.40.82 remote-as 65082
+neighbor 192.168.40.82 ebgp-multihop
+neighbor 192.168.40.82 timers connect 10
+neighbor 192.168.40.83 remote-as 65083
+neighbor 192.168.40.83 ebgp-multihop
+neighbor 192.168.40.83 timers connect 10
+neighbor 192.168.40.84 remote-as 65084
+neighbor 192.168.40.84 ebgp-multihop
+neighbor 192.168.40.84 timers connect 10
+neighbor 192.168.40.85 remote-as 65085
+neighbor 192.168.40.85 ebgp-multihop
+neighbor 192.168.40.85 timers connect 10
+neighbor 192.168.40.86 remote-as 65086
+neighbor 192.168.40.86 ebgp-multihop
+neighbor 192.168.40.86 timers connect 10
+neighbor 192.168.40.87 remote-as 65087
+neighbor 192.168.40.87 ebgp-multihop
+neighbor 192.168.40.87 timers connect 10
+neighbor 192.168.40.88 remote-as 65088
+neighbor 192.168.40.88 ebgp-multihop
+neighbor 192.168.40.88 timers connect 10
+neighbor 192.168.40.89 remote-as 65089
+neighbor 192.168.40.89 ebgp-multihop
+neighbor 192.168.40.89 timers connect 10
+neighbor 192.168.40.90 remote-as 65090
+neighbor 192.168.40.90 ebgp-multihop
+neighbor 192.168.40.90 timers connect 10
+neighbor 192.168.40.91 remote-as 65091
+neighbor 192.168.40.91 ebgp-multihop
+neighbor 192.168.40.91 timers connect 10
+neighbor 192.168.40.92 remote-as 65092
+neighbor 192.168.40.92 ebgp-multihop
+neighbor 192.168.40.92 timers connect 10
+neighbor 192.168.40.93 remote-as 65093
+neighbor 192.168.40.93 ebgp-multihop
+neighbor 192.168.40.93 timers connect 10
+neighbor 192.168.40.94 remote-as 65094
+neighbor 192.168.40.94 ebgp-multihop
+neighbor 192.168.40.94 timers connect 10
+neighbor 192.168.40.95 remote-as 65095
+neighbor 192.168.40.95 ebgp-multihop
+neighbor 192.168.40.95 timers connect 10
+neighbor 192.168.40.96 remote-as 65096
+neighbor 192.168.40.96 ebgp-multihop
+neighbor 192.168.40.96 timers connect 10
+neighbor 192.168.40.97 remote-as 65097
+neighbor 192.168.40.97 ebgp-multihop
+neighbor 192.168.40.97 timers connect 10
+neighbor 192.168.40.98 remote-as 65098
+neighbor 192.168.40.98 ebgp-multihop
+neighbor 192.168.40.98 timers connect 10
+neighbor 192.168.40.99 remote-as 65099
+neighbor 192.168.40.99 ebgp-multihop
+neighbor 192.168.40.99 timers connect 10
+neighbor 192.168.40.100 remote-as 65100
+neighbor 192.168.40.100 ebgp-multihop
+neighbor 192.168.40.100 timers connect 10
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/mininet/quagga1.conf b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga1.conf
new file mode 100644
index 0000000..264f85e
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga1.conf
@@ -0,0 +1,32 @@
+!
+! Zebra configuration saved from vty
+! 2014/11/25 11:22:24
+!
+hostname bgpd
+password hello
+log stdout
+!
+router bgp 64514
+ bgp router-id 192.168.10.1
+! network 3.0.0.0/24
+! network 3.0.1.0/24
+! network 3.0.2.0/24
+! network 3.0.3.0/24
+! network 3.0.4.0/24
+! network 3.0.5.0/24
+! network 3.0.6.0/24
+! network 3.0.7.0/24
+! network 3.0.8.0/24
+! network 3.0.9.0/24
+ neighbor 192.168.20.101 remote-as 64513
+ neighbor 192.168.20.101 route-map PREPEND2 in
+ neighbor 192.168.20.101 route-map PREPEND2 out
+!
+route-map PREPEND1 permit 1
+ set as-path prepend 64514
+!
+route-map PREPEND2 permit 2
+ set as-path prepend 64514 64514
+!
+line vty
+!
diff --git a/TestON/tests/PeeringRouterTest/vlan/mininet/quagga2.conf b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga2.conf
new file mode 100644
index 0000000..20ca9e4
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/mininet/quagga2.conf
@@ -0,0 +1,31 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64516
+ bgp router-id 192.168.30.1
+! timers bgp 1 3
+ neighbor 192.168.30.101 remote-as 64513
+! neighbor 192.168.50.2 remote-as 65001
+! network 172.16.30.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/mininet/zebra.conf b/TestON/tests/PeeringRouterTest/vlan/mininet/zebra.conf
new file mode 100644
index 0000000..0f8e3a2
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/mininet/zebra.conf
@@ -0,0 +1,26 @@
+! -*- zebra -*-
+!
+! zebra sample configuration file
+!
+! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
+!
+hostname zebra
+password hello
+enable password 0fw0rk
+log stdout
+!
+! Interfaces description.
+!
+!interface lo
+! description test of desc.
+!
+!interface sit0
+! multicast
+
+!
+! Static default route sample.
+!
+!ip route 0.0.0.0/0 203.181.89.241
+!
+
+!log file /usr/local/var/log/quagga/zebra.log
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/PeeringRouterConvergenceVlanMininet.py b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/PeeringRouterConvergenceVlanMininet.py
new file mode 100755
index 0000000..983d666
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/PeeringRouterConvergenceVlanMininet.py
@@ -0,0 +1,381 @@
+#!/usr/bin/python
+
+"""
+Start up the SDN-IP demo topology
+"""
+
+"""
+AS1 = 64513, (SDN AS)
+AS2 = 64514, reachable by 192.168.10.1, 192.168.20.1
+AS3 = 64516, reachable by 192.168.30.1
+AS4 = 64517, reachable by 192.168.40.1
+AS6 = 64520, reachable by 192.168.60.2, (route server 192.168.60.1)
+"""
+
+from mininet.node import Host
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+
+import os.path
+import time
+import sys
+from subprocess import Popen, STDOUT, PIPE
+
+QUAGGA_DIR = '/usr/lib/quagga'
+#QUAGGA_DIR = '/usr/local/sbin'
+QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
+
+QUAGGA_CONFIG_FILE_DIR = '/home/tutorial1/ONLabTest/TestON/tests/PeeringRouterTest/mininet'
+
+class VLANHost( Host ):
+ "Host connected to VLAN interface"
+
+ def config( self, vlan=10, intf2 = '', ip2 = 0, vlan2 = 0, **params):
+ """Configure VLANHost according to (optional) parameters:
+ vlan: VLAN ID for default interface"""
+
+ r = super( VLANHost, self ).config( **params )
+
+ intf = params['inf']
+ # remove IP from default, "physical" interface
+ self.cmd( 'ifconfig %s inet 0' % intf )
+ # create VLAN interface
+ self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
+ # assign the host's IP to the VLAN interface
+ self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+ # update the intf name and host's intf map
+ newName = '%s.%d' % ( intf, vlan )
+ # update the (Mininet) interface to refer to VLAN interface name
+ defaultIntf = self.defaultIntf()
+ defaultIntf.name = newName
+ # add VLAN interface to host's name to intf map
+ self.nameToIntf[ newName ] = defaultIntf
+
+ return r
+
+class SDNIpModifiedTopo( Topo ):
+ "SDN Ip Modified Topology"
+
+ def __init__( self, *args, **kwargs ):
+ global numHost101
+ global numHost200
+ numHost101 = 101
+ numHost200 = 200
+ Topo.__init__( self, *args, **kwargs )
+ sw1 = self.addSwitch('sw1', dpid='0000000000000001')
+ sw2 = self.addSwitch('sw2', dpid='0000000000000002')
+ #add a switch for 3 quagga hosts
+ swTestOn = self.addSwitch('swTestOn', dpid='0000000000000102')
+ #Note this switch isn't part of the SDN topology
+ #We'll use the ovs-controller to turn this into a learning switch
+ as6sw = self.addSwitch('as6sw', dpid='00000000000000a7')
+
+ host1 = self.addHost( 'host1' )
+ root1 = self.addHost( 'root1', inNamespace=False , ip='0')
+ rootTestOn = self.addHost( 'rootTestOn', inNamespace=False, ip='0' )
+
+ #AS2 host
+ host3 = self.addHost( 'host3', cls=VLANHost, vlan=10, inf="host3-eth0", ip="192.168.10.1")
+
+ as2host = self.addHost( 'as2host' )
+ #AS3 host
+ host4 = self.addHost( 'host4', cls=VLANHost, vlan=30, inf="host4-eth0", ip="192.168.30.1" )
+ as3host = self.addHost( 'as3host' )
+ #AS6 host
+ host5 = self.addHost( 'host5', cls=VLANHost, vlan=60, inf="host5-eth0", ip="192.168.60.2" )
+ as6host = self.addHost( 'as6host' )
+
+ self.addLink( host1, sw2 )
+ #Links to the multihomed AS
+ self.addLink( host3, sw1 )
+ self.addLink( host3, sw1 )
+ self.addLink( as2host, host3 )
+ #Single links to the remaining two ASes
+ self.addLink( host4, sw1 )
+ self.addLink( as3host, host4 )
+
+ #AS3-AS4 link
+ #self.addLink( host4, host5)
+ #Add new AS6 to its bridge
+ self.addLink( host5, as6sw )
+ self.addLink( as6host, host5 )
+ #Backup link from router5 to router4
+ self.addLink( host4, host5)
+ #test the host behind the router(behind the router server)
+# for i in range(1, 10):
+ # host = self.addHost('as6host%d' % i)
+ # self.addLink(host, as6router)
+
+ ## Internal Connection To Hosts ##
+ self.addLink( root1, host1 )
+
+ # self.addLink( sw1, sw2 )
+ # self.addLink( sw1, sw3 )
+ # self.addLink( sw2, sw4 )
+ # self.addLink( sw3, sw4 )
+ # self.addLink( sw3, sw5 )
+ # self.addLink( sw4, sw6 )
+ # self.addLink( sw5, sw6 )
+ self.addLink( as6sw, sw1 )
+
+
+ self.addLink(swTestOn, rootTestOn)
+ #self.addLink(swTestOn, host1)
+ self.addLink(swTestOn, host3)
+ self.addLink(swTestOn, host4)
+ self.addLink(swTestOn, host5)
+ self.addLink(swTestOn, as2host)
+
+
+ #self.addLink(rootTestOn, host4)
+
+def startsshd( host ):
+ "Start sshd on host"
+ info( '*** Starting sshd\n' )
+ name, intf, ip = host.name, host.defaultIntf(), host.IP()
+ banner = '/tmp/%s.banner' % name
+ host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
+ host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+ info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+ for h in hosts:
+ startsshd( h )
+
+def stopsshd( ):
+ "Stop *all* sshd processes with a custom banner"
+ info( '*** Shutting down stale sshd/Banner processes ',
+ quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def startquagga( host, num, config_file ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ print zebra_cmd
+ print quagga_cmd
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+def startquaggahost5( host, num ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+
+def stopquagga( ):
+ quietRun( 'sudo pkill -9 -f bgpd' )
+ quietRun( 'sudo pkill -9 -f zebra' )
+
+def sdn1net():
+ topo = SDNIpModifiedTopo()
+ info( '*** Creating network\n' )
+ net = Mininet( topo=topo, controller=RemoteController )
+ net = Mininet( topo=topo, controller=RemoteController )
+
+ host1, host3, host4, host5 = net.get( 'host1', 'host3', 'host4', 'host5' )
+
+ #host100.setIP('1.168.30.' + str(i), 24, str(host100) + "-eth2")
+
+ #host500.setMAC('00:00:00:00:04:%d' % (i-101), 'host%d-eth0' %(i))
+ #add IP prefixes
+ #for j in range(0,121):
+ #host100.cmd('sudo ip addr add %s.0.40.%s/24 dev host%s-eth0' %(i,j,i))
+
+ ## Adding 2nd, 3rd and 4th interface to host1 connected to sw1 (for another BGP peering)
+ #sw1 = net.get('sw1')
+ host1.setMAC('00:00:00:00:00:01', 'host1-eth0')
+ #host1.cmd('ip addr add 192.168.20.101/24 dev host1-eth0')
+ #host1.cmd('ip addr add 192.168.30.101/24 dev host1-eth0')
+ #host1.cmd('ip addr add 192.168.60.101/24 dev host1-eth0')
+
+ # Net has to be start after adding the above link
+ net.start()
+
+ # Set up as6sw as a learning switch as quickly as possible so it
+ # hopefully doesn't connect to the actual controller
+ # TODO figure out how to change controller before starting switch
+ as6sw = net.get('as6sw')
+ as6sw.cmd('ovs-vsctl set-controller as6sw none')
+ as6sw.cmd('ovs-vsctl set-fail-mode as6sw standalone')
+
+ as6sw.cmd( 'sudo ovs-vsctl set port as6sw-eth1 trunk=60')
+ as6sw.cmd( 'sudo ovs-vsctl set port as6sw-eth2 trunk=60')
+
+
+ sw1 = net.get('sw1')
+ sw1.cmd('ovs-vsctl set-controller sw1 tcp:127.0.0.1:6633')
+
+ swTestOn = net.get('swTestOn')
+ swTestOn.cmd('ovs-vsctl set-controller swTestOn none')
+ swTestOn.cmd('ovs-vsctl set-fail-mode swTestOn standalone')
+
+ #host1.defaultIntf().setIP('192.168.10.101/24')
+
+ host1.cmd( 'ifconfig host1-eth0 inet 0')
+ host1.cmd( 'vconfig add host1-eth0 10')
+ host1.cmd( 'ifconfig host1-eth0.10 inet 192.168.10.101')
+
+ host1.cmd( 'vconfig add host1-eth0 20')
+ host1.cmd( 'ifconfig host1-eth0.20 inet 192.168.20.101')
+
+ host1.cmd( 'vconfig add host1-eth0 30')
+ host1.cmd( 'ifconfig host1-eth0.30 inet 192.168.30.101')
+
+ host1.cmd( 'vconfig add host1-eth0 60')
+ host1.cmd( 'ifconfig host1-eth0.60 inet 192.168.60.101')
+
+ # Run BGPd
+ #host1.cmd('%s -d -f %s' % (BGPD, BGPD_CONF))
+ #host1.cmd('/sbin/route add default gw 192.168.10.254 dev %s-eth0' % (host1.name))
+
+ # Configure new host interfaces
+ #host2.defaultIntf().setIP('172.16.10.2/24')
+ #host2.defaultIntf().setMAC('00:00:00:00:01:02')
+ #host2.cmd('/sbin/route add default gw 172.16.10.254 dev %s-eth0' % (host2.name))
+
+ # Set up AS2
+ # add additional VLAN interface
+ host3.cmd( 'ifconfig host3-eth1 inet 0')
+ host3.cmd( 'vconfig add host3-eth1 20')
+ host3.cmd( 'ifconfig host3-eth1.20 inet 192.168.20.1')
+ # change the interface for the sencond connection to sw1 to vlan interface
+ newName = "host3-eth1.20"
+ secondIntf = host3.intf("host3-eth1")
+ secondIntf.name = newName
+ host3.nameToIntf[ newName ] = secondIntf
+
+ host3.setMAC('00:00:00:00:02:01', 'host3-eth0.10')
+ host3.setMAC('00:00:00:00:02:02', 'host3-eth1.20')
+
+ #host3.setIP('172.16.20.254', 24, 'host3-eth2')
+ host3.setIP('3.0.0.254', 8, 'host3-eth2')
+ host3.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+
+ host3.setIP('1.168.30.2', 24, 'host3-eth3')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_ignore=1')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_announce=1')
+ as2host = net.get('as2host')
+ #as2host.defaultIntf().setIP('172.16.20.1/24')
+ for i in range(0, 20):
+ as2host.cmd('sudo ip addr add 3.0.%d.1/24 dev as2host-eth0' %i)
+ as2host.setIP('1.168.30.100', 24, 'as2host-eth1')
+
+ as2host.cmd('ip route add default via 3.0.0.254')
+
+ # Set up AS3
+ host4.setMAC('00:00:00:00:03:01', 'host4-eth0.30')
+ host4.setIP('4.0.0.254', 8, 'host4-eth1')
+ host4.setMAC('00:00:00:00:03:99', 'host4-eth1')
+ host4.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ as3host = net.get('as3host')
+ for i in range(0, 20):
+ as3host.cmd('sudo ip addr add 4.0.%d.1/24 dev as3host-eth0' %i)
+ as3host.cmd('ip route add default via 4.0.0.254')
+
+ host4.setIP('10.0.0.4', 24, 'host4-eth2')
+ host4.setMAC('00:00:00:00:03:33', 'host4-eth2')
+
+ #root space
+ host4.setIP('1.168.30.3', 24, 'host4-eth3')
+ host4.setMAC('00:00:00:00:03:03', 'host4-eth3')
+
+ # Set up AS4
+ #as4host = net.get('as4host')
+ #as4host.defaultIntf().setIP('172.16.40.1/24')
+ #as4host.cmd('ip route add default via 172.16.40.254')
+
+ # setup interface address for 100 quagga hosts
+ time.sleep(10)
+ #for i in range(numHost101, numHost200 + 1):
+ #host100 = net.get('host' + str(i))
+ #host100.cmd(str(i)+'.0.1.254', 24, 'host'+str(i)+'-eth1')
+ #as4host100 = net.get('as4host%s' %(i))
+ #as4host100.defaultIntf().setIP(str(i) + '.0.0.1/24')
+ #as4host100.cmd('ip route add default via ' + str(i) + '.0.0.254')
+ #for j in range(0, 100):
+ #as4host100.cmd('sudo ip addr add %d.0.%d.1/24 dev %s-eth0' %(i, j, as4host100))
+
+ # Set up AS6 - This has a router and a route server
+ host5 = net.get('host5')
+ host5.setMAC('00:00:00:00:06:02', 'host5-eth0.60')
+ #as6router.setIP('172.16.60.254', 24, 'as6router-eth1')
+ host5.setIP('5.0.0.254', 8, 'host5-eth1')
+ host5.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ host5.setIP('10.0.0.5', 24, 'host5-eth2')
+ host5.setMAC('00:00:00:00:06:66', 'host5-eth2')
+ host5.setIP('1.168.30.5', 24, 'host5-eth3')
+ host5.setMAC('00:00:00:00:06:05', 'host5-eth3')
+
+ as6host = net.get('as6host')
+ #as6host.defaultIntf().setIP('5.0.0.1/24')
+ for i in range(0, 10):
+ as6host.cmd('sudo ip addr add 5.0.%d.1/24 dev as6host-eth0' %i)
+ as6host.cmd('ip route add default via 5.0.0.254')
+
+ # test the host in the as6
+ #for i in range(1, 10):
+ # baseip = (i-1)*4
+ # host = net.get('as6host%d' % i)
+ # host.defaultIntf().setIP('172.16.70.%d/24' % (baseip+1))
+ # host.cmd('ip route add default via 172.16.70.%d' % (baseip+2))
+ # as6router.setIP('172.16.70.%d' % (baseip+2), 30, 'as6router-eth%d' % (i+1))
+
+ # Start Quagga on border routers
+ startquagga(host3, 1, QUAGGA_CONFIG_FILE_DIR + '/quagga1.conf')
+ startquagga(host4, 2, QUAGGA_CONFIG_FILE_DIR + '/quagga2.conf')
+ #for i in range(numHost101, numHost200 + 1):
+ #host100=net.get('host%d' % (i))
+ #startquaggahost5(host100, i)
+
+ #startquagga(as6rs, 4, 'quagga-as6-rs.conf')
+ startquagga(host5, 5, QUAGGA_CONFIG_FILE_DIR + '/quagga-as6.conf')
+
+ #root1, root2, rootTestOn = net.get( 'root1', 'root2', 'rootTestOn' )
+ root1, rootTestOn = net.get( 'root1', 'rootTestOn' )
+ host1.intf('host1-eth1').setIP('1.1.1.1/24')
+ root1.intf('root1-eth0').setIP('1.1.1.2/24')
+ #host2.intf('host2-eth1').setIP('1.1.2.1/24')
+ #root2.intf('root2-eth0').setIP('1.1.2.2/24')
+
+ #rootTestOn.cmd('ip addr add 1.168.30.102/24 dev rootTestOn-eth0')
+ rootTestOn.cmd('ip addr add 1.168.30.99/24 dev rootTestOn-eth0')
+
+ stopsshd()
+
+ startquagga(host1, 100, QUAGGA_CONFIG_FILE_DIR + '/quagga-sdn-modified.conf')
+ hosts = [ host1, host3, host4, host5, as2host ];
+ #sshdHosts = sshdHosts + hosts
+ startsshds( hosts )
+ #
+ onos1 = '127.0.0.1'
+ forwarding1 = '%s:2000:%s:2000' % ('1.1.1.2', onos1)
+ root1.cmd( 'ssh -nNT -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % (forwarding1, onos1) )
+
+ # Forward 2605 to root namespace for easier access to SDN domain BGPd
+ # If root can ssh to itself without a password this should work
+ root1.cmd('ssh -N -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -L 2605:1.1.1.1:2605 1.1.1.1 &')
+ #time.sleep(3000000000)
+ CLI( net )
+
+ # Close the ssh port forwarding
+ #quietRun('sudo pkill -f 1.1.1.1')
+
+ stopsshd()
+ stopquagga()
+ net.stop()
+
+if __name__ == '__main__':
+ setLogLevel( 'debug' )
+ if len(sys.argv) > 1:
+ QUAGGA_CONFIG_FILE_DIR = sys.argv[1]
+ sdn1net()
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga-as6.conf b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga-as6.conf
new file mode 100644
index 0000000..5e7028d
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga-as6.conf
@@ -0,0 +1,39 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64521
+ bgp router-id 192.168.60.2
+ neighbor 192.168.60.101 remote-as 64513
+ neighbor 10.0.0.4 remote-as 64516
+! neighbor 192.168.60.3 remote-as 64520
+! network 172.16.60.0/24
+! network 172.16.70.4/30
+ ! network 172.16.70.8/30
+ ! network 172.16.70.12/30
+ ! network 172.16.70.16/30
+ ! network 172.16.70.20/30
+ ! network 172.16.70.24/30
+ ! network 172.16.70.28/30
+ ! network 172.16.70.32/30
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga-sdn-modified.conf b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga-sdn-modified.conf
new file mode 100644
index 0000000..d334c2a
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga-sdn-modified.conf
@@ -0,0 +1,49 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 ebgp-multihop
+ neighbor 192.168.60.2 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga1.conf b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga1.conf
new file mode 100644
index 0000000..264f85e
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga1.conf
@@ -0,0 +1,32 @@
+!
+! Zebra configuration saved from vty
+! 2014/11/25 11:22:24
+!
+hostname bgpd
+password hello
+log stdout
+!
+router bgp 64514
+ bgp router-id 192.168.10.1
+! network 3.0.0.0/24
+! network 3.0.1.0/24
+! network 3.0.2.0/24
+! network 3.0.3.0/24
+! network 3.0.4.0/24
+! network 3.0.5.0/24
+! network 3.0.6.0/24
+! network 3.0.7.0/24
+! network 3.0.8.0/24
+! network 3.0.9.0/24
+ neighbor 192.168.20.101 remote-as 64513
+ neighbor 192.168.20.101 route-map PREPEND2 in
+ neighbor 192.168.20.101 route-map PREPEND2 out
+!
+route-map PREPEND1 permit 1
+ set as-path prepend 64514
+!
+route-map PREPEND2 permit 2
+ set as-path prepend 64514 64514
+!
+line vty
+!
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga2.conf b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga2.conf
new file mode 100644
index 0000000..14c7d67
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/quagga2.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64516
+ bgp router-id 192.168.30.1
+! timers bgp 1 3
+ neighbor 192.168.30.101 remote-as 64513
+ neighbor 10.0.0.5 remote-as 64521
+! neighbor 192.168.50.2 remote-as 65001
+! network 172.16.30.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/zebra.conf b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/zebra.conf
new file mode 100644
index 0000000..0f8e3a2
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeconvergence/mininet/zebra.conf
@@ -0,0 +1,26 @@
+! -*- zebra -*-
+!
+! zebra sample configuration file
+!
+! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
+!
+hostname zebra
+password hello
+enable password 0fw0rk
+log stdout
+!
+! Interfaces description.
+!
+!interface lo
+! description test of desc.
+!
+!interface sit0
+! multicast
+
+!
+! Static default route sample.
+!
+!ip route 0.0.0.0/0 203.181.89.241
+!
+
+!log file /usr/local/var/log/quagga/zebra.log
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeserver/addresses.json b/TestON/tests/PeeringRouterTest/vlan/routeserver/addresses.json
new file mode 100644
index 0000000..f800c1f
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeserver/addresses.json
@@ -0,0 +1,33 @@
+{
+ "addresses" : [
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "1",
+ "ips" : ["192.168.10.101/24"],
+ "mac" : "00:00:00:00:00:01",
+ "vlan" : "10"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "2",
+ "ips" : ["192.168.20.101/24"],
+ "mac" : "00:00:00:00:00:01",
+ "vlan" : "20"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "3",
+ "ips" : ["192.168.30.101/24"],
+ "mac" : "00:00:00:00:00:01",
+ "vlan" : "30"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:01",
+ "port" : "4",
+ "ips" : ["192.168.60.101/24"],
+ "mac" : "00:00:00:00:00:01",
+ "vlan" : "60"
+ }
+
+ ]
+}
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/PeeringRouteServerVlanMininet.py b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/PeeringRouteServerVlanMininet.py
new file mode 100755
index 0000000..3ba30cd
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/PeeringRouteServerVlanMininet.py
@@ -0,0 +1,389 @@
+#!/usr/bin/python
+
+"""
+Start up the SDN-IP demo topology
+"""
+
+"""
+AS1 = 64513, (SDN AS)
+AS2 = 64514, reachable by 192.168.10.1, 192.168.20.1
+AS3 = 64516, reachable by 192.168.30.1
+AS4 = 64517, reachable by 192.168.40.1
+AS6 = 64520, reachable by 192.168.60.2, (route server 192.168.60.1)
+"""
+
+from mininet.node import Host
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+
+import os.path
+import time
+import sys
+from subprocess import Popen, STDOUT, PIPE
+
+QUAGGA_DIR = '/usr/lib/quagga'
+#QUAGGA_DIR = '/usr/local/sbin'
+QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
+
+QUAGGA_CONFIG_FILE_DIR = '/home/tutorial1/ONLabTest/TestON/tests/PeeringRouterTest/mininet'
+
+class VLANHost( Host ):
+ "Host connected to VLAN interface"
+
+ def config( self, vlan=10, intf2 = '', ip2 = 0, vlan2 = 0, **params):
+ """Configure VLANHost according to (optional) parameters:
+ vlan: VLAN ID for default interface"""
+
+ r = super( VLANHost, self ).config( **params )
+
+ intf = params['inf']
+ # remove IP from default, "physical" interface
+ self.cmd( 'ifconfig %s inet 0' % intf )
+ # create VLAN interface
+ self.cmd( 'vconfig add %s %d' % ( intf, vlan ) )
+ # assign the host's IP to the VLAN interface
+ self.cmd( 'ifconfig %s.%d inet %s' % ( intf, vlan, params['ip'] ) )
+ # update the intf name and host's intf map
+ newName = '%s.%d' % ( intf, vlan )
+ # update the (Mininet) interface to refer to VLAN interface name
+ defaultIntf = self.defaultIntf()
+ defaultIntf.name = newName
+ # add VLAN interface to host's name to intf map
+ self.nameToIntf[ newName ] = defaultIntf
+
+ return r
+
+class SDNIpModifiedTopo( Topo ):
+ "SDN Ip Modified Topology"
+
+ def __init__( self, *args, **kwargs ):
+ global numHost101
+ global numHost200
+ numHost101 = 101
+ numHost200 = 200
+ Topo.__init__( self, *args, **kwargs )
+ sw1 = self.addSwitch('sw1', dpid='0000000000000001')
+ sw2 = self.addSwitch('sw2', dpid='0000000000000002')
+ #add a switch for 3 quagga hosts
+ swTestOn = self.addSwitch('swTestOn', dpid='0000000000000102')
+ #Note this switch isn't part of the SDN topology
+ #We'll use the ovs-controller to turn this into a learning switch
+ as6sw = self.addSwitch('as6sw', dpid='00000000000000a7')
+
+ host1 = self.addHost( 'host1' )
+ root1 = self.addHost( 'root1', inNamespace=False , ip='0')
+ rootTestOn = self.addHost( 'rootTestOn', inNamespace=False, ip='0' )
+
+ #AS2 host
+ host3 = self.addHost( 'host3', cls=VLANHost, vlan=10, inf="host3-eth0", ip="192.168.10.1")
+
+ as2host = self.addHost( 'as2host' )
+ #AS3 host
+ host4 = self.addHost( 'host4', cls=VLANHost, vlan=30, inf="host4-eth0", ip="192.168.30.1" )
+ as3host = self.addHost( 'as3host' )
+ #AS6 host
+ as6rs = self.addHost( 'as6rs', cls=VLANHost, vlan=60, inf="as6rs-eth0", ip="192.168.60.1" )
+ host5 = self.addHost( 'host5', cls=VLANHost, vlan=60, inf="host5-eth0", ip="192.168.60.2" )
+ as6host = self.addHost( 'as6host' )
+
+ self.addLink( host1, sw2 )
+ #Links to the multihomed AS
+ self.addLink( host3, sw1 )
+ self.addLink( host3, sw1 )
+ self.addLink( as2host, host3 )
+ #Single links to the remaining two ASes
+ self.addLink( host4, sw1 )
+ self.addLink( as3host, host4 )
+
+ #AS3-AS4 link
+ #self.addLink( host4, host5)
+ #Add new AS6 to its bridge
+ self.addLink( as6rs, as6sw )
+ self.addLink( host5, as6sw )
+ self.addLink( as6host, host5 )
+ #Backup link from router5 to router4
+ self.addLink( host4, host5)
+ #test the host behind the router(behind the router server)
+# for i in range(1, 10):
+ # host = self.addHost('as6host%d' % i)
+ # self.addLink(host, as6router)
+
+ ## Internal Connection To Hosts ##
+ self.addLink( root1, host1 )
+
+ # self.addLink( sw1, sw2 )
+ # self.addLink( sw1, sw3 )
+ # self.addLink( sw2, sw4 )
+ # self.addLink( sw3, sw4 )
+ # self.addLink( sw3, sw5 )
+ # self.addLink( sw4, sw6 )
+ # self.addLink( sw5, sw6 )
+ self.addLink( as6sw, sw1 )
+
+
+ self.addLink(swTestOn, rootTestOn)
+ #self.addLink(swTestOn, host1)
+ self.addLink(swTestOn, host3)
+ self.addLink(swTestOn, host4)
+ self.addLink(swTestOn, host5)
+ self.addLink(swTestOn, as2host)
+ self.addLink(swTestOn, as6rs)
+
+
+ #self.addLink(rootTestOn, host4)
+
+def startsshd( host ):
+ "Start sshd on host"
+ info( '*** Starting sshd\n' )
+ name, intf, ip = host.name, host.defaultIntf(), host.IP()
+ banner = '/tmp/%s.banner' % name
+ host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
+ host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+ info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+ for h in hosts:
+ startsshd( h )
+
+def stopsshd( ):
+ "Stop *all* sshd processes with a custom banner"
+ info( '*** Shutting down stale sshd/Banner processes ',
+ quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def startquagga( host, num, config_file ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ print zebra_cmd
+ print quagga_cmd
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+def startquaggahost5( host, num ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f %s/zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_CONFIG_FILE_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+
+def stopquagga( ):
+ quietRun( 'sudo pkill -9 -f bgpd' )
+ quietRun( 'sudo pkill -9 -f zebra' )
+
+def sdn1net():
+ topo = SDNIpModifiedTopo()
+ info( '*** Creating network\n' )
+ net = Mininet( topo=topo, controller=RemoteController )
+ net = Mininet( topo=topo, controller=RemoteController )
+
+ host1, host3, host4, host5 = net.get( 'host1', 'host3', 'host4', 'host5' )
+
+ #host100.setIP('1.168.30.' + str(i), 24, str(host100) + "-eth2")
+
+ #host500.setMAC('00:00:00:00:04:%d' % (i-101), 'host%d-eth0' %(i))
+ #add IP prefixes
+ #for j in range(0,121):
+ #host100.cmd('sudo ip addr add %s.0.40.%s/24 dev host%s-eth0' %(i,j,i))
+
+ ## Adding 2nd, 3rd and 4th interface to host1 connected to sw1 (for another BGP peering)
+ #sw1 = net.get('sw1')
+ host1.setMAC('00:00:00:00:00:01', 'host1-eth0')
+ #host1.cmd('ip addr add 192.168.20.101/24 dev host1-eth0')
+ #host1.cmd('ip addr add 192.168.30.101/24 dev host1-eth0')
+ #host1.cmd('ip addr add 192.168.60.101/24 dev host1-eth0')
+
+ # Net has to be start after adding the above link
+ net.start()
+
+ # Set up as6sw as a learning switch as quickly as possible so it
+ # hopefully doesn't connect to the actual controller
+ # TODO figure out how to change controller before starting switch
+ as6sw = net.get('as6sw')
+ as6sw.cmd('ovs-vsctl set-controller as6sw none')
+ as6sw.cmd('ovs-vsctl set-fail-mode as6sw standalone')
+
+ as6sw.cmd( 'sudo ovs-vsctl set port as6sw-eth1 trunk=60')
+ as6sw.cmd( 'sudo ovs-vsctl set port as6sw-eth2 trunk=60')
+
+
+ sw1 = net.get('sw1')
+ sw1.cmd('ovs-vsctl set-controller sw1 tcp:127.0.0.1:6633')
+
+ swTestOn = net.get('swTestOn')
+ swTestOn.cmd('ovs-vsctl set-controller swTestOn none')
+ swTestOn.cmd('ovs-vsctl set-fail-mode swTestOn standalone')
+
+ #host1.defaultIntf().setIP('192.168.10.101/24')
+
+ host1.cmd( 'ifconfig host1-eth0 inet 0')
+ host1.cmd( 'vconfig add host1-eth0 10')
+ host1.cmd( 'ifconfig host1-eth0.10 inet 192.168.10.101')
+
+ host1.cmd( 'vconfig add host1-eth0 20')
+ host1.cmd( 'ifconfig host1-eth0.20 inet 192.168.20.101')
+
+ host1.cmd( 'vconfig add host1-eth0 30')
+ host1.cmd( 'ifconfig host1-eth0.30 inet 192.168.30.101')
+
+ host1.cmd( 'vconfig add host1-eth0 60')
+ host1.cmd( 'ifconfig host1-eth0.60 inet 192.168.60.101')
+
+ # Run BGPd
+ #host1.cmd('%s -d -f %s' % (BGPD, BGPD_CONF))
+ #host1.cmd('/sbin/route add default gw 192.168.10.254 dev %s-eth0' % (host1.name))
+
+ # Configure new host interfaces
+ #host2.defaultIntf().setIP('172.16.10.2/24')
+ #host2.defaultIntf().setMAC('00:00:00:00:01:02')
+ #host2.cmd('/sbin/route add default gw 172.16.10.254 dev %s-eth0' % (host2.name))
+
+ # Set up AS2
+ # add additional VLAN interface
+ host3.cmd( 'ifconfig host3-eth1 inet 0')
+ host3.cmd( 'vconfig add host3-eth1 20')
+ host3.cmd( 'ifconfig host3-eth1.20 inet 192.168.20.1')
+ # change the interface for the sencond connection to sw1 to vlan interface
+ newName = "host3-eth1.20"
+ secondIntf = host3.intf("host3-eth1")
+ secondIntf.name = newName
+ host3.nameToIntf[ newName ] = secondIntf
+
+ host3.setMAC('00:00:00:00:02:01', 'host3-eth0.10')
+ host3.setMAC('00:00:00:00:02:02', 'host3-eth1.20')
+
+ #host3.setIP('172.16.20.254', 24, 'host3-eth2')
+ host3.setIP('3.0.0.254', 8, 'host3-eth2')
+ host3.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+
+ host3.setIP('1.168.30.2', 24, 'host3-eth3')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_ignore=1')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_announce=1')
+ as2host = net.get('as2host')
+ #as2host.defaultIntf().setIP('172.16.20.1/24')
+ for i in range(0, 20):
+ as2host.cmd('sudo ip addr add 3.0.%d.1/24 dev as2host-eth0' %i)
+ as2host.setIP('1.168.30.100', 24, 'as2host-eth1')
+
+ as2host.cmd('ip route add default via 3.0.0.254')
+
+ # Set up AS3
+ host4.setMAC('00:00:00:00:03:01', 'host4-eth0.30')
+ host4.setIP('4.0.0.254', 8, 'host4-eth1')
+ host4.setMAC('00:00:00:00:03:99', 'host4-eth1')
+ host4.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ as3host = net.get('as3host')
+ for i in range(0, 20):
+ as3host.cmd('sudo ip addr add 4.0.%d.1/24 dev as3host-eth0' %i)
+ as3host.cmd('ip route add default via 4.0.0.254')
+
+ host4.setIP('10.0.0.4', 24, 'host4-eth2')
+ host4.setMAC('00:00:00:00:03:33', 'host4-eth2')
+
+ #root space
+ host4.setIP('1.168.30.3', 24, 'host4-eth3')
+ host4.setMAC('00:00:00:00:03:03', 'host4-eth3')
+
+ # Set up AS4
+ #as4host = net.get('as4host')
+ #as4host.defaultIntf().setIP('172.16.40.1/24')
+ #as4host.cmd('ip route add default via 172.16.40.254')
+
+ # setup interface address for 100 quagga hosts
+ time.sleep(10)
+ #for i in range(numHost101, numHost200 + 1):
+ #host100 = net.get('host' + str(i))
+ #host100.cmd(str(i)+'.0.1.254', 24, 'host'+str(i)+'-eth1')
+ #as4host100 = net.get('as4host%s' %(i))
+ #as4host100.defaultIntf().setIP(str(i) + '.0.0.1/24')
+ #as4host100.cmd('ip route add default via ' + str(i) + '.0.0.254')
+ #for j in range(0, 100):
+ #as4host100.cmd('sudo ip addr add %d.0.%d.1/24 dev %s-eth0' %(i, j, as4host100))
+
+ # Set up AS6 - This has a router and a route server
+ as6rs, host5 = net.get('as6rs', 'host5')
+
+ as6rs.setMAC('00:00:00:06:06:01', 'as6rs-eth0')
+ as6rs.setIP('1.168.30.6', 24, 'as6rs-eth1')
+ as6rs.setMAC('00:00:00:06:06:06', 'as6rs-eth1')
+
+ host5.setMAC('00:00:00:00:06:02', 'host5-eth0.60')
+ #as6router.setIP('172.16.60.254', 24, 'as6router-eth1')
+ host5.setIP('5.0.0.254', 8, 'host5-eth1')
+ host5.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ host5.setIP('10.0.0.5', 24, 'host5-eth2')
+ host5.setMAC('00:00:00:00:06:66', 'host5-eth2')
+ host5.setIP('1.168.30.5', 24, 'host5-eth3')
+ host5.setMAC('00:00:00:00:06:05', 'host5-eth3')
+
+ as6host = net.get('as6host')
+ #as6host.defaultIntf().setIP('5.0.0.1/24')
+ for i in range(0, 10):
+ as6host.cmd('sudo ip addr add 5.0.%d.1/24 dev as6host-eth0' %i)
+ as6host.cmd('ip route add default via 5.0.0.254')
+
+ # test the host in the as6
+ #for i in range(1, 10):
+ # baseip = (i-1)*4
+ # host = net.get('as6host%d' % i)
+ # host.defaultIntf().setIP('172.16.70.%d/24' % (baseip+1))
+ # host.cmd('ip route add default via 172.16.70.%d' % (baseip+2))
+ # as6router.setIP('172.16.70.%d' % (baseip+2), 30, 'as6router-eth%d' % (i+1))
+
+ # Start Quagga on border routers
+ startquagga(host3, 1, QUAGGA_CONFIG_FILE_DIR + '/quagga1.conf')
+ startquagga(host4, 2, QUAGGA_CONFIG_FILE_DIR + '/quagga2.conf')
+ #for i in range(numHost101, numHost200 + 1):
+ #host100=net.get('host%d' % (i))
+ #startquaggahost5(host100, i)
+
+ startquagga(as6rs, 4, QUAGGA_CONFIG_FILE_DIR + '/quagga-as6-rs.conf')
+ startquagga(host5, 5, QUAGGA_CONFIG_FILE_DIR + '/quagga-as6.conf')
+
+ #root1, root2, rootTestOn = net.get( 'root1', 'root2', 'rootTestOn' )
+ root1, rootTestOn = net.get( 'root1', 'rootTestOn' )
+ host1.intf('host1-eth1').setIP('1.1.1.1/24')
+ root1.intf('root1-eth0').setIP('1.1.1.2/24')
+ #host2.intf('host2-eth1').setIP('1.1.2.1/24')
+ #root2.intf('root2-eth0').setIP('1.1.2.2/24')
+
+ #rootTestOn.cmd('ip addr add 1.168.30.102/24 dev rootTestOn-eth0')
+ rootTestOn.cmd('ip addr add 1.168.30.99/24 dev rootTestOn-eth0')
+
+ stopsshd()
+
+ startquagga(host1, 100, QUAGGA_CONFIG_FILE_DIR + '/quagga-sdn-modified.conf')
+ hosts = [ host1, host3, host4, host5, as2host, as6rs ];
+ #sshdHosts = sshdHosts + hosts
+ startsshds( hosts )
+ #
+ onos1 = '127.0.0.1'
+ forwarding1 = '%s:2000:%s:2000' % ('1.1.1.2', onos1)
+ root1.cmd( 'ssh -nNT -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % (forwarding1, onos1) )
+
+ # Forward 2605 to root namespace for easier access to SDN domain BGPd
+ # If root can ssh to itself without a password this should work
+ root1.cmd('ssh -N -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -L 2605:1.1.1.1:2605 1.1.1.1 &')
+ #time.sleep(3000000000)
+ CLI( net )
+
+ # Close the ssh port forwarding
+ #quietRun('sudo pkill -f 1.1.1.1')
+
+ stopsshd()
+ stopquagga()
+ net.stop()
+
+if __name__ == '__main__':
+ setLogLevel( 'debug' )
+ if len(sys.argv) > 1:
+ QUAGGA_CONFIG_FILE_DIR = sys.argv[1]
+ sdn1net()
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga-as6-rs.conf b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga-as6-rs.conf
new file mode 100644
index 0000000..1eac0dd
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga-as6-rs.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64520
+ bgp router-id 192.168.60.1
+ neighbor 192.168.60.101 remote-as 64513
+ neighbor 192.168.60.101 route-server-client
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 route-server-client
+! network 172.16.60.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga-as6.conf b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga-as6.conf
new file mode 100644
index 0000000..19cc140
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga-as6.conf
@@ -0,0 +1,39 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64521
+ bgp router-id 192.168.60.2
+ neighbor 192.168.60.1 remote-as 64520
+ neighbor 10.0.0.4 remote-as 64516
+! neighbor 192.168.60.3 remote-as 64520
+! network 172.16.60.0/24
+! network 172.16.70.4/30
+ ! network 172.16.70.8/30
+ ! network 172.16.70.12/30
+ ! network 172.16.70.16/30
+ ! network 172.16.70.20/30
+ ! network 172.16.70.24/30
+ ! network 172.16.70.28/30
+ ! network 172.16.70.32/30
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga-sdn-modified.conf b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga-sdn-modified.conf
new file mode 100644
index 0000000..bf37a60
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga-sdn-modified.conf
@@ -0,0 +1,49 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.1 remote-as 64520
+ neighbor 192.168.60.1 ebgp-multihop
+ neighbor 192.168.60.1 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga1.conf b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga1.conf
new file mode 100644
index 0000000..264f85e
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga1.conf
@@ -0,0 +1,32 @@
+!
+! Zebra configuration saved from vty
+! 2014/11/25 11:22:24
+!
+hostname bgpd
+password hello
+log stdout
+!
+router bgp 64514
+ bgp router-id 192.168.10.1
+! network 3.0.0.0/24
+! network 3.0.1.0/24
+! network 3.0.2.0/24
+! network 3.0.3.0/24
+! network 3.0.4.0/24
+! network 3.0.5.0/24
+! network 3.0.6.0/24
+! network 3.0.7.0/24
+! network 3.0.8.0/24
+! network 3.0.9.0/24
+ neighbor 192.168.20.101 remote-as 64513
+ neighbor 192.168.20.101 route-map PREPEND2 in
+ neighbor 192.168.20.101 route-map PREPEND2 out
+!
+route-map PREPEND1 permit 1
+ set as-path prepend 64514
+!
+route-map PREPEND2 permit 2
+ set as-path prepend 64514 64514
+!
+line vty
+!
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga2.conf b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga2.conf
new file mode 100644
index 0000000..14c7d67
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/quagga2.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64516
+ bgp router-id 192.168.30.1
+! timers bgp 1 3
+ neighbor 192.168.30.101 remote-as 64513
+ neighbor 10.0.0.5 remote-as 64521
+! neighbor 192.168.50.2 remote-as 65001
+! network 172.16.30.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/zebra.conf b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/zebra.conf
new file mode 100644
index 0000000..0f8e3a2
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeserver/mininet/zebra.conf
@@ -0,0 +1,26 @@
+! -*- zebra -*-
+!
+! zebra sample configuration file
+!
+! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
+!
+hostname zebra
+password hello
+enable password 0fw0rk
+log stdout
+!
+! Interfaces description.
+!
+!interface lo
+! description test of desc.
+!
+!interface sit0
+! multicast
+
+!
+! Static default route sample.
+!
+!ip route 0.0.0.0/0 203.181.89.241
+!
+
+!log file /usr/local/var/log/quagga/zebra.log
diff --git a/TestON/tests/PeeringRouterTest/vlan/routeserver/sdnip.json b/TestON/tests/PeeringRouterTest/vlan/routeserver/sdnip.json
new file mode 100644
index 0000000..f3117c6
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/routeserver/sdnip.json
@@ -0,0 +1,59 @@
+{
+
+ "bgpPeers" : [
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "1",
+ "ipAddress" : "192.168.10.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "2",
+ "ipAddress" : "192.168.20.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "3",
+ "ipAddress" : "192.168.30.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "4",
+ "ipAddress" : "192.168.60.1"
+ }
+
+ ],
+ "bgpSpeakers" : [
+ {
+ "name" : "bgpSpeaker1",
+ "attachmentDpid" : "00:00:00:00:00:00:00:02",
+ "attachmentPort" : "1",
+ "macAddress" : "00:00:00:00:00:02",
+ "interfaceAddresses" : [
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "1",
+ "ipAddress" : "192.168.10.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "2",
+ "ipAddress" : "192.168.20.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "3",
+ "ipAddress" : "192.168.30.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "4",
+ "ipAddress" : "192.168.60.101"
+ }
+
+ ]
+
+ }
+
+ ]
+}
diff --git a/TestON/tests/PeeringRouterTest/vlan/sdnip.json b/TestON/tests/PeeringRouterTest/vlan/sdnip.json
new file mode 100644
index 0000000..5b61d05
--- /dev/null
+++ b/TestON/tests/PeeringRouterTest/vlan/sdnip.json
@@ -0,0 +1,59 @@
+{
+
+ "bgpPeers" : [
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "1",
+ "ipAddress" : "192.168.10.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "2",
+ "ipAddress" : "192.168.20.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "3",
+ "ipAddress" : "192.168.30.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:01",
+ "attachmentPort" : "4",
+ "ipAddress" : "192.168.60.2"
+ }
+
+ ],
+ "bgpSpeakers" : [
+ {
+ "name" : "bgpSpeaker1",
+ "attachmentDpid" : "00:00:00:00:00:00:00:02",
+ "attachmentPort" : "1",
+ "macAddress" : "00:00:00:00:00:02",
+ "interfaceAddresses" : [
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "1",
+ "ipAddress" : "192.168.10.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "2",
+ "ipAddress" : "192.168.20.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "3",
+ "ipAddress" : "192.168.30.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:01",
+ "interfacePort" : "4",
+ "ipAddress" : "192.168.60.101"
+ }
+
+ ]
+
+ }
+
+ ]
+}
diff --git a/TestON/tests/PingallExample/PingallExample.params b/TestON/tests/PingallExample/PingallExample.params
index 12bebcd..1e4cfc1 100644
--- a/TestON/tests/PingallExample/PingallExample.params
+++ b/TestON/tests/PingallExample/PingallExample.params
@@ -1,12 +1,12 @@
<PARAMS>
<testcases>1,2,3</testcases>
<ENV>
- <cellName>kelvin</cellName>
+ <cellName>SingleHA</cellName>
</ENV>
<Git>xe</Git>
<CTRL>
- <ip1>10.128.10.21</ip1>
+ <ip1>10.128.30.11</ip1>
<port1>6633</port1>
</CTRL>
</PARAMS>
diff --git a/TestON/tests/PingallExample/PingallExample.py b/TestON/tests/PingallExample/PingallExample.py
index dab380f..c03b0f1 100644
--- a/TestON/tests/PingallExample/PingallExample.py
+++ b/TestON/tests/PingallExample/PingallExample.py
@@ -94,7 +94,7 @@
if case1Result == main.FALSE:
main.cleanup()
main.exit()
-
+
# Starting the mininet using the old way
main.step( "Starting Mininet ..." )
netIsUp = main.Mininet1.startNet()
@@ -143,7 +143,7 @@
def CASE3( self, main ):
"""
- Assign intents
+ Install forwarding app, Pingall and unistall the app
"""
import time
@@ -151,10 +151,11 @@
main.case( "Run Pingall" )
# install onos-app-fwd
- main.log.info( "Install reactive forwarding app" )
- main.ONOScli1.featureInstall( "onos-app-fwd" )
+ main.step( "Activate reactive forwarding app" )
+ main.ONOScli1.activateApp( "org.onosproject.fwd" )
# REACTIVE FWD test
+ main.step( "Run the pingall command in Mininet" )
pingResult = main.FALSE
time1 = time.time()
pingResult = main.Mininet1.pingall()
@@ -162,8 +163,8 @@
main.log.info( "Time for pingall: %2f seconds" % ( time2 - time1 ) )
# uninstall onos-app-fwd
- main.log.info( "Uninstall reactive forwarding app" )
- main.ONOScli1.featureUninstall( "onos-app-fwd" )
+ main.step( "Deactivate reactive forwarding app" )
+ main.ONOScli1.deactivateApp( "org.onosproject.fwd" )
utilities.assert_equals( expect=main.TRUE, actual=pingResult,
onpass="All hosts are reachable",
diff --git a/TestON/tests/PingallExample/PingallExample.topo b/TestON/tests/PingallExample/PingallExample.topo
index dba7a5d..3eda540 100644
--- a/TestON/tests/PingallExample/PingallExample.topo
+++ b/TestON/tests/PingallExample/PingallExample.topo
@@ -2,7 +2,7 @@
<COMPONENT>
<ONOSbench>
- <host>10.128.10.20</host>
+ <host>10.128.30.10</host>
<user>admin</user>
<password></password>
<type>OnosDriver</type>
@@ -11,7 +11,7 @@
</ONOSbench>
<ONOScli1>
- <host>10.128.10.20</host>
+ <host>10.128.30.10</host>
<user>admin</user>
<password></password>
<type>OnosCliDriver</type>
@@ -20,7 +20,7 @@
</ONOScli1>
<ONOS1>
- <host>10.128.10.21</host>
+ <host>10.128.30.11</host>
<user>admin</user>
<password></password>
<type>OnosDriver</type>
@@ -29,7 +29,7 @@
</ONOS1>
<Mininet1>
- <host>10.128.10.20</host>
+ <host>10.128.30.9</host>
<user>admin</user>
<password></password>
<type>MininetCliDriver</type>
diff --git a/TestON/tests/ScaleOutTemplate/.ScaleOutTemplate.py.swo b/TestON/tests/ScaleOutTemplate/.ScaleOutTemplate.py.swo
deleted file mode 100644
index a1a28ae..0000000
--- a/TestON/tests/ScaleOutTemplate/.ScaleOutTemplate.py.swo
+++ /dev/null
Binary files differ
diff --git a/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.params b/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.params
index 641d16a..d4fa651 100644
--- a/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.params
+++ b/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.params
@@ -1,13 +1,13 @@
<PARAMS>
- <testcases>1,2</testcases>
+ <testcases>1,2,1,2,1,2,1,2</testcases>
- <SCALE>2</SCALE>
+ <SCALE>1,3,5,7</SCALE>
<availableNodes>7</availableNodes>
<ENV>
<cellName>defaultCell</cellName>
- <cellFeatures></cellFeatures>
+ <cellApps></cellApps>
</ENV>
<TEST>
@@ -46,7 +46,7 @@
</CTRL>
<MN>
- <ip1>10.128.5.59</ip1>
+ <ip1>10.128.5.55</ip1>
</MN>
<BENCH>
diff --git a/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.py b/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.py
index fdcd680..c290155 100644
--- a/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.py
+++ b/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.py
@@ -16,63 +16,46 @@
def CASE1( self, main ): #This is the initialization case
#this case will clean up all nodes
import time #but only node 1 is started in this case
-
- global clusterCount #number of nodes running
- global ONOSIp #list of ONOS IP addresses
- clusterCount = 1
- ONOSIp = [ 0 ]
-
-
+ global init
+ try:
+ if type(init) is not bool:
+ init = False
+ except NameError:
+ init = False
+
#Load values from params file
checkoutBranch = main.params[ 'GIT' ][ 'checkout' ]
gitPull = main.params[ 'GIT' ][ 'autopull' ]
cellName = main.params[ 'ENV' ][ 'cellName' ]
- Features= main.params[ 'ENV' ][ 'cellFeatures' ]
+ Apps = main.params[ 'ENV' ][ 'cellApps' ]
BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
BENCHUser = main.params[ 'BENCH' ][ 'user' ]
MN1Ip = main.params[ 'MN' ][ 'ip1' ]
maxNodes = int(main.params[ 'availableNodes' ])
- Features = main.params[ 'ENV' ][ 'cellFeatures' ]
skipMvn = main.params[ 'TEST' ][ 'skipCleanInstall' ]
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
- #Populate ONOSIp with ips from params
- for i in range(1, maxNodes + 1):
- ipString = 'ip' + str(i)
- ONOSIp.append(main.params[ 'CTRL' ][ ipString ])
+ # -- INIT SECTION, ONLY RUNS ONCE -- #
+ if init == False:
+ init = True
+ global clusterCount #number of nodes running
+ global ONOSIp #list of ONOS IP addresses
+ global scale
+
+ clusterCount = 0
+ ONOSIp = [ 0 ]
+ scale = (main.params[ 'SCALE' ]).split(",")
+ clusterCount = int(scale[0])
- #############################
- tempIp = [ ONOSIp[1],ONOSIp[2],ONOSIp[3],ONOSIp[4],ONOSIp[5]]
- main.ONOSbench.createLinkGraphFile(BENCHIp, tempIp, str(7))
+ #Populate ONOSIp with ips from params
+ for i in range(1, maxNodes + 1):
+ ipString = 'ip' + str(i)
+ ONOSIp.append(main.params[ 'CTRL' ][ ipString ])
+
+ #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
+ if skipMvn != "yes":
+ mvnResult = main.ONOSbench.cleanInstall()
- main.log.info("marker")
- #############################
-
-
- #kill off all onos processes
- main.log.step("Safety check, killing all ONOS processes")
- main.log.step("before initiating enviornment setup")
- for node in range(1, maxNodes + 1):
- main.ONOSbench.onosDie(ONOSIp[node])
-
-
- #construct the cell file
- main.log.info("Creating cell file")
- exec "a = main.ONOSbench.createCellFile"
- cellIp = []
- for node in range (1, maxNodes + 1):
- cellIp.append(ONOSIp[node])
- a(BENCHIp,cellName,MN1Ip,str(Features), *cellIp)
-
- #Uninstall everywhere
- main.log.step( "Cleaning Enviornment..." )
- for i in range(1, maxNodes + 1):
- main.log.info(" Uninstalling ONOS " + str(i) )
- main.ONOSbench.onosUninstall( ONOSIp[i] )
-
- #mvn clean install, for debugging set param 'skipCleanInstall' to yes to speed up test
- if skipMvn != "yes":
- mvnResult = main.ONOSbench.cleanInstall()
-
#git
main.step( "Git checkout and pull " + checkoutBranch )
if gitPull == 'on':
@@ -83,52 +66,57 @@
checkoutResult = main.TRUE
pullResult = main.TRUE
main.log.info( "Skipped git checkout and pull" )
+
+ # -- END OF INIT SECTION --#
+
+ clusterCount = int(scale[0])
+ scale.remove(scale[0])
+
+ #kill off all onos processes
+ main.log.step("Safety check, killing all ONOS processes")
+ main.log.step("before initiating enviornment setup")
+ for node in range(1, maxNodes + 1):
+ main.ONOSbench.onosDie(ONOSIp[node])
+
+ #Uninstall everywhere
+ main.log.step( "Cleaning Enviornment..." )
+ for i in range(1, maxNodes + 1):
+ main.log.info(" Uninstalling ONOS " + str(i) )
+ main.ONOSbench.onosUninstall( ONOSIp[i] )
+
+ #construct the cell file
+ main.log.info("Creating cell file")
+ cellIp = []
+ for node in range (1, clusterCount + 1):
+ cellIp.append(ONOSIp[node])
+ main.ONOSbench.createCellFile(BENCHIp,cellName,MN1Ip,str(Apps), *cellIp)
- #main.step( "Set cell for ONOS cli env" )
- #main.ONOS1cli.setCell( cellName )
main.step( "Creating ONOS package" )
packageResult = main.ONOSbench.onosPackage()
- main.step( "Installing ONOS package" )
- install1Result = main.ONOSbench.onosInstall( node=ONOSIp[1] )
-
- cellName = main.params[ 'ENV' ][ 'cellName' ]
- main.step( "Applying cell file to environment" )
- cellApplyResult = main.ONOSbench.setCell( cellName )
main.step( "verify cells" )
verifyCellResult = main.ONOSbench.verifyCell()
+
+ for node in range(1, clusterCount + 1):
+ main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
+ main.ONOSbench.onosInstall( ONOSIp[node])
- main.step( "Set cell for ONOS cli env" )
- cli1 = main.ONOS1cli.startOnosCli( ONOSIp[1] )
+ for node in range(1, clusterCount + 1):
+ for i in range( 2 ):
+ isup = main.ONOSbench.isup( ONOSIp[node] )
+ if isup:
+ main.log.info("ONOS " + str(node) + " is up\n")
+ break
+ if not isup:
+ main.log.report( "ONOS " + str(node) + " didn't start!" )
+ main.log.info("Startup sequence complete")
-
def CASE2( self, main ):
- # This case increases the cluster size by whatever scale is
- # Note: 'scale' is the size of the step
- # if scaling is not a part of your test, simply run this case
- # once after CASE1 to set up your enviornment for your desired
- # cluster size. If scaling is a part of you test call this case each time
- # you want to increase cluster size
-
- ''
- 'Increase number of nodes and initiate CLI'
- ''
- import time
- global clusterCount
-
- BENCHIp = main.params[ 'BENCH' ][ 'ip1' ]
- scale = int( main.params[ 'SCALE' ] )
- clusterCount += scale
-
- main.log.report( "Increasing cluster size to " + str( clusterCount ) )
- for node in range((clusterCount - scale) + 1, clusterCount + 1):
- main.ONOSbench.onosDie(ONOSIp[node])
- time.sleep(10)
- main.log.info("Starting ONOS " + str(node) + " at IP: " + ONOSIp[node])
- main.ONOSbench.onosInstall( node=ONOSIp[node])
- exec "a = main.ONOS%scli.startOnosCli" %str(node)
- a(ONOSIp[node])
-
+ print ("clusterCount: " + str(clusterCount))
+ print ("scale: " + str(scale))
+ print ("ONOSIp: " + str(ONOSIp))
+ print ("INIT: " + str(init))
+
diff --git a/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.topo b/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.topo
index 8bd5a9f..0802eca 100644
--- a/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.topo
+++ b/TestON/tests/ScaleOutTemplate/ScaleOutTemplate.topo
@@ -66,7 +66,7 @@
</ONOS3>
<Mininet1>
- <host>10.128.5.59</host>
+ <host>10.128.5.55</host>
<user>admin</user>
<password>onos_test</password>
<type>MininetCliDriver</type>
diff --git a/TestON/tests/SdnIpSingleSwitch/CASE4-ping-as2host.sh b/TestON/tests/SdnIpSingleSwitch/CASE4-ping-as2host.sh
new file mode 100755
index 0000000..52768b2
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/CASE4-ping-as2host.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+
+#all the address in this for loop should work
+
+# ping test between as2 and as3
+for ((i=0;i<10;i++)); do
+
+ #echo '------from 3.0.0.x to 4.0.1.'$j'------'
+
+ for ((j=0; j<10; ++j )) ; do
+ echo '3.0.'$i'.1 -> 4.0.'$j'.1'
+ ping -c 1 -w 1 -I 3.0.$i.1 4.0.$j.1 | grep 'from 4.0.'$j'.1'
+
+ done
+
+done
+for ((i=0;i<10;i++)); do
+
+ #echo '------from 3.0.0.x to 5.0.1.'$j'------'
+
+ for ((j=0; j<10; ++j )) ; do
+ echo '3.0.'$i'.1 -> 5.0.'$j'.1'
+ ping -c 1 -w 1 -I 3.0.$i.1 5.0.$j.1 | grep 'from 5.0.'$j'.1'
+
+ done
+
+done
+
+# ping test between as2 and as4
+for ((i=1;i<2;i++)); do
+ for ((prefix=101; prefix<=200; ++prefix)) ; do
+ for ((j=0; j<10; ++j )) ; do
+ echo '3.0.0.'$i' - > '$prefix'.0.'$j'.1'
+ ping -c 1 -w 1 -I 3.0.0.$i $prefix.0.$j.1 | grep 'from '$prefix'.0.'$j'.1'
+
+ done
+ done
+
+done
+
diff --git a/TestON/tests/SdnIpSingleSwitch/SdnIpSingleSwitch.params b/TestON/tests/SdnIpSingleSwitch/SdnIpSingleSwitch.params
new file mode 100755
index 0000000..467141d
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/SdnIpSingleSwitch.params
@@ -0,0 +1,25 @@
+<PARAMS>
+
+ <testcases>4</testcases>
+
+ #Environment variables
+ <ENV>
+ <cellName>sdnip_single_instance</cellName>
+ </ENV>
+
+ <CTRL>
+ <ip1>127.0.0.1</ip1>
+ <port1>6633</port1>
+ </CTRL>
+
+ <GIT>
+ <autoPull>off</autoPull>
+ <checkout>master</checkout>
+ </GIT>
+
+ <JSON>
+ <prefix>prefix</prefix>
+ <nextHop>nextHop</nextHop>
+ </JSON>
+
+</PARAMS>
diff --git a/TestON/tests/SdnIpSingleSwitch/SdnIpSingleSwitch.py b/TestON/tests/SdnIpSingleSwitch/SdnIpSingleSwitch.py
new file mode 100644
index 0000000..d13bdb3
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/SdnIpSingleSwitch.py
@@ -0,0 +1,1133 @@
+# from cupshelpers.config import prefix
+
+# Testing the basic functionality of SDN-IP
+
+
+class SdnIpSingleSwitch:
+
+ def __init__( self ):
+ self.default = ''
+
+# from cupshelpers.config import prefix
+
+# Testing the basic functionality of SDN-IP
+
+
+class SdnIpSingleSwitch:
+
+ def __init__( self ):
+ self.default = ''
+
+ def CASE4( self, main ):
+ """
+ Test the SDN-IP functionality
+ allRoutesExpected: all expected routes for all BGP peers
+ routeIntentsExpected: all expected MultiPointToSinglePointIntent \
+ intents
+ bgpIntentsExpected: expected PointToPointIntent intents
+ allRoutesActual: all routes from ONOS LCI
+ routeIntentsActual: actual MultiPointToSinglePointIntent intents from \
+ ONOS CLI
+ bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
+ """
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ # SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
+ SDNIPJSONFILEPATH = \
+ "/home/sdnip/TestON/tests/SdnIpSingleSwitch/sdnip.json"
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+ main.log.info( "Generate prefixes for host3" )
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host5" )
+ prefixesHost5 = main.QuaggaCliHost5.generatePrefixes( 5, 10 )
+ main.log.info( prefixesHost5 )
+ for prefix in prefixesHost5:
+ allRoutesExpected.append( prefix + "/" + "192.168.60.2" )
+ routeIntentsExpectedHost5 = \
+ main.QuaggaCliHost5.generateExpectedOnePeerRouteIntents(
+ prefixesHost5, "192.168.60.1", "00:00:00:00:06:02",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4 + routeIntentsExpectedHost5
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+
+ main.step( "Checking if ONOS is up yet" )
+ time.sleep( 20 )
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+
+ main.ONOScli.startOnosCli( ONOS1Ip )
+
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing sdn-ip feature" )
+ main.ONOScli.featureInstall( "onos-app-sdnip" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+ main.log.info( "Login Quagga CLI on host5" )
+ main.QuaggaCliHost5.loginQuagga( "1.168.30.5" )
+ main.log.info( "Enter configuration model of Quagga CLI on host5" )
+ main.QuaggaCliHost5.enterConfig( 64521 )
+ main.log.info( "Add routes to Quagga on host5" )
+ main.QuaggaCliHost5.addRoutes( prefixesHost5, 1 )
+
+ time.sleep( 60 )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ time.sleep( 20 )
+ getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+
+ main.step( "Check MultiPointToSinglePointIntent intents installed" )
+ # routeIntentsExpected are generated when generating routes
+ # get rpoute intents from ONOS CLI
+ routeIntentsActual = \
+ main.QuaggaCliHost3.extractActualRouteIntents(
+ getIntentsResult )
+ routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
+ routeIntentsStrActual = str( routeIntentsActual ).replace( 'u', "" )
+ main.log.info( "MultiPointToSinglePoint intents expected:" )
+ main.log.info( routeIntentsStrExpected )
+ main.log.info( "MultiPointToSinglePoint intents get from ONOS CLI:" )
+ main.log.info( routeIntentsStrActual )
+ utilities.assertEquals(
+ expect=True,
+ actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
+ onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
+ correct!***",
+ onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
+ wrong!***" )
+
+ if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+ main.log.report( "***MultiPointToSinglePoint Intents before \
+ deleting routes correct!***" )
+ else:
+ main.log.report( "***MultiPointToSinglePoint Intents before \
+ deleting routes wrong!***" )
+
+ main.step( "Check BGP PointToPointIntent intents installed" )
+ # bgp intents expected
+ bgpIntentsExpected = \
+ main.QuaggaCliHost3.generateExpectedBgpIntents( SDNIPJSONFILEPATH )
+ # get BGP intents from ONOS CLI
+ bgpIntentsActual = \
+ main.QuaggaCliHost3.extractActualBgpIntents( getIntentsResult )
+
+ bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
+ bgpIntentsStrActual = str( bgpIntentsActual )
+ main.log.info( "PointToPointIntent intents expected:" )
+ main.log.info( bgpIntentsStrExpected )
+ main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
+ main.log.info( bgpIntentsStrActual )
+
+ utilities.assertEquals(
+ expect=True,
+ actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
+ onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
+ onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+ if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
+ main.log.report(
+ "***PointToPointIntent Intents in SDN-IP are correct!***" )
+ else:
+ main.log.report(
+ "***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+ main.log.info( "Ping Test Start" )
+ time.sleep(1000000)
+
+ #============================= Ping Test ========================
+ # wait until all MultiPointToSinglePoint
+ time.sleep( 20 )
+ pingTestScript = "CASE4-ping-as2host.sh"
+ pingTestResultsFile = \
+ "~/CASE4-ping-results-before-delete-routes-" \
+ + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+ pingTestResults = main.QuaggaCliHost.pingTest(
+ "1.168.30.100", pingTestScript, pingTestResultsFile )
+ main.log.info( pingTestResults )
+ time.sleep( 20 )
+
+ #============================= Deleting Routes ==================
+ main.step( "Check deleting routes installed" )
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+ main.QuaggaCliHost5.deleteRoutes( prefixesHost5, 1 )
+
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ main.log.info( "allRoutes_actual = " )
+ main.log.info( allRoutesActual )
+
+ utilities.assertEquals(
+ expect="[]", actual=str( allRoutesActual ),
+ onpass="***Route number in SDN-IP is 0, correct!***",
+ onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report( "***Routes in SDN-IP after deleting correct!***" )
+ else:
+ main.log.report( "***Routes in SDN-IP after deleting wrong!***" )
+
+ main.step( "Check intents after deleting routes" )
+ getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+ routeIntentsActual = \
+ main.QuaggaCliHost3.extractActualRouteIntents(
+ getIntentsResult )
+ main.log.info( "main.ONOScli.intents()= " )
+ main.log.info( routeIntentsActual )
+ utilities.assertEquals(
+ expect="[]", actual=str( routeIntentsActual ),
+ onpass="***MultiPointToSinglePoint Intents number in SDN-IP is 0, \
+ correct!***",
+ onfail="***MultiPointToSinglePoint Intents number in SDN-IP is 0, \
+ wrong!***" )
+
+ if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+ main.log.report( "***MultiPointToSinglePoint Intents after \
+ deleting routes correct!***" )
+ else:
+ main.log.report( "***MultiPointToSinglePoint Intents after \
+ deleting routes wrong!***" )
+
+ time.sleep( 20 )
+ pingTestScript = "CASE4-ping-as2host.sh"
+ pingTestResultsFile = \
+ "~/CASE4-ping-results-after-delete-routes-" \
+ + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+ pingTestResults = main.QuaggaCliHost.pingTest(
+ "1.168.30.100", pingTestScript, pingTestResultsFile )
+ main.log.info( pingTestResults )
+ time.sleep( 100 )
+
+ # main.step( "Test whether Mininet is started" )
+ # main.Mininet2.handle.sendline( "xterm host1" )
+ # main.Mininet2.handle.expect( "mininet>" )
+
+ def CASE3( self, main ):
+ """
+ Test the SDN-IP functionality
+ allRoutesExpected: all expected routes for all BGP peers
+ routeIntentsExpected: all expected MultiPointToSinglePointIntent intents
+ bgpIntentsExpected: expected PointToPointIntent intents
+ allRoutesActual: all routes from ONOS LCI
+ routeIntentsActual: actual MultiPointToSinglePointIntent intents from \
+ ONOS CLI
+ bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
+ """
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case( "The test case is to help to setup the TestON \
+ environment and test new drivers" )
+ # SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
+ SDNIPJSONFILEPATH = \
+ "/home/admin/workspace/onos/tools/package/config/sdnip.json"
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+ main.log.info( "Generate prefixes for host3" )
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+
+ main.step( "Checking if ONOS is up yet" )
+ time.sleep( 60 )
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+
+ main.ONOScli.startOnosCli( ONOS1Ip )
+
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing sdn-ip feature" )
+ main.ONOScli.featureInstall( "onos-app-sdnip" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+
+ for i in range( 101, 201 ):
+ prefixesHostX = \
+ main.QuaggaCliHost.generatePrefixes( str( i ), 10 )
+ main.log.info( prefixesHostX )
+ for prefix in prefixesHostX:
+ allRoutesExpected.append(
+ prefix + "/" + "192.168.40." + str( i - 100 ) )
+
+ routeIntentsExpectedHostX = \
+ main.QuaggaCliHost.generateExpectedOnePeerRouteIntents(
+ prefixesHostX, "192.168.40." + str( i - 100 ),
+ "00:00:%02d:00:00:90" % ( i - 101 ), SDNIPJSONFILEPATH )
+ routeIntentsExpected = routeIntentsExpected + \
+ routeIntentsExpectedHostX
+
+ main.log.info( "Login Quagga CLI on host" + str( i ) )
+ QuaggaCliHostX = getattr( main, ( 'QuaggaCliHost' + str( i ) ) )
+ QuaggaCliHostX.loginQuagga( "1.168.30." + str( i ) )
+ main.log.info(
+ "Enter configuration model of Quagga CLI on host" + str( i ) )
+ QuaggaCliHostX.enterConfig( 65000 + i - 100 )
+ main.log.info( "Add routes to Quagga on host" + str( i ) )
+ QuaggaCliHostX.addRoutes( prefixesHostX, 1 )
+
+ time.sleep( 60 )
+
+ # get routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ time.sleep( 20 )
+ getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+
+ main.step( "Check MultiPointToSinglePointIntent intents installed" )
+ # routeIntentsExpected are generated when generating routes
+ # get rpoute intents from ONOS CLI
+ routeIntentsActual = \
+ main.QuaggaCliHost3.extractActualRouteIntents(
+ getIntentsResult )
+ routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
+ routeIntentsStrActual = str( routeIntentsActual ).replace( 'u', "" )
+ main.log.info( "MultiPointToSinglePoint intents expected:" )
+ main.log.info( routeIntentsStrExpected )
+ main.log.info( "MultiPointToSinglePoint intents get from ONOS CLI:" )
+ main.log.info( routeIntentsStrActual )
+ utilities.assertEquals(
+ expect=True,
+ actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
+ onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
+ correct!***",
+ onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
+ wrong!***" )
+
+ if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+ main.log.report(
+ "***MultiPointToSinglePoint Intents before deleting routes \
+ correct!***" )
+ else:
+ main.log.report(
+ "***MultiPointToSinglePoint Intents before deleting routes \
+ wrong!***" )
+
+ main.step( "Check BGP PointToPointIntent intents installed" )
+ # bgp intents expected
+ bgpIntentsExpected = main.QuaggaCliHost3.generateExpectedBgpIntents(
+ SDNIPJSONFILEPATH )
+ # get BGP intents from ONOS CLI
+ bgpIntentsActual = main.QuaggaCliHost3.extractActualBgpIntents(
+ getIntentsResult )
+
+ bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
+ bgpIntentsStrActual = str( bgpIntentsActual )
+ main.log.info( "PointToPointIntent intents expected:" )
+ main.log.info( bgpIntentsStrExpected )
+ main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
+ main.log.info( bgpIntentsStrActual )
+
+ utilities.assertEquals(
+ expect=True,
+ actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
+ onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
+ onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+ if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
+ main.log.report(
+ "***PointToPointIntent Intents in SDN-IP are correct!***" )
+ else:
+ main.log.report(
+ "***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+ #============================= Ping Test ========================
+ # wait until all MultiPointToSinglePoint
+ time.sleep( 20 )
+ pingTestScript = "~/SDNIP/test-tools/CASE3-ping-as2host.sh"
+ pingTestResultsFile = \
+ "~/SDNIP/SdnIpIntentDemo/log/CASE3-ping-results-before-delete-routes-" \
+ + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+ pingTestResults = main.QuaggaCliHost.pingTest(
+ "1.168.30.100", pingTestScript, pingTestResultsFile )
+ main.log.info( pingTestResults )
+ time.sleep( 20 )
+
+ #============================= Deleting Routes ==================
+ main.step( "Check deleting routes installed" )
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+ for i in range( 101, 201 ):
+ prefixesHostX = \
+ main.QuaggaCliHost.generatePrefixes( str( i ), 10 )
+ main.log.info( prefixesHostX )
+ QuaggaCliHostX = getattr( main, ( 'QuaggaCliHost' + str( i ) ) )
+ QuaggaCliHostX.deleteRoutes( prefixesHostX, 1 )
+
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+ allRoutesActual = main.QuaggaCliHost3.extractActualRoutes(
+ getRoutesResult )
+ main.log.info( "allRoutes_actual = " )
+ main.log.info( allRoutesActual )
+
+ utilities.assertEquals(
+ expect="[]", actual=str( allRoutesActual ),
+ onpass="***Route number in SDN-IP is 0, correct!***",
+ onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after deleting correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after deleting wrong!***" )
+
+ main.step( "Check intents after deleting routes" )
+ getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+ routeIntentsActual = \
+ main.QuaggaCliHost3.extractActualRouteIntents(
+ getIntentsResult )
+ main.log.info( "main.ONOScli.intents()= " )
+ main.log.info( routeIntentsActual )
+ utilities.assertEquals(
+ expect="[]", actual=str( routeIntentsActual ),
+ onpass="***MultiPointToSinglePoint Intents number in SDN-IP is \
+ 0, correct!***",
+ onfail="***MultiPointToSinglePoint Intents number in SDN-IP is \
+ 0, wrong!***" )
+
+ if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+ main.log.report(
+ "***MultiPointToSinglePoint Intents after deleting routes \
+ correct!***" )
+ else:
+ main.log.report(
+ "***MultiPointToSinglePoint Intents after deleting routes \
+ wrong!***" )
+
+ time.sleep( 20 )
+ pingTestScript = "~/SDNIP/test-tools/CASE3-ping-as2host.sh"
+ pingTestResultsFile = \
+ "~/SDNIP/SdnIpIntentDemo/log/CASE3-ping-results-after-delete-routes-" \
+ + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+ pingTestResults = main.QuaggaCliHost.pingTest(
+ "1.168.30.100", pingTestScript, pingTestResultsFile )
+ main.log.info( pingTestResults )
+ time.sleep( 100 )
+
+ # main.step( "Test whether Mininet is started" )
+ # main.Mininet2.handle.sendline( "xterm host1" )
+ # main.Mininet2.handle.expect( "mininet>" )
+
+ def CASE1( self, main ):
+ """
+ Test the SDN-IP functionality
+ allRoutesExpected: all expected routes for all BGP peers
+ routeIntentsExpected: all expected MultiPointToSinglePointIntent \
+ intents
+ bgpIntentsExpected: expected PointToPointIntent intents
+ allRoutesActual: all routes from ONOS LCI
+ routeIntentsActual: actual MultiPointToSinglePointIntent intents \
+ from ONOS CLI
+ bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
+ """
+ import time
+ import json
+ from operator import eq
+ # from datetime import datetime
+ from time import localtime, strftime
+
+ main.case("The test case is to help to setup the TestON environment \
+ and test new drivers" )
+ SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+ # bgpPeerHosts = []
+ # for i in range( 3, 5 ):
+ # bgpPeerHosts.append( "host" + str( i ) )
+ # main.log.info( "BGP Peer Hosts are:" + bgpPeerHosts )
+
+ # for i in range( 3, 5 ):
+ # QuaggaCliHost = "QuaggaCliHost" + str( i )
+ # prefixes = main.QuaggaCliHost.generatePrefixes( 3, 10 )
+
+ # main.log.info( prefixes )
+ # allRoutesExpected.append( prefixes )
+ main.log.info( "Generate prefixes for host3" )
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Starting ONOS service" )
+ # TODO: start ONOS from Mininet Script
+ # startResult = main.ONOSbench.onosStart( "127.0.0.1" )
+ main.step( "Installing ONOS package" )
+ onos1InstallResult = main.ONOSbench.onosInstall(
+ options="-f", node=ONOS1Ip )
+
+ main.step( "Checking if ONOS is up yet" )
+ time.sleep( 60 )
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+ # TODO: change the hardcode in startOnosCli method in ONOS CLI driver
+
+ main.ONOScli.startOnosCli( ONOS1Ip )
+
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing sdn-ip feature" )
+ main.ONOScli.featureInstall( "onos-app-sdnip" )
+ time.sleep( 10 )
+ main.step( "Login all BGP peers and add routes into peers" )
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info( "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info( "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+ time.sleep( 60 )
+
+ # get all routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding routes are wrong!***" )
+
+ time.sleep( 20 )
+ getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+
+ main.step( "Check MultiPointToSinglePointIntent intents installed" )
+ # routeIntentsExpected are generated when generating routes
+ # get rpoute intents from ONOS CLI
+ routeIntentsActual = \
+ main.QuaggaCliHost3.extractActualRouteIntents(
+ getIntentsResult )
+ routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
+ routeIntentsStrActual = str( routeIntentsActual ).replace( 'u', "" )
+ main.log.info( "MultiPointToSinglePoint intents expected:" )
+ main.log.info( routeIntentsStrExpected )
+ main.log.info( "MultiPointToSinglePoint intents get from ONOS CLI:" )
+ main.log.info( routeIntentsStrActual )
+ utilities.assertEquals(
+ expect=True,
+ actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
+ onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
+ correct!***",
+ onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
+ wrong!***" )
+
+ if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+ main.log.report(
+ "***MultiPointToSinglePoint Intents before deleting routes \
+ correct!***" )
+ else:
+ main.log.report(
+ "***MultiPointToSinglePoint Intents before deleting routes \
+ wrong!***" )
+
+ main.step( "Check BGP PointToPointIntent intents installed" )
+ # bgp intents expected
+ bgpIntentsExpected = \
+ main.QuaggaCliHost3.generateExpectedBgpIntents( SDNIPJSONFILEPATH )
+ # get BGP intents from ONOS CLI
+ bgpIntentsActual = main.QuaggaCliHost3.extractActualBgpIntents(
+ getIntentsResult )
+
+ bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
+ bgpIntentsStrActual = str( bgpIntentsActual )
+ main.log.info( "PointToPointIntent intents expected:" )
+ main.log.info( bgpIntentsStrExpected )
+ main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
+ main.log.info( bgpIntentsStrActual )
+
+ utilities.assertEquals(
+ expect=True,
+ actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
+ onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
+ onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+ if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
+ main.log.report(
+ "***PointToPointIntent Intents in SDN-IP are correct!***" )
+ else:
+ main.log.report(
+ "***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+ #============================= Ping Test ========================
+ # wait until all MultiPointToSinglePoint
+ time.sleep( 20 )
+ pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+ pingTestResultsFile = \
+ "~/SDNIP/SdnIpIntentDemo/log/CASE1-ping-results-before-delete-routes-" \
+ + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+ pingTestResults = main.QuaggaCliHost.pingTest(
+ "1.168.30.100", pingTestScript, pingTestResultsFile )
+ main.log.info( pingTestResults )
+
+ # ping test
+
+ #============================= Deleting Routes ==================
+ main.step( "Check deleting routes installed" )
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+
+ # main.log.info( "main.ONOScli.get_routes_num() = " )
+ # main.log.info( main.ONOScli.getRoutesNum() )
+ # utilities.assertEquals( expect="Total SDN-IP routes = 1", actual=
+ # main.ONOScli.getRoutesNum(),
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ main.log.info( "allRoutes_actual = " )
+ main.log.info( allRoutesActual )
+
+ utilities.assertEquals(
+ expect="[]", actual=str( allRoutesActual ),
+ onpass="***Route number in SDN-IP is 0, correct!***",
+ onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after deleting correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after deleting wrong!***" )
+
+ main.step( "Check intents after deleting routes" )
+ getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+ routeIntentsActual = \
+ main.QuaggaCliHost3.extractActualRouteIntents(
+ getIntentsResult )
+ main.log.info( "main.ONOScli.intents()= " )
+ main.log.info( routeIntentsActual )
+ utilities.assertEquals(
+ expect="[]", actual=str( routeIntentsActual ),
+ onpass="***MultiPointToSinglePoint Intents number in SDN-IP is \
+ 0, correct!***",
+ onfail="***MultiPointToSinglePoint Intents number in SDN-IP is \
+ 0, wrong!***" )
+
+ if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+ main.log.report(
+ "***MultiPointToSinglePoint Intents after deleting routes \
+ correct!***" )
+ else:
+ main.log.report(
+ "***MultiPointToSinglePoint Intents after deleting routes \
+ wrong!***" )
+
+ time.sleep( 20 )
+ pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+ pingTestResultsFile = \
+ "~/SDNIP/SdnIpIntentDemo/log/CASE1-ping-results-after-delete-routes-" \
+ + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+ pingTestResults = main.QuaggaCliHost.pingTest(
+ "1.168.30.100", pingTestScript, pingTestResultsFile )
+ main.log.info( pingTestResults )
+ time.sleep( 30 )
+
+ # main.step( "Test whether Mininet is started" )
+ # main.Mininet2.handle.sendline( "xterm host1" )
+ # main.Mininet2.handle.expect( "mininet>" )
+
+ def CASE2( self, main ):
+ """
+ Test the SDN-IP functionality
+ allRoutesExpected: all expected routes for all BGP peers
+ routeIntentsExpected: all expected MultiPointToSinglePointIntent \
+ intents
+ bgpIntentsExpected: expected PointToPointIntent intents
+ allRoutesActual: all routes from ONOS LCI
+ routeIntentsActual: actual MultiPointToSinglePointIntent intents \
+ from ONOS CLI
+ bgpIntentsActual: actual PointToPointIntent intents from ONOS CLI
+ """
+ import time
+ import json
+ from operator import eq
+ from time import localtime, strftime
+
+ main.case(
+ "The test case is to help to setup the TestON environment and \
+ test new drivers" )
+ SDNIPJSONFILEPATH = "../tests/SdnIpTest/sdnip.json"
+ # all expected routes for all BGP peers
+ allRoutesExpected = []
+ main.step( "Start to generate routes for all BGP peers" )
+
+ main.log.info( "Generate prefixes for host3" )
+ prefixesHost3 = main.QuaggaCliHost3.generatePrefixes( 3, 10 )
+ main.log.info( prefixesHost3 )
+ # generate route with next hop
+ for prefix in prefixesHost3:
+ allRoutesExpected.append( prefix + "/" + "192.168.20.1" )
+ routeIntentsExpectedHost3 = \
+ main.QuaggaCliHost3.generateExpectedOnePeerRouteIntents(
+ prefixesHost3, "192.168.20.1", "00:00:00:00:02:02",
+ SDNIPJSONFILEPATH )
+
+ main.log.info( "Generate prefixes for host4" )
+ prefixesHost4 = main.QuaggaCliHost4.generatePrefixes( 4, 10 )
+ main.log.info( prefixesHost4 )
+ # generate route with next hop
+ for prefix in prefixesHost4:
+ allRoutesExpected.append( prefix + "/" + "192.168.30.1" )
+ routeIntentsExpectedHost4 = \
+ main.QuaggaCliHost4.generateExpectedOnePeerRouteIntents(
+ prefixesHost4, "192.168.30.1", "00:00:00:00:03:01",
+ SDNIPJSONFILEPATH )
+
+ routeIntentsExpected = routeIntentsExpectedHost3 + \
+ routeIntentsExpectedHost4
+
+ main.log.report( "Removing raft logs" )
+ main.ONOSbench.onosRemoveRaftLogs()
+ main.log.report( "Uninstalling ONOS" )
+ main.ONOSbench.onosUninstall( ONOS1Ip )
+
+ cellName = main.params[ 'ENV' ][ 'cellName' ]
+ ONOS1Ip = main.params[ 'CTRL' ][ 'ip1' ]
+ main.step( "Set cell for ONOS-cli environment" )
+ main.ONOScli.setCell( cellName )
+ verifyResult = main.ONOSbench.verifyCell()
+ # main.log.report( "Removing raft logs" )
+ # main.ONOSbench.onosRemoveRaftLogs()
+ # main.log.report( "Uninstalling ONOS" )
+ # main.ONOSbench.onosUninstall( ONOS1Ip )
+ main.step( "Creating ONOS package" )
+ # packageResult = main.ONOSbench.onosPackage()
+
+ main.step( "Installing ONOS package" )
+ # onos1InstallResult = main.ONOSbench.onosInstall( options="-f",
+ # node=ONOS1Ip )
+
+ main.step( "Checking if ONOS is up yet" )
+ # time.sleep( 60 )
+ onos1Isup = main.ONOSbench.isup( ONOS1Ip )
+ if not onos1Isup:
+ main.log.report( "ONOS1 didn't start!" )
+
+ main.step( "Start ONOS-cli" )
+ main.ONOScli.startOnosCli( ONOS1Ip )
+
+ main.step( "Get devices in the network" )
+ listResult = main.ONOScli.devices( jsonFormat=False )
+ main.log.info( listResult )
+ time.sleep( 10 )
+ main.log.info( "Installing sdn-ip feature" )
+ main.ONOScli.featureInstall( "onos-app-sdnip" )
+ time.sleep( 10 )
+
+ main.step( "Check BGP PointToPointIntent intents installed" )
+ # bgp intents expected
+ bgpIntentsExpected = main.QuaggaCliHost3.generateExpectedBgpIntents(
+ SDNIPJSONFILEPATH )
+ # get BGP intents from ONOS CLI
+ getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+ bgpIntentsActual = main.QuaggaCliHost3.extractActualBgpIntents(
+ getIntentsResult )
+
+ bgpIntentsStrExpected = str( bgpIntentsExpected ).replace( 'u', "" )
+ bgpIntentsStrActual = str( bgpIntentsActual )
+ main.log.info( "PointToPointIntent intents expected:" )
+ main.log.info( bgpIntentsStrExpected )
+ main.log.info( "PointToPointIntent intents get from ONOS CLI:" )
+ main.log.info( bgpIntentsStrActual )
+
+ utilities.assertEquals(
+ expect=True,
+ actual=eq( bgpIntentsStrExpected, bgpIntentsStrActual ),
+ onpass="***PointToPointIntent Intents in SDN-IP are correct!***",
+ onfail="***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+ if ( eq( bgpIntentsStrExpected, bgpIntentsStrActual ) ):
+ main.log.report(
+ "***PointToPointIntent Intents in SDN-IP are correct!***" )
+ else:
+ main.log.report(
+ "***PointToPointIntent Intents in SDN-IP are wrong!***" )
+
+ allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
+ pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+ # roundNum = 0;
+ # while( True ):
+ for roundNum in range( 1, 6 ):
+ # round = round + 1;
+ main.log.report( "The Round " + str( roundNum ) +
+ " test starts................................" )
+
+ main.step( "Login all BGP peers and add routes into peers" )
+ main.log.info( "Login Quagga CLI on host3" )
+ main.QuaggaCliHost3.loginQuagga( "1.168.30.2" )
+ main.log.info(
+ "Enter configuration model of Quagga CLI on host3" )
+ main.QuaggaCliHost3.enterConfig( 64514 )
+ main.log.info( "Add routes to Quagga on host3" )
+ main.QuaggaCliHost3.addRoutes( prefixesHost3, 1 )
+
+ main.log.info( "Login Quagga CLI on host4" )
+ main.QuaggaCliHost4.loginQuagga( "1.168.30.3" )
+ main.log.info(
+ "Enter configuration model of Quagga CLI on host4" )
+ main.QuaggaCliHost4.enterConfig( 64516 )
+ main.log.info( "Add routes to Quagga on host4" )
+ main.QuaggaCliHost4.addRoutes( prefixesHost4, 1 )
+ time.sleep( 60 )
+
+ # get all routes inside SDN-IP
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+
+ # parse routes from ONOS CLI
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+
+ # allRoutesStrExpected = str( sorted( allRoutesExpected ) )
+ allRoutesStrActual = str( allRoutesActual ).replace( 'u', "" )
+ main.step( "Check routes installed" )
+ main.log.info( "Routes expected:" )
+ main.log.info( allRoutesStrExpected )
+ main.log.info( "Routes get from ONOS CLI:" )
+ main.log.info( allRoutesStrActual )
+ utilities.assertEquals(
+ expect=allRoutesStrExpected, actual=allRoutesStrActual,
+ onpass="***Routes in SDN-IP are correct!***",
+ onfail="***Routes in SDN-IP are wrong!***" )
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after adding correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after adding wrong!***" )
+
+ time.sleep( 20 )
+ getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+
+ main.step(
+ "Check MultiPointToSinglePointIntent intents installed" )
+ # routeIntentsExpected are generated when generating routes
+ # get route intents from ONOS CLI
+ routeIntentsActual = \
+ main.QuaggaCliHost3.extractActualRouteIntents(
+ getIntentsResult )
+ # routeIntentsStrExpected = str( sorted( routeIntentsExpected ) )
+ routeIntentsStrActual = str(
+ routeIntentsActual ).replace( 'u', "" )
+ main.log.info( "MultiPointToSinglePoint intents expected:" )
+ main.log.info( routeIntentsStrExpected )
+ main.log.info(
+ "MultiPointToSinglePoint intents get from ONOS CLI:" )
+ main.log.info( routeIntentsStrActual )
+ utilities.assertEquals(
+ expect=True,
+ actual=eq( routeIntentsStrExpected, routeIntentsStrActual ),
+ onpass="***MultiPointToSinglePoint Intents in SDN-IP are \
+ correct!***",
+ onfail="***MultiPointToSinglePoint Intents in SDN-IP are \
+ wrong!***" )
+
+ if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+ main.log.report(
+ "***MultiPointToSinglePoint Intents after adding routes \
+ correct!***" )
+ else:
+ main.log.report(
+ "***MultiPointToSinglePoint Intents after adding routes \
+ wrong!***" )
+
+ #============================= Ping Test ========================
+ # wait until all MultiPointToSinglePoint
+ time.sleep( 20 )
+ # pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+ pingTestResultsFile = \
+ "~/SDNIP/SdnIpIntentDemo/log/CASE2-Round" \
+ + str( roundNum ) + "-ping-results-before-delete-routes-" \
+ + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+ pingTestResults = main.QuaggaCliHost.pingTest(
+ "1.168.30.100", pingTestScript, pingTestResultsFile )
+ main.log.info( pingTestResults )
+ # ping test
+
+ #============================= Deleting Routes ==================
+ main.step( "Check deleting routes installed" )
+ main.log.info( "Delete routes to Quagga on host3" )
+ main.QuaggaCliHost3.deleteRoutes( prefixesHost3, 1 )
+ main.log.info( "Delete routes to Quagga on host4" )
+ main.QuaggaCliHost4.deleteRoutes( prefixesHost4, 1 )
+
+ getRoutesResult = main.ONOScli.routes( jsonFormat=True )
+ allRoutesActual = \
+ main.QuaggaCliHost3.extractActualRoutes( getRoutesResult )
+ main.log.info( "allRoutes_actual = " )
+ main.log.info( allRoutesActual )
+
+ utilities.assertEquals(
+ expect="[]", actual=str( allRoutesActual ),
+ onpass="***Route number in SDN-IP is 0, correct!***",
+ onfail="***Routes number in SDN-IP is not 0, wrong!***" )
+
+ if( eq( allRoutesStrExpected, allRoutesStrActual ) ):
+ main.log.report(
+ "***Routes in SDN-IP after deleting correct!***" )
+ else:
+ main.log.report(
+ "***Routes in SDN-IP after deleting wrong!***" )
+
+ main.step( "Check intents after deleting routes" )
+ getIntentsResult = main.ONOScli.intents( jsonFormat=True )
+ routeIntentsActual = \
+ main.QuaggaCliHost3.extractActualRouteIntents(
+ getIntentsResult )
+ main.log.info( "main.ONOScli.intents()= " )
+ main.log.info( routeIntentsActual )
+ utilities.assertEquals(
+ expect="[]", actual=str( routeIntentsActual ),
+ onpass=
+ "***MultiPointToSinglePoint Intents number in SDN-IP \
+ is 0, correct!***",
+ onfail="***MultiPointToSinglePoint Intents number in SDN-IP \
+ is 0, wrong!***" )
+
+ if( eq( routeIntentsStrExpected, routeIntentsStrActual ) ):
+ main.log.report(
+ "***MultiPointToSinglePoint Intents after deleting \
+ routes correct!***" )
+ else:
+ main.log.report(
+ "***MultiPointToSinglePoint Intents after deleting \
+ routes wrong!***" )
+
+ time.sleep( 20 )
+ # pingTestScript = "~/SDNIP/SdnIpIntentDemo/CASE1-ping-as2host.sh"
+ pingTestResultsFile = \
+ "~/SDNIP/SdnIpIntentDemo/log/CASE2-Round" \
+ + str( roundNum ) + "-ping-results-after-delete-routes-" \
+ + strftime( "%Y-%m-%d_%H:%M:%S", localtime() ) + ".txt"
+ pingTestResults = main.QuaggaCliHost.pingTest(
+ "1.168.30.100", pingTestScript, pingTestResultsFile )
+ main.log.info( pingTestResults )
+ time.sleep( 30 )
+
diff --git a/TestON/tests/SdnIpSingleSwitch/SdnIpSingleSwitch.topo b/TestON/tests/SdnIpSingleSwitch/SdnIpSingleSwitch.topo
new file mode 100755
index 0000000..df9f7d2
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/SdnIpSingleSwitch.topo
@@ -0,0 +1,73 @@
+<TOPOLOGY>
+ <COMPONENT>
+
+ <ONOSbench>
+ <host>127.0.0.1</host>
+ <user>sdnip</user>
+ <password>sdnip</password>
+ <type>OnosDriver</type>
+ <connect_order>1</connect_order>
+ <COMPONENTS>
+ <home>~/onos</home>
+ </COMPONENTS>
+ </ONOSbench>
+
+ <ONOScli>
+ <host>127.0.0.1</host>
+ <user>sdnip</user>
+ <password>sdnip</password>
+ <type>OnosCliDriver</type>
+ <connect_order>2</connect_order>
+ <COMPONENTS>
+ <home>~/onos</home>
+ </COMPONENTS>
+ </ONOScli>
+
+ <ONOS1>
+ <host>127.0.0.1</host>
+ <user>sdnip</user>
+ <password>sdnip</password>
+ <type>OnosDriver</type>
+ <connect_order>3</connect_order>
+ <COMPONENTS>
+ <home>~/onos</home>
+ </COMPONENTS>
+ </ONOS1>
+
+ <QuaggaCliHost3>
+ <host>1.168.30.2</host>
+ <user>sdnip</user>
+ <password>sdnip</password>
+ <type>QuaggaCliDriver</type>
+ <connect_order>4</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </QuaggaCliHost3>
+ <QuaggaCliHost4>
+ <host>1.168.30.3</host>
+ <user>sdnip</user>
+ <password>sdnip</password>
+ <type>QuaggaCliDriver</type>
+ <connect_order>5</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </QuaggaCliHost4>
+ <QuaggaCliHost5>
+ <host>1.168.30.5</host>
+ <user>sdnip</user>
+ <password>sdnip</password>
+ <type>QuaggaCliDriver</type>
+ <connect_order>6</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </QuaggaCliHost5>
+ <QuaggaCliHost>
+ <host>1.168.30.100</host>
+ <user>sdnip</user>
+ <password>sdnip</password>
+ <type>QuaggaCliDriver</type>
+ <connect_order>7</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </QuaggaCliHost>
+
+
+ </COMPONENT>
+</TOPOLOGY>
+
diff --git a/TestON/tests/SdnIpSingleSwitch/__init__.py b/TestON/tests/SdnIpSingleSwitch/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/__init__.py
diff --git a/TestON/tests/SdnIpSingleSwitch/addresses.json b/TestON/tests/SdnIpSingleSwitch/addresses.json
new file mode 100644
index 0000000..203de9b
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/addresses.json
@@ -0,0 +1,30 @@
+{
+ "addresses" : [
+ {
+ "dpid" : "00:00:00:00:00:00:00:a1",
+ "port" : "2",
+ "ips" : ["192.168.10.101/24"],
+ "mac" : "00:00:00:00:00:01"
+
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:a1",
+ "port" : "3",
+ "ips" : ["192.168.20.101/24"],
+ "mac" : "00:00:00:00:00:01"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:a1",
+ "port" : "4",
+ "ips" : ["192.168.30.101/24"],
+ "mac" : "00:00:00:00:00:01"
+ },
+ {
+ "dpid" : "00:00:00:00:00:00:00:a1",
+ "port" : "5",
+ "ips" : ["192.168.60.101/24"],
+ "mac" : "00:00:00:00:00:01"
+ }
+
+ ]
+}
diff --git a/TestON/tests/SdnIpSingleSwitch/intents.json b/TestON/tests/SdnIpSingleSwitch/intents.json
new file mode 100644
index 0000000..d17715f
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/intents.json
@@ -0,0 +1,1468 @@
+[
+ {
+ "id":"0xffffffffcb2cb6ec",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.10.101/32}, IPV4_DST{ip=192.168.10.1/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a3",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x140a3304",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a3, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.10.101/32}, IPV4_DST{ip=192.168.10.1/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a3, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffcb2d9828",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.10.1/32}, IPV4_DST{ip=192.168.10.101/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a3",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x1a89f138",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a3, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.10.1/32}, IPV4_DST{ip=192.168.10.101/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a3, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffd1418988",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.30.101/32}, IPV4_DST{ip=192.168.30.1/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a2",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x2cd85684",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a2, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.30.101/32}, IPV4_DST{ip=192.168.30.1/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a2, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x3122a56b",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.40.101/32}, IPV4_DST{ip=192.168.40.1/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a6",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x5874487",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a6, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a6, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.40.101/32}, IPV4_DST{ip=192.168.40.1/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a6, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a6, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x6ae96523",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.10.101/32}, IPV4_DST{ip=192.168.10.1/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a3",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x217361ed",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a3, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.10.101/32}, IPV4_DST{ip=192.168.10.1/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a3, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffaee31428",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.30.1/32}, IPV4_DST{ip=192.168.30.101/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a2",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x68cad35c",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a2, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.30.1/32}, IPV4_DST{ip=192.168.30.101/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a2, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffed2b21fa",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.20.1/32}, IPV4_DST{ip=192.168.20.101/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a5",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffffa5dbcf50",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a5, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.20.1/32}, IPV4_DST{ip=192.168.20.101/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a5, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x373774a3",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.60.101/32}, IPV4_DST{ip=192.168.60.1/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a4",
+ "port":"4"
+ },
+ "installable":[
+ {
+ "id":"0x5a75d509",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a4, portNumber=4}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.60.101/32}, IPV4_DST{ip=192.168.60.1/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a4, portNumber=4}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffff8d492c5d",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.10.1/32}, IPV4_DST{ip=192.168.10.101/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "ingress":{
+ "device":"of:00000000000000a3",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffffef408263",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a3, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.10.1/32}, IPV4_DST{ip=192.168.10.101/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a3, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffff8ce7d031",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.20.1/32}, IPV4_DST{ip=192.168.20.101/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a5",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffffb344fe39",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a5, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.20.1/32}, IPV4_DST{ip=192.168.20.101/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a5, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xf2665f1",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.30.1/32}, IPV4_DST{ip=192.168.30.101/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a2",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x5b61a473",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a2, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.30.1/32}, IPV4_DST{ip=192.168.30.101/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a2, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffd0e186b8",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.40.1/32}, IPV4_DST{ip=192.168.40.101/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a6",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x4d8d4942",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a6, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a6, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.40.1/32}, IPV4_DST{ip=192.168.40.101/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a6, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a6, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x3738d163",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.60.1/32}, IPV4_DST{ip=192.168.60.101/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "ingress":{
+ "device":"of:00000000000000a4",
+ "port":"4"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffff993b0fc9",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a4, portNumber=4}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.60.1/32}, IPV4_DST{ip=192.168.60.101/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a4, portNumber=4}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xfffffffff33e39a0",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.40.101/32}, IPV4_DST{ip=192.168.40.1/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a6",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffffda3dd5b2",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a6, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a6, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.40.101/32}, IPV4_DST{ip=192.168.40.1/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a6, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a6, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffff8ce60db9",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.20.101/32}, IPV4_DST{ip=192.168.20.1/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a5",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xfeca8b9",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a5, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.20.101/32}, IPV4_DST{ip=192.168.20.1/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a5, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x3124d881",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.40.1/32}, IPV4_DST{ip=192.168.40.101/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a6",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x40241a59",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a6, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a6, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.40.1/32}, IPV4_DST{ip=192.168.40.101/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a6, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a6, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffd141fa26",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.30.1/32}, IPV4_DST{ip=192.168.30.101/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "ingress":{
+ "device":"of:00000000000000a2",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x3018359e",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a2, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.30.1/32}, IPV4_DST{ip=192.168.30.101/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a2, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffaee2a38a",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.30.101/32}, IPV4_DST{ip=192.168.30.1/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a2",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x658af442",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a2, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.30.101/32}, IPV4_DST{ip=192.168.30.1/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a2, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffaf46b62f",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.20.1/32}, IPV4_DST{ip=192.168.20.101/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "ingress":{
+ "device":"of:00000000000000a5",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x7a92607b",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a5, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.20.1/32}, IPV4_DST{ip=192.168.20.101/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a5, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffff8d484b21",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.10.101/32}, IPV4_DST{ip=192.168.10.1/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a3",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffffe8c0c42f",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a3, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.10.101/32}, IPV4_DST{ip=192.168.10.1/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a3, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffed295f82",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.20.101/32}, IPV4_DST{ip=192.168.20.1/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a5",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x28379d0",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a5, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.20.101/32}, IPV4_DST{ip=192.168.20.1/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a5, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffdba23bce",
+ "type":"MultiPointToSinglePointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_DST{ip=172.16.30.0/24}, ETH_TYPE{ethType=800}]",
+ "treatment":"[ETH_DST{mac=00:00:00:00:03:01}]",
+ "ingress":[
+ {
+ "device":"of:00000000000000a3",
+ "port":"1"
+ },
+ {
+ "device":"of:00000000000000a4",
+ "port":"4"
+ },
+ {
+ "device":"of:00000000000000a6",
+ "port":"1"
+ },
+ {
+ "device":"of:00000000000000a5",
+ "port":"1"
+ }
+ ],
+ "egress":{
+ "device":"of:00000000000000a2",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x5e70036",
+ "type":"LinkCollectionIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a6, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_DST{ip=172.16.30.0/24}, ETH_TYPE{ethType=800}]",
+ "treatment":"[ETH_DST{mac=00:00:00:00:03:01}]",
+ "links":[
+ {
+ "src":{
+ "device":"of:00000000000000a4",
+ "port":"1"
+ },
+ "dst":{
+ "device":"of:00000000000000a2",
+ "port":"3"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a5",
+ "port":"2"
+ },
+ "dst":{
+ "device":"of:00000000000000a3",
+ "port":"4"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a6",
+ "port":"3"
+ },
+ "dst":{
+ "device":"of:00000000000000a4",
+ "port":"3"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a3",
+ "port":"3"
+ },
+ "dst":{
+ "device":"of:00000000000000a4",
+ "port":"2"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffaf44f3b7",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.20.101/32}, IPV4_DST{ip=192.168.20.1/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a5",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffffd73a0afb",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a5, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.20.101/32}, IPV4_DST{ip=192.168.20.1/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a5, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x751d3d2e",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.60.1/32}, IPV4_DST{ip=192.168.60.101/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a4",
+ "port":"4"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffffc4847e9e",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a4, portNumber=4}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.60.1/32}, IPV4_DST{ip=192.168.60.101/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a4, portNumber=4}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x3fb23806",
+ "type":"MultiPointToSinglePointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_DST{ip=2.0.0.0/24}, ETH_TYPE{ethType=800}]",
+ "treatment":"[ETH_DST{mac=00:00:00:00:03:01}]",
+ "ingress":[
+ {
+ "device":"of:00000000000000a3",
+ "port":"1"
+ },
+ {
+ "device":"of:00000000000000a4",
+ "port":"4"
+ },
+ {
+ "device":"of:00000000000000a6",
+ "port":"1"
+ },
+ {
+ "device":"of:00000000000000a5",
+ "port":"1"
+ }
+ ],
+ "egress":{
+ "device":"of:00000000000000a2",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x23d68afe",
+ "type":"LinkCollectionIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a6, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_DST{ip=2.0.0.0/24}, ETH_TYPE{ethType=800}]",
+ "treatment":"[ETH_DST{mac=00:00:00:00:03:01}]",
+ "links":[
+ {
+ "src":{
+ "device":"of:00000000000000a4",
+ "port":"1"
+ },
+ "dst":{
+ "device":"of:00000000000000a2",
+ "port":"3"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a5",
+ "port":"2"
+ },
+ "dst":{
+ "device":"of:00000000000000a3",
+ "port":"4"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a6",
+ "port":"3"
+ },
+ "dst":{
+ "device":"of:00000000000000a4",
+ "port":"3"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a3",
+ "port":"3"
+ },
+ "dst":{
+ "device":"of:00000000000000a4",
+ "port":"2"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x751be06e",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.60.101/32}, IPV4_DST{ip=192.168.60.1/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a4",
+ "port":"4"
+ },
+ "installable":[
+ {
+ "id":"0xffffffff85bf43de",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a4, portNumber=4}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.60.101/32}, IPV4_DST{ip=192.168.60.1/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a4, portNumber=4}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x6aea465f",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.10.1/32}, IPV4_DST{ip=192.168.10.101/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a3",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x27f32021",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a3, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.10.1/32}, IPV4_DST{ip=192.168.10.101/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a3, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xf25f553",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.30.101/32}, IPV4_DST{ip=192.168.30.1/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a2",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x5821c559",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a2, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.30.101/32}, IPV4_DST{ip=192.168.30.1/32}, IP_PROTO{protocol=1}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a2, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xfffffffff3406cb6",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.40.1/32}, IPV4_DST{ip=192.168.40.101/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "ingress":{
+ "device":"of:00000000000000a6",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x14daab84",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a6, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a6, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.40.1/32}, IPV4_DST{ip=192.168.40.101/32}, IP_PROTO{protocol=6}, ETH_TYPE{ethType=800}, TCP_DST{tcpPort=179}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a6, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a6, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffd7d10b27",
+ "type":"MultiPointToSinglePointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_DST{ip=1.0.0.0/24}, ETH_TYPE{ethType=800}]",
+ "treatment":"[ETH_DST{mac=00:00:00:00:03:01}]",
+ "ingress":[
+ {
+ "device":"of:00000000000000a3",
+ "port":"1"
+ },
+ {
+ "device":"of:00000000000000a4",
+ "port":"4"
+ },
+ {
+ "device":"of:00000000000000a6",
+ "port":"1"
+ },
+ {
+ "device":"of:00000000000000a5",
+ "port":"1"
+ }
+ ],
+ "egress":{
+ "device":"of:00000000000000a2",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffff8f921bfd",
+ "type":"LinkCollectionIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a6, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_DST{ip=1.0.0.0/24}, ETH_TYPE{ethType=800}]",
+ "treatment":"[ETH_DST{mac=00:00:00:00:03:01}]",
+ "links":[
+ {
+ "src":{
+ "device":"of:00000000000000a4",
+ "port":"1"
+ },
+ "dst":{
+ "device":"of:00000000000000a2",
+ "port":"3"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a5",
+ "port":"2"
+ },
+ "dst":{
+ "device":"of:00000000000000a3",
+ "port":"4"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a6",
+ "port":"3"
+ },
+ "dst":{
+ "device":"of:00000000000000a4",
+ "port":"3"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a3",
+ "port":"3"
+ },
+ "dst":{
+ "device":"of:00000000000000a4",
+ "port":"2"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffa79364e5",
+ "type":"MultiPointToSinglePointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_DST{ip=3.0.0.0/24}, ETH_TYPE{ethType=800}]",
+ "treatment":"[ETH_DST{mac=00:00:00:00:03:01}]",
+ "ingress":[
+ {
+ "device":"of:00000000000000a3",
+ "port":"1"
+ },
+ {
+ "device":"of:00000000000000a4",
+ "port":"4"
+ },
+ {
+ "device":"of:00000000000000a6",
+ "port":"1"
+ },
+ {
+ "device":"of:00000000000000a5",
+ "port":"1"
+ }
+ ],
+ "egress":{
+ "device":"of:00000000000000a2",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffffb81af9ff",
+ "type":"LinkCollectionIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a6, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_DST{ip=3.0.0.0/24}, ETH_TYPE{ethType=800}]",
+ "treatment":"[ETH_DST{mac=00:00:00:00:03:01}]",
+ "links":[
+ {
+ "src":{
+ "device":"of:00000000000000a4",
+ "port":"1"
+ },
+ "dst":{
+ "device":"of:00000000000000a2",
+ "port":"3"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a5",
+ "port":"2"
+ },
+ "dst":{
+ "device":"of:00000000000000a3",
+ "port":"4"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a6",
+ "port":"3"
+ },
+ "dst":{
+ "device":"of:00000000000000a4",
+ "port":"3"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ },
+ {
+ "src":{
+ "device":"of:00000000000000a3",
+ "port":"3"
+ },
+ "dst":{
+ "device":"of:00000000000000a4",
+ "port":"2"
+ },
+ "type":"DIRECT",
+ "state":"ACTIVE",
+ "annotations":{
+
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x14d9eb65",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.60.1/32}, IPV4_DST{ip=192.168.60.101/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a4",
+ "port":"4"
+ },
+ "egress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0xffffffffd1edad87",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a4, portNumber=4}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.60.1/32}, IPV4_DST{ip=192.168.60.101/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a4, portNumber=4}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, dst=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a1, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0x14d88ea5",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.60.101/32}, IPV4_DST{ip=192.168.60.1/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a4",
+ "port":"4"
+ },
+ "installable":[
+ {
+ "id":"0xffffffff932872c7",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a4, portNumber=4}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.60.101/32}, IPV4_DST{ip=192.168.60.1/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a2, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a2, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a4, portNumber=1}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a4, portNumber=4}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ },
+ {
+ "id":"0xffffffffd0df53a2",
+ "type":"PointToPointIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "state":"INSTALLED",
+ "selector":"[IPV4_SRC{ip=192.168.40.101/32}, IPV4_DST{ip=192.168.40.1/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "ingress":{
+ "device":"of:00000000000000a1",
+ "port":"1"
+ },
+ "egress":{
+ "device":"of:00000000000000a6",
+ "port":"1"
+ },
+ "installable":[
+ {
+ "id":"0x12f07370",
+ "type":"PathIntent",
+ "appId":"org.onlab.onos.sdnip",
+ "resources":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a6, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a6, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ],
+ "selector":"[IPV4_SRC{ip=192.168.40.101/32}, IPV4_DST{ip=192.168.40.1/32}, IP_PROTO{protocol=6}, TCP_SRC{tcpPort=179}, ETH_TYPE{ethType=800}]",
+ "path":[
+ "DefaultEdgeLink{src=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, dst=HostLocation{elementId=of:00000000000000a1, portNumber=1}, type=EDGE, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a1, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a3, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a3, portNumber=4}, dst=ConnectPoint{elementId=of:00000000000000a5, portNumber=2}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultLink{src=ConnectPoint{elementId=of:00000000000000a5, portNumber=3}, dst=ConnectPoint{elementId=of:00000000000000a6, portNumber=4}, type=DIRECT, state=ACTIVE, durable=false}",
+ "DefaultEdgeLink{src=HostLocation{elementId=of:00000000000000a6, portNumber=1}, dst=ConnectPoint{elementId=00:00:00:00:00:00/-1, portNumber=0}, type=EDGE, state=ACTIVE, durable=false}"
+ ]
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/TestON/tests/SdnIpSingleSwitch/sdnip.json b/TestON/tests/SdnIpSingleSwitch/sdnip.json
new file mode 100644
index 0000000..6f719cf
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/sdnip.json
@@ -0,0 +1,59 @@
+{
+
+ "bgpPeers" : [
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:a1",
+ "attachmentPort" : "2",
+ "ipAddress" : "192.168.10.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:a1",
+ "attachmentPort" : "3",
+ "ipAddress" : "192.168.20.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:a1",
+ "attachmentPort" : "4",
+ "ipAddress" : "192.168.30.1"
+ },
+ {
+ "attachmentDpid" : "00:00:00:00:00:00:00:a1",
+ "attachmentPort" : "5",
+ "ipAddress" : "192.168.60.2"
+ }
+
+ ],
+ "bgpSpeakers" : [
+ {
+ "name" : "bgpSpeaker1",
+ "attachmentDpid" : "00:00:00:00:00:00:00:a1",
+ "attachmentPort" : "1",
+ "macAddress" : "00:00:00:00:00:01",
+ "interfaceAddresses" : [
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:a1",
+ "interfacePort" : "2",
+ "ipAddress" : "192.168.10.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:a1",
+ "interfacePort" : "3",
+ "ipAddress" : "192.168.20.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:a1",
+ "interfacePort" : "4",
+ "ipAddress" : "192.168.30.101"
+ },
+ {
+ "interfaceDpid" : "00:00:00:00:00:00:00:a1",
+ "interfacePort" : "5",
+ "ipAddress" : "192.168.60.101"
+ }
+
+ ]
+
+ }
+
+ ]
+}
diff --git a/TestON/tests/SdnIpSingleSwitch/topology/SdnIpSingleSwitchMininet.py b/TestON/tests/SdnIpSingleSwitch/topology/SdnIpSingleSwitchMininet.py
new file mode 100755
index 0000000..6befc1b
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/topology/SdnIpSingleSwitchMininet.py
@@ -0,0 +1,333 @@
+#!/usr/bin/python
+
+"""
+Start up the SDN-IP demo topology
+"""
+
+"""
+AS1 = 64513, (SDN AS)
+AS2 = 64514, reachable by 192.168.10.1, 192.168.20.1
+AS3 = 64516, reachable by 192.168.30.1
+AS4 = 64517, reachable by 192.168.40.1
+AS6 = 64520, reachable by 192.168.60.2, (route server 192.168.60.1)
+"""
+
+from mininet.net import Mininet
+from mininet.node import Controller, RemoteController
+from mininet.log import setLogLevel, info
+from mininet.cli import CLI
+from mininet.topo import Topo
+from mininet.util import quietRun
+from mininet.moduledeps import pathCheck
+
+import os.path
+import time
+from subprocess import Popen, STDOUT, PIPE
+
+QUAGGA_DIR = '/usr/lib/quagga'
+#QUAGGA_DIR = '/usr/local/sbin'
+QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
+
+
+class SDNIpModifiedTopo( Topo ):
+ "SDN Ip Modified Topology"
+
+ def __init__( self, *args, **kwargs ):
+ global numHost101
+ global numHost200
+ numHost101 = 101
+ numHost200 = 200
+ Topo.__init__( self, *args, **kwargs )
+ sw1 = self.addSwitch('sw1', dpid='00000000000000a1')
+ #sw2 = self.addSwitch('sw2', dpid='00000000000000a2')
+ #sw3 = self.addSwitch('sw3', dpid='00000000000000a3')
+ #sw4 = self.addSwitch('sw4', dpid='00000000000000a4')
+ #sw5 = self.addSwitch('sw5', dpid='00000000000000a5')
+ #sw6 = self.addSwitch('sw6', dpid='00000000000000a6')
+ #add a switch for 3 quagga hosts
+ swTestOn = self.addSwitch('swTestOn', dpid='0000000000000102')
+ #Note this switch isn't part of the SDN topology
+ #We'll use the ovs-controller to turn this into a learning switch
+ as6sw = self.addSwitch('as6sw', dpid='00000000000000a7')
+
+ host1 = self.addHost( 'host1' )
+ root1 = self.addHost( 'root1', inNamespace=False , ip='0')
+ rootTestOn = self.addHost( 'rootTestOn', inNamespace=False, ip='0' )
+
+ #AS2 host
+ host3 = self.addHost( 'host3' )
+ as2host = self.addHost( 'as2host' )
+ #AS3 host
+ host4 = self.addHost( 'host4' )
+ as3host = self.addHost( 'as3host' )
+ #AS6 host
+ host5 = self.addHost( 'host5' )
+ as6host = self.addHost( 'as6host' )
+
+ self.addLink( host1, sw1 )
+ #Links to the multihomed AS
+ self.addLink( host3, sw1 )
+ self.addLink( host3, sw1 )
+ self.addLink( as2host, host3 )
+ #Single links to the remaining two ASes
+ self.addLink( host4, sw1 )
+ self.addLink( as3host, host4 )
+
+ #AS3-AS4 link
+ #self.addLink( host4, host5)
+ #Add new AS6 to its bridge
+ self.addLink( host5, as6sw )
+ self.addLink( as6host, host5 )
+ #test the host behind the router(behind the router server)
+# for i in range(1, 10):
+ # host = self.addHost('as6host%d' % i)
+ # self.addLink(host, as6router)
+
+ ## Internal Connection To Hosts ##
+ self.addLink( root1, host1 )
+
+ # self.addLink( sw1, sw2 )
+ # self.addLink( sw1, sw3 )
+ # self.addLink( sw2, sw4 )
+ # self.addLink( sw3, sw4 )
+ # self.addLink( sw3, sw5 )
+ # self.addLink( sw4, sw6 )
+ # self.addLink( sw5, sw6 )
+ self.addLink( as6sw, sw1 )
+
+
+ self.addLink(swTestOn, rootTestOn)
+ #self.addLink(swTestOn, host1)
+ self.addLink(swTestOn, host3)
+ self.addLink(swTestOn, host4)
+ self.addLink(swTestOn, host5)
+ self.addLink(swTestOn, as2host)
+
+
+ #self.addLink(rootTestOn, host4)
+
+def startsshd( host ):
+ "Start sshd on host"
+ info( '*** Starting sshd\n' )
+ name, intf, ip = host.name, host.defaultIntf(), host.IP()
+ banner = '/tmp/%s.banner' % name
+ host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
+ host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
+ info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
+
+def startsshds ( hosts ):
+ for h in hosts:
+ startsshd( h )
+
+def stopsshd( ):
+ "Stop *all* sshd processes with a custom banner"
+ info( '*** Shutting down stale sshd/Banner processes ',
+ quietRun( "pkill -9 -f Banner" ), '\n' )
+
+def startquagga( host, num, config_file ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ print zebra_cmd
+ print quagga_cmd
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+def startquaggahost5( host, num ):
+ info( '*** Starting Quagga on %s\n' % host )
+ zebra_cmd = 'sudo %s/zebra -d -f zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' % (QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+ quagga_cmd = 'sudo %s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid' % (QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num)
+
+ host.cmd( zebra_cmd )
+ host.cmd( quagga_cmd )
+
+
+def stopquagga( ):
+ quietRun( 'sudo pkill -9 -f bgpd' )
+ quietRun( 'sudo pkill -9 -f zebra' )
+
+def sdn1net():
+ topo = SDNIpModifiedTopo()
+ info( '*** Creating network\n' )
+ net = Mininet( topo=topo, controller=RemoteController )
+ net = Mininet( topo=topo, controller=RemoteController )
+
+ host1, host3, host4, host5 = net.get( 'host1', 'host3', 'host4', 'host5' )
+
+ #host100.setIP('1.168.30.' + str(i), 24, str(host100) + "-eth2")
+
+ #host500.setMAC('00:00:00:00:04:%d' % (i-101), 'host%d-eth0' %(i))
+ #add IP prefixes
+ #for j in range(0,121):
+ #host100.cmd('sudo ip addr add %s.0.40.%s/24 dev host%s-eth0' %(i,j,i))
+
+ ## Adding 2nd, 3rd and 4th interface to host1 connected to sw1 (for another BGP peering)
+ #sw1 = net.get('sw1')
+ host1.setMAC('00:00:00:00:00:01', 'host1-eth0')
+ host1.cmd('ip addr add 192.168.20.101/24 dev host1-eth0')
+ host1.cmd('ip addr add 192.168.30.101/24 dev host1-eth0')
+ #host1.cmd('ip addr add 192.168.40.101/24 dev host1-eth0')
+ host1.cmd('ip addr add 192.168.60.101/24 dev host1-eth0')
+
+ # Net has to be start after adding the above link
+ net.start()
+
+ # Set up as6sw as a learning switch as quickly as possible so it
+ # hopefully doesn't connect to the actual controller
+ # TODO figure out how to change controller before starting switch
+ as6sw = net.get('as6sw')
+ as6sw.cmd('ovs-vsctl set-controller as6sw none')
+ as6sw.cmd('ovs-vsctl set-fail-mode as6sw standalone')
+
+
+ sw1 = net.get('sw1')
+ sw1.cmd('ovs-vsctl set-controller sw1 tcp:127.0.0.1:6633')
+# sw2.cmd('ovs-vsctl set-controller sw2 tcp:127.0.0.1:6633')
+# sw3.cmd('ovs-vsctl set-controller sw3 tcp:127.0.0.1:6633')
+# sw4.cmd('ovs-vsctl set-controller sw4 tcp:127.0.0.1:6633')
+# sw5.cmd('ovs-vsctl set-controller sw5 tcp:127.0.0.1:6633')
+# sw6.cmd('ovs-vsctl set-controller sw6 tcp:127.0.0.1:6633')
+
+
+ swTestOn = net.get('swTestOn')
+ swTestOn.cmd('ovs-vsctl set-controller swTestOn none')
+ swTestOn.cmd('ovs-vsctl set-fail-mode swTestOn standalone')
+
+ host1.defaultIntf().setIP('192.168.10.101/24')
+ # Run BGPd
+ #host1.cmd('%s -d -f %s' % (BGPD, BGPD_CONF))
+ #host1.cmd('/sbin/route add default gw 192.168.10.254 dev %s-eth0' % (host1.name))
+
+ # Configure new host interfaces
+ #host2.defaultIntf().setIP('172.16.10.2/24')
+ #host2.defaultIntf().setMAC('00:00:00:00:01:02')
+ #host2.cmd('/sbin/route add default gw 172.16.10.254 dev %s-eth0' % (host2.name))
+
+ # Set up AS2
+ host3.setIP('192.168.10.1', 24, 'host3-eth0')
+ #host3.cmd('sudo ip addr add 172.16.20.1/24 dev host3-eth0')
+ host3.setIP('192.168.20.1', 24, 'host3-eth1')
+ host3.setMAC('00:00:00:00:02:01', 'host3-eth0')
+ host3.setMAC('00:00:00:00:02:02', 'host3-eth1')
+ #host3.setIP('172.16.20.254', 24, 'host3-eth2')
+ host3.setIP('3.0.0.254', 8, 'host3-eth2')
+ host3.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+
+ host3.setIP('1.168.30.2', 24, 'host3-eth3')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_ignore=1')
+ host3.cmd('sysctl net.ipv4.conf.all.arp_announce=1')
+ as2host = net.get('as2host')
+ #as2host.defaultIntf().setIP('172.16.20.1/24')
+ for i in range(0, 20):
+ as2host.cmd('sudo ip addr add 3.0.%d.1/24 dev as2host-eth0' %i)
+ as2host.setIP('1.168.30.100', 24, 'as2host-eth1')
+
+ as2host.cmd('ip route add default via 3.0.0.254')
+
+ # Set up AS3
+ host4.setIP('192.168.30.1', 24, 'host4-eth0')
+ host4.setMAC('00:00:00:00:03:01', 'host4-eth0')
+ host4.setIP('4.0.0.254', 8, 'host4-eth1')
+ host4.setMAC('00:00:00:00:03:99', 'host4-eth1')
+ host4.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ as3host = net.get('as3host')
+ for i in range(0, 20):
+ as3host.cmd('sudo ip addr add 4.0.%d.1/24 dev as3host-eth0' %i)
+ as3host.cmd('ip route add default via 4.0.0.254')
+
+ #root space
+ host4.setIP('1.168.30.3', 24, 'host4-eth2')
+ host4.setMAC('00:00:00:00:03:03', 'host4-eth2')
+
+ # Set up AS4
+ #as4host = net.get('as4host')
+ #as4host.defaultIntf().setIP('172.16.40.1/24')
+ #as4host.cmd('ip route add default via 172.16.40.254')
+
+ # setup interface address for 100 quagga hosts
+ time.sleep(10)
+ #for i in range(numHost101, numHost200 + 1):
+ #host100 = net.get('host' + str(i))
+ #host100.cmd(str(i)+'.0.1.254', 24, 'host'+str(i)+'-eth1')
+ #as4host100 = net.get('as4host%s' %(i))
+ #as4host100.defaultIntf().setIP(str(i) + '.0.0.1/24')
+ #as4host100.cmd('ip route add default via ' + str(i) + '.0.0.254')
+ #for j in range(0, 100):
+ #as4host100.cmd('sudo ip addr add %d.0.%d.1/24 dev %s-eth0' %(i, j, as4host100))
+
+ # Set up AS6 - This has a router and a route server
+ #as6rs, host5 = net.get('as6rs', 'host5')
+ host5 = net.get('host5')
+ #as6rs.setIP('192.168.60.1', 24, 'as6rs-eth0')
+ #as6rs.setMAC('00:00:00:00:06:01', 'as6rs-eth0')
+ host5.setIP('192.168.60.2', 24, 'host5-eth0')
+ host5.setMAC('00:00:00:00:06:02', 'host5-eth0')
+ #as6router.setIP('172.16.60.254', 24, 'as6router-eth1')
+ host5.setIP('5.0.0.254', 8, 'host5-eth1')
+ host5.cmd('sysctl net.ipv4.conf.all.forwarding=1')
+ host5.setIP('1.168.30.5', 24, 'host5-eth2')
+ host5.setMAC('00:00:00:00:06:05', 'host5-eth2')
+
+ as6host = net.get('as6host')
+ #as6host.defaultIntf().setIP('5.0.0.1/24')
+ for i in range(0, 10):
+ as6host.cmd('sudo ip addr add 5.0.%d.1/24 dev as6host-eth0' %i)
+ as6host.cmd('ip route add default via 5.0.0.254')
+
+ # test the host in the as6
+ #for i in range(1, 10):
+ # baseip = (i-1)*4
+ # host = net.get('as6host%d' % i)
+ # host.defaultIntf().setIP('172.16.70.%d/24' % (baseip+1))
+ # host.cmd('ip route add default via 172.16.70.%d' % (baseip+2))
+ # as6router.setIP('172.16.70.%d' % (baseip+2), 30, 'as6router-eth%d' % (i+1))
+
+ # Start Quagga on border routers
+ startquagga(host3, 1, 'quagga1.conf')
+ startquagga(host4, 2, 'quagga2.conf')
+ #for i in range(numHost101, numHost200 + 1):
+ #host100=net.get('host%d' % (i))
+ #startquaggahost5(host100, i)
+
+ #startquagga(as6rs, 4, 'quagga-as6-rs.conf')
+ startquagga(host5, 5, 'quagga-as6.conf')
+
+ #root1, root2, rootTestOn = net.get( 'root1', 'root2', 'rootTestOn' )
+ root1, rootTestOn = net.get( 'root1', 'rootTestOn' )
+ host1.intf('host1-eth1').setIP('1.1.1.1/24')
+ root1.intf('root1-eth0').setIP('1.1.1.2/24')
+ #host2.intf('host2-eth1').setIP('1.1.2.1/24')
+ #root2.intf('root2-eth0').setIP('1.1.2.2/24')
+
+ #rootTestOn.cmd('ip addr add 1.168.30.102/24 dev rootTestOn-eth0')
+ rootTestOn.cmd('ip addr add 1.168.30.99/24 dev rootTestOn-eth0')
+
+ stopsshd()
+
+ startquagga(host1, 100, 'quagga-sdn-modified.conf')
+ hosts = [ host1, host3, host4, host5, as2host ];
+ #sshdHosts = sshdHosts + hosts
+ startsshds( hosts )
+ #
+ onos1 = '127.0.0.1'
+ forwarding1 = '%s:2000:%s:2000' % ('1.1.1.2', onos1)
+ root1.cmd( 'ssh -nNT -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % (forwarding1, onos1) )
+
+ # Forward 2605 to root namespace for easier access to SDN domain BGPd
+ # If root can ssh to itself without a password this should work
+ root1.cmd('ssh -N -o "PasswordAuthentication no" -o "StrictHostKeyChecking no" -L 2605:1.1.1.1:2605 1.1.1.1 &')
+ #time.sleep(3000000000)
+ CLI( net )
+
+ # Close the ssh port forwarding
+ #quietRun('sudo pkill -f 1.1.1.1')
+
+ stopsshd()
+ stopquagga()
+ net.stop()
+
+if __name__ == '__main__':
+ setLogLevel( 'debug' )
+ sdn1net()
diff --git a/TestON/tests/SdnIpSingleSwitch/topology/quagga-as6-rs.conf b/TestON/tests/SdnIpSingleSwitch/topology/quagga-as6-rs.conf
new file mode 100644
index 0000000..1eac0dd
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/topology/quagga-as6-rs.conf
@@ -0,0 +1,32 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64520
+ bgp router-id 192.168.60.1
+ neighbor 192.168.60.101 remote-as 64513
+ neighbor 192.168.60.101 route-server-client
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 route-server-client
+! network 172.16.60.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/SdnIpSingleSwitch/topology/quagga-as6.conf b/TestON/tests/SdnIpSingleSwitch/topology/quagga-as6.conf
new file mode 100644
index 0000000..434f983
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/topology/quagga-as6.conf
@@ -0,0 +1,39 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64521
+ bgp router-id 192.168.60.2
+ neighbor 192.168.60.101 remote-as 64513
+! neighbor 192.168.60.1 remote-as 64520
+! neighbor 192.168.60.3 remote-as 64520
+! network 172.16.60.0/24
+! network 172.16.70.4/30
+ ! network 172.16.70.8/30
+ ! network 172.16.70.12/30
+ ! network 172.16.70.16/30
+ ! network 172.16.70.20/30
+ ! network 172.16.70.24/30
+ ! network 172.16.70.28/30
+ ! network 172.16.70.32/30
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/SdnIpSingleSwitch/topology/quagga-sdn-modified.conf b/TestON/tests/SdnIpSingleSwitch/topology/quagga-sdn-modified.conf
new file mode 100644
index 0000000..d334c2a
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/topology/quagga-sdn-modified.conf
@@ -0,0 +1,49 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.2 remote-as 64521
+ neighbor 192.168.60.2 ebgp-multihop
+ neighbor 192.168.60.2 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/SdnIpSingleSwitch/topology/quagga-sdn.conf b/TestON/tests/SdnIpSingleSwitch/topology/quagga-sdn.conf
new file mode 100644
index 0000000..77392a6
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/topology/quagga-sdn.conf
@@ -0,0 +1,349 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+route-map AS65000 permit 1
+ set as-path prepend 65000
+!
+router bgp 64513
+ bgp router-id 192.168.10.101
+ timers bgp 1 3
+ !timers bgp 3 9
+ neighbor 192.168.10.1 remote-as 64514
+ neighbor 192.168.10.1 ebgp-multihop
+ neighbor 192.168.10.1 timers connect 5
+ neighbor 192.168.20.1 remote-as 64514
+ neighbor 192.168.20.1 ebgp-multihop
+ neighbor 192.168.20.1 timers connect 5
+ neighbor 192.168.20.1 route-map AS65000 in
+ neighbor 192.168.30.1 remote-as 64516
+ neighbor 192.168.30.1 ebgp-multihop
+ neighbor 192.168.30.1 timers connect 5
+ neighbor 192.168.60.1 remote-as 64520
+ neighbor 192.168.60.1 ebgp-multihop
+ neighbor 192.168.60.1 timers connect 5
+ neighbor 1.1.1.2 remote-as 64513
+ neighbor 1.1.1.2 port 2000
+ neighbor 1.1.1.2 timers connect 5
+
+
+neighbor 192.168.40.1 remote-as 65001
+neighbor 192.168.40.1 ebgp-multihop
+neighbor 192.168.40.1 timers connect 10
+neighbor 192.168.40.2 remote-as 65002
+neighbor 192.168.40.2 ebgp-multihop
+neighbor 192.168.40.2 timers connect 10
+neighbor 192.168.40.3 remote-as 65003
+neighbor 192.168.40.3 ebgp-multihop
+neighbor 192.168.40.3 timers connect 10
+neighbor 192.168.40.4 remote-as 65004
+neighbor 192.168.40.4 ebgp-multihop
+neighbor 192.168.40.4 timers connect 10
+neighbor 192.168.40.5 remote-as 65005
+neighbor 192.168.40.5 ebgp-multihop
+neighbor 192.168.40.5 timers connect 10
+neighbor 192.168.40.6 remote-as 65006
+neighbor 192.168.40.6 ebgp-multihop
+neighbor 192.168.40.6 timers connect 10
+neighbor 192.168.40.7 remote-as 65007
+neighbor 192.168.40.7 ebgp-multihop
+neighbor 192.168.40.7 timers connect 10
+neighbor 192.168.40.8 remote-as 65008
+neighbor 192.168.40.8 ebgp-multihop
+neighbor 192.168.40.8 timers connect 10
+neighbor 192.168.40.9 remote-as 65009
+neighbor 192.168.40.9 ebgp-multihop
+neighbor 192.168.40.9 timers connect 10
+neighbor 192.168.40.10 remote-as 65010
+neighbor 192.168.40.10 ebgp-multihop
+neighbor 192.168.40.10 timers connect 10
+neighbor 192.168.40.11 remote-as 65011
+neighbor 192.168.40.11 ebgp-multihop
+neighbor 192.168.40.11 timers connect 10
+neighbor 192.168.40.12 remote-as 65012
+neighbor 192.168.40.12 ebgp-multihop
+neighbor 192.168.40.12 timers connect 10
+neighbor 192.168.40.13 remote-as 65013
+neighbor 192.168.40.13 ebgp-multihop
+neighbor 192.168.40.13 timers connect 10
+neighbor 192.168.40.14 remote-as 65014
+neighbor 192.168.40.14 ebgp-multihop
+neighbor 192.168.40.14 timers connect 10
+neighbor 192.168.40.15 remote-as 65015
+neighbor 192.168.40.15 ebgp-multihop
+neighbor 192.168.40.15 timers connect 10
+neighbor 192.168.40.16 remote-as 65016
+neighbor 192.168.40.16 ebgp-multihop
+neighbor 192.168.40.16 timers connect 10
+neighbor 192.168.40.17 remote-as 65017
+neighbor 192.168.40.17 ebgp-multihop
+neighbor 192.168.40.17 timers connect 10
+neighbor 192.168.40.18 remote-as 65018
+neighbor 192.168.40.18 ebgp-multihop
+neighbor 192.168.40.18 timers connect 10
+neighbor 192.168.40.19 remote-as 65019
+neighbor 192.168.40.19 ebgp-multihop
+neighbor 192.168.40.19 timers connect 10
+neighbor 192.168.40.20 remote-as 65020
+neighbor 192.168.40.20 ebgp-multihop
+neighbor 192.168.40.20 timers connect 10
+neighbor 192.168.40.21 remote-as 65021
+neighbor 192.168.40.21 ebgp-multihop
+neighbor 192.168.40.21 timers connect 10
+neighbor 192.168.40.22 remote-as 65022
+neighbor 192.168.40.22 ebgp-multihop
+neighbor 192.168.40.22 timers connect 10
+neighbor 192.168.40.23 remote-as 65023
+neighbor 192.168.40.23 ebgp-multihop
+neighbor 192.168.40.23 timers connect 10
+neighbor 192.168.40.24 remote-as 65024
+neighbor 192.168.40.24 ebgp-multihop
+neighbor 192.168.40.24 timers connect 10
+neighbor 192.168.40.25 remote-as 65025
+neighbor 192.168.40.25 ebgp-multihop
+neighbor 192.168.40.25 timers connect 10
+neighbor 192.168.40.26 remote-as 65026
+neighbor 192.168.40.26 ebgp-multihop
+neighbor 192.168.40.26 timers connect 10
+neighbor 192.168.40.27 remote-as 65027
+neighbor 192.168.40.27 ebgp-multihop
+neighbor 192.168.40.27 timers connect 10
+neighbor 192.168.40.28 remote-as 65028
+neighbor 192.168.40.28 ebgp-multihop
+neighbor 192.168.40.28 timers connect 10
+neighbor 192.168.40.29 remote-as 65029
+neighbor 192.168.40.29 ebgp-multihop
+neighbor 192.168.40.29 timers connect 10
+neighbor 192.168.40.30 remote-as 65030
+neighbor 192.168.40.30 ebgp-multihop
+neighbor 192.168.40.30 timers connect 10
+neighbor 192.168.40.31 remote-as 65031
+neighbor 192.168.40.31 ebgp-multihop
+neighbor 192.168.40.31 timers connect 10
+neighbor 192.168.40.32 remote-as 65032
+neighbor 192.168.40.32 ebgp-multihop
+neighbor 192.168.40.32 timers connect 10
+neighbor 192.168.40.33 remote-as 65033
+neighbor 192.168.40.33 ebgp-multihop
+neighbor 192.168.40.33 timers connect 10
+neighbor 192.168.40.34 remote-as 65034
+neighbor 192.168.40.34 ebgp-multihop
+neighbor 192.168.40.34 timers connect 10
+neighbor 192.168.40.35 remote-as 65035
+neighbor 192.168.40.35 ebgp-multihop
+neighbor 192.168.40.35 timers connect 10
+neighbor 192.168.40.36 remote-as 65036
+neighbor 192.168.40.36 ebgp-multihop
+neighbor 192.168.40.36 timers connect 10
+neighbor 192.168.40.37 remote-as 65037
+neighbor 192.168.40.37 ebgp-multihop
+neighbor 192.168.40.37 timers connect 10
+neighbor 192.168.40.38 remote-as 65038
+neighbor 192.168.40.38 ebgp-multihop
+neighbor 192.168.40.38 timers connect 10
+neighbor 192.168.40.39 remote-as 65039
+neighbor 192.168.40.39 ebgp-multihop
+neighbor 192.168.40.39 timers connect 10
+neighbor 192.168.40.40 remote-as 65040
+neighbor 192.168.40.40 ebgp-multihop
+neighbor 192.168.40.40 timers connect 10
+neighbor 192.168.40.41 remote-as 65041
+neighbor 192.168.40.41 ebgp-multihop
+neighbor 192.168.40.41 timers connect 10
+neighbor 192.168.40.42 remote-as 65042
+neighbor 192.168.40.42 ebgp-multihop
+neighbor 192.168.40.42 timers connect 10
+neighbor 192.168.40.43 remote-as 65043
+neighbor 192.168.40.43 ebgp-multihop
+neighbor 192.168.40.43 timers connect 10
+neighbor 192.168.40.44 remote-as 65044
+neighbor 192.168.40.44 ebgp-multihop
+neighbor 192.168.40.44 timers connect 10
+neighbor 192.168.40.45 remote-as 65045
+neighbor 192.168.40.45 ebgp-multihop
+neighbor 192.168.40.45 timers connect 10
+neighbor 192.168.40.46 remote-as 65046
+neighbor 192.168.40.46 ebgp-multihop
+neighbor 192.168.40.46 timers connect 10
+neighbor 192.168.40.47 remote-as 65047
+neighbor 192.168.40.47 ebgp-multihop
+neighbor 192.168.40.47 timers connect 10
+neighbor 192.168.40.48 remote-as 65048
+neighbor 192.168.40.48 ebgp-multihop
+neighbor 192.168.40.48 timers connect 10
+neighbor 192.168.40.49 remote-as 65049
+neighbor 192.168.40.49 ebgp-multihop
+neighbor 192.168.40.49 timers connect 10
+neighbor 192.168.40.50 remote-as 65050
+neighbor 192.168.40.50 ebgp-multihop
+neighbor 192.168.40.50 timers connect 10
+neighbor 192.168.40.51 remote-as 65051
+neighbor 192.168.40.51 ebgp-multihop
+neighbor 192.168.40.51 timers connect 10
+neighbor 192.168.40.52 remote-as 65052
+neighbor 192.168.40.52 ebgp-multihop
+neighbor 192.168.40.52 timers connect 10
+neighbor 192.168.40.53 remote-as 65053
+neighbor 192.168.40.53 ebgp-multihop
+neighbor 192.168.40.53 timers connect 10
+neighbor 192.168.40.54 remote-as 65054
+neighbor 192.168.40.54 ebgp-multihop
+neighbor 192.168.40.54 timers connect 10
+neighbor 192.168.40.55 remote-as 65055
+neighbor 192.168.40.55 ebgp-multihop
+neighbor 192.168.40.55 timers connect 10
+neighbor 192.168.40.56 remote-as 65056
+neighbor 192.168.40.56 ebgp-multihop
+neighbor 192.168.40.56 timers connect 10
+neighbor 192.168.40.57 remote-as 65057
+neighbor 192.168.40.57 ebgp-multihop
+neighbor 192.168.40.57 timers connect 10
+neighbor 192.168.40.58 remote-as 65058
+neighbor 192.168.40.58 ebgp-multihop
+neighbor 192.168.40.58 timers connect 10
+neighbor 192.168.40.59 remote-as 65059
+neighbor 192.168.40.59 ebgp-multihop
+neighbor 192.168.40.59 timers connect 10
+neighbor 192.168.40.60 remote-as 65060
+neighbor 192.168.40.60 ebgp-multihop
+neighbor 192.168.40.60 timers connect 10
+neighbor 192.168.40.61 remote-as 65061
+neighbor 192.168.40.61 ebgp-multihop
+neighbor 192.168.40.61 timers connect 10
+neighbor 192.168.40.62 remote-as 65062
+neighbor 192.168.40.62 ebgp-multihop
+neighbor 192.168.40.62 timers connect 10
+neighbor 192.168.40.63 remote-as 65063
+neighbor 192.168.40.63 ebgp-multihop
+neighbor 192.168.40.63 timers connect 10
+neighbor 192.168.40.64 remote-as 65064
+neighbor 192.168.40.64 ebgp-multihop
+neighbor 192.168.40.64 timers connect 10
+neighbor 192.168.40.65 remote-as 65065
+neighbor 192.168.40.65 ebgp-multihop
+neighbor 192.168.40.65 timers connect 10
+neighbor 192.168.40.66 remote-as 65066
+neighbor 192.168.40.66 ebgp-multihop
+neighbor 192.168.40.66 timers connect 10
+neighbor 192.168.40.67 remote-as 65067
+neighbor 192.168.40.67 ebgp-multihop
+neighbor 192.168.40.67 timers connect 10
+neighbor 192.168.40.68 remote-as 65068
+neighbor 192.168.40.68 ebgp-multihop
+neighbor 192.168.40.68 timers connect 10
+neighbor 192.168.40.69 remote-as 65069
+neighbor 192.168.40.69 ebgp-multihop
+neighbor 192.168.40.69 timers connect 10
+neighbor 192.168.40.70 remote-as 65070
+neighbor 192.168.40.70 ebgp-multihop
+neighbor 192.168.40.70 timers connect 10
+neighbor 192.168.40.71 remote-as 65071
+neighbor 192.168.40.71 ebgp-multihop
+neighbor 192.168.40.71 timers connect 10
+neighbor 192.168.40.72 remote-as 65072
+neighbor 192.168.40.72 ebgp-multihop
+neighbor 192.168.40.72 timers connect 10
+neighbor 192.168.40.73 remote-as 65073
+neighbor 192.168.40.73 ebgp-multihop
+neighbor 192.168.40.73 timers connect 10
+neighbor 192.168.40.74 remote-as 65074
+neighbor 192.168.40.74 ebgp-multihop
+neighbor 192.168.40.74 timers connect 10
+neighbor 192.168.40.75 remote-as 65075
+neighbor 192.168.40.75 ebgp-multihop
+neighbor 192.168.40.75 timers connect 10
+neighbor 192.168.40.76 remote-as 65076
+neighbor 192.168.40.76 ebgp-multihop
+neighbor 192.168.40.76 timers connect 10
+neighbor 192.168.40.77 remote-as 65077
+neighbor 192.168.40.77 ebgp-multihop
+neighbor 192.168.40.77 timers connect 10
+neighbor 192.168.40.78 remote-as 65078
+neighbor 192.168.40.78 ebgp-multihop
+neighbor 192.168.40.78 timers connect 10
+neighbor 192.168.40.79 remote-as 65079
+neighbor 192.168.40.79 ebgp-multihop
+neighbor 192.168.40.79 timers connect 10
+neighbor 192.168.40.80 remote-as 65080
+neighbor 192.168.40.80 ebgp-multihop
+neighbor 192.168.40.80 timers connect 10
+neighbor 192.168.40.81 remote-as 65081
+neighbor 192.168.40.81 ebgp-multihop
+neighbor 192.168.40.81 timers connect 10
+neighbor 192.168.40.82 remote-as 65082
+neighbor 192.168.40.82 ebgp-multihop
+neighbor 192.168.40.82 timers connect 10
+neighbor 192.168.40.83 remote-as 65083
+neighbor 192.168.40.83 ebgp-multihop
+neighbor 192.168.40.83 timers connect 10
+neighbor 192.168.40.84 remote-as 65084
+neighbor 192.168.40.84 ebgp-multihop
+neighbor 192.168.40.84 timers connect 10
+neighbor 192.168.40.85 remote-as 65085
+neighbor 192.168.40.85 ebgp-multihop
+neighbor 192.168.40.85 timers connect 10
+neighbor 192.168.40.86 remote-as 65086
+neighbor 192.168.40.86 ebgp-multihop
+neighbor 192.168.40.86 timers connect 10
+neighbor 192.168.40.87 remote-as 65087
+neighbor 192.168.40.87 ebgp-multihop
+neighbor 192.168.40.87 timers connect 10
+neighbor 192.168.40.88 remote-as 65088
+neighbor 192.168.40.88 ebgp-multihop
+neighbor 192.168.40.88 timers connect 10
+neighbor 192.168.40.89 remote-as 65089
+neighbor 192.168.40.89 ebgp-multihop
+neighbor 192.168.40.89 timers connect 10
+neighbor 192.168.40.90 remote-as 65090
+neighbor 192.168.40.90 ebgp-multihop
+neighbor 192.168.40.90 timers connect 10
+neighbor 192.168.40.91 remote-as 65091
+neighbor 192.168.40.91 ebgp-multihop
+neighbor 192.168.40.91 timers connect 10
+neighbor 192.168.40.92 remote-as 65092
+neighbor 192.168.40.92 ebgp-multihop
+neighbor 192.168.40.92 timers connect 10
+neighbor 192.168.40.93 remote-as 65093
+neighbor 192.168.40.93 ebgp-multihop
+neighbor 192.168.40.93 timers connect 10
+neighbor 192.168.40.94 remote-as 65094
+neighbor 192.168.40.94 ebgp-multihop
+neighbor 192.168.40.94 timers connect 10
+neighbor 192.168.40.95 remote-as 65095
+neighbor 192.168.40.95 ebgp-multihop
+neighbor 192.168.40.95 timers connect 10
+neighbor 192.168.40.96 remote-as 65096
+neighbor 192.168.40.96 ebgp-multihop
+neighbor 192.168.40.96 timers connect 10
+neighbor 192.168.40.97 remote-as 65097
+neighbor 192.168.40.97 ebgp-multihop
+neighbor 192.168.40.97 timers connect 10
+neighbor 192.168.40.98 remote-as 65098
+neighbor 192.168.40.98 ebgp-multihop
+neighbor 192.168.40.98 timers connect 10
+neighbor 192.168.40.99 remote-as 65099
+neighbor 192.168.40.99 ebgp-multihop
+neighbor 192.168.40.99 timers connect 10
+neighbor 192.168.40.100 remote-as 65100
+neighbor 192.168.40.100 ebgp-multihop
+neighbor 192.168.40.100 timers connect 10
+
+ network 172.16.10.0/24
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/SdnIpSingleSwitch/topology/quagga1.conf b/TestON/tests/SdnIpSingleSwitch/topology/quagga1.conf
new file mode 100644
index 0000000..264f85e
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/topology/quagga1.conf
@@ -0,0 +1,32 @@
+!
+! Zebra configuration saved from vty
+! 2014/11/25 11:22:24
+!
+hostname bgpd
+password hello
+log stdout
+!
+router bgp 64514
+ bgp router-id 192.168.10.1
+! network 3.0.0.0/24
+! network 3.0.1.0/24
+! network 3.0.2.0/24
+! network 3.0.3.0/24
+! network 3.0.4.0/24
+! network 3.0.5.0/24
+! network 3.0.6.0/24
+! network 3.0.7.0/24
+! network 3.0.8.0/24
+! network 3.0.9.0/24
+ neighbor 192.168.20.101 remote-as 64513
+ neighbor 192.168.20.101 route-map PREPEND2 in
+ neighbor 192.168.20.101 route-map PREPEND2 out
+!
+route-map PREPEND1 permit 1
+ set as-path prepend 64514
+!
+route-map PREPEND2 permit 2
+ set as-path prepend 64514 64514
+!
+line vty
+!
diff --git a/TestON/tests/SdnIpSingleSwitch/topology/quagga2.conf b/TestON/tests/SdnIpSingleSwitch/topology/quagga2.conf
new file mode 100644
index 0000000..20ca9e4
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/topology/quagga2.conf
@@ -0,0 +1,31 @@
+! -*- bgp -*-
+!
+! BGPd sample configuratin file
+!
+! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
+!
+hostname bgpd
+password hello
+!enable password please-set-at-here
+!
+!bgp mulitple-instance
+!
+router bgp 64516
+ bgp router-id 192.168.30.1
+! timers bgp 1 3
+ neighbor 192.168.30.101 remote-as 64513
+! neighbor 192.168.50.2 remote-as 65001
+! network 172.16.30.0/24
+! neighbor 10.0.0.2 route-map set-nexthop out
+! neighbor 10.0.0.2 ebgp-multihop
+! neighbor 10.0.0.2 next-hop-self
+!
+! access-list all permit any
+!
+!route-map set-nexthop permit 10
+! match ip address all
+! set ip next-hop 10.0.0.1
+!
+!log file /usr/local/var/log/quagga/bgpd.log
+!
+log stdout
diff --git a/TestON/tests/SdnIpSingleSwitch/topology/zebra.conf b/TestON/tests/SdnIpSingleSwitch/topology/zebra.conf
new file mode 100644
index 0000000..0f8e3a2
--- /dev/null
+++ b/TestON/tests/SdnIpSingleSwitch/topology/zebra.conf
@@ -0,0 +1,26 @@
+! -*- zebra -*-
+!
+! zebra sample configuration file
+!
+! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
+!
+hostname zebra
+password hello
+enable password 0fw0rk
+log stdout
+!
+! Interfaces description.
+!
+!interface lo
+! description test of desc.
+!
+!interface sit0
+! multicast
+
+!
+! Static default route sample.
+!
+!ip route 0.0.0.0/0 203.181.89.241
+!
+
+!log file /usr/local/var/log/quagga/zebra.log
diff --git a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params
index 09c741c..24588e0 100644
--- a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params
+++ b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.params
@@ -39,6 +39,8 @@
<TSHARK>
<ofpPortStatus>OF 1.3 146</ofpPortStatus>
<ofpRoleReply>OF 1.3 90 of_role_reply</ofpRoleReply>
+ <featureReply>OF 1.3 98 of_features_reply</featureReply>
+ <roleRequest>OF 1.3 90 of_role_request</roleRequest>
<tcpSynAck>TCP 74 6633</tcpSynAck>
</TSHARK>
@@ -59,7 +61,7 @@
</topoConfigName>
#Number of times to iterate each case
- <numIter>10</numIter>
+ <numIter>35</numIter>
<numSwitch>2</numSwitch>
#Number of iterations to ignore initially
<iterIgnore>2</iterIgnore>
diff --git a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
index 872238e..8a9591d 100644
--- a/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
+++ b/TestON/tests/TopoPerfNextBM/TopoPerfNextBM.py
@@ -156,8 +156,10 @@
defaultSwPort = main.params['CTRL']['port1']
numIter = main.params['TEST']['numIter']
iterIgnore = int(main.params['TEST']['iterIgnore'])
+
deviceTimestamp = main.params['JSON']['deviceTimestamp']
graphTimestamp = main.params['JSON']['graphTimestamp']
+
debugMode = main.params['TEST']['debugMode']
onosLog = main.params['TEST']['onosLogFile']
resultPath = main.params['DB']['switchEventResultPath']
@@ -166,25 +168,26 @@
thresholdMin = int(thresholdObj[0])
thresholdMax = int(thresholdObj[1])
- #TODO: Look for 'role-request' messages,
- # which replaces the 'vendor' messages previously seen
- # on OVS 2.0.1
- tsharkOfString = main.params[ 'TSHARK' ][ 'ofpRoleReply' ]
+ # Look for 'role-request' messages,
+ # which replaces the 'vendor' messages previously seen
+ # on OVS 2.0.1
tsharkTcpString = main.params[ 'TSHARK' ][ 'tcpSynAck' ]
+ tsharkFeatureReply = main.params[ 'TSHARK' ][ 'featureReply' ]
+ tsharkRoleRequest = main.params[ 'TSHARK' ][ 'roleRequest' ]
+ tsharkOfString = main.params[ 'TSHARK' ][ 'ofpRoleReply' ]
+
tsharkOfOutput = '/tmp/tshark_of_topo.txt'
tsharkTcpOutput = '/tmp/tshark_tcp_topo.txt'
+ tsharkRoleOutput = '/tmp/tshark_role_request.txt'
+ tsharkFeatureOutput = '/tmp/tshark_feature_reply.txt'
- latencyEndToEndList = []
- latencyOfpToGraphList = []
- latencyOfpToDeviceList = []
- latencyT0ToDeviceList = []
- latencyTcpToOfpList = []
-
endToEndLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
ofpToGraphLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
ofpToDeviceLatNodeIter = numpy.zeros((clusterCount, int(numIter)))
tcpToOfpLatIter = []
+ tcpToFeatureLatIter = []
+ tcpToRoleLatIter = []
assertion = main.TRUE
localTime = time.strftime('%x %X')
localTime = localTime.replace('/', '')
@@ -204,7 +207,9 @@
main.log.info('Starting tshark capture')
main.ONOS1.tsharkGrep(tsharkTcpString, tsharkTcpOutput)
main.ONOS1.tsharkGrep(tsharkOfString, tsharkOfOutput)
-
+ main.ONOS1.tsharkGrep(tsharkRoleRequest, tsharkRoleOutput)
+ main.ONOS1.tsharkGrep(tsharkFeatureReply, tsharkFeatureOutput)
+
time.sleep(10)
main.log.info('Assigning s3 to controller')
@@ -219,6 +224,14 @@
main.log.info('Copying over tshark files')
os.system('scp ' + ONOSUser + '@' + ONOS1Ip +
':' + tsharkTcpOutput + ' /tmp/')
+ os.system('scp ' + ONOSUser + '@' + ONOS1Ip +
+ ':' + tsharkRoleOutput + ' /tmp/')
+ os.system('scp ' + ONOSUser + '@' + ONOS1Ip +
+ ':' + tsharkFeatureOutput + ' /tmp/')
+ os.system('scp ' + ONOSUser + '@' +
+ ONOS1Ip + ':' + tsharkOfOutput + ' /tmp/')
+
+ # Get tcp syn / ack output
time.sleep(5)
tcpFile = open(tsharkTcpOutput, 'r')
tempText = tcpFile.readline()
@@ -234,10 +247,8 @@
t0Tcp = 0
assertion = main.FALSE
tcpFile.close()
-
- os.system('scp ' + ONOSUser + '@' +
- ONOS1Ip + ':' + tsharkOfOutput + ' /tmp/')
-
+
+ # Get Role reply output
time.sleep(5)
ofFile = open(tsharkOfOutput, 'r')
lineOfp = ''
@@ -247,7 +258,6 @@
lineOfp = tempText
else:
break
-
obj = lineOfp.split(' ')
main.log.info('Object read in from OFP capture: ' +
str(lineOfp))
@@ -259,7 +269,92 @@
t0Ofp = 0
assertion = main.FALSE
ofFile.close()
-
+
+ # Get role request output
+ roleFile = open(tsharkRoleOutput, 'r')
+ tempText = roleFile.readline()
+ tempText = tempText.split(' ')
+ if len(tempText) > 1:
+ main.log.info('Object read in from role request capture:' +
+ str(tempText))
+ roleTimestamp = float(tempText[1]) * 1000.0
+ else:
+ main.log.error('Tshark output file for role request' +
+ ' returned unexpected results')
+ timeRoleRequest = 0
+ assertion = main.FALSE
+ roleFile.close()
+
+ # Get feature reply output
+ featureFile = open(tsharkFeatureOutput, 'r')
+ tempText = featureFile.readline()
+ tempText = tempText.split(' ')
+ if len(tempText) > 1:
+ main.log.info('Object read in from feature reply capture: '+
+ str(tempText))
+ featureTimestamp = float(tempText[1]) * 1000.0
+ else:
+ main.log.error('Tshark output file for feature reply' +
+ ' returned unexpected results')
+ timeFeatureReply = 0
+ assertion = main.FALSE
+ featureFile.close()
+
+ # TODO: calculate feature reply, role request times
+ # stack measurements correctly and report
+
+ """
+ #TODO: Refactor in progress
+
+ for node in range(0, clusterCount):
+ nodeNum = node+1
+ exec "metricsSwUp = main.ONOS%scli.topologyEventsMetrics"%str(nodeNum)
+ jsonStr = metricsSwUp()
+ jsonObj = json.loads(jsonStr)
+ graphTimestamp = jsonObj[graphTimestamp]['value']
+ deviceTimestamp = jsonObj[deviceTimestamp]['value']
+
+ deltaGraphTcp = int(graphTimestamp) - int(t0Tcp)
+ deltaDeviceTcp = int(deviceTimestamp) - int(t0Tcp)
+ deltaGraphOfp = int(graphTimestamp) - int(t0Ofp)
+ deltaDeviceOfp = int(deviceTimestamp) - int(t0Ofp)
+ deltaRoleTcp = int(roleTimestamp) - int(t0Tcp)
+ deltaFeatureTcp = int(featureTimestamp) - int(t0Tcp)
+ deltaOfpTcp = int(t0Ofp) - int(t0Tcp)
+
+ if deltaGraphTcp > thresholdMin and\
+ deltaGraphTcp < thresholdMax and i >= iterIgnore:
+ endToEndLatNodeIter[node][i] = deltaGraphTcp
+ main.log.info("ONOS "+str(nodeNum)+ " tcp-to-graph: "+
+ str(deltaGraphTcp) + " ms")
+ else:
+ main.log.info("ONOS "+str(nodeNum)+ " tcp-to-graph "+
+ "measurement ignored due to excess in "+
+ "threshold or premature iteration")
+
+ if deltaGraphOfp > thresholdMin and\
+ deltaGraphOfp < thresholdMax and i >= iterIgnore:
+ ofpToGraphLatNodeIter[node][i] = deltaGraphOfp
+ main.log.info("ONOS "+str(nodeNum)+ " ofp-to-graph: "+
+ str(deltaGraphOfp) + " ms")
+ else:
+ main.log.info("ONOS "+str(nodeNum)+ " ofp-to-graph: "+
+ "measurement ignored due to excess in "+
+ "threshold or premature iteration")
+
+ if deltaDeviceOfp > thresholdMin and\
+ deltaDeviceOfp < thresholdMax and i >= iterIgnore:
+ ofpToDeviceLatNodeIter[node][i] = deltaDeviceOfp
+ main.log.info("ONOS "+str(nodeNum)+ " ofp-to-device: "+
+ str(deltaDeviceOfp) + " ms")
+ else:
+ main.log.info("ONOS "+str(nodeNum)+ " ofp-to-device: "+
+ "measurement ignored due to excess in "+
+ "threshold or premature iteration")
+
+
+ # ********************
+ """
jsonStr1 = main.ONOS1cli.topologyEventsMetrics()
jsonStr2 = ''
jsonStr3 = ''
@@ -275,7 +370,8 @@
jsonObj5 = ''
jsonObj6 = ''
jsonObj7 = ''
-
+
+
graphTimestamp1 = jsonObj1[graphTimestamp]['value']
deviceTimestamp1 = jsonObj1[deviceTimestamp]['value']
@@ -286,39 +382,46 @@
deltaGraph1 = int(graphTimestamp1) - int(t0Tcp)
deltaOfpGraph1 = int(graphTimestamp1) - int(t0Ofp)
deltaOfpDevice1 = int(deviceTimestamp1) - int(t0Ofp)
+ # Tshark timestamps
deltaTcpOfp1 = int(t0Ofp) - int(t0Tcp)
+ deltaRoleTcp1 = int(roleTimestamp) - int(t0Tcp)
+ deltaFeatureTcp1 = int(featureTimestamp) - int(t0Tcp)
+ deltaOfpTcp1 = int(t0Ofp) - int(t0Tcp)
if deltaTcpOfp1 > thresholdMin and\
deltaTcpOfp1 < thresholdMax and i >= iterIgnore:
tcpToOfpLatIter.append(deltaTcpOfp1)
- main.log.info('ONOS1 iter' + str(i) +
+ main.log.info('ONOS1 iter' + str(i) +
' tcp-to-ofp: ' +
str(deltaTcpOfp1) + ' ms')
- else:
- tcpToOfpLatIter.append(0)
- main.log.info('ONOS1 iter' + str(i) +
- ' tcp-to-ofp: ' + str(deltaTcpOfp1) +
- ' ms - ignored this iteration')
+ if deltaFeatureTcp1 > thresholdMin and\
+ deltaFeatureTcp1 < thresholdMax and i >= iterIgnore:
+ tcpToFeatureLatIter.append(deltaFeatureTcp1)
+ main.log.info('ONOS1 iter' + str(i) +
+ ' tcp-to-feature-reply: ' +
+ str(deltaFeatureTcp1) + ' ms')
+ if deltaRoleTcp1 > thresholdMin and\
+ deltaRoleTcp1 < thresholdMax and i >= iterIgnore:
+ tcpToRoleLatIter.append(deltaRoleTcp1)
+ main.log.info('ONOS1 iter' + str(i) +
+ ' tcp-to-role-request: ' +
+ str(deltaRoleTcp1) + ' ms')
if deltaGraph1 > thresholdMin and\
deltaGraph1 < thresholdMax and i >= iterIgnore:
endToEndLatNodeIter[0][i] = deltaGraph1
- main.log.info('ONOS1 iter' + str(i) +
+ main.log.info('ONOS1 iter' + str(i) +
' end-to-end: ' +
str(deltaGraph1) + ' ms')
- else:
- main.log.info('ONOS1 iter' + str(i) +
- ' end-to-end: ' + str(deltaGraph1) +
- ' ms - ignored this iteration')
if deltaOfpGraph1 > thresholdMin and \
deltaOfpGraph1 < thresholdMax and i >= iterIgnore:
ofpToGraphLatNodeIter[0][i] = deltaOfpGraph1
- main.log.info('ONOS1 iter' + str(i) +
+ main.log.info('ONOS1 iter' + str(i) +
' ofp-to-graph: ' +
str(deltaOfpGraph1) + ' ms')
if deltaOfpDevice1 > thresholdMin and\
deltaOfpDevice1 < thresholdMax and i >= iterIgnore:
ofpToDeviceLatNodeIter[0][i] = deltaOfpDevice1
- main.log.info('ONOS1 iter' + str(i) +
+ main.log.info('ONOS1 iter' + str(i) +
' ofp-to-device: ' +
str(deltaOfpDevice1))
@@ -342,36 +445,36 @@
if deltaGraph2 > thresholdMin and\
deltaGraph2 < thresholdMax and i >= iterIgnore:
endToEndLatNodeIter[1][i] = deltaGraph2
- main.log.info('ONOS2 iter' + str(i) +
+ main.log.info('ONOS2 iter' + str(i) +
' end-to-end: ' +
str(deltaGraph2) + ' ms')
if deltaOfpGraph2 > thresholdMin and\
deltaOfpGraph2 < thresholdMax and i >= iterIgnore:
ofpToGraphLatNodeIter[1][i] = deltaOfpGraph2
- main.log.info('ONOS2 iter' + str(i) +
+ main.log.info('ONOS2 iter' + str(i) +
' ofp-to-graph: ' +
str(deltaOfpGraph2) + ' ms')
if deltaOfpDevice2 > thresholdMin and\
deltaOfpDevice2 < thresholdMax and i >= iterIgnore:
ofpToDeviceLatNodeIter[1][i] = deltaOfpDevice2
- main.log.info('ONOS2 iter' + str(i) +
+ main.log.info('ONOS2 iter' + str(i) +
' ofp-to-device: ' +
- str(deltaOfpDevice2))
+ str(deltaOfpDevice2)+ ' ms')
if deltaGraph3 > thresholdMin and\
deltaGraph3 < thresholdMax and i >= iterIgnore:
endToEndLatNodeIter[2][i] = deltaGraph3
- main.log.info('ONOS3 iter' + str(i) +
+ main.log.info('ONOS3 iter' + str(i) +
' end-to-end: ' + str(deltaGraph3) + ' ms')
if deltaOfpGraph3 > thresholdMin and\
deltaOfpGraph3 < thresholdMax and i >= iterIgnore:
ofpToGraphLatNodeIter[2][i] = deltaOfpGraph3
- main.log.info('ONOS3 iter' + str(i) +
+ main.log.info('ONOS3 iter' + str(i) +
' ofp-to-graph: ' +
str(deltaOfpGraph3) + ' ms')
if deltaOfpDevice3 > thresholdMin and\
- deltaOfpDevice3 < thresholdMax and i >= iterIgnore:
+ deltaOfpDevice3 < thresholdMax and i >= iterIgnore:
ofpToDeviceLatNodeIter[2][i] = deltaOfpDevice3
- main.log.info('ONOS3 iter' + str(i) +
+ main.log.info('ONOS3 iter' + str(i) +
' ofp-to-device: ' + str(deltaOfpDevice3))
if clusterCount >= 5:
jsonStr4 = main.ONOS4cli.topologyEventsMetrics()
@@ -393,32 +496,32 @@
if deltaGraph4 > thresholdMin and \
deltaGraph4 < thresholdMax and i >= iterIgnore:
endToEndLatNodeIter[3][i] = deltaGraph4
- main.log.info('ONOS4 iter' + str(i) +
+ main.log.info('ONOS4 iter' + str(i) +
' end-to-end: ' + str(deltaGraph4) + ' ms')
if deltaOfpDevice4 > thresholdMin and \
deltaOfpDevice4 < thresholdMax and i >= iterIgnore:
ofpToDeviceLatNodeIter[3][i] = deltaOfpDevice4
- main.log.info('ONOS4 iter' + str(i) +
+ main.log.info('ONOS4 iter' + str(i) +
' ofp-to-device: ' + str(deltaOfpDevice4))
if deltaOfpGraph4 > thresholdMin and \
deltaOfpGraph4 < thresholdMax and i >= iterIgnore:
ofpToGraphLatNodeIter[3][i] = deltaOfpGraph4
- main.log.info('ONOS4 iter' + str(i) +
+ main.log.info('ONOS4 iter' + str(i) +
' ofp-to-graph: ' + str(deltaOfpGraph4) + ' ms')
if deltaGraph5 > thresholdMin and\
deltaGraph5 < thresholdMax and i >= iterIgnore:
endToEndLatNodeIter[4][i] = deltaGraph5
- main.log.info('ONOS5 iter' + str(i) +
+ main.log.info('ONOS5 iter' + str(i) +
' end-to-end: ' + str(deltaGraph5) + ' ms')
if deltaOfpDevice5 > thresholdMin and\
deltaOfpDevice5 < thresholdMax and i >= iterIgnore:
ofpToDeviceLatNodeIter[4][i] = deltaOfpDevice5
- main.log.info('ONOS5 iter' + str(i) +
+ main.log.info('ONOS5 iter' + str(i) +
' ofp-to-device: ' + str(deltaOfpDevice5))
if deltaOfpGraph5 > thresholdMin and\
deltaOfpGraph5 < thresholdMax and i >= iterIgnore:
ofpToGraphLatNodeIter[4][i] = deltaOfpGraph5
- main.log.info('ONOS5 iter' + str(i) +
+ main.log.info('ONOS5 iter' + str(i) +
' ofp-to-graph: ' +
str(deltaOfpGraph5) + ' ms')
if clusterCount >= 7:
@@ -441,38 +544,38 @@
if deltaGraph6 > thresholdMin and \
deltaGraph6 < thresholdMax and i >= iterIgnore:
endToEndLatNodeIter[5][i] = deltaGraph6
- main.log.info('ONOS6 iter' + str(i) +
+ main.log.info('ONOS6 iter' + str(i) +
' end-to-end: ' + str(deltaGraph6) + ' ms')
if deltaOfpDevice6 > thresholdMin and\
deltaOfpDevice6 < thresholdMax and i >= iterIgnore:
ofpToDeviceLatNodeIter[5][i] = deltaOfpDevice6
- main.log.info('ONOS6 iter' + str(i) +
+ main.log.info('ONOS6 iter' + str(i) +
' ofp-to-device: ' + str(deltaOfpDevice6))
if deltaOfpGraph6 > thresholdMin and\
deltaOfpGraph6 < thresholdMax and i >= iterIgnore:
ofpToGraphLatNodeIter[5][i] = deltaOfpGraph6
- main.log.info('ONOS6 iter' + str(i) +
+ main.log.info('ONOS6 iter' + str(i) +
' ofp-to-graph: ' +
str(deltaOfpGraph6) + ' ms')
if deltaGraph7 > thresholdMin and \
deltaGraph7 < thresholdMax and i >= iterIgnore:
endToEndLatNodeIter[6][i] = deltaGraph7
- main.log.info('ONOS7 iter' + str(i) +
+ main.log.info('ONOS7 iter' + str(i) +
' end-to-end: ' +
str(deltaGraph7) + ' ms')
if deltaOfpDevice7 > thresholdMin and\
deltaOfpDevice7 < thresholdMax and i >= iterIgnore:
ofpToDeviceLatNodeIter[6][i] = deltaOfpDevice7
- main.log.info('ONOS7 iter' + str(i) +
+ main.log.info('ONOS7 iter' + str(i) +
' ofp-to-device: ' +
str(deltaOfpDevice7))
if deltaOfpGraph7 > thresholdMin and \
deltaOfpGraph7 < thresholdMax and i >= iterIgnore:
ofpToGraphLatNodeIter[6][i] = deltaOfpGraph7
- main.log.info('ONOS7 iter' + str(i) +
+ main.log.info('ONOS7 iter' + str(i) +
' ofp-to-graph: ' +
str(deltaOfpGraph7) + ' ms')
-
+
time.sleep(5)
# Get device id to remove
@@ -499,11 +602,19 @@
endToEndAvg = 0
ofpToGraphAvg = 0
- endToEndList = []
- ofpToGraphList = []
- ofpToDeviceList = []
dbCmdList = []
for node in range(0, clusterCount):
+ # List of latency for each node
+ endToEndList = []
+ ofpToGraphList = []
+ ofpToDeviceList = []
+ tcpToOfpList = []
+ tcpToFeatureList = []
+ tcpToRoleList = []
+
+ # LatNodeIter 2d arrays contain all iteration latency
+ # for each node of the current scale cluster size
+
for item in endToEndLatNodeIter[node]:
if item > 0.0:
endToEndList.append(item)
@@ -516,7 +627,22 @@
if item > 0.0:
ofpToDeviceList.append(item)
+ for item in tcpToOfpLatIter:
+ if item > 0.0:
+ tcpToOfpList.append(item)
+
+ for item in tcpToFeatureLatIter:
+ if item > 0.0:
+ tcpToFeatureList.append(item)
+
+ for item in tcpToRoleLatIter:
+ if item > 0.0:
+ tcpToRoleList.append(item)
+
endToEndAvg = round(numpy.mean(endToEndList), 2)
+ tcpToOfpAvg = round(numpy.mean(tcpToOfpList), 2)
+ tcpToFeatureAvg = round(numpy.mean(tcpToFeatureList), 2)
+ tcpToRoleAvg = round(numpy.mean(tcpToRoleList), 2)
ofpToGraphAvg = round(numpy.mean(ofpToGraphList), 2)
endToEndStd = round(numpy.std(endToEndList), 2)
ofpToGraphStd = round(numpy.std(ofpToGraphList), 2)
@@ -526,6 +652,9 @@
main.log.report(' End-to-end Avg: ' + str(endToEndAvg) +
' ms' + ' End-to-end Std dev: ' +
str(endToEndStd) + ' ms')
+ main.log.report(' Tcp-to-role-reply : ' + str(tcpToOfpAvg) + ' ms')
+ main.log.report(' Tcp-to-feature-reply : ' + str(tcpToFeatureAvg) + ' ms')
+ main.log.report(' Tcp-to-role-request : ' + str(tcpToRoleAvg) + ' ms')
main.log.report(' Ofp-to-graph Avg: ' + str(ofpToGraphAvg) +
' ms' + ' Ofp-to-graph Std dev: ' +
str(ofpToGraphStd) + ' ms')
@@ -658,7 +787,59 @@
' results: ' + str(objDown))
timestampBeginPtDown = 0
fPortDown.close()
-
+
+ """
+ # TODO: Refactor in progress
+
+ for node in range(0, clusterCount):
+ nodeNum = node+1
+ exec "metricsDown = main.ONOS%scli.topologyEventsMetrics"%str(nodeNum)
+ jsonStrDown = metricsDown()
+ jsonObj = json.loads(jsonStrDown)
+
+ graphTimestamp = jsonObj[graphTimestamp]['value']
+ deviceTimestamp = jsonObj[deviceTimestamp]['value']
+ linkTimestamp = jsonObj[linkTimestamp]['value']
+
+ ptDownGraphToOfp = int(graphTimestamp) - int(timestampBeginPtDown)
+ ptDownDeviceToOfp = int(deviceTimestamp) - int(timestampBeginPtDown)
+ ptDownLinkToOfp = int(linkTimestamp) - int(timestampBeginPtDown)
+
+ if ptDownGraphToOfp > downThresholdMin and\
+ ptDownGraphToOfp < downThresholdMax and i > iterIgnore:
+ portDownGraphNodeIter[node][i] = ptDownGraphToOfp
+ main.log.info("ONOS "+str(nodeNum)+
+ " port down graph-to-ofp: "+
+ str(ptDownGraphToOfp) + " ms")
+ else:
+ main.log.info("ONOS "+str(nodeNum)+
+ " port down graph-to-ofp ignored"+
+ " due to excess in threshold or premature iteration")
+
+ if ptDownDeviceToOfp > downThresholdMin and\
+ ptDownDeviceToOfp < downThresholdMax and i > iterIgnore:
+ portDownDeviceNodeIter[node][i] = ptDownDeviceToOfp
+ main.log.info("ONOS "+str(nodeNum)+
+ " port down device-to-ofp: "+
+ str(ptDownDeviceToOfp) + " ms")
+ else:
+ main.log.info("ONOS "+str(nodeNum)+
+ " port down device-to-ofp ignored"+
+ " due to excess in threshold or premature iteration")
+
+ if ptDownLinkToOfp > downThresholdMin and\
+ ptDownLinkToOfp < downThresholdMax and i > iterIgnore:
+ portDownLinkNodeIter[node][i] = ptDownLinkToOfp
+ main.log.info("ONOS "+str(nodeNum)+
+ " port down link-to-ofp: "+
+ str(ptDownLinkToOfp) + " ms")
+ else:
+ main.log.info("ONOS "+str(nodeNum)+
+ " port down link-to-ofp ignored"+
+ " due to excess in threshold or premature iteration")
+ """
+ # *************************
+
main.step('Obtain t1 by metrics call')
jsonStrUp1 = main.ONOS1cli.topologyEventsMetrics()
@@ -669,36 +850,27 @@
ptDownGraphToOfp1 = int(graphTimestamp1) - int(timestampBeginPtDown)
ptDownDeviceToOfp1 = int(deviceTimestamp1) - int(timestampBeginPtDown)
ptDownLinkToOfp1 = int(linkTimestamp1) - int(timestampBeginPtDown)
-
+
if ptDownGraphToOfp1 > downThresholdMin and\
ptDownGraphToOfp1 < downThresholdMax and i > iterIgnore:
portDownGraphNodeIter[0][i] = ptDownGraphToOfp1
main.log.info('ONOS1 iter' + str(i) +
' port down graph-to-ofp: ' +
str(ptDownGraphToOfp1) + ' ms')
- else:
- main.log.info('ONOS1 iter' + str(i) +
- ' skipped. Result: ' +
- str(ptDownGraphToOfp1) + ' ms')
+
if ptDownDeviceToOfp1 > downThresholdMin and \
ptDownDeviceToOfp1 < downThresholdMax and i > iterIgnore:
portDownDevNodeIter[0][i] = ptDownDeviceToOfp1
main.log.info('ONOS1 iter' + str(i) +
' port down device-to-ofp: ' +
str(ptDownDeviceToOfp1) + ' ms')
- else:
- main.log.info('ONOS1 iter' + str(i) +
- ' skipped. Result: ' +
- str(ptDownDeviceToOfp1) + ' ms')
if ptDownLinkToOfp1 > downThresholdMin and\
ptDownLinkToOfp1 < downThresholdMax and i > iterIgnore:
portDownLinkNodeIter[0][i] = ptDownLinkToOfp1
main.log.info('ONOS1 iter' + str(i) +
' port down link-to-ofp: ' +
str(ptDownLinkToOfp1) + ' ms')
- else:
- main.log.info('ONOS1 Link-to-ofp skipped. Result: ' +
- str(ptDownLinkToOfp1) + ' ms')
+
if clusterCount >= 3:
jsonStrUp2 = main.ONOS2cli.topologyEventsMetrics()
jsonStrUp3 = main.ONOS3cli.topologyEventsMetrics()
@@ -858,7 +1030,7 @@
main.log.info('ONOS7 iter' + str(i) +
' link-to-ofp: ' +
str(ptDownLinkToOfp7) + ' ms')
-
+
time.sleep(3)
main.step('Starting wireshark capture for port status up')
@@ -888,6 +1060,62 @@
main.log.info('Tshark output file returned unexpected' + ' results.')
timestampBeginPtUp = 0
fPortUp.close()
+ """
+ # TODO: Refactoring in progress
+
+ for node in range(0, clusterCount):
+ nodeNum = node+1
+ exec "metricsUp = main.ONOS%scli.topologyEventsMetrics"%str(nodeNum)
+ jsonStrUp = metricsUp()
+ jsonObj = json.loads(jsonStrUp)
+
+ print jsonObj
+
+ graphTimestamp = jsonObj[graphTimestamp]['value']
+ deviceTimestamp = jsonObj[deviceTimestamp]['value']
+ linkTimestamp = jsonObj[linkTimestamp]['value']
+
+ ptUpGraphToOfp = int(graphTimestamp) - int(timestampBeginPtUp)
+ ptUpDeviceToOfp = int(deviceTimestamp) - int(timestampBeginPtUp)
+ ptUpLinkToOfp = int(linkTimestamp) - int(timestampBeginPtUp)
+
+ if ptUpGraphToOfp > upThresholdMin and\
+ ptUpGraphToOfp < upThresholdMax and i > iterIgnore:
+ portUpGraphNodeIter[node][i] = ptUpGraphToOfp
+ main.log.info("ONOS "+str(nodeNum)+
+ " port up graph-to-ofp: "+
+ str(ptUpGraphToOfp) + " ms")
+ else:
+ main.log.info("ONOS "+str(nodeNum)+
+ " port up graph-to-ofp ignored"+
+ " due to excess in threshold or premature iteration")
+
+ if ptUpDeviceToOfp > upThresholdMin and\
+ ptUpDeviceToOfp < upThresholdMax and i > iterIgnore:
+ portUpDeviceNodeIter[node][i] = ptUpDeviceToOfp
+ main.log.info("ONOS "+str(nodeNum)+
+ " port up device-to-ofp: "+
+ str(ptUpDeviceToOfp) + " ms")
+ else:
+ main.log.info("ONOS "+str(nodeNum)+
+ " port up device-to-ofp ignored"+
+ " due to excess in threshold or premature iteration")
+
+ if ptUpLinkToOfp > upThresholdMin and\
+ ptUpLinkToOfp < upThresholdMax and i > iterIgnore:
+ portUpLinkNodeIter[node][i] = ptUpLinkToOfp
+ main.log.info("ONOS "+str(nodeNum)+
+ " port up link-to-ofp: "+
+ str(ptUpLinkToOfp) + " ms")
+ else:
+ main.log.info("ONOS "+str(nodeNum)+
+ " port up link-to-ofp ignored"+
+ " due to excess in threshold or premature iteration")
+
+ """
+
+ # *****************************
+
main.step('Obtain t1 by REST call')
jsonStrUp1 = main.ONOS1cli.topologyEventsMetrics()
jsonObj1 = json.loads(jsonStrUp1)
@@ -903,20 +1131,12 @@
main.log.info('ONOS1 iter' + str(i) +
' port up graph-to-ofp: ' +
str(ptUpGraphToOfp1) + ' ms')
- else:
- main.log.info('ONOS1 iter' + str(i) +
- ' skipped. Result: ' +
- str(ptUpGraphToOfp1) + ' ms')
if ptUpDeviceToOfp1 > upThresholdMin and \
ptUpDeviceToOfp1 < upThresholdMax and i > iterIgnore:
portUpDevNodeIter[0][i] = ptUpDeviceToOfp1
main.log.info('ONOS1 iter' + str(i) +
' port up device-to-ofp: ' +
str(ptUpDeviceToOfp1) + ' ms')
- else:
- main.log.info('ONOS1 iter' + str(i) +
- ' skipped. Result: ' +
- str(ptUpDeviceToOfp1) + ' ms')
if ptUpLinkToOfp1 > downThresholdMin and\
ptUpLinkToOfp1 < downThresholdMax and i > iterIgnore:
portUpLinkNodeIter[0][i] = ptUpLinkToOfp1
@@ -1005,10 +1225,16 @@
main.log.info('ONOS4 iter' + str(i) +
' port up device-to-ofp: ' +
str(ptUpDeviceToOfp4) + ' ms')
+ if ptUpLinkToOfp4 > downThresholdMin and\
+ ptUpLinkToOfp4 < downThresholdMax and i > iterIgnore:
+ portUpLinkNodeIter[3][i] = ptUpLinkToOfp4
+ main.log.info('ONOS4 iter' + str(i) +
+ ' port up link-to-ofp: ' +
+ str(ptUpLinkToOfp4) + ' ms')
if ptUpGraphToOfp5 > upThresholdMin and\
ptUpGraphToOfp5 < upThresholdMax and i > iterIgnore:
portUpGraphNodeIter[4][i] = ptUpGraphToOfp5
- main.log.info('ONSO5 iter' + str(i) +
+ main.log.info('ONOS5 iter' + str(i) +
' port up graph-to-ofp: ' +
str(ptUpGraphToOfp5) + ' ms')
if ptUpDeviceToOfp5 > upThresholdMin and \
@@ -1017,6 +1243,13 @@
main.log.info('ONOS5 iter' + str(i) +
' port up device-to-ofp: ' +
str(ptUpDeviceToOfp5) + ' ms')
+ if ptUpLinkToOfp5 > downThresholdMin and\
+ ptUpLinkToOfp5 < downThresholdMax and i > iterIgnore:
+ portUpLinkNodeIter[4][i] = ptUpLinkToOfp5
+ main.log.info('ONOS5 iter' + str(i) +
+ ' port up link-to-ofp: ' +
+ str(ptUpLinkToOfp5) + ' ms')
+
if clusterCount >= 7:
jsonStrUp6 = main.ONOS6cli.topologyEventsMetrics()
jsonStrUp7 = main.ONOS7cli.topologyEventsMetrics()
@@ -1026,45 +1259,67 @@
graphTimestamp7 = jsonObj7[graphTimestamp]['value']
deviceTimestamp6 = jsonObj6[deviceTimestamp]['value']
deviceTimestamp7 = jsonObj7[deviceTimestamp]['value']
+ linkTimestamp6 = jsonObj6[linkTimestamp]['value']
+ linkTimestamp7 = jsonObj7[linkTimestamp]['value']
ptUpGraphToOfp6 = int(graphTimestamp6) - int(timestampBeginPtUp)
ptUpGraphToOfp7 = int(graphTimestamp7) - int(timestampBeginPtUp)
ptUpDeviceToOfp6 = int(deviceTimestamp6) - int(timestampBeginPtUp)
ptUpDeviceToOfp7 = int(deviceTimestamp7) - int(timestampBeginPtUp)
+ ptUpLinkToOfp6 = int(linkTimestamp6) - int(timestampBeginPtUp)
+ ptUpLinkToOfp7 = int(linkTimestamp7) - int(timestampBeginPtUp)
if ptUpGraphToOfp6 > upThresholdMin and\
ptUpGraphToOfp6 < upThresholdMax and i > iterIgnore:
portUpGraphNodeIter[5][i] = ptUpGraphToOfp6
- main.log.info('iter' + str(i) +
+ main.log.info('ONOS6 iter' + str(i) +
' port up graph-to-ofp: ' +
str(ptUpGraphToOfp6) + ' ms')
if ptUpDeviceToOfp6 > upThresholdMin and\
ptUpDeviceToOfp6 < upThresholdMax and i > iterIgnore:
portUpDevNodeIter[5][i] = ptUpDeviceToOfp6
- main.log.info('iter' + str(i) +
+ main.log.info('ONOS6 iter' + str(i) +
' port up device-to-ofp: ' +
str(ptUpDeviceToOfp6) + ' ms')
+ if ptUpLinkToOfp6 > downThresholdMin and\
+ ptUpLinkToOfp6 < downThresholdMax and i > iterIgnore:
+ portUpLinkNodeIter[5][i] = ptUpLinkToOfp6
+ main.log.info('ONOS6 iter' + str(i) +
+ ' port up link-to-ofp: ' +
+ str(ptUpLinkToOfp6) + ' ms')
if ptUpGraphToOfp7 > upThresholdMin and \
ptUpGraphToOfp7 < upThresholdMax and i > iterIgnore:
portUpGraphNodeIter[6][i] = ptUpGraphToOfp7
- main.log.info('iter' + str(i) +
+ main.log.info('ONOS7 iter' + str(i) +
' port up graph-to-ofp: ' +
str(ptUpGraphToOfp7) + ' ms')
if ptUpDeviceToOfp7 > upThresholdMin and\
ptUpDeviceToOfp7 < upThresholdMax and i > iterIgnore:
portUpDevNodeIter[6][i] = ptUpDeviceToOfp7
- main.log.info('iter' + str(i) +
+ main.log.info('ONOS7 iter' + str(i) +
' port up device-to-ofp: ' +
str(ptUpDeviceToOfp7) + ' ms')
+ if ptUpLinkToOfp7 > downThresholdMin and\
+ ptUpLinkToOfp7 < downThresholdMax and i > iterIgnore:
+ portUpLinkNodeIter[6][i] = ptUpLinkToOfp7
+ main.log.info('ONOS7 iter' + str(i) +
+ ' port up link-to-ofp: ' +
+ str(ptUpLinkToOfp7) + ' ms')
dbCmdList = []
for node in range(0, clusterCount):
portUpDevList = []
portUpGraphList = []
+ portUpLinkList = []
portDownDevList = []
portDownGraphList = []
+ portDownLinkList = []
+
portUpDevAvg = 0
portUpGraphAvg = 0
+ portUpLinkAvg = 0
portDownDevAvg = 0
portDownGraphAvg = 0
+ portDownLinkAvg = 0
+
for item in portUpDevNodeIter[node]:
if item > 0.0:
portUpDevList.append(item)
@@ -1073,6 +1328,10 @@
if item > 0.0:
portUpGraphList.append(item)
+ for item in portUpLinkNodeIter[node]:
+ if item > 0.0:
+ portUpLinkList.append(item)
+
for item in portDownDevNodeIter[node]:
if item > 0.0:
portDownDevList.append(item)
@@ -1081,21 +1340,36 @@
if item > 0.0:
portDownGraphList.append(item)
+ for item in portDownLinkNodeIter[node]:
+ if item > 0.0:
+ portDownLinkList.append(item)
+
portUpDevAvg = round(numpy.mean(portUpDevList), 2)
portUpGraphAvg = round(numpy.mean(portUpGraphList), 2)
+ portUpLinkAvg = round(numpy.mean(portUpLinkList), 2)
+
portDownDevAvg = round(numpy.mean(portDownDevList), 2)
portDownGraphAvg = round(numpy.mean(portDownGraphList), 2)
+ portDownLinkAvg = round(numpy.mean(portDownLinkList), 2)
+
portUpStdDev = round(numpy.std(portUpGraphList), 2)
portDownStdDev = round(numpy.std(portDownGraphList), 2)
+
main.log.report(' - Node ' + str(node + 1) + ' Summary - ')
main.log.report(' Port up ofp-to-device ' +
- str(round(portUpDevAvg, 2)) + ' ms')
+ str(portUpDevAvg) + ' ms')
main.log.report(' Port up ofp-to-graph ' +
str(portUpGraphAvg) + ' ms')
+ main.log.report(' Port up ofp-to-link ' +
+ str(portUpLinkAvg) + ' ms')
+
main.log.report(' Port down ofp-to-device ' +
str(round(portDownDevAvg, 2)) + ' ms')
main.log.report(' Port down ofp-to-graph ' +
str(portDownGraphAvg) + ' ms')
+ main.log.report(' Port down ofp-to-link ' +
+ str(portDownLinkAvg) + ' ms')
+
dbCmdList.append("INSERT INTO port_latency_tests VALUES('" +
timeToPost + "','port_latency_results'," + runNum +
',' + str(clusterCount) + ",'baremetal" + str(node + 1) +
diff --git a/TestON/tests/flowTP1g/flowTP1g.params b/TestON/tests/flowTP1g/flowTP1g.params
index 93b3923..5771a62 100644
--- a/TestON/tests/flowTP1g/flowTP1g.params
+++ b/TestON/tests/flowTP1g/flowTP1g.params
@@ -17,8 +17,8 @@
<skipCleanInstall>yes</skipCleanInstall>
<warmUp>4</warmUp> #number of runs to warm up the system
<sampleSize>20</sampleSize> #number of runs to take data from
- <neighbors>6</neighbors> #list of number of neighbors
- <servers>7</servers> #list of servers
+ <neighbors>4,2,0</neighbors> #list of number of neighbors
+ <servers>7,5,3,1</servers> #list of servers
<flows>122500</flows>
<switches>35</switches>
diff --git a/TestON/tests/flowTP1g/flowTP1g.py b/TestON/tests/flowTP1g/flowTP1g.py
index b8450fd..8261a47 100644
--- a/TestON/tests/flowTP1g/flowTP1g.py
+++ b/TestON/tests/flowTP1g/flowTP1g.py
@@ -182,7 +182,7 @@
serviceConfig.write("# Starts ONOS Apache Karaf container\n ")
serviceConfig.write("#------------------------------------- \n ")
serviceConfig.write("#export JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-7-openjdk-amd64/}\n ")
- serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms256m -Xmx8G}" \n """)
+ serviceConfig.write("""export JAVA_OPTS="${JAVA_OPTS:--Xms8G -Xmx8G}" \n """)
serviceConfig.write("")
serviceConfig.write("ONOS_HOME=/opt/onos \n ")
serviceConfig.write("")
diff --git a/TestON/tests/pushTestIntents/pushTestIntents.params b/TestON/tests/pushTestIntents/pushTestIntents.params
index c6b79d5..067ff8e 100644
--- a/TestON/tests/pushTestIntents/pushTestIntents.params
+++ b/TestON/tests/pushTestIntents/pushTestIntents.params
@@ -1,6 +1,6 @@
<PARAMS>
- <testcases>1,2,3,2,3,2,3</testcases>
+ <testcases>1,3,2,3,2,3,2,3</testcases>
<SCALE>2</SCALE>
<availableNodes>7</availableNodes>
@@ -16,8 +16,8 @@
<warmUp>4</warmUp>
<sampleSize>10</sampleSize>
<wait></wait>
- <intents>1,1000</intents> #list format, will be split on ','
- <debug></debug> #empty for false/no
+ <intents>1000</intents> #list format, will be split on ','
+ <debug>False</debug> #"True" for true
</TEST>
<GIT>
@@ -28,36 +28,36 @@
<CTRL>
<USER>admin</USER>
- <ip1>10.128.5.51</ip1>
+ <ip1>10.254.1.201</ip1>
<port1>6633</port1>
- <ip2>10.128.5.52</ip2>
+ <ip2>10.254.1.202</ip2>
<port2>6633</port2>
- <ip3>10.128.5.53</ip3>
+ <ip3>10.254.1.203</ip3>
<port3>6633</port3>
- <ip4>10.128.5.54</ip4>
+ <ip4>10.254.1.204</ip4>
<port4>6633</port4>
- <ip5>10.128.5.65</ip5>
+ <ip5>10.254.1.205</ip5>
<port5>6633</port5>
- <ip6>10.128.5.66</ip6>
+ <ip6>10.254.1.206</ip6>
<port6>6633</port6>
- <ip7>10.128.5.67</ip7>
+ <ip7>10.254.1.207</ip7>
<port7>6633</port7>
</CTRL>
<MN>
- <ip1>10.128.5.59</ip1>
+ <ip1>10.254.1.200</ip1>
</MN>
<BENCH>
<user>admin</user>
- <ip1>10.128.5.55</ip1>
+ <ip1>10.254.1.200</ip1>
</BENCH>
<JSON>
diff --git a/TestON/tests/pushTestIntents/pushTestIntents.py b/TestON/tests/pushTestIntents/pushTestIntents.py
index d5623cf..1594345 100644
--- a/TestON/tests/pushTestIntents/pushTestIntents.py
+++ b/TestON/tests/pushTestIntents/pushTestIntents.py
@@ -175,16 +175,21 @@
debug = main.params[ 'TEST' ][ 'switchCount' ]
for i in range(0,len(intentsList)):
intentsList[i] = int(intentsList[i])
-
+
+ if debug == "True":
+ debug = True
+ else:
+ debug = False
linkCount = 0
- while True:
+ for i in range(0,10):
main.ONOSbench.handle.sendline("onos $OC1 links|wc -l")
main.ONOSbench.handle.expect(":~")
linkCount = main.ONOSbench.handle.before
if debug: main.log.info("Link Count check: " + linkCount)
if str((switchCount*2)-2) in linkCount:
break
+ time.sleep(2)
links = "--"
while "=null:" not in links:
@@ -225,6 +230,8 @@
withdrawn = []
for run in range(0, (warmUp + sampleSize)):
+ if run > warmUp:
+ time.sleep(5)
myRawResult = "--"
while "ms" not in myRawResult:
@@ -233,22 +240,32 @@
myRawResult = main.ONOSbench.handle.before
if debug: main.log.info(myRawResult)
- main.log.info(myRawResult)
+ if debug: main.log.info(myRawResult)
if run >= warmUp:
myRawResult = myRawResult.splitlines()
for line in myRawResult:
if "install" in line:
- installed.append(line.split(" ")[5])
- if "withdrawn" in line:
- withdrawn.append(line.split(" ")[5])
- print(installed)
- print(withdrawn)
-
- main.log.info("Scale: " + str(clusterCount) + "\tIntent batch size: " + str(intentSize))
-
+ installed.append(int(line.split(" ")[5]))
+
+ for line in myRawResult:
+ if "withdraw" in line:
+ withdrawn.append(int(line.split(" ")[5]))
+
+ print("installed: " + str(installed))
+ print("withraw: " + str(withdrawn) + "\n")
+
+ main.log.report("----------------------------------------------------")
+ main.log.report("Scale: " + str(clusterCount) + "\tIntent batch size: " + str(intentSize))
+ main.log.report("Installed average: " + str(numpy.mean(installed)))
+ main.log.report("Installed standard deviation: " + str(numpy.std(installed)))
+ main.log.report("Withdraw average: " + str(numpy.mean(withdrawn)))
+ main.log.report("Withdraw standard deviation: " + str(numpy.std(withdrawn)))
+ main.log.report(" ")
+
+
- time.sleep(5)
+
diff --git a/TestON/tests/pushTestIntents/pushTestIntents.topo b/TestON/tests/pushTestIntents/pushTestIntents.topo
index 30a1467..0e45e0f 100644
--- a/TestON/tests/pushTestIntents/pushTestIntents.topo
+++ b/TestON/tests/pushTestIntents/pushTestIntents.topo
@@ -3,7 +3,7 @@
<COMPONENT>
<ONOSbench>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosDriver</type>
@@ -12,7 +12,7 @@
</ONOSbench>
<ONOS1cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -21,7 +21,7 @@
</ONOS1cli>
<ONOS2cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -30,7 +30,7 @@
</ONOS2cli>
<ONOS3cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -39,7 +39,7 @@
</ONOS3cli>
<ONOS4cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -48,7 +48,7 @@
</ONOS4cli>
<ONOS5cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -57,7 +57,7 @@
</ONOS5cli>
<ONOS6cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -66,7 +66,7 @@
</ONOS6cli>
<ONOS7cli>
- <host>10.128.5.55</host>
+ <host>10.254.1.200</host>
<user>admin</user>
<password>onos_test</password>
<type>OnosCliDriver</type>
@@ -75,7 +75,7 @@
</ONOS7cli>
<ONOS1>
- <host>10.128.5.51</host>
+ <host>10.254.1.201</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -84,7 +84,7 @@
</ONOS1>
<ONOS2>
- <host>10.128.5.52</host>
+ <host>10.254.1.202</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -93,7 +93,7 @@
</ONOS2>
<ONOS3>
- <host>10.128.5.53</host>
+ <host>10.254.1.203</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -102,7 +102,7 @@
</ONOS3>
<ONOS4>
- <host>10.128.5.54</host>
+ <host>10.254.1.204</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -112,7 +112,7 @@
<ONOS5>
- <host>10.128.5.65</host>
+ <host>10.254.1.205</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -121,7 +121,7 @@
</ONOS5>
<ONOS6>
- <host>10.128.5.66</host>
+ <host>10.254.1.206</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>
@@ -130,7 +130,7 @@
</ONOS6>
<ONOS7>
- <host>10.128.5.67</host>
+ <host>10.254.1.207</host>
<user>sdn</user>
<password>rocks</password>
<type>OnosDriver</type>