ONOS-2480 Added FUNCoptical test. Launches opticalTest topology, checks that it loaded, tests arping, pingall, point-to-point intents and host-to-host intents. Added lincoemininetdriver.py which inherits from the mininet driver and has linc oe specific methods.
runOpticalMnScript() now tries again after a sudo mn -c if the topo fails the first time
updated topo to use admin user and removed unused linc-oe1 and renamed linc-oe2 to linc-oe
Added case explanations for the wiki. Case 21 now asserts on the pingall failing
Change-Id: I0409117d7b3e615e62a1c253e074bdef8cd7de2c
diff --git a/TestON/drivers/common/cli/emulator/lincoemininetdriver.py b/TestON/drivers/common/cli/emulator/lincoemininetdriver.py
new file mode 100644
index 0000000..9372a54
--- /dev/null
+++ b/TestON/drivers/common/cli/emulator/lincoemininetdriver.py
@@ -0,0 +1,121 @@
+#!/usr/bin/env python
+"""
+
+ TestON is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ ( at your option ) any later version.
+
+ TestON is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TestON. If not, see <http://www.gnu.org/licenses/>.
+
+
+LincOEMininetDriver is an extension of the mininetclidriver to handle linc oe
+"""
+import pexpect
+import re
+import sys
+import os
+from drivers.common.cli.emulator.mininetclidriver import MininetCliDriver
+
+
+class LincOEMininetDriver( MininetCliDriver ):
+ def runOpticalMnScript( self,onosDirectory = 'onos', ctrllerIP = None ):
+ import time
+ import types
+ """
+ Description:
+ This function is only meant for Packet Optical.
+ It runs python script "opticalTest.py" to create the
+ packet layer( mn ) and optical topology
+ Optional:
+ name - Name of onos directory. (ONOS | onos)
+ Required:
+ ctrllerIP = Controller(s) IP address
+ TODO: If no ctrllerIP is provided, a default
+ $OC1 can be accepted
+ """
+ try:
+ if ctrllerIP == None:
+ main.log.error( "You need to specify the IP" )
+ return main.FALSE
+ else:
+ controller = ''
+ if isinstance( ctrllerIP, types.ListType ):
+ for i in xrange( len( ctrllerIP ) ):
+ controller += ctrllerIP[i] + ' '
+ main.log.info( "Mininet topology is being loaded with " +
+ "controllers: " + controller )
+ elif isinstance( ctrllerIP, types.StringType ):
+ controller = ctrllerIP
+ main.log.info( "Mininet topology is being loaded with " +
+ "controller: " + controller )
+ else:
+ main.log.info( "You need to specify a valid IP" )
+ return main.FALSE
+ topoFile = "~/{0}/tools/test/topos/opticalTest.py".format( onosDirectory )
+ cmd = "sudo -E python {0} {1}".format( topoFile, controller )
+ main.log.info( self.name + ": cmd = " + cmd )
+ self.handle.sendline( cmd )
+ lincStart = self.handle.expect( [ "mininet>", pexpect.TIMEOUT ],timeout=120 )
+ if lincStart == 1:
+ self.handle.sendline( "\x03" )
+ self.handle.sendline( "sudo mn -c" )
+ self.handle.sendline( cmd )
+ lincStart = self.handle.expect( [ "mininet>", pexpect.TIMEOUT ],timeout=120 )
+ if lincStart == 1:
+ main.log.error( "OpticalTest.py failed to start." )
+ return main.FALSE
+ return main.TRUE
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ return main.FALSE
+
+ def pingHostOptical( self, **pingParams ):
+ """
+ This function is only for Packet Optical related ping
+ Use the next pingHost() function for all normal scenarios )
+ Ping from one mininet host to another
+ Currently the only supported Params: SRC and TARGET
+ """
+ args = utilities.parse_args( [ "SRC", "TARGET" ], **pingParams )
+ command = args[ "SRC" ] + " ping " + \
+ args[ "TARGET" ] + " -c 1 -i 1 -W 8"
+ try:
+ main.log.warn( "Sending: " + command )
+ self.handle.sendline( command )
+ i = self.handle.expect( [ command, pexpect.TIMEOUT ] )
+ if i == 1:
+ main.log.error(
+ self.name +
+ ": timeout when waiting for response from mininet" )
+ main.log.error( "response: " + str( self.handle.before ) )
+ i = self.handle.expect( [ "mininet>", pexpect.TIMEOUT ] )
+ if i == 1:
+ main.log.error(
+ self.name +
+ ": timeout when waiting for response from mininet" )
+ main.log.error( "response: " + str( self.handle.before ) )
+ response = self.handle.before
+ except pexpect.EOF:
+ main.log.error( self.name + ": EOF exception found" )
+ main.log.error( self.name + ": " + self.handle.before )
+ main.cleanup()
+ main.exit()
+ main.log.info( self.name + ": Ping Response: " + response )
+ if re.search( ',\s0\%\spacket\sloss', response ):
+ main.log.info( self.name + ": no packets lost, host is reachable" )
+ main.lastResult = main.TRUE
+ return main.TRUE
+ else:
+ main.log.error(
+ self.name +
+ ": PACKET LOST, HOST IS NOT REACHABLE" )
+ main.lastResult = main.FALSE
+ return main.FALSE
diff --git a/TestON/tests/FUNCoptical/Dependency/FuncIntentFunction.py b/TestON/tests/FUNCoptical/Dependency/FuncIntentFunction.py
new file mode 100644
index 0000000..377fd20
--- /dev/null
+++ b/TestON/tests/FUNCoptical/Dependency/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/FUNCoptical/Dependency/startUp.py b/TestON/tests/FUNCoptical/Dependency/startUp.py
new file mode 100644
index 0000000..bf2a2b6
--- /dev/null
+++ b/TestON/tests/FUNCoptical/Dependency/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/FUNCoptical/Dependency/topo.py b/TestON/tests/FUNCoptical/Dependency/topo.py
new file mode 100644
index 0000000..b44e3fc
--- /dev/null
+++ b/TestON/tests/FUNCoptical/Dependency/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
+
+
diff --git a/TestON/tests/FUNCoptical/FUNCoptical.params b/TestON/tests/FUNCoptical/FUNCoptical.params
new file mode 100644
index 0000000..2d8df50
--- /dev/null
+++ b/TestON/tests/FUNCoptical/FUNCoptical.params
@@ -0,0 +1,56 @@
+<PARAMS>
+ # CASE - Description
+ # 1 - Variable initialization and optional pull and build ONOS package
+ # 2 - Install ONOS
+ # 10 - Start Mininet opticalTest Topology
+ # 14 - Stop Mininet
+ # 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</testcases>
+
+ <SCALE>
+ <size>1,3</size>
+ </SCALE>
+
+ <DEPENDENCY>
+ <path>/tests/FUNCoptical/Dependency/</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/FUNCoptical/FUNCoptical.py b/TestON/tests/FUNCoptical/FUNCoptical.py
new file mode 100644
index 0000000..b5ca189
--- /dev/null
+++ b/TestON/tests/FUNCoptical/FUNCoptical.py
@@ -0,0 +1,600 @@
+# 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.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 enviornment 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 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( "Conmparing 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
+ intentsJson = json.loads( main.CLIs[ 0 ].intents() )
+ main.CLIs[ 0 ].removeIntent( intentId=intent1, purge=True )
+ #main.CLIs[ 0 ].removeIntent( intentId=intent2, purge=True )
+ for intents in intentsJson:
+ main.CLIs[ 0 ].removeIntent( intentId=intents.get( 'id' ),
+ app='org.onosproject.optical',
+ purge=True )
+ # Check if any intents could not be removed
+ if len( json.loads( main.CLIs[ 0 ].intents() ) ):
+ print json.loads( main.CLIs[ 0 ].intents() )
+ removeResult = main.FALSE
+ utilities.assert_equals( expect=main.TRUE,
+ actual=removeResult,
+ onpass="Successfully removed host intents",
+ onfail="Failed to remove host intents" )
+
diff --git a/TestON/tests/FUNCoptical/FUNCoptical.topo b/TestON/tests/FUNCoptical/FUNCoptical.topo
new file mode 100755
index 0000000..73859bd
--- /dev/null
+++ b/TestON/tests/FUNCoptical/FUNCoptical.topo
@@ -0,0 +1,64 @@
+<TOPOLOGY>
+ <COMPONENT>
+
+ <ONOSbench>
+ <host>localhost</host>
+ <user>admin</user>
+ <password></password>
+ <type>OnosDriver</type>
+ <connect_order>1</connect_order>
+ <COMPONENTS>
+ <nodes>3</nodes>
+ </COMPONENTS>
+ </ONOSbench>
+
+ <ONOScli1>
+ <host>localhost</host>
+ <user>admin</user>
+ <password></password>
+ <type>OnosCliDriver</type>
+ <connect_order>2</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOScli1>
+
+ <ONOScli2>
+ <host>localhost</host>
+ <user>admin</user>
+ <password></password>
+ <type>OnosCliDriver</type>
+ <connect_order>3</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOScli2>
+
+ <ONOScli3>
+ <host>localhost</host>
+ <user>admin</user>
+ <password></password>
+ <type>OnosCliDriver</type>
+ <connect_order>4</connect_order>
+ <COMPONENTS> </COMPONENTS>
+ </ONOScli3>
+
+ <Mininet1>
+ <host>OCN</host>
+ <user>admin</user>
+ <password></password>
+ <type>MininetCliDriver</type>
+ <connect_order>5</connect_order>
+ <COMPONENTS>
+ <home>~/mininet/custom/</home>
+ </COMPONENTS>
+ </Mininet1>
+
+ <LincOE>
+ <host>OCN</host>
+ <user>admin</user>
+ <password>rocks</password>
+ <type>LincOEMininetDriver</type>
+ <connect_order>7</connect_order>
+ <COMPONENTS>
+ </COMPONENTS>
+ </LincOE>
+
+ </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNCoptical/TopoConfig.json b/TestON/tests/FUNCoptical/TopoConfig.json
new file mode 100644
index 0000000..9545eae
--- /dev/null
+++ b/TestON/tests/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/FUNCoptical/Topology.json b/TestON/tests/FUNCoptical/Topology.json
new file mode 100644
index 0000000..21c21e7
--- /dev/null
+++ b/TestON/tests/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/FUNCoptical/__init__.py b/TestON/tests/FUNCoptical/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNCoptical/__init__.py