Creating subfolders for test suites
allow teston to look in subfolders
create subfolders for current test suites
move tests into sub folders
create HA suite dependencies folder and moved all common files there
minor driver and test updates
standardize on the name dependencies for the directory
change from admin to sdn users
Conflicts:
TestON/tests/FUNC/FUNCipv6Intent/FUNCipv6Intent.topo
Change-Id: I849e45ab67da8b285c36c5fdf43b34323876e741
diff --git a/TestON/tests/FUNC/FUNCoptical/FUNCoptical.params b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.params
new file mode 100644
index 0000000..a906f12
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.params
@@ -0,0 +1,57 @@
+<PARAMS>
+ # CASE - Description
+ # 1 - Variable initialization and optional pull and build ONOS package
+ # 2 - Install ONOS
+ # 10 - Start Mininet opticalTest Topology
+ # 14 - Stop Mininet
+ # 17 - Activate Flow Objectives
+ # 21 - Run pingall to discover all hosts
+ # 22 - Send arpings to discover all hosts
+ # 23 - Compare ONOS Topology to Mininet Topology
+ # 31 - Add and test bidirectional point intents
+ # 32 - Add and test bidirectional host intents
+
+ <testcases>1,[2,10,21,22,23,31,32,14,2,10,21,22,23,31,32,14]*1,[2,10,17,21,22,23,31,32,14,2,10,17,21,22,23,31,32,14]*1</testcases>
+
+ <SCALE>
+ <size>1,3,1,3</size>
+ </SCALE>
+
+ <DEPENDENCY>
+ <path>/tests/FUNC/FUNCoptical/dependencies/</path>
+ <wrapper1>startUp</wrapper1>
+ <wrapper2>FuncIntentFunction</wrapper2>
+ <wrapper3>topo</wrapper3>
+ </DEPENDENCY>
+
+ <ENV>
+ <cellApps>drivers,openflow,proxyarp,mobility,optical,fwd</cellApps>
+ </ENV>
+ <GIT>
+ <pull>False</pull>
+ <branch>master</branch>
+ </GIT>
+
+ <SLEEP>
+ <startup>15</startup>
+ <reroute>5</reroute>
+ <removeintent>10</removeintent>
+ <checkintent>5</checkintent>
+ <fwd>10</fwd>
+ <topoAttempts>3</topoAttempts>
+ </SLEEP>
+
+ <MININET>
+ <switch>7</switch>
+ <links>20</links>
+ </MININET>
+
+ # Intent tests params
+ <SDNIP>
+ <tcpProto>6</tcpProto>
+ <icmpProto>1</icmpProto>
+ <srcPort>5001</srcPort>
+ <dstPort>5001</dstPort>
+ </SDNIP>
+
+</PARAMS>
diff --git a/TestON/tests/FUNC/FUNCoptical/FUNCoptical.py b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.py
new file mode 100644
index 0000000..ab4d3d0
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.py
@@ -0,0 +1,628 @@
+# Testing the basic intent functionality of ONOS
+
+class FUNCoptical:
+
+ def __init__( self ):
+ self.default = ''
+
+ def CASE1( self, main ):
+ import time
+ import imp
+ import re
+
+ """
+ - Construct tests variables
+ - GIT ( optional )
+ - Checkout ONOS master branch
+ - Pull latest ONOS code
+ - Building ONOS ( optional )
+ - Install ONOS package
+ - Build ONOS package
+ """
+
+ main.case( "Constructing test variables and building ONOS package" )
+ main.step( "Constructing test variables" )
+ main.caseExplanation = "This test case is mainly for loading " +\
+ "from params file, and pull and build the " +\
+ " latest ONOS package"
+ stepResult = main.FALSE
+
+ # Test variables
+ try:
+ main.testOnDirectory = re.sub( "(/tests)$", "", main.testDir )
+ main.apps = main.params[ 'ENV' ][ 'cellApps' ]
+ gitBranch = main.params[ 'GIT' ][ 'branch' ]
+ main.dependencyPath = main.testOnDirectory + \
+ main.params[ 'DEPENDENCY' ][ 'path' ]
+ main.scale = ( main.params[ 'SCALE' ][ 'size' ] ).split( "," )
+ if main.ONOSbench.maxNodes:
+ main.maxNodes = int( main.ONOSbench.maxNodes )
+ else:
+ main.maxNodes = 0
+ wrapperFile1 = main.params[ 'DEPENDENCY' ][ 'wrapper1' ]
+ wrapperFile2 = main.params[ 'DEPENDENCY' ][ 'wrapper2' ]
+ wrapperFile3 = main.params[ 'DEPENDENCY' ][ 'wrapper3' ]
+ main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+ main.checkIntentSleep = int( main.params[ 'SLEEP' ][ 'checkintent' ] )
+ main.removeIntentSleep = int( main.params[ 'SLEEP' ][ 'removeintent' ] )
+ main.rerouteSleep = int( main.params[ 'SLEEP' ][ 'reroute' ] )
+ main.fwdSleep = int( main.params[ 'SLEEP' ][ 'fwd' ] )
+ main.checkTopoAttempts = int( main.params[ 'SLEEP' ][ 'topoAttempts' ] )
+ gitPull = main.params[ 'GIT' ][ 'pull' ]
+ main.numSwitch = int( main.params[ 'MININET' ][ 'switch' ] )
+ main.numLinks = int( main.params[ 'MININET' ][ 'links' ] )
+ main.cellData = {} # For creating cell file
+ main.hostsData = {}
+ main.CLIs = []
+ main.ONOSip = [] # List of IPs of active ONOS nodes. CASE 2
+ main.activeONOSip = []
+ main.assertReturnString = '' # Assembled assert return string
+
+ main.ONOSip = main.ONOSbench.getOnosIps()
+
+ # Assigning ONOS cli handles to a list
+ for i in range( 1, main.maxNodes + 1 ):
+ main.CLIs.append( getattr( main, 'ONOScli' + str( i ) ) )
+
+ # -- INIT SECTION, ONLY RUNS ONCE -- #
+ main.startUp = imp.load_source( wrapperFile1,
+ main.dependencyPath +
+ wrapperFile1 +
+ ".py" )
+
+ main.intentFunction = imp.load_source( wrapperFile2,
+ main.dependencyPath +
+ wrapperFile2 +
+ ".py" )
+
+ main.topo = imp.load_source( wrapperFile3,
+ main.dependencyPath +
+ wrapperFile3 +
+ ".py" )
+
+ if main.CLIs:
+ stepResult = main.TRUE
+ else:
+ main.log.error( "Did not properly created list of ONOS CLI handle" )
+ stepResult = main.FALSE
+ except Exception as e:
+ main.log.exception(e)
+ main.cleanup()
+ main.exit()
+
+ utilities.assert_equals( expect=main.TRUE,
+ actual=stepResult,
+ onpass="Successfully construct " +
+ "test variables ",
+ onfail="Failed to construct test variables" )
+
+ if gitPull == 'True':
+ main.step( "Building ONOS in " + gitBranch + " branch" )
+ onosBuildResult = main.startUp.onosBuild( main, gitBranch )
+ stepResult = onosBuildResult
+ utilities.assert_equals( expect=main.TRUE,
+ actual=stepResult,
+ onpass="Successfully compiled " +
+ "latest ONOS",
+ onfail="Failed to compile " +
+ "latest ONOS" )
+ else:
+ main.log.warn( "Did not pull new code so skipping mvn " +
+ "clean install" )
+ main.ONOSbench.getVersion( report=True )
+
+ def CASE2( self, main ):
+ """
+ - Set up cell
+ - Create cell file
+ - Set cell file
+ - Verify cell file
+ - Kill ONOS process
+ - Uninstall ONOS cluster
+ - Verify ONOS start up
+ - Install ONOS cluster
+ - Connect to cli
+ """
+
+ # main.scale[ 0 ] determines the current number of ONOS controller
+ main.numCtrls = int( main.scale[ 0 ] )
+ main.flowCompiler = "Flow Rules"
+
+ main.case( "Starting up " + str( main.numCtrls ) +
+ " node(s) ONOS cluster" )
+ main.caseExplanation = "Set up ONOS with " + str( main.numCtrls ) +\
+ " node(s) ONOS cluster"
+
+
+
+ #kill off all onos processes
+ main.log.info( "Safety check, killing all ONOS processes" +
+ " before initiating environment setup" )
+
+ for i in range( main.maxNodes ):
+ main.ONOSbench.onosDie( main.ONOSip[ i ] )
+
+ print "NODE COUNT = ", main.numCtrls
+
+ tempOnosIp = []
+ for i in range( main.numCtrls ):
+ tempOnosIp.append( main.ONOSip[i] )
+
+ main.ONOSbench.createCellFile( main.ONOSbench.ip_address,
+ "temp", main.Mininet1.ip_address,
+ main.apps, tempOnosIp )
+
+ main.step( "Apply cell to environment" )
+ cellResult = main.ONOSbench.setCell( "temp" )
+ verifyResult = main.ONOSbench.verifyCell()
+ stepResult = cellResult and verifyResult
+ utilities.assert_equals( expect=main.TRUE,
+ actual=stepResult,
+ onpass="Successfully applied cell to " + \
+ "environment",
+ onfail="Failed to apply cell to environment " )
+
+ main.step( "Creating ONOS package" )
+ packageResult = main.ONOSbench.onosPackage()
+ stepResult = packageResult
+ utilities.assert_equals( expect=main.TRUE,
+ actual=stepResult,
+ onpass="Successfully created ONOS package",
+ onfail="Failed to create ONOS package" )
+
+ time.sleep( main.startUpSleep )
+ main.step( "Uninstalling ONOS package" )
+ onosUninstallResult = main.TRUE
+ for ip in main.ONOSip:
+ onosUninstallResult = onosUninstallResult and \
+ main.ONOSbench.onosUninstall( nodeIp=ip )
+ stepResult = onosUninstallResult
+ utilities.assert_equals( expect=main.TRUE,
+ actual=stepResult,
+ onpass="Successfully uninstalled ONOS package",
+ onfail="Failed to uninstall ONOS package" )
+
+ time.sleep( main.startUpSleep )
+ main.step( "Installing ONOS package" )
+ onosInstallResult = main.TRUE
+ for i in range( main.numCtrls ):
+ onosInstallResult = onosInstallResult and \
+ main.ONOSbench.onosInstall( node=main.ONOSip[ i ] )
+ # Populate activeONOSip
+ main.activeONOSip.append( main.ONOSip[ i ] )
+ stepResult = onosInstallResult
+ utilities.assert_equals( expect=main.TRUE,
+ actual=stepResult,
+ onpass="Successfully installed ONOS package",
+ onfail="Failed to install ONOS package" )
+
+ time.sleep( main.startUpSleep )
+ main.step( "Starting ONOS service" )
+ stopResult = main.TRUE
+ startResult = main.TRUE
+ onosIsUp = main.TRUE
+
+ for i in range( main.numCtrls ):
+ onosIsUp = onosIsUp and main.ONOSbench.isup( main.ONOSip[ i ] )
+ if onosIsUp == main.TRUE:
+ main.log.report( "ONOS instance is up and ready" )
+ else:
+ main.log.report( "ONOS instance may not be up, stop and " +
+ "start ONOS again " )
+
+ for i in range( main.numCtrls ):
+ stopResult = stopResult and \
+ main.ONOSbench.onosStop( main.ONOSip[ i ] )
+ for i in range( main.numCtrls ):
+ startResult = startResult and \
+ main.ONOSbench.onosStart( main.ONOSip[ i ] )
+ stepResult = onosIsUp and stopResult and startResult
+ utilities.assert_equals( expect=main.TRUE,
+ actual=stepResult,
+ onpass="ONOS service is ready",
+ onfail="ONOS service did not start properly" )
+
+ main.step( "Start ONOS cli" )
+ cliResult = main.TRUE
+ for i in range( main.numCtrls ):
+ cliResult = cliResult and \
+ main.CLIs[ i ].startOnosCli( main.ONOSip[ i ] )
+ stepResult = cliResult
+ utilities.assert_equals( expect=main.TRUE,
+ actual=stepResult,
+ onpass="Successfully start ONOS cli",
+ onfail="Failed to start ONOS cli" )
+
+ # Remove the first element in main.scale list
+ main.scale.remove( main.scale[ 0 ] )
+
+ main.intentFunction.report( main )
+
+
+ def CASE10( self, main ):
+ """
+ Start Mininet opticalTest Topology
+ """
+ main.case( "Mininet with Linc-OE startup")
+ main.caseExplanation = "Start opticalTest.py topology included with ONOS"
+ main.step( "Starting mininet and LINC-OE" )
+ topoResult = main.TRUE
+ time.sleep( 10 )
+ controllerIPs = ' '.join( main.activeONOSip )
+ opticalMnScript = main.LincOE.runOpticalMnScript(ctrllerIP = controllerIPs)
+ topoResult = opticalMnScript
+ utilities.assert_equals(
+ expect=main.TRUE,
+ actual=topoResult,
+ onpass="Started the topology successfully ",
+ onfail="Failed to start the topology")
+
+ # Exit if topology did not load properly
+ if not topoResult:
+ main.cleanup()
+ main.exit()
+
+
+
+
+ def CASE14( self, main ):
+ """
+ Stop mininet
+ """
+ main.log.report( "Stop Mininet topology" )
+ main.case( "Stop Mininet topology" )
+ main.caseExplanation = "Stopping the current mininet topology " +\
+ "to start up fresh"
+
+ main.step( "Stopping Mininet Topology" )
+ topoResult = main.LincOE.stopNet( timeout=180 )
+ utilities.assert_equals( expect=main.TRUE,
+ actual=topoResult,
+ onpass="Successfully stopped mininet",
+ onfail="Failed to stopped mininet" )
+ # Exit if topology did not load properly
+ if not topoResult:
+ main.cleanup()
+ main.exit()
+
+ def CASE17( self, main ):
+ """
+ Use Flow Objectives
+ """
+ main.case( "Enable intent compilation using Flow Objectives" )
+ main.step( "Enabling Flow Objectives" )
+
+ main.flowCompiler = "Flow Objectives"
+
+ cmd = "org.onosproject.net.intent.impl.compiler.IntentConfigurableRegistrator"
+
+ stepResult = main.CLIs[ 0 ].setCfg( component=cmd,
+ propName="useFlowObjectives", value="true" )
+
+ utilities.assert_equals( expect=main.TRUE,
+ actual=stepResult,
+ onpass="Successfully activated Flow Objectives",
+ onfail="Failed to activate Flow Objectives" )
+
+ def CASE21( self,main ):
+ """
+ Run pingall to discover all hosts
+ """
+ main.case( "Running Pingall" )
+ main.caseExplanation = "Use pingall to discover all hosts. Pingall is expected to fail."
+ main.step( "Discover Hosts through Pingall" )
+ pingResult = main.LincOE.pingall( timeout = 600 )
+
+ utilities.assert_equals( expect=main.FALSE,
+ actual=pingResult,
+ onpass="Pingall Completed",
+ onfail="Pingall did not complete or did not return fales" )
+
+ def CASE22( self,main ):
+ """
+ Send arpings to discover all hosts
+ """
+ main.case( "Discover Hosts with arping" )
+ main.caseExplanation = "Send arpings between all the hosts to discover and verify them"
+
+ main.step( "Send arping between all hosts" )
+
+ hosts = [ "h1","h2","h3","h4","h5","h6" ]
+
+ arpingHostResults = main.TRUE
+ for host in hosts:
+ if main.LincOE.arping( host ):
+ main.log.info( "Successfully reached host {} with arping".format( host ) )
+ else:
+ main.log.error( "Could not reach host {} with arping".format( host ) )
+ arpingHostResults = main.FALSE
+
+ utilities.assert_equals( expect=main.TRUE,
+ actual=arpingHostResults,
+ onpass="Successfully discovered all hosts",
+ onfail="Could not descover some hosts" )
+
+ def CASE23( self, main ):
+ """
+ Compare ONOS Topology to Mininet Topology
+ """
+ import json
+
+ main.case( "Compare ONOS Topology view to Mininet topology" )
+ main.caseExplanation = "Compare topology elements between Mininet" +\
+ " and ONOS"
+
+ main.log.info( "Gathering topology information from Mininet" )
+ devicesResults = main.FALSE # Overall Boolean for device correctness
+ linksResults = main.FALSE # Overall Boolean for link correctness
+ hostsResults = main.FALSE # Overall Boolean for host correctness
+ deviceFails = [] # Nodes where devices are incorrect
+ linkFails = [] # Nodes where links are incorrect
+ hostFails = [] # Nodes where hosts are incorrect
+ attempts = main.checkTopoAttempts # Remaining Attempts
+
+ mnSwitches = 16
+ mnLinks = 46
+ mnHosts = 6
+
+ main.step( "Comparing Mininet topology to ONOS topology" )
+
+ while ( attempts >= 0 ) and\
+ ( not devicesResults or not linksResults or not hostsResults ):
+ time.sleep( 2 )
+ if not devicesResults:
+ devices = main.topo.getAllDevices( main )
+ ports = main.topo.getAllPorts( main )
+ devicesResults = main.TRUE
+ deviceFails = [] # Reset for each attempt
+ if not linksResults:
+ links = main.topo.getAllLinks( main )
+ linksResults = main.TRUE
+ linkFails = [] # Reset for each attempt
+ if not hostsResults:
+ hosts = main.topo.getAllHosts( main )
+ hostsResults = main.TRUE
+ hostFails = [] # Reset for each attempt
+
+ # Check for matching topology on each node
+ for controller in range( main.numCtrls ):
+ controllerStr = str( controller + 1 ) # ONOS node number
+ # Compare Devices
+ if devices[ controller ] and ports[ controller ] and\
+ "Error" not in devices[ controller ] and\
+ "Error" not in ports[ controller ]:
+
+ try:
+ deviceData = json.loads( devices[ controller ] )
+ portData = json.loads( ports[ controller ] )
+ except (TypeError,ValueError):
+ main.log.error("Could not load json:" + str( devices[ controller ] ) + ' or ' + str( ports[ controller ] ))
+ currentDevicesResult = main.FALSE
+ else:
+ if mnSwitches == len( deviceData ):
+ currentDevicesResult = main.TRUE
+ else:
+ currentDevicesResult = main.FALSE
+ main.log.error( "Node {} only sees {} device(s) but {} exist".format(
+ controllerStr,len( deviceData ),mnSwitches ) )
+ else:
+ currentDevicesResult = main.FALSE
+ if not currentDevicesResult:
+ deviceFails.append( controllerStr )
+ devicesResults = devicesResults and currentDevicesResult
+ # Compare Links
+ if links[ controller ] and "Error" not in links[ controller ]:
+ try:
+ linkData = json.loads( links[ controller ] )
+ except (TypeError,ValueError):
+ main.log.error("Could not load json:" + str( links[ controller ] ) )
+ currentLinksResult = main.FALSE
+ else:
+ if mnLinks == len( linkData ):
+ currentLinksResult = main.TRUE
+ else:
+ currentLinksResult = main.FALSE
+ main.log.error( "Node {} only sees {} link(s) but {} exist".format(
+ controllerStr,len( linkData ),mnLinks ) )
+ else:
+ currentLinksResult = main.FALSE
+ if not currentLinksResult:
+ linkFails.append( controllerStr )
+ linksResults = linksResults and currentLinksResult
+ # Compare Hosts
+ if hosts[ controller ] and "Error" not in hosts[ controller ]:
+ try:
+ hostData = json.loads( hosts[ controller ] )
+ except (TypeError,ValueError):
+ main.log.error("Could not load json:" + str( hosts[ controller ] ) )
+ currentHostsResult = main.FALSE
+ else:
+ if mnHosts == len( hostData ):
+ currentHostsResult = main.TRUE
+ else:
+ currentHostsResult = main.FALSE
+ main.log.error( "Node {} only sees {} host(s) but {} exist".format(
+ controllerStr,len( hostData ),mnHosts ) )
+ else:
+ currentHostsResult = main.FALSE
+ if not currentHostsResult:
+ hostFails.append( controllerStr )
+ hostsResults = hostsResults and currentHostsResult
+ # Decrement Attempts Remaining
+ attempts -= 1
+
+ utilities.assert_equals( expect=[],
+ actual=deviceFails,
+ onpass="ONOS correctly discovered all devices",
+ onfail="ONOS incorrectly discovered devices on nodes: " +
+ str( deviceFails ) )
+ utilities.assert_equals( expect=[],
+ actual=linkFails,
+ onpass="ONOS correctly discovered all links",
+ onfail="ONOS incorrectly discovered links on nodes: " +
+ str( linkFails ) )
+ utilities.assert_equals( expect=[],
+ actual=hostFails,
+ onpass="ONOS correctly discovered all hosts",
+ onfail="ONOS incorrectly discovered hosts on nodes: " +
+ str( hostFails ) )
+ if hostsResults and linksResults and devicesResults:
+ topoResults = main.TRUE
+ else:
+ topoResults = main.FALSE
+ utilities.assert_equals( expect=main.TRUE,
+ actual=topoResults,
+ onpass="ONOS correctly discovered the topology",
+ onfail="ONOS incorrectly discovered the topology" )
+
+
+ def CASE31( self, main ):
+ import time
+ """
+ Add bidirectional point intents between 2 packet layer( mininet )
+ devices and ping mininet hosts
+ """
+ main.log.report(
+ "This testcase adds bidirectional point intents between 2 " +
+ "packet layer( mininet ) devices and ping mininet hosts" )
+ main.case( "Install point intents between 2 packet layer device and " +
+ "ping the hosts" )
+ main.caseExplanation = "This testcase adds bidirectional point intents between 2 " +\
+ "packet layer( mininet ) devices and ping mininet hosts"
+
+ main.step( "Adding point intents" )
+ checkFlowResult = main.TRUE
+ main.pIntentsId = []
+ pIntent1 = main.CLIs[ 0 ].addPointIntent(
+ "of:0000ffffffff0001/1",
+ "of:0000ffffffff0005/1" )
+ time.sleep( 10 )
+ pIntent2 = main.CLIs[ 0 ].addPointIntent(
+ "of:0000ffffffff0005/1",
+ "of:0000ffffffff0001/1" )
+ main.pIntentsId.append( pIntent1 )
+ main.pIntentsId.append( pIntent2 )
+ time.sleep( 10 )
+ main.log.info( "Checking intents state")
+ checkStateResult = main.CLIs[ 0 ].checkIntentState(
+ intentsId = main.pIntentsId )
+ time.sleep( 10 )
+ main.log.info( "Checking flows state")
+ checkFlowResult = main.CLIs[ 0 ].checkFlowsState()
+ # Sleep for 10 seconds to provide time for the intent state to change
+ time.sleep( 10 )
+ main.log.info( "Checking intents state one more time")
+ checkStateResult = main.CLIs[ 0 ].checkIntentState(
+ intentsId = main.pIntentsId )
+
+ if checkStateResult and checkFlowResult:
+ addIntentsResult = main.TRUE
+ else:
+ addIntentsResult = main.FALSE
+ utilities.assert_equals(
+ expect=main.TRUE,
+ actual=addIntentsResult,
+ onpass="Successfully added point intents",
+ onfail="Failed to add point intents")
+
+ if not addIntentsResult:
+ main.log.error( "Intents were not properly installed. Exiting case." )
+ main.skipCase()
+
+ main.step( "Ping h1 and h5" )
+ pingResult = main.LincOE.pingHostOptical( src="h1", target="h5" )
+ utilities.assert_equals(
+ expect=main.TRUE,
+ actual=pingResult,
+ onpass="Successfully pinged h1 and h5",
+ onfail="Failed to ping between h1 and h5")
+
+ def CASE32( self ):
+ """
+ Add host intents between 2 packet layer host
+ """
+ import time
+ import json
+ main.log.report( "Adding host intents between 2 optical layer host" )
+ main.case( "Test add host intents between optical layer host" )
+ main.caseExplanation = "Test host intents between 2 optical layer host"
+
+ main.step( "Adding host intents to h1 and h2" )
+ hostMACs = []
+ hostId = []
+ # Listing host MAC addresses
+ for i in range( 1 , 7 ):
+ hostMACs.append( "00:00:00:00:00:" +
+ str( hex( i )[ 2: ] ).zfill( 2 ).upper() )
+ for macs in hostMACs:
+ hostId.append( macs + "/-1" )
+ host1 = hostId[ 0 ]
+ host2 = hostId[ 1 ]
+
+ intentsId = []
+ intent1 = main.CLIs[ 0 ].addHostIntent( hostIdOne = host1,
+ hostIdTwo = host2 )
+ intentsId.append( intent1 )
+ # Checking intents state before pinging
+ main.log.info( "Checking intents state" )
+ intentResult = main.CLIs[ 0 ].checkIntentState( intentsId = intentsId )
+ # Check intent state again if intents are not in installed state
+
+
+ # If intent state is wrong, wait 3 sec and try again
+ if not intentResult:
+ time.sleep( 3 )
+ intentResult = main.CLIs[ 0 ].checkIntentState( intentsId = intentsId )
+
+ # If intent state is still wrong, display intent states
+ if not intentResult:
+ main.log.error( main.CLIs[ 0 ].intents() )
+
+ utilities.assert_equals( expect=main.TRUE,
+ actual=intentResult,
+ onpass="All intents are in INSTALLED state ",
+ onfail="Some of the intents are not in " +
+ "INSTALLED state " )
+
+ if not intentResult:
+ main.log.error( "Intents were not properly installed. Skipping Ping" )
+ else:
+ # Pinging h1 to h2 and then ping h2 to h1
+ main.step( "Pinging h1 and h2" )
+ pingResult = main.TRUE
+ pingResult = main.LincOE.pingHostOptical( src="h1", target="h2" ) \
+ and main.LincOE.pingHostOptical( src="h2",target="h1" )
+
+ utilities.assert_equals( expect=main.TRUE,
+ actual=pingResult,
+ onpass="Pinged successfully between h1 and h2",
+ onfail="Pinged failed between h1 and h2" )
+
+ # Removed all added host intents
+ main.step( "Removing host intents" )
+ removeResult = main.TRUE
+ # Check remaining intents
+ try:
+ intentsJson = json.loads( main.CLIs[ 0 ].intents() )
+ main.CLIs[ 0 ].removeIntent( intentId=intent1, purge=True )
+ #main.CLIs[ 0 ].removeIntent( intentId=intent2, purge=True )
+ main.log.debug(intentsJson)
+ for intents in intentsJson:
+ main.CLIs[ 0 ].removeIntent( intentId=intents.get( 'id' ),
+ app='org.onosproject.optical',
+ purge=True )
+
+ for i in range( main.numCtrls ):
+ if len( json.loads( main.CLIs[ i ].intents() ) ):
+ print json.loads( main.CLIs[ i ].intents() )
+ removeResult = main.FALSE
+ except ( TypeError, ValueError ):
+ main.log.error( "Cannot see intents on Node " + str( main.CLIs[ 0 ] ) +\
+ ". Removing all intents.")
+ main.CLIs[ 0 ].removeAllIntents( purge=True )
+ main.CLIs[ 0 ].removeAllIntents( purge=True, app='org.onosproject.optical')
+
+ utilities.assert_equals( expect=main.TRUE,
+ actual=removeResult,
+ onpass="Successfully removed host intents",
+ onfail="Failed to remove host intents" )
diff --git a/TestON/tests/FUNC/FUNCoptical/FUNCoptical.topo b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.topo
new file mode 100755
index 0000000..c8037cd
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/FUNCoptical.topo
@@ -0,0 +1,64 @@
+<TOPOLOGY>
+ <COMPONENT>
+
+ <ONOSbench>
+ <host>localhost</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosDriver</type>
+ <connect_order>1</connect_order>
+ <COMPONENTS>
+ <nodes>3</nodes>
+ </COMPONENTS>
+ </ONOSbench>
+
+ <ONOScli1>
+ <host>localhost</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosCliDriver</type>
+ <connect_order>2</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOScli1>
+
+ <ONOScli2>
+ <host>localhost</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosCliDriver</type>
+ <connect_order>3</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOScli2>
+
+ <ONOScli3>
+ <host>localhost</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>OnosCliDriver</type>
+ <connect_order>4</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOScli3>
+
+ <Mininet1>
+ <host>OCN</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>MininetCliDriver</type>
+ <connect_order>5</connect_order>
+ <COMPONENTS>
+ <home>~/mininet/custom/</home>
+ </COMPONENTS>
+ </Mininet1>
+
+ <LincOE>
+ <host>OCN</host>
+ <user>sdn</user>
+ <password>rocks</password>
+ <type>LincOEMininetDriver</type>
+ <connect_order>7</connect_order>
+ <COMPONENTS>
+ </COMPONENTS>
+ </LincOE>
+
+ </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNC/FUNCoptical/README b/TestON/tests/FUNC/FUNCoptical/README
new file mode 100644
index 0000000..48a4f5f
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/README
@@ -0,0 +1,11 @@
+Summary:
+ This test suite consist of basic optical functionality testing.
+ It bings up Link-OE topology to simulate optical switches.
+ The following is an overview of the basic functionality that is
+ performed in this test.
+ Steps:
+ - Discover hosts
+ - Compare Mininet topology
+ - Add and test point intents
+ - Add and test host intents
+
diff --git a/TestON/tests/FUNC/FUNCoptical/TopoConfig.json b/TestON/tests/FUNC/FUNCoptical/TopoConfig.json
new file mode 100644
index 0000000..9545eae
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/TopoConfig.json
@@ -0,0 +1,2832 @@
+{
+ "linkConfig": [
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 100,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:01",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:01",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:15",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 100,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:02",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:02",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:13",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:02",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:15",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:02",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1e",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 100,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:03",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:10",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:03",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:42",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:04",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:08",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:04",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:0c",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:04",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1a",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:0b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:04",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:0b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:04",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:0b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:04",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:0b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:04",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:0b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:04",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:4b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:19",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:4b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:05",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:0e",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 104,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:05",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:06",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:09",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:06",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:13",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:06",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3f",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:07",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2e",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:07",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:30",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:07",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:46",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:08",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:26",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:08",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:27",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:09",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0a",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:19",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0a",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:27",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:14",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:22",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3e",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0c",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:17",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0d",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1a",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0d",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:34",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0e",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:0f",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 101,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0e",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:46",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:0f",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:30",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:10",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:31",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:11",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:0f",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:11",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1f",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:11",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:12",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:19",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:12",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:20",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:12",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2a",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:0a",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:0a",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:0a",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:0a",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:0a",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:12",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:13",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2c",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:13",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:38",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:14",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:46",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:15",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:15",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:44",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:16",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:16",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1f",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 108,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:16",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2a",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 108,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:17",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1f",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:17",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:33",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:17",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:34",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 108,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:18",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1c",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:18",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:31",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1a",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2c",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:40",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:47",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1c",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:29",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1d",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3a",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1d",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3b",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:09",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:09",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:09",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:09",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:09",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:1d",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1e",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1e",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:38",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 104,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1f",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:26",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 108,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:1f",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:40",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:20",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:23",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:21",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:43",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:21",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:4a",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:22",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:23",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:26",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:24",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2c",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:08",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:08",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:08",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:08",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:08",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:24",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:25",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:34",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:25",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:49",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:27",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:45",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:28",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2e",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:07",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:07",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:07",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:07",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:07",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:29",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:28",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:29",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:37",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:29",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:49",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2a",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:47",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:36",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:38",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2b",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3c",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2d",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:4a",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:06",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:06",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:06",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:06",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:06",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2d",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2e",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:37",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2f",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3b",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:2f",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:44",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:05",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:05",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:05",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:05",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:05",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:2f",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:30",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:37",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:32",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:36",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 108,
+ "numWaves": 80,
+ "port1": 102,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:32",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:38",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 103,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:32",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:41",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:33",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:35",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:42",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:04",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:04",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:04",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:04",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:04",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:35",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:37",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:42",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:03",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:03",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:03",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:03",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:03",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:39",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 105,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:3c",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:3d",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3a",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:02",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:02",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:02",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:02",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:02",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3d",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:3e",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:40",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 107,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:41",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:3f",
+ "allowed": true
+ },
+ {
+ "type": "wdmLink",
+ "params": {
+ "port2": 106,
+ "numWaves": 80,
+ "port1": 101,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:ff:ff:45",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:43",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 10,
+ "bandwidth": 100000,
+ "port1": 2,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:01",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 11,
+ "bandwidth": 100000,
+ "port1": 3,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:01",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 12,
+ "bandwidth": 100000,
+ "port1": 4,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:01",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 13,
+ "bandwidth": 100000,
+ "port1": 5,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:01",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+ "allowed": true
+ },
+ {
+ "type": "pktOptLink",
+ "params": {
+ "port2": 14,
+ "bandwidth": 100000,
+ "port1": 6,
+ "nodeName2": "none",
+ "nodeName1": "none"
+ },
+ "nodeDpid1": "00:00:ff:ff:ff:00:00:01",
+ "nodeDpid2": "00:00:ff:ff:ff:ff:ff:48",
+ "allowed": true
+ }
+ ],
+ "switchConfig": [
+ {
+ "name": "none",
+ "longitude": -99.741564,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 32.508086,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:01"
+ },
+ {
+ "name": "none",
+ "longitude": -106.649719,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 35.084446,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:02"
+ },
+ {
+ "name": "none",
+ "longitude": -73.758333,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 42.652222,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:03"
+ },
+ {
+ "name": "none",
+ "longitude": -97.743057,
+ "params": {
+ "numregens": 5
+ },
+ "allowed": true,
+ "latitude": 33.755833,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:04"
+ },
+ {
+ "name": "none",
+ "longitude": -96.7,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 29.57,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:4b"
+ },
+ {
+ "name": "none",
+ "longitude": -78.877778,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 42.882778,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:05"
+ },
+ {
+ "name": "none",
+ "longitude": -108.509167,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 45.781667,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:06"
+ },
+ {
+ "name": "none",
+ "longitude": -76.614127,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 39.293781,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:07"
+ },
+ {
+ "name": "none",
+ "longitude": -86.812225,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 33.517223,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:08"
+ },
+ {
+ "name": "none",
+ "longitude": -100.796917,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 46.836379,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:09"
+ },
+ {
+ "name": "none",
+ "longitude": -91.184167,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 30.449722,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:0a"
+ },
+ {
+ "name": "none",
+ "longitude": -87.640432,
+ "params": {
+ "numregens": 4
+ },
+ "allowed": true,
+ "latitude": 41.881484,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:0b"
+ },
+ {
+ "name": "none",
+ "longitude": -80.837502,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 35.224924,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:0c"
+ },
+ {
+ "name": "none",
+ "longitude": -79.938056,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 32.785278,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:0d"
+ },
+ {
+ "name": "none",
+ "longitude": -81.686943,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 41.498333,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:0e"
+ },
+ {
+ "name": "none",
+ "longitude": -82.996666,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 39.965279,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:0f"
+ },
+ {
+ "name": "none",
+ "longitude": -71.084918,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 42.36745,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:10"
+ },
+ {
+ "name": "none",
+ "longitude": -84.516944,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 39.102778,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:11"
+ },
+ {
+ "name": "none",
+ "longitude": -96.780431,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 32.797524,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:12"
+ },
+ {
+ "name": "none",
+ "longitude": -104.996391,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 39.744999,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:13"
+ },
+ {
+ "name": "none",
+ "longitude": -83.054169,
+ "params": {
+ "numregens": 5
+ },
+ "allowed": true,
+ "latitude": 42.332779,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:14"
+ },
+ {
+ "name": "none",
+ "longitude": -106.483611,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 31.756389,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:15"
+ },
+ {
+ "name": "none",
+ "longitude": -119.79423,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 36.73923,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:16"
+ },
+ {
+ "name": "none",
+ "longitude": -79.793889,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 36.072222,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:17"
+ },
+ {
+ "name": "none",
+ "longitude": -72.676389,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 41.765833,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:18"
+ },
+ {
+ "name": "none",
+ "longitude": -95.36528,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 29.748333,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:19"
+ },
+ {
+ "name": "none",
+ "longitude": -81.43,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 30.33071,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:1a"
+ },
+ {
+ "name": "none",
+ "longitude": -94.578716,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 39.096649,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:1b"
+ },
+ {
+ "name": "none",
+ "longitude": -73.6699993,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 40.5899999,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:1c"
+ },
+ {
+ "name": "none",
+ "longitude": -118.252958,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 34.051227,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:1d"
+ },
+ {
+ "name": "none",
+ "longitude": -115.138889,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 36.168056,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:1e"
+ },
+ {
+ "name": "none",
+ "longitude": -85.760833,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 38.249167,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:1f"
+ },
+ {
+ "name": "none",
+ "longitude": -92.271942,
+ "params": {
+ "numregens": 2
+ },
+ "allowed": true,
+ "latitude": 34.740833,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:20"
+ },
+ {
+ "name": "none",
+ "longitude": -80.195,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 25.779167,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:21"
+ },
+ {
+ "name": "none",
+ "longitude": -87.922501,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 43.037224,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:22"
+ },
+ {
+ "name": "none",
+ "longitude": -90.048058,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 35.145158,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:23"
+ },
+ {
+ "name": "none",
+ "longitude": -93.26718,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 44.977365,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:24"
+ },
+ {
+ "name": "none",
+ "longitude": -76.29,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 36.853333,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:25"
+ },
+ {
+ "name": "none",
+ "longitude": -86.775558,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 36.163955,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:26"
+ },
+ {
+ "name": "none",
+ "longitude": -90.07222,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 29.949806,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:27"
+ },
+ {
+ "name": "none",
+ "longitude": -74.177978,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 40.734408,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:28"
+ },
+ {
+ "name": "none",
+ "longitude": -73.989713,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 40.767497,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:29"
+ },
+ {
+ "name": "none",
+ "longitude": -97.515274,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 35.470833,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:2a"
+ },
+ {
+ "name": "none",
+ "longitude": -122.268889,
+ "params": {
+ "numregens": 2
+ },
+ "allowed": true,
+ "latitude": 37.805556,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:2b"
+ },
+ {
+ "name": "none",
+ "longitude": -95.940277,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 41.259167,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:2c"
+ },
+ {
+ "name": "none",
+ "longitude": -81.377502,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 28.543279,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:2d"
+ },
+ {
+ "name": "none",
+ "longitude": -75.184139,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 39.946446,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:2e"
+ },
+ {
+ "name": "none",
+ "longitude": -112.07709,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 33.450361,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:2f"
+ },
+ {
+ "name": "none",
+ "longitude": -79.995552,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 40.441387,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:30"
+ },
+ {
+ "name": "none",
+ "longitude": -71.415278,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 41.818889,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:31"
+ },
+ {
+ "name": "none",
+ "longitude": -122.678055,
+ "params": {
+ "numregens": 2
+ },
+ "allowed": true,
+ "latitude": 45.522499,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:32"
+ },
+ {
+ "name": "none",
+ "longitude": -77.436096,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 37.540752,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:33"
+ },
+ {
+ "name": "none",
+ "longitude": -78.640831,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 35.779656,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:34"
+ },
+ {
+ "name": "none",
+ "longitude": -77.616389,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 43.157222,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:35"
+ },
+ {
+ "name": "none",
+ "longitude": -121.487221,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 38.578609,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:36"
+ },
+ {
+ "name": "none",
+ "longitude": -75.649167,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 41.415278,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:37"
+ },
+ {
+ "name": "none",
+ "longitude": -111.888336,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 40.767776,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:38"
+ },
+ {
+ "name": "none",
+ "longitude": -98.488892,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 29.429445,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:39"
+ },
+ {
+ "name": "none",
+ "longitude": -119.7,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 34.418889,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:3a"
+ },
+ {
+ "name": "none",
+ "longitude": -117.158611,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 32.746944,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:3b"
+ },
+ {
+ "name": "none",
+ "longitude": -122.397263,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 37.785143,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:3c"
+ },
+ {
+ "name": "none",
+ "longitude": -121.892778,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 37.333333,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:3d"
+ },
+ {
+ "name": "none",
+ "longitude": -89.649444,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 39.795278,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:3e"
+ },
+ {
+ "name": "none",
+ "longitude": -117.419167,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 47.654724,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:3f"
+ },
+ {
+ "name": "none",
+ "longitude": -90.215279,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 38.633335,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:40"
+ },
+ {
+ "name": "none",
+ "longitude": -122.333336,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 47.606945,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:41"
+ },
+ {
+ "name": "none",
+ "longitude": -76.1475,
+ "params": {
+ "numregens": 3
+ },
+ "allowed": true,
+ "latitude": 43.049444,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:42"
+ },
+ {
+ "name": "none",
+ "longitude": -82.522778,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 28.0225,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:43"
+ },
+ {
+ "name": "none",
+ "longitude": -110.968333,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 32.224444,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:44"
+ },
+ {
+ "name": "none",
+ "longitude": -84.290833,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 30.456389,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:45"
+ },
+ {
+ "name": "none",
+ "longitude": -83.538056,
+ "params": {
+ "numregens": 2
+ },
+ "allowed": true,
+ "latitude": 41.65,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:46"
+ },
+ {
+ "name": "none",
+ "longitude": -95.985832,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 36.151669,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:47"
+ },
+ {
+ "name": "none",
+ "longitude": -77.01028,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 38.88306,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:48"
+ },
+ {
+ "name": "none",
+ "longitude": -75.553889,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 39.739167,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:49"
+ },
+ {
+ "name": "none",
+ "longitude": -80.05278,
+ "params": {
+ "numregens": 0
+ },
+ "allowed": true,
+ "latitude": 26.709391,
+ "type": "Roadm",
+ "nodeDpid": "00:00:ff:ff:ff:ff:ff:4a"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/TestON/tests/FUNC/FUNCoptical/Topology.json b/TestON/tests/FUNC/FUNCoptical/Topology.json
new file mode 100644
index 0000000..21c21e7
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/Topology.json
@@ -0,0 +1,4362 @@
+{
+ "devices": {
+ "of:0000ffffffffff4a": {
+ "basic": {
+ "name": "WPBHFLAN",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff4a",
+ "longitude": -80.05278,
+ "mfr": "Linc",
+ "latitude": 26.709391,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff4b": {
+ "basic": {
+ "name": "AUSTTXGR",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff4b",
+ "longitude": -96.7,
+ "mfr": "Linc",
+ "latitude": 29.57,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff44": {
+ "basic": {
+ "name": "TCSNAZMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff44",
+ "longitude": -110.968333,
+ "mfr": "Linc",
+ "latitude": 32.224444,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff45": {
+ "basic": {
+ "name": "TLHSFLAT",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff45",
+ "longitude": -84.290833,
+ "mfr": "Linc",
+ "latitude": 30.456389,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff46": {
+ "basic": {
+ "name": "TOLDOH21",
+ "optical.regens": 2,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff46",
+ "longitude": -83.538056,
+ "mfr": "Linc",
+ "latitude": 41.65,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff47": {
+ "basic": {
+ "name": "TULSOKTB",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff47",
+ "longitude": -95.985832,
+ "mfr": "Linc",
+ "latitude": 36.151669,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff40": {
+ "basic": {
+ "name": "STLSMO09",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff40",
+ "longitude": -90.215279,
+ "mfr": "Linc",
+ "latitude": 38.633335,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff41": {
+ "basic": {
+ "name": "STTLWA06",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff41",
+ "longitude": -122.333336,
+ "mfr": "Linc",
+ "latitude": 47.606945,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff42": {
+ "basic": {
+ "name": "SYRCNYSU",
+ "optical.regens": 3,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff42",
+ "longitude": -76.1475,
+ "mfr": "Linc",
+ "latitude": 43.049444,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff43": {
+ "basic": {
+ "name": "TAMQFLFN",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff43",
+ "longitude": -82.522778,
+ "mfr": "Linc",
+ "latitude": 28.0225,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff48": {
+ "basic": {
+ "name": "WASHDCSW",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff48",
+ "longitude": -77.01028,
+ "mfr": "Linc",
+ "latitude": 38.88306,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff49": {
+ "basic": {
+ "name": "WLMGDE01",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff49",
+ "longitude": -75.553889,
+ "mfr": "Linc",
+ "latitude": 39.739167,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffff00000a": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "DLLSTXTL-R",
+ "latitude": 32.7,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "eaf75c83054e",
+ "longitude": -96.7
+ }
+ },
+ "of:0000ffffff00000b": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "ATLNGATL-R",
+ "latitude": 33.7,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "ee5628887b4f",
+ "longitude": -97.7
+ }
+ },
+ "of:0000ffffffffff1d": {
+ "basic": {
+ "name": "LSANCA03",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff1d",
+ "longitude": -118.252958,
+ "mfr": "Linc",
+ "latitude": 34.051227,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff03": {
+ "basic": {
+ "name": "ALBYNYSS",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff03",
+ "longitude": -73.758333,
+ "mfr": "Linc",
+ "latitude": 42.652222,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff0a": {
+ "basic": {
+ "name": "BTRGLAMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff0a",
+ "longitude": -91.184167,
+ "mfr": "Linc",
+ "latitude": 30.449722,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff0b": {
+ "basic": {
+ "name": "CHCGILCL",
+ "optical.regens": 4,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff0b",
+ "longitude": -87.640432,
+ "mfr": "Linc",
+ "latitude": 41.881484,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff0c": {
+ "basic": {
+ "name": "CHRLNCCA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff0c",
+ "longitude": -80.837502,
+ "mfr": "Linc",
+ "latitude": 35.224924,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff0d": {
+ "basic": {
+ "name": "CHTNSCDT",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff0d",
+ "longitude": -79.938056,
+ "mfr": "Linc",
+ "latitude": 32.785278,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff0e": {
+ "basic": {
+ "name": "CLEVOH02",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff0e",
+ "longitude": -81.686943,
+ "mfr": "Linc",
+ "latitude": 41.498333,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff0f": {
+ "basic": {
+ "name": "CLMBOH11",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff0f",
+ "longitude": -82.996666,
+ "mfr": "Linc",
+ "latitude": 39.965279,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffff000008": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "MPLSMNDT-R",
+ "latitude": 44.9,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "96d57fb4eb43",
+ "longitude": -93.2
+ }
+ },
+ "of:0000ffffff000009": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "LSANCA03-R",
+ "latitude": 34.1,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "6ee9b704c04d",
+ "longitude": -118.3
+ }
+ },
+ "of:0000ffffffffff19": {
+ "basic": {
+ "name": "HSTNTX01",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff19",
+ "longitude": -95.36528,
+ "mfr": "Linc",
+ "latitude": 29.748333,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff18": {
+ "basic": {
+ "name": "HRFRCT03",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff18",
+ "longitude": -72.676389,
+ "mfr": "Linc",
+ "latitude": 41.765833,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff13": {
+ "basic": {
+ "name": "DNVRCOMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff13",
+ "longitude": -104.996391,
+ "mfr": "Linc",
+ "latitude": 39.744999,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffff000001": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "WASHDCSW-R",
+ "latitude": 38.8,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "2221b5cb5c45",
+ "longitude": -77.0
+ }
+ },
+ "of:0000ffffff000002": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "SNJSCA02-R",
+ "latitude": 37.3,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "f28c95ff6145",
+ "longitude": -121.8
+ }
+ },
+ "of:0000ffffffffff10": {
+ "basic": {
+ "name": "CMBRMA01",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff10",
+ "longitude": -71.084918,
+ "mfr": "Linc",
+ "latitude": 42.36745,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff17": {
+ "basic": {
+ "name": "GNBONCEU",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff17",
+ "longitude": -79.793889,
+ "mfr": "Linc",
+ "latitude": 36.072222,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffff000005": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "PHNXAZMA-R",
+ "latitude": 33.4,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "566c93367041",
+ "longitude": -112.0
+ }
+ },
+ "of:0000ffffffffff15": {
+ "basic": {
+ "name": "ELPSTXMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff15",
+ "longitude": -106.483611,
+ "mfr": "Linc",
+ "latitude": 31.756389,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff14": {
+ "basic": {
+ "name": "DTRTMIBA",
+ "optical.regens": 5,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff14",
+ "longitude": -83.054169,
+ "mfr": "Linc",
+ "latitude": 42.332779,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff12": {
+ "basic": {
+ "name": "DLLSTXTL",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff12",
+ "longitude": -96.780431,
+ "mfr": "Linc",
+ "latitude": 32.797524,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff11": {
+ "basic": {
+ "name": "CNCNOHWS",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff11",
+ "longitude": -84.516944,
+ "mfr": "Linc",
+ "latitude": 39.102778,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffff000003": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "SNANTXCA-R",
+ "latitude": 29.4,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "c6463e3da348",
+ "longitude": -98.4
+ }
+ },
+ "of:0000ffffffffff1c": {
+ "basic": {
+ "name": "LGISLAND",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff1c",
+ "longitude": -73.6699993,
+ "mfr": "Linc",
+ "latitude": 40.5899999,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffff000004": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "ROCHNYXA-R",
+ "latitude": 43.1,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "a2c8e539f440",
+ "longitude": -77.6
+ }
+ },
+ "of:0000ffffffffff1a": {
+ "basic": {
+ "name": "JCVLFLCL",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff1a",
+ "longitude": -81.43,
+ "mfr": "Linc",
+ "latitude": 30.33071,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff1f": {
+ "basic": {
+ "name": "LSVLKYCS",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff1f",
+ "longitude": -85.760833,
+ "mfr": "Linc",
+ "latitude": 38.249167,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff1e": {
+ "basic": {
+ "name": "LSVGNV02",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff1e",
+ "longitude": -115.138889,
+ "mfr": "Linc",
+ "latitude": 36.168056,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff16": {
+ "basic": {
+ "name": "FRSNCA01",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff16",
+ "longitude": -119.79423,
+ "mfr": "Linc",
+ "latitude": 36.73923,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff08": {
+ "basic": {
+ "name": "BRHMALMT",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff08",
+ "longitude": -86.812225,
+ "mfr": "Linc",
+ "latitude": 33.517223,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff09": {
+ "basic": {
+ "name": "BSMRNDJC",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff09",
+ "longitude": -100.796917,
+ "mfr": "Linc",
+ "latitude": 46.836379,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffff000006": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "ORLDFLMA-R",
+ "latitude": 28.5,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "bac54f68574f",
+ "longitude": -81.3
+ }
+ },
+ "of:0000ffffffffff01": {
+ "basic": {
+ "name": "ABLNTXRO",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff01",
+ "longitude": -99.741564,
+ "mfr": "Linc",
+ "latitude": 32.508086,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff02": {
+ "basic": {
+ "name": "ALBQNMMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff02",
+ "longitude": -106.649719,
+ "mfr": "Linc",
+ "latitude": 35.084446,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffff000007": {
+ "basic": {
+ "mfr": "Linc",
+ "name": "NWRKNJ02-R",
+ "latitude": 40.7,
+ "driver": "PK",
+ "type": "SWITCH",
+ "mac": "1237bde27347",
+ "longitude": -74.1
+ }
+ },
+ "of:0000ffffffffff04": {
+ "basic": {
+ "name": "ATLNGATL",
+ "optical.regens": 5,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff04",
+ "longitude": -97.743057,
+ "mfr": "Linc",
+ "latitude": 33.755833,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff05": {
+ "basic": {
+ "name": "BFLONYFR",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff05",
+ "longitude": -78.877778,
+ "mfr": "Linc",
+ "latitude": 42.882778,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff06": {
+ "basic": {
+ "name": "BLNGMTMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff06",
+ "longitude": -108.509167,
+ "mfr": "Linc",
+ "latitude": 45.781667,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff07": {
+ "basic": {
+ "name": "BLTMMDCH",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff07",
+ "longitude": -76.614127,
+ "mfr": "Linc",
+ "latitude": 39.293781,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff2b": {
+ "basic": {
+ "name": "OKLDCA03",
+ "optical.regens": 2,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff2b",
+ "longitude": -122.268889,
+ "mfr": "Linc",
+ "latitude": 37.805556,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff2c": {
+ "basic": {
+ "name": "OMAHNENW",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff2c",
+ "longitude": -95.940277,
+ "mfr": "Linc",
+ "latitude": 41.259167,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff2a": {
+ "basic": {
+ "name": "OKCYOKCE",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff2a",
+ "longitude": -97.515274,
+ "mfr": "Linc",
+ "latitude": 35.470833,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff2f": {
+ "basic": {
+ "name": "PHNXAZMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff2f",
+ "longitude": -112.07709,
+ "mfr": "Linc",
+ "latitude": 33.450361,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff2d": {
+ "basic": {
+ "name": "ORLDFLMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff2d",
+ "longitude": -81.377502,
+ "mfr": "Linc",
+ "latitude": 28.543279,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff2e": {
+ "basic": {
+ "name": "PHLAPASL",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff2e",
+ "longitude": -75.184139,
+ "mfr": "Linc",
+ "latitude": 39.946446,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff39": {
+ "basic": {
+ "name": "SNANTXCA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff39",
+ "longitude": -98.488892,
+ "mfr": "Linc",
+ "latitude": 29.429445,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff38": {
+ "basic": {
+ "name": "SLKCUTMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff38",
+ "longitude": -111.888336,
+ "mfr": "Linc",
+ "latitude": 40.767776,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff35": {
+ "basic": {
+ "name": "ROCHNYXA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff35",
+ "longitude": -77.616389,
+ "mfr": "Linc",
+ "latitude": 43.157222,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff34": {
+ "basic": {
+ "name": "RLGHNCMO",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff34",
+ "longitude": -78.640831,
+ "mfr": "Linc",
+ "latitude": 35.779656,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff37": {
+ "basic": {
+ "name": "SCTNPA01",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff37",
+ "longitude": -75.649167,
+ "mfr": "Linc",
+ "latitude": 41.415278,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff36": {
+ "basic": {
+ "name": "SCRMCA01",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff36",
+ "longitude": -121.487221,
+ "mfr": "Linc",
+ "latitude": 38.578609,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff31": {
+ "basic": {
+ "name": "PRVDRIGR",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff31",
+ "longitude": -71.415278,
+ "mfr": "Linc",
+ "latitude": 41.818889,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff30": {
+ "basic": {
+ "name": "PITBPADG",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff30",
+ "longitude": -79.995552,
+ "mfr": "Linc",
+ "latitude": 40.441387,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff33": {
+ "basic": {
+ "name": "RCMDVAGR",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff33",
+ "longitude": -77.436096,
+ "mfr": "Linc",
+ "latitude": 37.540752,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff32": {
+ "basic": {
+ "name": "PTLDOR62",
+ "optical.regens": 2,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff32",
+ "longitude": -122.678055,
+ "mfr": "Linc",
+ "latitude": 45.522499,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff22": {
+ "basic": {
+ "name": "MILWWIHE",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff22",
+ "longitude": -87.922501,
+ "mfr": "Linc",
+ "latitude": 43.037224,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff23": {
+ "basic": {
+ "name": "MMPHTNMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff23",
+ "longitude": -90.048058,
+ "mfr": "Linc",
+ "latitude": 35.145158,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff20": {
+ "basic": {
+ "name": "LTRKARFR",
+ "optical.regens": 2,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff20",
+ "longitude": -92.271942,
+ "mfr": "Linc",
+ "latitude": 34.740833,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff21": {
+ "basic": {
+ "name": "MIAMFLAC",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff21",
+ "longitude": -80.195,
+ "mfr": "Linc",
+ "latitude": 25.779167,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff26": {
+ "basic": {
+ "name": "NSVLTNMT",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff26",
+ "longitude": -86.775558,
+ "mfr": "Linc",
+ "latitude": 36.163955,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff27": {
+ "basic": {
+ "name": "NWORLAMA",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff27",
+ "longitude": -90.07222,
+ "mfr": "Linc",
+ "latitude": 29.949806,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff24": {
+ "basic": {
+ "name": "MPLSMNDT",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff24",
+ "longitude": -93.26718,
+ "mfr": "Linc",
+ "latitude": 44.977365,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff25": {
+ "basic": {
+ "name": "NRFLVABS",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff25",
+ "longitude": -76.29,
+ "mfr": "Linc",
+ "latitude": 36.853333,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff28": {
+ "basic": {
+ "name": "NWRKNJ02",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff28",
+ "longitude": -74.177978,
+ "mfr": "Linc",
+ "latitude": 40.734408,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff29": {
+ "basic": {
+ "name": "NYCMNY54",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff29",
+ "longitude": -73.989713,
+ "mfr": "Linc",
+ "latitude": 40.767497,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff3e": {
+ "basic": {
+ "name": "SPFDILSD",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff3e",
+ "longitude": -89.649444,
+ "mfr": "Linc",
+ "latitude": 39.795278,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff3d": {
+ "basic": {
+ "name": "SNJSCA02",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff3d",
+ "longitude": -121.892778,
+ "mfr": "Linc",
+ "latitude": 37.333333,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff3f": {
+ "basic": {
+ "name": "SPKNWA01",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff3f",
+ "longitude": -117.419167,
+ "mfr": "Linc",
+ "latitude": 47.654724,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff3a": {
+ "basic": {
+ "name": "SNBBCA01",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff3a",
+ "longitude": -119.7,
+ "mfr": "Linc",
+ "latitude": 34.418889,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff3c": {
+ "basic": {
+ "name": "SNFCCA21",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff3c",
+ "longitude": -122.397263,
+ "mfr": "Linc",
+ "latitude": 37.785143,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff3b": {
+ "basic": {
+ "name": "SNDGCA02",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff3b",
+ "longitude": -117.158611,
+ "mfr": "Linc",
+ "latitude": 32.746944,
+ "type": "ROADM"
+ }
+ },
+ "of:0000ffffffffff1b": {
+ "basic": {
+ "name": "KSCYMO09",
+ "optical.regens": 0,
+ "driver": "LINC-OE",
+ "mac": "ffffffffffff1b",
+ "longitude": -94.578716,
+ "mfr": "Linc",
+ "latitude": 39.096649,
+ "type": "ROADM"
+ }
+ }
+ },
+ "links": {
+ "of:0000ffffff000006/6-of:0000ffffffffff2d/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff1b/101-of:0000ffffffffff2c/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 320
+ }
+ },
+ "of:0000ffffffffff1f/102-of:0000ffffffffff40/108": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 468
+ }
+ },
+ "of:0000ffffff000001/4-of:0000ffffffffff48/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff0f/101-of:0000ffffffffff30/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 312
+ }
+ },
+ "of:0000ffffffffff06/103-of:0000ffffffffff3f/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 852
+ }
+ },
+ "of:0000ffffffffff30/101-of:0000ffffffffff37/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 457
+ }
+ },
+ "of:0000ffffffffff02/103-of:0000ffffffffff1e/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 931
+ }
+ },
+ "of:0000ffffff00000a/6-of:0000ffffffffff12/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff12/102-of:0000ffffffffff20/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 563
+ }
+ },
+ "of:0000ffffff000003/5-of:0000ffffffffff39/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000005/3-of:0000ffffffffff2f/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff05/103-of:0000ffffffffff0e/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 333
+ }
+ },
+ "of:0000ffffffffff22/101-of:0000ffffffffff24/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 574
+ }
+ },
+ "of:0000ffffffffff0a/102-of:0000ffffffffff27/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 144
+ }
+ },
+ "of:0000ffffffffff02/100-of:0000ffffffffff12/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 1134
+ }
+ },
+ "of:0000ffffffffff04/102-of:0000ffffffffff0c/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 436
+ }
+ },
+ "of:0000ffffff00000a/4-of:0000ffffffffff12/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff2d/101-of:0000ffffffffff4a/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 290
+ }
+ },
+ "of:0000ffffffffff13/101-of:0000ffffffffff2c/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 940
+ }
+ },
+ "of:0000ffffff000008/2-of:0000ffffffffff24/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000007/6-of:0000ffffffffff28/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000008/3-of:0000ffffffffff24/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff14/101-of:0000ffffffffff46/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 103
+ }
+ },
+ "of:0000ffffff000002/3-of:0000ffffffffff3d/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000009/3-of:0000ffffffffff1d/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff11/103-of:0000ffffffffff48/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 779
+ }
+ },
+ "of:0000ffffff000002/5-of:0000ffffffffff3d/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff1b/103-of:0000ffffffffff47/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 420
+ }
+ },
+ "of:0000ffffffffff0d/101-of:0000ffffffffff1a/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 368
+ }
+ },
+ "of:0000ffffff000009/4-of:0000ffffffffff1d/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff28/101-of:0000ffffffffff2e/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 146
+ }
+ },
+ "of:0000ffffffffff1f/104-of:0000ffffffffff26/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 298
+ }
+ },
+ "of:0000ffffffffff0e/102-of:0000ffffffffff46/101": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 185
+ }
+ },
+ "of:0000ffffff000005/4-of:0000ffffffffff2f/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff0c/101-of:0000ffffffffff17/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 160
+ }
+ },
+ "of:0000ffffffffff18/101-of:0000ffffffffff1c/108": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 185
+ }
+ },
+ "of:0000ffffffffff06/101-of:0000ffffffffff09/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 724
+ }
+ },
+ "of:0000ffffff000009/5-of:0000ffffffffff1d/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff17/101-of:0000ffffffffff1f/108": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 697
+ }
+ },
+ "of:0000ffffffffff16/102-of:0000ffffffffff1d/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 396
+ }
+ },
+ "of:0000ffffff00000a/2-of:0000ffffffffff12/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff1c/101-of:0000ffffffffff29/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 40
+ }
+ },
+ "of:0000ffffff000006/4-of:0000ffffffffff2d/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff08/102-of:0000ffffffffff27/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 602
+ }
+ },
+ "of:0000ffffffffff1d/102-of:0000ffffffffff3a/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 167
+ }
+ },
+ "of:0000ffffff00000a/5-of:0000ffffffffff12/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000001/3-of:0000ffffffffff48/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff01/100-of:0000ffffffffff12/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 334
+ }
+ },
+ "of:0000ffffffffff1a/101-of:0000ffffffffff2d/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 238
+ }
+ },
+ "of:0000ffffff000004/6-of:0000ffffffffff35/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff1e/102-of:0000ffffffffff38/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 701
+ }
+ },
+ "of:0000ffffff000008/6-of:0000ffffffffff24/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000004/4-of:0000ffffffffff35/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000002/2-of:0000ffffffffff3d/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff03/101-of:0000ffffffffff42/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 239
+ }
+ },
+ "of:0000ffffffffff2e/101-of:0000ffffffffff37/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 201
+ }
+ },
+ "of:0000ffffffffff13/102-of:0000ffffffffff38/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 714
+ }
+ },
+ "of:0000ffffffffff07/101-of:0000ffffffffff2e/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 170
+ }
+ },
+ "of:0000ffffffffff16/103-of:0000ffffffffff2a/108": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 298
+ }
+ },
+ "of:0000ffffffffff3e/101-of:0000ffffffffff40/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 165
+ }
+ },
+ "of:0000ffffffffff02/101-of:0000ffffffffff13/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 646
+ }
+ },
+ "of:0000ffffff000002/6-of:0000ffffffffff3d/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000007/5-of:0000ffffffffff28/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000002/4-of:0000ffffffffff3d/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff01/101-of:0000ffffffffff15/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 768
+ }
+ },
+ "of:0000ffffff000006/2-of:0000ffffffffff2d/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff04/103-of:0000ffffffffff1a/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 566
+ }
+ },
+ "of:0000ffffffffff0e/101-of:0000ffffffffff0f/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 243
+ }
+ },
+ "of:0000ffffff000003/4-of:0000ffffffffff39/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000009/2-of:0000ffffffffff1d/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff18/102-of:0000ffffffffff31/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 125
+ }
+ },
+ "of:0000ffffff000001/5-of:0000ffffffffff48/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff11/102-of:0000ffffffffff1f/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 172
+ }
+ },
+ "of:0000ffffff00000b/6-of:0000ffffffffff04/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff29/101-of:0000ffffffffff28/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 19
+ }
+ },
+ "of:0000ffffffffff12/101-of:0000ffffffffff19/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 437
+ }
+ },
+ "of:0000ffffffffff3d/101-of:0000ffffffffff3a/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 455
+ }
+ },
+ "of:0000ffffffffff2b/103-of:0000ffffffffff3c/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 13
+ }
+ },
+ "of:0000ffffffffff4b/101-of:0000ffffffffff19/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 283
+ }
+ },
+ "of:0000ffffffffff32/101-of:0000ffffffffff36/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 934
+ }
+ },
+ "of:0000ffffffffff12/103-of:0000ffffffffff2a/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 365
+ }
+ },
+ "of:0000ffffffffff0d/102-of:0000ffffffffff34/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 424
+ }
+ },
+ "of:0000ffffffffff29/103-of:0000ffffffffff49/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 210
+ }
+ },
+ "of:0000ffffffffff10/101-of:0000ffffffffff31/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 80
+ }
+ },
+ "of:0000ffffffffff1d/101-of:0000ffffffffff3b/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 212
+ }
+ },
+ "of:0000ffffffffff29/102-of:0000ffffffffff37/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 187
+ }
+ },
+ "of:0000ffffff00000a/3-of:0000ffffffffff12/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff15/101-of:0000ffffffffff39/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 969
+ }
+ },
+ "of:0000ffffff000003/6-of:0000ffffffffff39/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff1e/101-of:0000ffffffffff2f/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 494
+ }
+ },
+ "of:0000ffffffffff1b/102-of:0000ffffffffff40/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 457
+ }
+ },
+ "of:0000ffffff000001/2-of:0000ffffffffff48/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff21/102-of:0000ffffffffff4a/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 125
+ }
+ },
+ "of:0000ffffff000003/3-of:0000ffffffffff39/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff15/102-of:0000ffffffffff44/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 511
+ }
+ },
+ "of:0000ffffff000005/2-of:0000ffffffffff2f/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff2b/102-of:0000ffffffffff38/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 1142
+ }
+ },
+ "of:0000ffffffffff0b/101-of:0000ffffffffff14/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 458
+ }
+ },
+ "of:0000ffffffffff45/101-of:0000ffffffffff43/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 384
+ }
+ },
+ "of:0000ffffffffff32/102-of:0000ffffffffff38/108": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 1225
+ }
+ },
+ "of:0000ffffffffff24/101-of:0000ffffffffff2c/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 560
+ }
+ },
+ "of:0000ffffff000006/3-of:0000ffffffffff2d/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff3c/101-of:0000ffffffffff3d/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 80.0
+ }
+ },
+ "of:0000ffffffffff21/101-of:0000ffffffffff43/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 407
+ }
+ },
+ "of:0000ffffff000008/5-of:0000ffffffffff24/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000005/6-of:0000ffffffffff2f/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff2f/102-of:0000ffffffffff44/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 205
+ }
+ },
+ "of:0000ffffff000007/3-of:0000ffffffffff28/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff0a/101-of:0000ffffffffff19/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 491
+ }
+ },
+ "of:0000ffffffffff41/101-of:0000ffffffffff3f/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 442
+ }
+ },
+ "of:0000ffffffffff33/101-of:0000ffffffffff48/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 184
+ }
+ },
+ "of:0000ffffff000004/3-of:0000ffffffffff35/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff2f/101-of:0000ffffffffff3b/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 575
+ }
+ },
+ "of:0000ffffff000006/5-of:0000ffffffffff2d/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff00000b/3-of:0000ffffffffff04/11": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000009/6-of:0000ffffffffff1d/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000007/2-of:0000ffffffffff28/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff17/103-of:0000ffffffffff33/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 319
+ }
+ },
+ "of:0000ffffffffff16/101-of:0000ffffffffff1f/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 505
+ }
+ },
+ "of:0000ffffffffff17/102-of:0000ffffffffff34/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 130
+ }
+ },
+ "of:0000ffffffffff2b/101-of:0000ffffffffff36/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 131
+ }
+ },
+ "of:0000ffffffffff03/100-of:0000ffffffffff10/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 265
+ }
+ },
+ "of:0000ffffffffff04/101-of:0000ffffffffff08/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 271
+ }
+ },
+ "of:0000ffffffffff07/103-of:0000ffffffffff46/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 68
+ }
+ },
+ "of:0000ffffffffff0b/102-of:0000ffffffffff22/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 156
+ }
+ },
+ "of:0000ffffffffff20/101-of:0000ffffffffff23/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 249
+ }
+ },
+ "of:0000ffffff00000b/2-of:0000ffffffffff04/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff25/102-of:0000ffffffffff49/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 392
+ }
+ },
+ "of:0000ffffffffff09/101-of:0000ffffffffff24/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 741
+ }
+ },
+ "of:0000ffffffffff2a/101-of:0000ffffffffff47/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 188
+ }
+ },
+ "of:0000ffffff000003/2-of:0000ffffffffff39/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff11/101-of:0000ffffffffff0f/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 194
+ }
+ },
+ "of:0000ffffffffff35/101-of:0000ffffffffff42/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 143
+ }
+ },
+ "of:0000ffffff000005/5-of:0000ffffffffff2f/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff00000b/5-of:0000ffffffffff04/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff25/101-of:0000ffffffffff34/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 290
+ }
+ },
+ "of:0000ffffffffff32/103-of:0000ffffffffff41/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 280
+ }
+ },
+ "of:0000ffffff000008/4-of:0000ffffffffff24/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff02/102-of:0000ffffffffff15/107": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 444
+ }
+ },
+ "of:0000ffffffffff0b/103-of:0000ffffffffff3e/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 344
+ }
+ },
+ "of:0000ffffffffff07/102-of:0000ffffffffff30/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 378
+ }
+ },
+ "of:0000ffffffffff4b/102-of:0000ffffffffff39/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 141
+ }
+ },
+ "of:0000ffffffffff23/101-of:0000ffffffffff26/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 380
+ }
+ },
+ "of:0000ffffff00000b/4-of:0000ffffffffff04/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff08/101-of:0000ffffffffff26/106": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 353
+ }
+ },
+ "of:0000ffffffffff27/101-of:0000ffffffffff45/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 670
+ }
+ },
+ "of:0000ffffff000004/2-of:0000ffffffffff35/10": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000001/6-of:0000ffffffffff48/14": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff05/104-of:0000ffffffffff35/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 128
+ }
+ },
+ "of:0000ffffffffff37/101-of:0000ffffffffff42/105": {
+ "basic": {
+ "optical.waves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 223
+ }
+ },
+ "of:0000ffffff000004/5-of:0000ffffffffff35/13": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffff000007/4-of:0000ffffffffff28/12": {
+ "basic": {
+ "bandwidth": 100000,
+ "type": "OPTICAL",
+ "durable": "true",
+ "optical.type": "cross-connect"
+ }
+ },
+ "of:0000ffffffffff06/102-of:0000ffffffffff13/107": {
+ "basic": {
+ "optical.wves": 80,
+ "durable": "true",
+ "type": "OPTICAL",
+ "optical.type": "WDM",
+ "optical.kms": 875
+ }
+ }
+ },
+ "ports": {
+ "of:0000ffffffffff27/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff3b/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff3b/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffff00000b/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffffffff32/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff22/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff4b/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff22/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff2f/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff03/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff03/100": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 100
+ }
+ },
+ "of:0000ffffffffff38/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff32/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff38/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff38/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff38/108": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 108
+ }
+ },
+ "of:0000ffffffffff1e/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffff000008/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffffffff3d/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff3d/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffffffff1e/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff3d/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff3f/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff1e/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff42/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff42/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff42/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff41/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff39/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff39/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff35/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffff000009/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffffffff49/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff49/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff2f/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff24/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff46/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff27/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff43/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff43/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff35/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff04/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffffffff04/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff04/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff04/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff36/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff36/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff04/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff35/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff28/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff17/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff17/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff17/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff47/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff47/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff17/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff20/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff14/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffff000005/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffffffff1d/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff1d/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffffffff14/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff1d/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff18/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff18/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff35/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff2b/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff2b/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff2a/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff39/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffff000006/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffff000006/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffffffff1d/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff39/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff16/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff16/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff16/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff15/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff15/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff15/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff15/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff48/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffff00000a/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffff00000a/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffffffff3c/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff3c/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff23/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff04/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff04/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff04/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff23/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff1c/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff33/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff07/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff07/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff07/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff3d/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff40/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff2e/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff2e/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff35/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff2e/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff3a/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff2d/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff2d/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff2d/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff2d/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffffffff2d/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff05/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff05/104": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 104
+ }
+ },
+ "of:0000ffffffffff24/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff13/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff13/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff06/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff13/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff13/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff06/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffff000007/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffff000007/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffffffff48/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff44/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff44/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff35/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffffffff46/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff46/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff31/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff31/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff12/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff12/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff2d/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff12/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff32/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff12/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff12/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff0d/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff0d/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff48/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff19/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff19/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff19/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff29/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff29/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff29/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff28/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff0a/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff29/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff35/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff0a/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff30/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffff000004/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffffffff39/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff39/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff30/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff30/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff39/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff12/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff12/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff12/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff12/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffffffff12/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff1d/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff33/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff2c/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff48/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff2c/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff2c/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff2d/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff28/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff28/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff28/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffffffff28/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff28/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff45/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff3d/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff45/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffff000004/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffff000004/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffffffff01/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff01/100": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 100
+ }
+ },
+ "of:0000ffffff000001/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffff000005/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffff000005/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffffffff27/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffff000007/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffffffff1b/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff1b/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff1b/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff24/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff2b/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff06/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff11/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff11/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff11/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff24/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffff000002/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffffffff08/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff2a/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff24/12": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 12
+ }
+ },
+ "of:0000ffffffffff08/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff08/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff0b/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff0b/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff0c/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff0b/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff0c/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff26/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff26/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff2f/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffff00000a/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffffffff2f/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff2f/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff1c/108": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 108
+ }
+ },
+ "of:0000ffffffffff2f/14": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 14
+ }
+ },
+ "of:0000ffffffffff34/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff34/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff34/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff4a/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff4a/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff09/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff2a/108": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 108
+ }
+ },
+ "of:0000ffffffffff09/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffff000002/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffffffff1d/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff1d/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff1d/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffff000006/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffff000002/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffff000001/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffffffff02/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff02/103": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 103
+ }
+ },
+ "of:0000ffffffffff02/100": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 100
+ }
+ },
+ "of:0000ffffffffff02/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff2f/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff26/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff0e/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff0e/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff4b/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff0e/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffff000008/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffffffff1a/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff1a/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffff000009/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffffffff1a/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff24/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffff000009/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffffffff24/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffff000008/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffffffff24/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffff000001/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffff00000b/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffff00000b/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffffffff2f/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff3a/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff3d/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffff000003/7": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 7
+ }
+ },
+ "of:0000ffffffffff48/11": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 11
+ }
+ },
+ "of:0000ffffffffff48/10": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 10
+ }
+ },
+ "of:0000ffffffffff3d/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff20/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff41/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff25/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff25/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff1f/108": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 108
+ }
+ },
+ "of:0000ffffffffff10/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff37/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff37/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff37/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ },
+ "of:0000ffffffffff10/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff37/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffff000003/8": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 8
+ }
+ },
+ "of:0000ffffff000003/9": {
+ "optical": {
+ "speed": 0,
+ "type": "COPPER",
+ "port": 9
+ }
+ },
+ "of:0000ffffffffff1f/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff1f/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff1f/104": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 104
+ }
+ },
+ "of:0000ffffffffff1f/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff0f/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff3e/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff0f/105": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 105
+ }
+ },
+ "of:0000ffffffffff48/13": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 13
+ }
+ },
+ "of:0000ffffffffff3e/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff40/106": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 106
+ }
+ },
+ "of:0000ffffffffff0f/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff40/108": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 108
+ }
+ },
+ "of:0000ffffffffff21/102": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 102
+ }
+ },
+ "of:0000ffffffffff21/101": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 101
+ }
+ },
+ "of:0000ffffffffff3f/107": {
+ "optical": {
+ "type": "FIBER",
+ "speed": 0,
+ "port": 107
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/TestON/tests/FUNC/FUNCoptical/__init__.py b/TestON/tests/FUNC/FUNCoptical/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/__init__.py
diff --git a/TestON/tests/FUNC/FUNCoptical/dependencies/FuncIntentFunction.py b/TestON/tests/FUNC/FUNCoptical/dependencies/FuncIntentFunction.py
new file mode 100644
index 0000000..377fd20
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/dependencies/FuncIntentFunction.py
@@ -0,0 +1,1631 @@
+"""
+ Wrapper functions for FuncIntent
+ This functions include Onosclidriver and Mininetclidriver driver functions
+ Author: kelvin@onlab.us
+"""
+import time
+import copy
+import json
+
+def __init__( self ):
+ self.default = ''
+
+def hostIntent( main,
+ name,
+ host1,
+ host2,
+ onosNode=0,
+ host1Id="",
+ host2Id="",
+ mac1="",
+ mac2="",
+ vlan1="-1",
+ vlan2="-1",
+ sw1="",
+ sw2="",
+ expectedLink=0 ):
+ """
+ Description:
+ Verify add-host-intent
+ Steps:
+ - Discover hosts
+ - Add host intents
+ - Check intents
+ - Verify flows
+ - Ping hosts
+ - Reroute
+ - Link down
+ - Verify flows
+ - Check topology
+ - Ping hosts
+ - Link up
+ - Verify flows
+ - Check topology
+ - Ping hosts
+ - Remove intents
+ Required:
+ name - Type of host intent to add eg. IPV4 | VLAN | Dualstack
+ host1 - Name of first host
+ host2 - Name of second host
+ Optional:
+ onosNode - ONOS node to install the intents in main.CLIs[ ]
+ 0 by default so that it will always use the first
+ ONOS node
+ host1Id - ONOS id of the first host eg. 00:00:00:00:00:01/-1
+ host2Id - ONOS id of the second host
+ mac1 - Mac address of first host
+ mac2 - Mac address of the second host
+ vlan1 - Vlan tag of first host, defaults to -1
+ vlan2 - Vlan tag of second host, defaults to -1
+ sw1 - First switch to bring down & up for rerouting purpose
+ sw2 - Second switch to bring down & up for rerouting purpose
+ expectedLink - Expected link when the switches are down, it should
+ be two links lower than the links before the two
+ switches are down
+ Return:
+ Returns main.TRUE if all verification passed, otherwise return
+ main.FALSE; returns main.FALSE if there is a key error
+ """
+
+ # Assert variables
+ assert main, "There is no main variable"
+ assert name, "variable name is empty"
+ assert host1 and host2, "You must specify hosts"
+
+ global itemName
+ itemName = name
+ h1Id = host1Id
+ h2Id = host2Id
+ h1Mac = mac1
+ h2Mac = mac2
+ vlan1 = vlan1
+ vlan2 = vlan2
+ hostNames = [ host1 , host2 ]
+ intentsId = []
+ stepResult = main.TRUE
+ pingResult = main.TRUE
+ intentResult = main.TRUE
+ removeIntentResult = main.TRUE
+ flowResult = main.TRUE
+ topoResult = main.TRUE
+ linkDownResult = main.TRUE
+ linkUpResult = main.TRUE
+ onosNode = int( onosNode )
+
+ try:
+ if main.hostsData:
+ if not h1Mac:
+ h1Mac = main.hostsData[ host1 ][ 'mac' ]
+ if not h2Mac:
+ h2Mac = main.hostsData[ host2 ][ 'mac' ]
+ if main.hostsData[ host1 ].get( 'vlan' ):
+ vlan1 = main.hostsData[ host1 ][ 'vlan' ]
+ if main.hostsData[ host1 ].get( 'vlan' ):
+ vlan2 = main.hostsData[ host2 ][ 'vlan' ]
+ if not h1Id:
+ h1Id = main.hostsData[ host1 ][ 'id' ]
+ if not h2Id:
+ h2Id = main.hostsData[ host2 ][ 'id' ]
+
+ assert h1Id and h2Id, "You must specify host IDs"
+ if not ( h1Id and h2Id ):
+ main.log.info( "There are no host IDs" )
+ return main.FALSE
+
+ except KeyError:
+ main.log.error( itemName + ": Key error Exception" )
+ return main.FALSE
+
+ # Discover hosts using arping incase pingall discovery failed
+ main.log.info( itemName + ": Discover host using arping" )
+ main.Mininet1.arping( srcHost=host1, dstHost=host2 )
+ main.Mininet1.arping( srcHost=host2, dstHost=host1 )
+ host1 = main.CLIs[ 0 ].getHost( mac=h1Mac )
+ host2 = main.CLIs[ 0 ].getHost( mac=h2Mac )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+
+ # Adding host intents
+ main.log.info( itemName + ": Adding host intents" )
+ intent1 = main.CLIs[ onosNode ].addHostIntent( hostIdOne=h1Id,
+ hostIdTwo=h2Id )
+ intentsId.append( intent1 )
+
+ # Check intents state
+ time.sleep( main.checkIntentSleep )
+ intentResult = checkIntentState( main, intentsId )
+ checkFlowsCount( main )
+
+ # Check intents state again if first check fails...
+ if not intentResult:
+ intentResult = checkIntentState( main, intentsId )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Ping hosts
+ firstPingResult = pingallHosts( main, hostNames )
+ if not firstPingResult:
+ main.log.debug( "First ping failed, there must be" +
+ " something wrong with ONOS performance" )
+
+ # Ping hosts again...
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+ if pingTemp:
+ main.assertReturnString += 'Initial Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Initial Pingall Failed\n'
+
+ # Test rerouting if these variables exist
+ if sw1 and sw2 and expectedLink:
+ # Link down
+ linkDownResult = link( main, sw1, sw2, "down" )
+
+ if linkDownResult:
+ main.assertReturnString += 'Link Down Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Failed\n'
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Check OnosTopology
+ topoResult = checkTopology( main, expectedLink )
+ if topoResult:
+ main.assertReturnString += 'Link Down Topology State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Topology State Failed\n'
+
+ # Ping hosts
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+
+ if pingTemp:
+ main.assertReturnString += 'Link Down Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Pingall Failed\n'
+
+ # Check intent states
+ intentTemp = checkIntentState( main, intentsId )
+ intentResult = intentResult and intentTemp
+ if intentTemp:
+ main.assertReturnString += 'Link Down Intent State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Intent State Failed\n'
+
+ # Checks ONOS state in link down
+ if linkDownResult and topoResult and pingResult and intentResult:
+ main.log.info( itemName + ": Successfully brought link down" )
+ else:
+ main.log.error( itemName + ": Failed to bring link down" )
+
+ # Link up
+ linkUpResult = link( main, sw1, sw2, "up" )
+ time.sleep( main.rerouteSleep )
+
+ if linkUpResult:
+ main.assertReturnString += 'Link Up Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Failed\n'
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Check OnosTopology
+ topoResult = checkTopology( main, main.numLinks )
+
+ if topoResult:
+ main.assertReturnString += 'Link Up Topology State Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Topology State Failed\n'
+
+ # Ping hosts
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+
+ if pingTemp:
+ main.assertReturnString += 'Link Up Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Pingall Failed\n'
+
+ intentTemp = checkIntentState( main, intentsId )
+ intentResult = intentResult and intentTemp
+ if intentTemp:
+ main.assertReturnString += 'Link Up Intent State Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Intent State Failed\n'
+
+ # Checks ONOS state in link up
+ if linkUpResult and topoResult and pingResult and intentResult:
+ main.log.info( itemName + ": Successfully brought link back up" )
+ else:
+ main.log.error( itemName + ": Failed to bring link back up" )
+
+ # Remove all intents
+ removeIntentResult = removeAllIntents( main, intentsId )
+
+ if removeIntentResult:
+ main.assertReturnString += 'Remove Intents Passed'
+ else:
+ main.assertReturnString += 'Remove Intents Failed'
+
+ stepResult = pingResult and linkDownResult and linkUpResult \
+ and intentResult and removeIntentResult
+
+ return stepResult
+
+def pointIntent( main,
+ name,
+ host1,
+ host2,
+ onosNode=0,
+ deviceId1="",
+ deviceId2="",
+ port1="",
+ port2="",
+ ethType="",
+ mac1="",
+ mac2="",
+ bandwidth="",
+ lambdaAlloc=False,
+ ipProto="",
+ ip1="",
+ ip2="",
+ tcp1="",
+ tcp2="",
+ sw1="",
+ sw2="",
+ expectedLink=0 ):
+
+ """
+ Description:
+ Verify add-point-intent
+ Steps:
+ - Get device ids | ports
+ - Add point intents
+ - Check intents
+ - Verify flows
+ - Ping hosts
+ - Reroute
+ - Link down
+ - Verify flows
+ - Check topology
+ - Ping hosts
+ - Link up
+ - Verify flows
+ - Check topology
+ - Ping hosts
+ - Remove intents
+ Required:
+ name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+ host1 - Name of first host
+ host2 - Name of second host
+ Optional:
+ onosNode - ONOS node to install the intents in main.CLIs[ ]
+ 0 by default so that it will always use the first
+ ONOS node
+ deviceId1 - ONOS device id of the first switch, the same as the
+ location of the first host eg. of:0000000000000001/1,
+ located at device 1 port 1
+ deviceId2 - ONOS device id of the second switch
+ port1 - The port number where the first host is attached
+ port2 - The port number where the second host is attached
+ ethType - Ethernet type eg. IPV4, IPV6
+ mac1 - Mac address of first host
+ mac2 - Mac address of the second host
+ bandwidth - Bandwidth capacity
+ lambdaAlloc - Allocate lambda, defaults to False
+ ipProto - IP protocol
+ ip1 - IP address of first host
+ ip2 - IP address of second host
+ tcp1 - TCP port of first host
+ tcp2 - TCP port of second host
+ sw1 - First switch to bring down & up for rerouting purpose
+ sw2 - Second switch to bring down & up for rerouting purpose
+ expectedLink - Expected link when the switches are down, it should
+ be two links lower than the links before the two
+ switches are down
+ """
+
+ assert main, "There is no main variable"
+ assert name, "variable name is empty"
+ assert host1 and host2, "You must specify hosts"
+
+ global itemName
+ itemName = name
+ host1 = host1
+ host2 = host2
+ hostNames = [ host1, host2 ]
+ intentsId = []
+
+ pingResult = main.TRUE
+ intentResult = main.TRUE
+ removeIntentResult = main.TRUE
+ flowResult = main.TRUE
+ topoResult = main.TRUE
+ linkDownResult = main.TRUE
+ linkUpResult = main.TRUE
+ onosNode = int( onosNode )
+
+ # Adding bidirectional point intents
+ main.log.info( itemName + ": Adding point intents" )
+ intent1 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+ egressDevice=deviceId2,
+ portIngress=port1,
+ portEgress=port2,
+ ethType=ethType,
+ ethSrc=mac1,
+ ethDst=mac2,
+ bandwidth=bandwidth,
+ lambdaAlloc=lambdaAlloc,
+ ipProto=ipProto,
+ ipSrc=ip1,
+ ipDst=ip2,
+ tcpSrc=tcp1,
+ tcpDst=tcp2 )
+
+ intentsId.append( intent1 )
+ intent2 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+ egressDevice=deviceId1,
+ portIngress=port2,
+ portEgress=port1,
+ ethType=ethType,
+ ethSrc=mac2,
+ ethDst=mac1,
+ bandwidth=bandwidth,
+ lambdaAlloc=lambdaAlloc,
+ ipProto=ipProto,
+ ipSrc=ip2,
+ ipDst=ip1,
+ tcpSrc=tcp2,
+ tcpDst=tcp1 )
+ intentsId.append( intent2 )
+
+ # Check intents state
+ time.sleep( main.checkIntentSleep )
+ intentResult = checkIntentState( main, intentsId )
+ # Check flows count in each node
+ checkFlowsCount( main )
+
+ # Check intents state again if first check fails...
+ if not intentResult:
+ intentResult = checkIntentState( main, intentsId )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Ping hosts
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+ if pingTemp:
+ main.assertReturnString += 'Initial Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Initial Pingall Failed\n'
+
+ # Test rerouting if these variables exist
+ if sw1 and sw2 and expectedLink:
+ # link down
+ linkDownResult = link( main, sw1, sw2, "down" )
+
+ if linkDownResult:
+ main.assertReturnString += 'Link Down Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Failed\n'
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Check OnosTopology
+ topoResult = checkTopology( main, expectedLink )
+ if topoResult:
+ main.assertReturnString += 'Link Down Topology State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Topology State Failed\n'
+
+ # Ping hosts
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+ if pingTemp:
+ main.assertReturnString += 'Link Down Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Pingall Failed\n'
+
+ # Check intent state
+ intentTemp = checkIntentState( main, intentsId )
+ intentResult = intentResult and intentTemp
+ if intentTemp:
+ main.assertReturnString += 'Link Down Intent State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Intent State Failed\n'
+
+ # Checks ONOS state in link down
+ if linkDownResult and topoResult and pingResult and intentResult:
+ main.log.info( itemName + ": Successfully brought link down" )
+ else:
+ main.log.error( itemName + ": Failed to bring link down" )
+
+ # link up
+ linkUpResult = link( main, sw1, sw2, "up" )
+ if linkUpResult:
+ main.assertReturnString += 'Link Up Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Failed\n'
+
+ time.sleep( main.rerouteSleep )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Check OnosTopology
+ topoResult = checkTopology( main, main.numLinks )
+ if topoResult:
+ main.assertReturnString += 'Link Up Topology State Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Topology State Failed\n'
+
+ # Ping hosts
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+
+ if pingTemp:
+ main.assertReturnString += 'Link Up Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Pingall Failed\n'
+
+ intentTemp = checkIntentState( main, intentsId )
+ intentResult = intentResult and intentTemp
+ if intentTemp:
+ main.assertReturnString += 'Link Up Intent State Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Intent State Failed\n'
+
+ # Checks ONOS state in link up
+ if linkUpResult and topoResult and pingResult and intentResult:
+ main.log.info( itemName + ": Successfully brought link back up" )
+ else:
+ main.log.error( itemName + ": Failed to bring link back up" )
+
+ # Remove all intents
+ removeIntentResult = removeAllIntents( main, intentsId )
+ if removeIntentResult:
+ main.assertReturnString += 'Remove Intents Passed'
+ else:
+ main.assertReturnString += 'Remove Intents Failed'
+
+ stepResult = pingResult and linkDownResult and linkUpResult \
+ and intentResult and removeIntentResult
+
+ return stepResult
+
+def pointIntentTcp( main,
+ name,
+ host1,
+ host2,
+ onosNode=0,
+ deviceId1="",
+ deviceId2="",
+ port1="",
+ port2="",
+ ethType="",
+ mac1="",
+ mac2="",
+ bandwidth="",
+ lambdaAlloc=False,
+ ipProto="",
+ ip1="",
+ ip2="",
+ tcp1="",
+ tcp2="",
+ sw1="",
+ sw2="",
+ expectedLink=0 ):
+
+ """
+ Description:
+ Verify add-point-intent only for TCP
+ Steps:
+ - Get device ids | ports
+ - Add point intents
+ - Check intents
+ - Verify flows
+ - Ping hosts
+ - Reroute
+ - Link down
+ - Verify flows
+ - Check topology
+ - Ping hosts
+ - Link up
+ - Verify flows
+ - Check topology
+ - Ping hosts
+ - Remove intents
+ Required:
+ name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+ host1 - Name of first host
+ host2 - Name of second host
+ Optional:
+ onosNode - ONOS node to install the intents in main.CLIs[ ]
+ 0 by default so that it will always use the first
+ ONOS node
+ deviceId1 - ONOS device id of the first switch, the same as the
+ location of the first host eg. of:0000000000000001/1,
+ located at device 1 port 1
+ deviceId2 - ONOS device id of the second switch
+ port1 - The port number where the first host is attached
+ port2 - The port number where the second host is attached
+ ethType - Ethernet type eg. IPV4, IPV6
+ mac1 - Mac address of first host
+ mac2 - Mac address of the second host
+ bandwidth - Bandwidth capacity
+ lambdaAlloc - Allocate lambda, defaults to False
+ ipProto - IP protocol
+ ip1 - IP address of first host
+ ip2 - IP address of second host
+ tcp1 - TCP port of first host
+ tcp2 - TCP port of second host
+ sw1 - First switch to bring down & up for rerouting purpose
+ sw2 - Second switch to bring down & up for rerouting purpose
+ expectedLink - Expected link when the switches are down, it should
+ be two links lower than the links before the two
+ switches are down
+ """
+
+ assert main, "There is no main variable"
+ assert name, "variable name is empty"
+ assert host1 and host2, "You must specify hosts"
+
+ global itemName
+ itemName = name
+ host1 = host1
+ host2 = host2
+ hostNames = [ host1, host2 ]
+ intentsId = []
+
+ iperfResult = main.TRUE
+ intentResult = main.TRUE
+ removeIntentResult = main.TRUE
+ flowResult = main.TRUE
+ topoResult = main.TRUE
+ linkDownResult = main.TRUE
+ linkUpResult = main.TRUE
+ onosNode = int( onosNode )
+
+ # Adding bidirectional point intents
+ main.log.info( itemName + ": Adding point intents" )
+ intent1 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+ egressDevice=deviceId2,
+ portIngress=port1,
+ portEgress=port2,
+ ethType=ethType,
+ ethSrc=mac1,
+ ethDst=mac2,
+ bandwidth=bandwidth,
+ lambdaAlloc=lambdaAlloc,
+ ipProto=ipProto,
+ ipSrc=ip1,
+ ipDst=ip2,
+ tcpSrc=tcp1,
+ tcpDst="" )
+
+ intent2 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+ egressDevice=deviceId1,
+ portIngress=port2,
+ portEgress=port1,
+ ethType=ethType,
+ ethSrc=mac2,
+ ethDst=mac1,
+ bandwidth=bandwidth,
+ lambdaAlloc=lambdaAlloc,
+ ipProto=ipProto,
+ ipSrc=ip2,
+ ipDst=ip1,
+ tcpSrc=tcp2,
+ tcpDst="" )
+
+ intent3 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId1,
+ egressDevice=deviceId2,
+ portIngress=port1,
+ portEgress=port2,
+ ethType=ethType,
+ ethSrc=mac1,
+ ethDst=mac2,
+ bandwidth=bandwidth,
+ lambdaAlloc=lambdaAlloc,
+ ipProto=ipProto,
+ ipSrc=ip1,
+ ipDst=ip2,
+ tcpSrc="",
+ tcpDst=tcp2 )
+
+ intent4 = main.CLIs[ onosNode ].addPointIntent( ingressDevice=deviceId2,
+ egressDevice=deviceId1,
+ portIngress=port2,
+ portEgress=port1,
+ ethType=ethType,
+ ethSrc=mac2,
+ ethDst=mac1,
+ bandwidth=bandwidth,
+ lambdaAlloc=lambdaAlloc,
+ ipProto=ipProto,
+ ipSrc=ip2,
+ ipDst=ip1,
+ tcpSrc="",
+ tcpDst=tcp1 )
+ intentsId.append( intent1 )
+ intentsId.append( intent2 )
+ intentsId.append( intent3 )
+ intentsId.append( intent4 )
+
+ # Check intents state
+ time.sleep( main.checkIntentSleep )
+ intentResult = checkIntentState( main, intentsId )
+ # Check flows count in each node
+ checkFlowsCount( main )
+
+ # Check intents state again if first check fails...
+ if not intentResult:
+ intentResult = checkIntentState( main, intentsId )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+
+ # Verify flows
+ checkFlowsState( main )
+
+ # Run iperf to both host
+ iperfTemp = main.Mininet1.iperftcp( host1,host2,10 )
+ iperfResult = iperfResult and iperfTemp
+ if iperfTemp:
+ main.assertReturnString += 'Initial Iperf Passed\n'
+ else:
+ main.assertReturnString += 'Initial Iperf Failed\n'
+
+ # Test rerouting if these variables exist
+ if sw1 and sw2 and expectedLink:
+ # link down
+ linkDownResult = link( main, sw1, sw2, "down" )
+
+ if linkDownResult:
+ main.assertReturnString += 'Link Down Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Failed\n'
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Check OnosTopology
+ topoResult = checkTopology( main, expectedLink )
+ if topoResult:
+ main.assertReturnString += 'Link Down Topology State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Topology State Failed\n'
+
+ # Run iperf to both host
+ iperfTemp = main.Mininet1.iperftcp( host1,host2,10 )
+ iperfResult = iperfResult and iperfTemp
+ if iperfTemp:
+ main.assertReturnString += 'Link Down Iperf Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Iperf Failed\n'
+
+ # Check intent state
+ intentTemp = checkIntentState( main, intentsId )
+ intentResult = intentResult and intentTemp
+ if intentTemp:
+ main.assertReturnString += 'Link Down Intent State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Intent State Failed\n'
+
+ # Checks ONOS state in link down
+ if linkDownResult and topoResult and iperfResult and intentResult:
+ main.log.info( itemName + ": Successfully brought link down" )
+ else:
+ main.log.error( itemName + ": Failed to bring link down" )
+
+ # link up
+ linkUpResult = link( main, sw1, sw2, "up" )
+ if linkUpTemp:
+ main.assertReturnString += 'Link Up Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Failed\n'
+
+ time.sleep( main.rerouteSleep )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Check OnosTopology
+ topoResult = checkTopology( main, main.numLinks )
+
+ if topoResult:
+ main.assertReturnString += 'Link Up Topology State Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Topology State Failed\n'
+
+ # Run iperf to both host
+ iperfTemp = main.Mininet1.iperftcp( host1,host2,10 )
+ iperfResult = iperfResult and iperfTemp
+ if iperfTemp:
+ main.assertReturnString += 'Link Up Iperf Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Iperf Failed\n'
+
+ # Check intent state
+ intentTemp = checkIntentState( main, intentsId )
+ intentResult = intentResult and intentTemp
+ if intentTemp:
+ main.assertReturnString += 'Link Down Intent State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Intent State Failed\n'
+
+ # Checks ONOS state in link up
+ if linkUpResult and topoResult and iperfResult and intentResult:
+ main.log.info( itemName + ": Successfully brought link back up" )
+ else:
+ main.log.error( itemName + ": Failed to bring link back up" )
+
+ # Remove all intents
+ removeIntentResult = removeAllIntents( main, intentsId )
+ if removeIntentResult:
+ main.assertReturnString += 'Remove Intents Passed'
+ else:
+ main.assertReturnString += 'Remove Intents Failed'
+
+ stepResult = iperfResult and linkDownResult and linkUpResult \
+ and intentResult and removeIntentResult
+
+ return stepResult
+
+def singleToMultiIntent( main,
+ name,
+ hostNames,
+ onosNode=0,
+ devices="",
+ ports=None,
+ ethType="",
+ macs=None,
+ bandwidth="",
+ lambdaAlloc=False,
+ ipProto="",
+ ipAddresses="",
+ tcp="",
+ sw1="",
+ sw2="",
+ expectedLink=0 ):
+ """
+ Verify Single to Multi Point intents
+ NOTE:If main.hostsData is not defined, variables data should be passed
+ in the same order index wise. All devices in the list should have the same
+ format, either all the devices have its port or it doesn't.
+ eg. hostName = [ 'h1', 'h2' ,.. ]
+ devices = [ 'of:0000000000000001', 'of:0000000000000002', ...]
+ ports = [ '1', '1', ..]
+ ...
+ Description:
+ Verify add-single-to-multi-intent iterates through the list of given
+ host | devices and add intents
+ Steps:
+ - Get device ids | ports
+ - Add single to multi point intents
+ - Check intents
+ - Verify flows
+ - Ping hosts
+ - Reroute
+ - Link down
+ - Verify flows
+ - Check topology
+ - Ping hosts
+ - Link up
+ - Verify flows
+ - Check topology
+ - Ping hosts
+ - Remove intents
+ Required:
+ name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+ hostNames - List of host names
+ Optional:
+ onosNode - ONOS node to install the intents in main.CLIs[ ]
+ 0 by default so that it will always use the first
+ ONOS node
+ devices - List of device ids in the same order as the hosts
+ in hostNames
+ ports - List of port numbers in the same order as the device in
+ devices
+ ethType - Ethernet type eg. IPV4, IPV6
+ macs - List of hosts mac address in the same order as the hosts in
+ hostNames
+ bandwidth - Bandwidth capacity
+ lambdaAlloc - Allocate lambda, defaults to False
+ ipProto - IP protocol
+ ipAddresses - IP addresses of host in the same order as the hosts in
+ hostNames
+ tcp - TCP ports in the same order as the hosts in hostNames
+ sw1 - First switch to bring down & up for rerouting purpose
+ sw2 - Second switch to bring down & up for rerouting purpose
+ expectedLink - Expected link when the switches are down, it should
+ be two links lower than the links before the two
+ switches are down
+ """
+
+ assert main, "There is no main variable"
+ assert hostNames, "You must specify hosts"
+ assert devices or main.hostsData, "You must specify devices"
+
+ global itemName
+ itemName = name
+ tempHostsData = {}
+ intentsId = []
+ onosNode = int( onosNode )
+
+ macsDict = {}
+ ipDict = {}
+ if hostNames and devices:
+ if len( hostNames ) != len( devices ):
+ main.log.debug( "hosts and devices does not have the same length" )
+ #print "len hostNames = ", len( hostNames )
+ #print "len devices = ", len( devices )
+ return main.FALSE
+ if ports:
+ if len( ports ) != len( devices ):
+ main.log.error( "Ports and devices does " +
+ "not have the same length" )
+ #print "len devices = ", len( devices )
+ #print "len ports = ", len( ports )
+ return main.FALSE
+ else:
+ main.log.info( "Device Ports are not specified" )
+ if macs:
+ for i in range( len( devices ) ):
+ macsDict[ devices[ i ] ] = macs[ i ]
+
+ elif hostNames and not devices and main.hostsData:
+ devices = []
+ main.log.info( "singleToMultiIntent function is using main.hostsData" )
+ for host in hostNames:
+ devices.append( main.hostsData.get( host ).get( 'location' ) )
+ macsDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+ main.hostsData.get( host ).get( 'mac' )
+ ipDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+ main.hostsData.get( host ).get( 'ipAddresses' )
+ #print main.hostsData
+
+ #print 'host names = ', hostNames
+ #print 'devices = ', devices
+ #print "macsDict = ", macsDict
+
+ pingResult = main.TRUE
+ intentResult = main.TRUE
+ removeIntentResult = main.TRUE
+ flowResult = main.TRUE
+ topoResult = main.TRUE
+ linkDownResult = main.TRUE
+ linkUpResult = main.TRUE
+
+ devicesCopy = copy.copy( devices )
+ if ports:
+ portsCopy = copy.copy( ports )
+ main.log.info( itemName + ": Adding single point to multi point intents" )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+
+ # Adding bidirectional point intents
+ for i in range( len( devices ) ):
+ ingressDevice = devicesCopy[ i ]
+ egressDeviceList = copy.copy( devicesCopy )
+ egressDeviceList.remove( ingressDevice )
+ if ports:
+ portIngress = portsCopy[ i ]
+ portEgressList = copy.copy( portsCopy )
+ del portEgressList[ i ]
+ else:
+ portIngress = ""
+ portEgressList = None
+ if not macsDict:
+ srcMac = ""
+ else:
+ srcMac = macsDict[ ingressDevice ]
+ if srcMac == None:
+ main.log.debug( "There is no MAC in device - " + ingressDevice )
+ srcMac = ""
+
+ intentsId.append(
+ main.CLIs[ onosNode ].addSinglepointToMultipointIntent(
+ ingressDevice=ingressDevice,
+ egressDeviceList=egressDeviceList,
+ portIngress=portIngress,
+ portEgressList=portEgressList,
+ ethType=ethType,
+ ethSrc=srcMac,
+ bandwidth=bandwidth,
+ lambdaAlloc=lambdaAlloc,
+ ipProto=ipProto,
+ ipSrc="",
+ ipDst="",
+ tcpSrc="",
+ tcpDst="" ) )
+
+ # Wait some time for the flow to go through when using multi instance
+ pingTemp = pingallHosts( main, hostNames )
+
+ # Check intents state
+ time.sleep( main.checkIntentSleep )
+ intentResult = checkIntentState( main, intentsId )
+
+ # Check intents state again if first check fails...
+ if not intentResult:
+ intentResult = checkIntentState( main, intentsId )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+ if pingTemp:
+ main.assertReturnString += 'Initial Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Initial Pingall Failed\n'
+
+ # Test rerouting if these variables exist
+ if sw1 and sw2 and expectedLink:
+ # link down
+ linkDownResult = link( main, sw1, sw2, "down" )
+
+ if linkDownResult:
+ main.assertReturnString += 'Link Down Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Failed\n'
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Check OnosTopology
+ topoResult = checkTopology( main, expectedLink )
+ if topoResult:
+ main.assertReturnString += 'Link Down Topology State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Topology State Failed\n'
+
+ # Ping hosts
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+ if pingTemp:
+ main.assertReturnString += 'Link Down Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Pingall Failed\n'
+
+ # Check intent state
+ intentTemp = checkIntentState( main, intentsId )
+ intentResult = intentResult and intentTemp
+ if intentTemp:
+ main.assertReturnString += 'Link Down Intent State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Intent State Failed\n'
+
+ # Checks ONOS state in link down
+ if linkDownResult and topoResult and pingResult and intentResult:
+ main.log.info( itemName + ": Successfully brought link down" )
+ else:
+ main.log.error( itemName + ": Failed to bring link down" )
+
+ # link up
+ linkUpResult = link( main, sw1, sw2, "up" )
+ if linkUpResult:
+ main.assertReturnString += 'Link Up Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Failed\n'
+
+ time.sleep( main.rerouteSleep )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Check OnosTopology
+ topoResult = checkTopology( main, main.numLinks )
+ if topoResult:
+ main.assertReturnString += 'Link Up Topology State Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Topology State Failed\n'
+
+ # Ping hosts
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+ if pingTemp:
+ main.assertReturnString += 'Link Up Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Pingall Failed\n'
+
+ # Check Intents
+ intentTemp = checkIntentState( main, intentsId )
+ intentResult = intentResult and intentTemp
+ if intentTemp:
+ main.assertReturnString += 'Link Up Intent State Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Intent State Failed\n'
+
+ # Checks ONOS state in link up
+ if linkUpResult and topoResult and pingResult and intentResult:
+ main.log.info( itemName + ": Successfully brought link back up" )
+ else:
+ main.log.error( itemName + ": Failed to bring link back up" )
+
+ # Remove all intents
+ removeIntentResult = removeAllIntents( main, intentsId )
+ if removeIntentResult:
+ main.assertReturnString += 'Remove Intents Passed'
+ else:
+ main.assertReturnString += 'Remove Intents Failed'
+
+ stepResult = pingResult and linkDownResult and linkUpResult \
+ and intentResult and removeIntentResult
+
+ return stepResult
+
+def multiToSingleIntent( main,
+ name,
+ hostNames,
+ onosNode=0,
+ devices="",
+ ports=None,
+ ethType="",
+ macs=None,
+ bandwidth="",
+ lambdaAlloc=False,
+ ipProto="",
+ ipAddresses="",
+ tcp="",
+ sw1="",
+ sw2="",
+ expectedLink=0 ):
+ """
+ Verify Single to Multi Point intents
+ NOTE:If main.hostsData is not defined, variables data should be passed in the
+ same order index wise. All devices in the list should have the same
+ format, either all the devices have its port or it doesn't.
+ eg. hostName = [ 'h1', 'h2' ,.. ]
+ devices = [ 'of:0000000000000001', 'of:0000000000000002', ...]
+ ports = [ '1', '1', ..]
+ ...
+ Description:
+ Verify add-multi-to-single-intent
+ Steps:
+ - Get device ids | ports
+ - Add multi to single point intents
+ - Check intents
+ - Verify flows
+ - Ping hosts
+ - Reroute
+ - Link down
+ - Verify flows
+ - Check topology
+ - Ping hosts
+ - Link up
+ - Verify flows
+ - Check topology
+ - Ping hosts
+ - Remove intents
+ Required:
+ name - Type of point intent to add eg. IPV4 | VLAN | Dualstack
+ hostNames - List of host names
+ Optional:
+ onosNode - ONOS node to install the intents in main.CLIs[ ]
+ 0 by default so that it will always use the first
+ ONOS node
+ devices - List of device ids in the same order as the hosts
+ in hostNames
+ ports - List of port numbers in the same order as the device in
+ devices
+ ethType - Ethernet type eg. IPV4, IPV6
+ macs - List of hosts mac address in the same order as the hosts in
+ hostNames
+ bandwidth - Bandwidth capacity
+ lambdaAlloc - Allocate lambda, defaults to False
+ ipProto - IP protocol
+ ipAddresses - IP addresses of host in the same order as the hosts in
+ hostNames
+ tcp - TCP ports in the same order as the hosts in hostNames
+ sw1 - First switch to bring down & up for rerouting purpose
+ sw2 - Second switch to bring down & up for rerouting purpose
+ expectedLink - Expected link when the switches are down, it should
+ be two links lower than the links before the two
+ switches are down
+ """
+
+ assert main, "There is no main variable"
+ assert hostNames, "You must specify hosts"
+ assert devices or main.hostsData, "You must specify devices"
+
+ global itemName
+ itemName = name
+ tempHostsData = {}
+ intentsId = []
+ onosNode = int( onosNode )
+
+ macsDict = {}
+ ipDict = {}
+ if hostNames and devices:
+ if len( hostNames ) != len( devices ):
+ main.log.debug( "hosts and devices does not have the same length" )
+ #print "len hostNames = ", len( hostNames )
+ #print "len devices = ", len( devices )
+ return main.FALSE
+ if ports:
+ if len( ports ) != len( devices ):
+ main.log.error( "Ports and devices does " +
+ "not have the same length" )
+ #print "len devices = ", len( devices )
+ #print "len ports = ", len( ports )
+ return main.FALSE
+ else:
+ main.log.info( "Device Ports are not specified" )
+ if macs:
+ for i in range( len( devices ) ):
+ macsDict[ devices[ i ] ] = macs[ i ]
+ elif hostNames and not devices and main.hostsData:
+ devices = []
+ main.log.info( "multiToSingleIntent function is using main.hostsData" )
+ for host in hostNames:
+ devices.append( main.hostsData.get( host ).get( 'location' ) )
+ macsDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+ main.hostsData.get( host ).get( 'mac' )
+ ipDict[ main.hostsData.get( host ).get( 'location' ) ] = \
+ main.hostsData.get( host ).get( 'ipAddresses' )
+ #print main.hostsData
+
+ #print 'host names = ', hostNames
+ #print 'devices = ', devices
+ #print "macsDict = ", macsDict
+
+ pingResult = main.TRUE
+ intentResult = main.TRUE
+ removeIntentResult = main.TRUE
+ flowResult = main.TRUE
+ topoResult = main.TRUE
+ linkDownResult = main.TRUE
+ linkUpResult = main.TRUE
+
+ devicesCopy = copy.copy( devices )
+ if ports:
+ portsCopy = copy.copy( ports )
+ main.log.info( itemName + ": Adding multi point to single point intents" )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+
+ # Adding bidirectional point intents
+ for i in range( len( devices ) ):
+ egressDevice = devicesCopy[ i ]
+ ingressDeviceList = copy.copy( devicesCopy )
+ ingressDeviceList.remove( egressDevice )
+ if ports:
+ portEgress = portsCopy[ i ]
+ portIngressList = copy.copy( portsCopy )
+ del portIngressList[ i ]
+ else:
+ portEgress = ""
+ portIngressList = None
+ if not macsDict:
+ dstMac = ""
+ else:
+ dstMac = macsDict[ egressDevice ]
+ if dstMac == None:
+ main.log.debug( "There is no MAC in device - " + egressDevice )
+ dstMac = ""
+
+ intentsId.append(
+ main.CLIs[ onosNode ].addMultipointToSinglepointIntent(
+ ingressDeviceList=ingressDeviceList,
+ egressDevice=egressDevice,
+ portIngressList=portIngressList,
+ portEgress=portEgress,
+ ethType=ethType,
+ ethDst=dstMac,
+ bandwidth=bandwidth,
+ lambdaAlloc=lambdaAlloc,
+ ipProto=ipProto,
+ ipSrc="",
+ ipDst="",
+ tcpSrc="",
+ tcpDst="" ) )
+
+ pingTemp = pingallHosts( main, hostNames )
+
+ # Check intents state
+ time.sleep( main.checkIntentSleep )
+ intentResult = checkIntentState( main, intentsId )
+
+ # Check intents state again if first check fails...
+ if not intentResult:
+ intentResult = checkIntentState( main, intentsId )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Ping hosts
+ pingTemp = pingallHosts( main, hostNames )
+
+ # Ping hosts again...
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+ if pingTemp:
+ main.assertReturnString += 'Initial Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Initial Pingall Failed\n'
+
+ # Test rerouting if these variables exist
+ if sw1 and sw2 and expectedLink:
+ # link down
+ linkDownResult = link( main, sw1, sw2, "down" )
+
+ if linkDownResult:
+ main.assertReturnString += 'Link Down Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Failed\n'
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Check OnosTopology
+ topoResult = checkTopology( main, expectedLink )
+ if topoResult:
+ main.assertReturnString += 'Link Down Topology State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Topology State Failed\n'
+
+ # Ping hosts
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+ if pingTemp:
+ main.assertReturnString += 'Link Down Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Pingall Failed\n'
+
+ # Check intent state
+ intentTemp = checkIntentState( main, intentsId )
+ intentResult = intentResult and intentTemp
+ if intentTemp:
+ main.assertReturnString += 'Link Down Intent State Passed\n'
+ else:
+ main.assertReturnString += 'Link Down Intent State Failed\n'
+
+ # Checks ONOS state in link down
+ if linkDownResult and topoResult and pingResult and intentResult:
+ main.log.info( itemName + ": Successfully brought link down" )
+ else:
+ main.log.error( itemName + ": Failed to bring link down" )
+
+ # link up
+ linkUpResult = link( main, sw1, sw2, "up" )
+ if linkUpResult:
+ main.assertReturnString += 'Link Up Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Failed\n'
+
+ time.sleep( main.rerouteSleep )
+
+ # Check flows count in each node
+ checkFlowsCount( main )
+ # Verify flows
+ checkFlowsState( main )
+
+ # Check OnosTopology
+ topoResult = checkTopology( main, main.numLinks )
+ if topoResult:
+ main.assertReturnString += 'Link Up Topology State Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Topology State Failed\n'
+
+ # Ping hosts
+ pingTemp = pingallHosts( main, hostNames )
+ pingResult = pingResult and pingTemp
+ if pingTemp:
+ main.assertReturnString += 'Link Up Pingall Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Pingall Failed\n'
+
+ # Check Intents
+ intentTemp = checkIntentState( main, intentsId )
+ intentResult = intentResult and intentTemp
+ if intentTemp:
+ main.assertReturnString += 'Link Up Intent State Passed\n'
+ else:
+ main.assertReturnString += 'Link Up Intent State Failed\n'
+
+ # Checks ONOS state in link up
+ if linkUpResult and topoResult and pingResult and intentResult:
+ main.log.info( itemName + ": Successfully brought link back up" )
+ else:
+ main.log.error( itemName + ": Failed to bring link back up" )
+
+ # Remove all intents
+ removeIntentResult = removeAllIntents( main, intentsId )
+ if removeIntentResult:
+ main.assertReturnString += 'Remove Intents Passed'
+ else:
+ main.assertReturnString += 'Remove Intents Failed'
+
+ stepResult = pingResult and linkDownResult and linkUpResult \
+ and intentResult and removeIntentResult
+
+ return stepResult
+
+def pingallHosts( main, hostList ):
+ # Ping all host in the hosts list variable
+ main.log.info( "Pinging: " + str( hostList ) )
+ return main.Mininet1.pingallHosts( hostList )
+
+def getHostsData( main ):
+ """
+ Use fwd app and pingall to discover all the hosts
+ """
+
+ activateResult = main.TRUE
+ appCheck = main.TRUE
+ getDataResult = main.TRUE
+ main.log.info( "Activating reactive forwarding app " )
+ activateResult = main.CLIs[ 0 ].activateApp( "org.onosproject.fwd" )
+ time.sleep( main.fwdSleep )
+
+ for i in range( main.numCtrls ):
+ appCheck = appCheck and main.CLIs[ i ].appToIDCheck()
+ if appCheck != main.TRUE:
+ main.log.warn( main.CLIs[ i ].apps() )
+ main.log.warn( main.CLIs[ i ].appIDs() )
+
+ pingResult = main.Mininet1.pingall( timeout = 600 )
+ hostsJson = json.loads( main.CLIs[ 0 ].hosts() )
+ hosts = main.Mininet1.getHosts().keys()
+ # TODO: Make better use of new getHosts function
+ for host in hosts:
+ main.hostsData[ host ] = {}
+ main.hostsData[ host ][ 'mac' ] = \
+ main.Mininet1.getMacAddress( host ).upper()
+ for hostj in hostsJson:
+ if main.hostsData[ host ][ 'mac' ] == hostj[ 'mac' ]:
+ main.hostsData[ host ][ 'id' ] = hostj[ 'id' ]
+ main.hostsData[ host ][ 'vlan' ] = hostj[ 'vlan' ]
+ main.hostsData[ host ][ 'location' ] = \
+ hostj[ 'location' ][ 'elementId' ] + '/' + \
+ hostj[ 'location' ][ 'port' ]
+ main.hostsData[ host ][ 'ipAddresses' ] = hostj[ 'ipAddresses' ]
+
+ main.log.info( "Deactivating reactive forwarding app " )
+ deactivateResult = main.CLIs[ 0 ].deactivateApp( "org.onosproject.fwd" )
+ if activateResult and deactivateResult and main.hostsData:
+ main.log.info( "Successfully used fwd app to discover hosts " )
+ getDataResult = main.TRUE
+ else:
+ main.log.info( "Failed to use fwd app to discover hosts " )
+ getDataResult = main.FALSE
+
+ print main.hostsData
+
+ return getDataResult
+
+def checkTopology( main, expectedLink ):
+ statusResult = main.TRUE
+ # Check onos topology
+ main.log.info( itemName + ": Checking ONOS topology " )
+
+ for i in range( main.numCtrls ):
+ topologyResult = main.CLIs[ i ].topology()
+ statusResult = main.ONOSbench.checkStatus( topologyResult,
+ main.numSwitch,
+ expectedLink )\
+ and statusResult
+ if not statusResult:
+ main.log.error( itemName + ": Topology mismatch" )
+ else:
+ main.log.info( itemName + ": Topology match" )
+ return statusResult
+
+def checkIntentState( main, intentsId ):
+ """
+ This function will check intent state to make sure all the intents
+ are in INSTALLED state
+ """
+
+ intentResult = main.TRUE
+ results = []
+
+ main.log.info( itemName + ": Checking intents state" )
+ # First check of intents
+ for i in range( main.numCtrls ):
+ tempResult = main.CLIs[ i ].checkIntentState( intentsId=intentsId )
+ results.append( tempResult )
+
+ expectedState = [ 'INSTALLED', 'INSTALLING' ]
+
+ if all( result == main.TRUE for result in results ):
+ main.log.info( itemName + ": Intents are installed correctly" )
+ else:
+ # Wait for at least 5 second before checking the intents again
+ time.sleep( 5 )
+ results = []
+ # Second check of intents since some of the intents may be in
+ # INSTALLING state, they should be in INSTALLED at this time
+ for i in range( main.numCtrls ):
+ tempResult = main.CLIs[ i ].checkIntentState(
+ intentsId=intentsId )
+ results.append( tempResult )
+ if all( result == main.TRUE for result in results ):
+ main.log.info( itemName + ": Intents are installed correctly" )
+ else:
+ main.log.error( itemName + ": Intents are NOT installed correctly" )
+ intentResult = main.FALSE
+
+ return intentResult
+
+def checkFlowsState( main ):
+
+ main.log.info( itemName + ": Check flows state" )
+ checkFlowsResult = main.CLIs[ 0 ].checkFlowsState()
+ return checkFlowsResult
+
+def link( main, sw1, sw2, option):
+
+ # link down
+ main.log.info( itemName + ": Bring link " + option + "between " +
+ sw1 + " and " + sw2 )
+ linkResult = main.Mininet1.link( end1=sw1, end2=sw2, option=option )
+ return linkResult
+
+def removeAllIntents( main, intentsId ):
+ """
+ Remove all intents in the intentsId
+ """
+
+ onosSummary = []
+ removeIntentResult = main.TRUE
+ # Remove intents
+ for intent in intentsId:
+ main.CLIs[ 0 ].removeIntent( intentId=intent, purge=True )
+
+ time.sleep( main.removeIntentSleep )
+
+ # If there is remianing intents then remove intents should fail
+ for i in range( main.numCtrls ):
+ onosSummary.append( json.loads( main.CLIs[ i ].summary() ) )
+
+ for summary in onosSummary:
+ if summary.get( 'intents' ) != 0:
+ main.log.warn( itemName + ": There are " +
+ str( summary.get( 'intents' ) ) +
+ " intents remaining in node " +
+ str( summary.get( 'node' ) ) +
+ ", failed to remove all the intents " )
+ removeIntentResult = main.FALSE
+
+ if removeIntentResult:
+ main.log.info( itemName + ": There are no more intents remaining, " +
+ "successfully removed all the intents." )
+
+ return removeIntentResult
+
+def checkFlowsCount( main ):
+ """
+ Check flows count in each node
+ """
+
+ flowsCount = []
+ main.log.info( itemName + ": Checking flows count in each ONOS node" )
+ for i in range( main.numCtrls ):
+ summaryResult = main.CLIs[ i ].summary()
+ if not summaryResult:
+ main.log.error( itemName + ": There is something wrong with " +
+ "summary command" )
+ return main.FALSE
+ else:
+ summaryJson = json.loads( summaryResult )
+ flowsCount.append( summaryJson.get( 'flows' ) )
+
+ if flowsCount:
+ if all( flows==flowsCount[ 0 ] for flows in flowsCount ):
+ main.log.info( itemName + ": There are " + str( flowsCount[ 0 ] ) +
+ " flows in all ONOS node" )
+ else:
+ for i in range( main.numCtrls ):
+ main.log.debug( itemName + ": ONOS node " + str( i ) + " has " +
+ str( flowsCount[ i ] ) + " flows" )
+ else:
+ main.log.error( "Checking flows count failed, check summary command" )
+ return main.FALSE
+
+ return main.TRUE
+
+def checkLeaderChange( leaders1, leaders2 ):
+ """
+ Checks for a change in intent partition leadership.
+
+ Takes the output of leaders -c in json string format before and after
+ a potential change as input
+
+ Returns main.TRUE if no mismatches are detected
+ Returns main.FALSE if there is a mismatch or on error loading the input
+ """
+ try:
+ leaders1 = json.loads( leaders1 )
+ leaders2 = json.loads( leaders2 )
+ except ( AttributeError, TypeError):
+ main.log.exception( self.name + ": Object not as expected" )
+ return main.FALSE
+ except Exception:
+ main.log.exception( self.name + ": Uncaught exception!" )
+ main.cleanup()
+ main.exit()
+ main.log.info( "Checking Intent Paritions for Change in Leadership" )
+ mismatch = False
+ for dict1 in leaders1:
+ if "intent" in dict1.get( "topic", [] ):
+ for dict2 in leaders2:
+ if dict1.get( "topic", 0 ) == dict2.get( "topic", 0 ) and \
+ dict1.get( "leader", 0 ) != dict2.get( "leader", 0 ):
+ mismatch = True
+ main.log.error( "{0} changed leader from {1} to {2}".\
+ format( dict1.get( "topic", "no-topic" ),\
+ dict1.get( "leader", "no-leader" ),\
+ dict2.get( "leader", "no-leader" ) ) )
+ if mismatch:
+ return main.FALSE
+ else:
+ return main.TRUE
+
+def report( main ):
+ """
+ Report errors/warnings/exceptions
+ """
+
+ main.ONOSbench.logReport( main.ONOSip[ 0 ],
+ [ "INFO",
+ "FOLLOWER",
+ "WARN",
+ "flow",
+ "ERROR",
+ "Except" ],
+ "s" )
+
+ main.log.info( "ERROR report: \n" )
+ for i in range( main.numCtrls ):
+ main.ONOSbench.logReport( main.ONOSip[ i ],
+ [ "ERROR" ],
+ "d" )
+
+ main.log.info( "EXCEPTIONS report: \n" )
+ for i in range( main.numCtrls ):
+ main.ONOSbench.logReport( main.ONOSip[ i ],
+ [ "Except" ],
+ "d" )
+
+ main.log.info( "WARNING report: \n" )
+ for i in range( main.numCtrls ):
+ main.ONOSbench.logReport( main.ONOSip[ i ],
+ [ "WARN" ],
+ "d" )
diff --git a/TestON/tests/FUNC/FUNCoptical/dependencies/startUp.py b/TestON/tests/FUNC/FUNCoptical/dependencies/startUp.py
new file mode 100644
index 0000000..bf2a2b6
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/dependencies/startUp.py
@@ -0,0 +1,38 @@
+"""
+ This wrapper function is use for starting up onos instance
+"""
+
+import time
+import os
+import json
+
+def onosBuild( main, gitBranch ):
+ """
+ This includes pulling ONOS and building it using maven install
+ """
+
+ buildResult = main.FALSE
+
+ # Git checkout a branch of ONOS
+ checkOutResult = main.ONOSbench.gitCheckout( gitBranch )
+ # Does the git pull on the branch that was checked out
+ if not checkOutResult:
+ main.log.warn( "Failed to checked out " + gitBranch +
+ " branch")
+ else:
+ main.log.info( "Successfully checked out " + gitBranch +
+ " branch")
+ gitPullResult = main.ONOSbench.gitPull()
+ if gitPullResult == main.ERROR:
+ main.log.error( "Error pulling git branch" )
+ else:
+ main.log.info( "Successfully pulled " + gitBranch + " branch" )
+
+ # Maven clean install
+ buildResult = main.ONOSbench.cleanInstall()
+
+ return buildResult
+
+
+
+
diff --git a/TestON/tests/FUNC/FUNCoptical/dependencies/topo.py b/TestON/tests/FUNC/FUNCoptical/dependencies/topo.py
new file mode 100644
index 0000000..b44e3fc
--- /dev/null
+++ b/TestON/tests/FUNC/FUNCoptical/dependencies/topo.py
@@ -0,0 +1,100 @@
+"""
+ These functions can be used for topology comparisons
+"""
+
+import time
+import os
+import json
+
+def getAllDevices( main ):
+ """
+ Return a list containing the devices output from each ONOS node
+ """
+ devices = []
+ threads = []
+ for i in range( main.numCtrls ):
+ t = main.Thread( target=main.CLIs[i].devices,
+ name="devices-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ devices.append( t.result )
+ return devices
+
+def getAllHosts( main ):
+ """
+ Return a list containing the hosts output from each ONOS node
+ """
+ hosts = []
+ ipResult = main.TRUE
+ threads = []
+ for i in range( main.numCtrls ):
+ t = main.Thread( target=main.CLIs[i].hosts,
+ name="hosts-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ hosts.append( t.result )
+ return hosts
+
+def getAllPorts( main ):
+ """
+ Return a list containing the ports output from each ONOS node
+ """
+ ports = []
+ threads = []
+ for i in range( main.numCtrls ):
+ t = main.Thread( target=main.CLIs[i].ports,
+ name="ports-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ ports.append( t.result )
+ return ports
+
+def getAllLinks( main ):
+ """
+ Return a list containing the links output from each ONOS node
+ """
+ links = []
+ threads = []
+ for i in range( main.numCtrls ):
+ t = main.Thread( target=main.CLIs[i].links,
+ name="links-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ links.append( t.result )
+ return links
+
+def getAllClusters( main ):
+ """
+ Return a list containing the clusters output from each ONOS node
+ """
+ clusters = []
+ threads = []
+ for i in range( main.numCtrls ):
+ t = main.Thread( target=main.CLIs[i].clusters,
+ name="clusters-" + str( i ),
+ args=[ ] )
+ threads.append( t )
+ t.start()
+
+ for t in threads:
+ t.join()
+ clusters.append( t.result )
+ return clusters
+
+