fahad
Committed by Gerrit Code Review

Lots of improvements in opticalUtils.py

Now we can controll LINC components from mininet e.g swtich start/stop or link up/down
-Added LINCSwitch, LINCIntf and LINCLink classes
    -fixed start/stop LINC-Switch bug related to taps
    -refactored opticalUtils.py
    -fixed typo
    -Implemented LINC-CLI support in LINCSwitch class
    -Added support for link up/down from mininet
    -Added support for switch start/stop from mininet
    and many more :)

Change-Id: Ide6460081a554ea3ca9146be480ae016d7d2356d
1 #!/usr/bin/python 1 #!/usr/bin/python
2 2
3 -from opticalUtils import MininetOE, OpticalSwitch, OpticalLink 3 +from opticalUtils import MininetOE, LINCSwitch, LINCLink
4 from mininet.topo import Topo 4 from mininet.topo import Topo
5 from mininet.log import setLogLevel 5 from mininet.log import setLogLevel
6 from mininet.node import RemoteController 6 from mininet.node import RemoteController
...@@ -10,25 +10,25 @@ class SmallOpticalTopo( Topo ): ...@@ -10,25 +10,25 @@ class SmallOpticalTopo( Topo ):
10 10
11 def build( self ): 11 def build( self ):
12 o1ann = { "latitude": 37.6, "longitude": -122.3, "optical.regens": 0 } 12 o1ann = { "latitude": 37.6, "longitude": -122.3, "optical.regens": 0 }
13 - O1 = self.addSwitch( 'SFO-W10', dpid='0000ffffffffff01', annotations=o1ann, cls=OpticalSwitch ) 13 + O1 = self.addSwitch( 'SFO-W10', dpid='0000ffffffffff01', annotations=o1ann, cls=LINCSwitch )
14 o2ann = { "latitude": 37.3, "longitude": -121.9, "optical.regens": 0 } 14 o2ann = { "latitude": 37.3, "longitude": -121.9, "optical.regens": 0 }
15 - O2 = self.addSwitch( 'SJC-W10', dpid='0000ffffffffff02', annotations=o2ann, cls=OpticalSwitch ) 15 + O2 = self.addSwitch( 'SJC-W10', dpid='0000ffffffffff02', annotations=o2ann, cls=LINCSwitch )
16 o3ann = { "latitude": 33.9, "longitude": -118.4, "optical.regens": 0 } 16 o3ann = { "latitude": 33.9, "longitude": -118.4, "optical.regens": 0 }
17 - O3 = self.addSwitch( 'LAX-W10', dpid='0000ffffffffff03', annotations=o3ann, cls=OpticalSwitch ) 17 + O3 = self.addSwitch( 'LAX-W10', dpid='0000ffffffffff03', annotations=o3ann, cls=LINCSwitch )
18 o4ann = { "latitude": 32.8, "longitude": -117.1, "optical.regens": 3 } 18 o4ann = { "latitude": 32.8, "longitude": -117.1, "optical.regens": 3 }
19 - O4 = self.addSwitch( 'SDG-W10', dpid='0000ffffffffff04', annotations=o4ann, cls=OpticalSwitch ) 19 + O4 = self.addSwitch( 'SDG-W10', dpid='0000ffffffffff04', annotations=o4ann, cls=LINCSwitch )
20 o5ann = { "latitude": 44.8, "longitude": -93.1, "optical.regens": 3 } 20 o5ann = { "latitude": 44.8, "longitude": -93.1, "optical.regens": 3 }
21 - O5 = self.addSwitch( 'MSP-M10', dpid='0000ffffffffff05', annotations=o5ann, cls=OpticalSwitch ) 21 + O5 = self.addSwitch( 'MSP-M10', dpid='0000ffffffffff05', annotations=o5ann, cls=LINCSwitch )
22 o6ann = { "latitude": 32.8, "longitude": -97.1, "optical.regens": 3 } 22 o6ann = { "latitude": 32.8, "longitude": -97.1, "optical.regens": 3 }
23 - O6 = self.addSwitch( 'DFW-M10', dpid='0000ffffffffff06', annotations=o6ann, cls=OpticalSwitch ) 23 + O6 = self.addSwitch( 'DFW-M10', dpid='0000ffffffffff06', annotations=o6ann, cls=LINCSwitch )
24 o7ann = { "latitude": 41.8, "longitude": -87.6, "optical.regens": 3 } 24 o7ann = { "latitude": 41.8, "longitude": -87.6, "optical.regens": 3 }
25 - O7 = self.addSwitch( 'CHG-N10', dpid='0000ffffffffff07', annotations=o7ann, cls=OpticalSwitch ) 25 + O7 = self.addSwitch( 'CHG-N10', dpid='0000ffffffffff07', annotations=o7ann, cls=LINCSwitch )
26 o8ann = { "latitude": 38.8, "longitude": -77.1, "optical.regens": 3 } 26 o8ann = { "latitude": 38.8, "longitude": -77.1, "optical.regens": 3 }
27 - O8 = self.addSwitch( 'IAD-M10', dpid='0000ffffffffff08', annotations=o8ann, cls=OpticalSwitch ) 27 + O8 = self.addSwitch( 'IAD-M10', dpid='0000ffffffffff08', annotations=o8ann, cls=LINCSwitch )
28 o9ann = { "latitude": 40.8, "longitude": -73.1, "optical.regens": 0 } 28 o9ann = { "latitude": 40.8, "longitude": -73.1, "optical.regens": 0 }
29 - O9 = self.addSwitch( 'JFK-M10', dpid='0000ffffffffff09', annotations=o9ann, cls=OpticalSwitch ) 29 + O9 = self.addSwitch( 'JFK-M10', dpid='0000ffffffffff09', annotations=o9ann, cls=LINCSwitch )
30 o10ann = { "latitude": 33.8, "longitude": -84.1, "optical.regens": 0 } 30 o10ann = { "latitude": 33.8, "longitude": -84.1, "optical.regens": 0 }
31 - O10 = self.addSwitch( 'ATL-S10', dpid='0000ffffffffff0a', annotations=o10ann, cls=OpticalSwitch ) 31 + O10 = self.addSwitch( 'ATL-S10', dpid='0000ffffffffff0a', annotations=o10ann, cls=LINCSwitch )
32 32
33 33
34 SFOR10 = self.addSwitch( 'SFO-R10', dpid='0000ffffffff0001', annotations={"latitude": 37.6, "longitude": -122.3} ) 34 SFOR10 = self.addSwitch( 'SFO-R10', dpid='0000ffffffff0001', annotations={"latitude": 37.6, "longitude": -122.3} )
...@@ -38,29 +38,29 @@ class SmallOpticalTopo( Topo ): ...@@ -38,29 +38,29 @@ class SmallOpticalTopo( Topo ):
38 JFKR10 = self.addSwitch( 'JFK-R10', dpid='0000ffffffff0005', annotations={ "latitude": 40.8, "longitude": -73.1 } ) 38 JFKR10 = self.addSwitch( 'JFK-R10', dpid='0000ffffffff0005', annotations={ "latitude": 40.8, "longitude": -73.1 } )
39 ATLR10 = self.addSwitch( 'ATL-R10', dpid='0000ffffffff0006', annotations={ "latitude": 33.8, "longitude": -84.1 } ) 39 ATLR10 = self.addSwitch( 'ATL-R10', dpid='0000ffffffff0006', annotations={ "latitude": 33.8, "longitude": -84.1 } )
40 40
41 - self.addLink( O1, O2, port1=50, port2=30, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 41 + self.addLink( O1, O2, port1=50, port2=30, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
42 - self.addLink( O2, O3, port1=50, port2=30, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 42 + self.addLink( O2, O3, port1=50, port2=30, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
43 - self.addLink( O3, O4, port1=50, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 43 + self.addLink( O3, O4, port1=50, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
44 - self.addLink( O1, O5, port1=20, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 44 + self.addLink( O1, O5, port1=20, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
45 - self.addLink( O2, O5, port1=20, port2=20, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 45 + self.addLink( O2, O5, port1=20, port2=20, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
46 - self.addLink( O3, O6, port1=20, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 46 + self.addLink( O3, O6, port1=20, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
47 - self.addLink( O4, O6, port1=20, port2=20, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 47 + self.addLink( O4, O6, port1=20, port2=20, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
48 - self.addLink( O5, O6, port1=30, port2=40, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 48 + self.addLink( O5, O6, port1=30, port2=40, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
49 - self.addLink( O5, O7, port1=40, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 49 + self.addLink( O5, O7, port1=40, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
50 - self.addLink( O6, O8, port1=30, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 50 + self.addLink( O6, O8, port1=30, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
51 - self.addLink( O7, O8, port1=20, port2=30, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 51 + self.addLink( O7, O8, port1=20, port2=30, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
52 - self.addLink( O7, O9, port1=30, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 52 + self.addLink( O7, O9, port1=30, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
53 - self.addLink( O8, O10, port1=20, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 53 + self.addLink( O8, O10, port1=20, port2=50, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
54 - self.addLink( O9, O10, port1=20, port2=20, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=OpticalLink ) 54 + self.addLink( O9, O10, port1=20, port2=20, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1000, "durable": "true" }, cls=LINCLink )
55 55
56 - self.addLink( SFOR10, O1, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 56 + self.addLink( SFOR10, O1, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
57 - self.addLink( LAXR10, O3, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 57 + self.addLink( LAXR10, O3, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
58 # added second tap 58 # added second tap
59 - self.addLink( LAXR10, O3, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 59 + self.addLink( LAXR10, O3, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
60 - self.addLink( SDGR10, O4, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 60 + self.addLink( SDGR10, O4, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
61 - self.addLink( CHGR10, O7, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 61 + self.addLink( CHGR10, O7, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
62 - self.addLink( JFKR10, O9, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 62 + self.addLink( JFKR10, O9, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
63 - self.addLink( ATLR10, O10, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 63 + self.addLink( ATLR10, O10, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
64 64
65 h1 = self.addHost( 'h1' ) 65 h1 = self.addHost( 'h1' )
66 h2 = self.addHost( 'h2' ) 66 h2 = self.addHost( 'h2' )
...@@ -81,7 +81,7 @@ if __name__ == '__main__': ...@@ -81,7 +81,7 @@ if __name__ == '__main__':
81 if len( sys.argv ) >= 2: 81 if len( sys.argv ) >= 2:
82 controllers = sys.argv[1:] 82 controllers = sys.argv[1:]
83 else: 83 else:
84 - print 'Usage: ./opticalUtils.py (<Controller IP>)+' 84 + print 'Usage:sudo -E python opticalTest.py (<Controller IP>)+'
85 print 'Using localhost...\n' 85 print 'Using localhost...\n'
86 controllers = [ '127.0.0.1' ] 86 controllers = [ '127.0.0.1' ]
87 87
......
1 #!/usr/bin/python 1 #!/usr/bin/python
2 2
3 -from opticalUtils import MininetOE, OpticalSwitch, OpticalLink 3 +from opticalUtils import MininetOE, LINCSwitch, LINCLink
4 from mininet.topo import Topo 4 from mininet.topo import Topo
5 from mininet.log import setLogLevel 5 from mininet.log import setLogLevel
6 from mininet.node import RemoteController 6 from mininet.node import RemoteController
...@@ -11,155 +11,155 @@ class BigOpticalTopo( Topo ): ...@@ -11,155 +11,155 @@ class BigOpticalTopo( Topo ):
11 def build( self ): 11 def build( self ):
12 # Optical layer ROADMs 12 # Optical layer ROADMs
13 o1ann = { "latitude": 32.508086, "longitude": -99.741564, "optical.regens": 0 } 13 o1ann = { "latitude": 32.508086, "longitude": -99.741564, "optical.regens": 0 }
14 - O1 = self.addSwitch( 'ABLNTXRO', dpid='0000ffffffffff01', annotations=o1ann, cls=OpticalSwitch ) 14 + O1 = self.addSwitch( 'ABLNTXRO', dpid='0000ffffffffff01', annotations=o1ann, cls=LINCSwitch )
15 o2ann = { "latitude": 35.084446, "longitude": -106.649719, "optical.regens": 0 } 15 o2ann = { "latitude": 35.084446, "longitude": -106.649719, "optical.regens": 0 }
16 - O2 = self.addSwitch( 'ALBQNMMA', dpid='0000ffffffffff02', annotations=o2ann, cls=OpticalSwitch ) 16 + O2 = self.addSwitch( 'ALBQNMMA', dpid='0000ffffffffff02', annotations=o2ann, cls=LINCSwitch )
17 o3ann = { "latitude": 42.652222, "longitude": -73.758333, "optical.regens": 0 } 17 o3ann = { "latitude": 42.652222, "longitude": -73.758333, "optical.regens": 0 }
18 - O3 = self.addSwitch( 'ALBYNYSS', dpid='0000ffffffffff03', annotations=o3ann, cls=OpticalSwitch ) 18 + O3 = self.addSwitch( 'ALBYNYSS', dpid='0000ffffffffff03', annotations=o3ann, cls=LINCSwitch )
19 o4ann = { "latitude": 33.755833, "longitude": -97.743057, "optical.regens": 5 } 19 o4ann = { "latitude": 33.755833, "longitude": -97.743057, "optical.regens": 5 }
20 - O4 = self.addSwitch( 'ATLNGATL', dpid='0000ffffffffff04', annotations=o4ann, cls=OpticalSwitch ) # ATLNGATL Connected to packet node 20 + O4 = self.addSwitch( 'ATLNGATL', dpid='0000ffffffffff04', annotations=o4ann, cls=LINCSwitch ) # ATLNGATL Connected to packet node
21 o5ann = { "latitude": 42.882778, "longitude": -78.877778, "optical.regens": 0 } 21 o5ann = { "latitude": 42.882778, "longitude": -78.877778, "optical.regens": 0 }
22 - O5 = self.addSwitch( 'BFLONYFR', dpid='0000ffffffffff05', annotations=o5ann, cls=OpticalSwitch ) 22 + O5 = self.addSwitch( 'BFLONYFR', dpid='0000ffffffffff05', annotations=o5ann, cls=LINCSwitch )
23 o6ann = { "latitude": 45.781667, "longitude": -108.509167, "optical.regens": 0 } 23 o6ann = { "latitude": 45.781667, "longitude": -108.509167, "optical.regens": 0 }
24 - O6 = self.addSwitch( 'BLNGMTMA', dpid='0000ffffffffff06', annotations=o6ann, cls=OpticalSwitch ) 24 + O6 = self.addSwitch( 'BLNGMTMA', dpid='0000ffffffffff06', annotations=o6ann, cls=LINCSwitch )
25 o7ann = { "latitude": 39.293781, "longitude": -76.614127, "optical.regens": 0 } 25 o7ann = { "latitude": 39.293781, "longitude": -76.614127, "optical.regens": 0 }
26 - O7 = self.addSwitch( 'BLTMMDCH', dpid='0000ffffffffff07', annotations=o7ann, cls=OpticalSwitch ) 26 + O7 = self.addSwitch( 'BLTMMDCH', dpid='0000ffffffffff07', annotations=o7ann, cls=LINCSwitch )
27 o8ann = { "latitude": 33.517223, "longitude": -86.812225, "optical.regens": 0 } 27 o8ann = { "latitude": 33.517223, "longitude": -86.812225, "optical.regens": 0 }
28 - O8 = self.addSwitch( 'BRHMALMT', dpid='0000ffffffffff08', annotations=o8ann, cls=OpticalSwitch ) 28 + O8 = self.addSwitch( 'BRHMALMT', dpid='0000ffffffffff08', annotations=o8ann, cls=LINCSwitch )
29 o9ann = { "latitude": 46.836379, "longitude": -100.796917, "optical.regens": 0 } 29 o9ann = { "latitude": 46.836379, "longitude": -100.796917, "optical.regens": 0 }
30 - O9 = self.addSwitch( 'BSMRNDJC', dpid='0000ffffffffff09', annotations=o9ann, cls=OpticalSwitch ) 30 + O9 = self.addSwitch( 'BSMRNDJC', dpid='0000ffffffffff09', annotations=o9ann, cls=LINCSwitch )
31 o10ann = { "latitude": 30.449722, "longitude": -91.184167, "optical.regens": 0 } 31 o10ann = { "latitude": 30.449722, "longitude": -91.184167, "optical.regens": 0 }
32 - O10 = self.addSwitch( 'BTRGLAMA', dpid='0000ffffffffff0a', annotations=o10ann, cls=OpticalSwitch ) 32 + O10 = self.addSwitch( 'BTRGLAMA', dpid='0000ffffffffff0a', annotations=o10ann, cls=LINCSwitch )
33 o11ann = { "latitude": 41.881484, "longitude": -87.640432, "optical.regens": 4 } 33 o11ann = { "latitude": 41.881484, "longitude": -87.640432, "optical.regens": 4 }
34 - O11 = self.addSwitch( 'CHCGILCL', dpid='0000ffffffffff0b', annotations=o11ann, cls=OpticalSwitch ) 34 + O11 = self.addSwitch( 'CHCGILCL', dpid='0000ffffffffff0b', annotations=o11ann, cls=LINCSwitch )
35 o12ann = { "latitude": 35.224924, "longitude": -80.837502, "optical.regens": 0 } 35 o12ann = { "latitude": 35.224924, "longitude": -80.837502, "optical.regens": 0 }
36 - O12 = self.addSwitch( 'CHRLNCCA', dpid='0000ffffffffff0c', annotations=o12ann, cls=OpticalSwitch ) 36 + O12 = self.addSwitch( 'CHRLNCCA', dpid='0000ffffffffff0c', annotations=o12ann, cls=LINCSwitch )
37 o13ann = { "latitude": 32.785278, "longitude": -79.938056, "optical.regens": 0 } 37 o13ann = { "latitude": 32.785278, "longitude": -79.938056, "optical.regens": 0 }
38 - O13 = self.addSwitch( 'CHTNSCDT', dpid='0000ffffffffff0d', annotations=o13ann, cls=OpticalSwitch ) 38 + O13 = self.addSwitch( 'CHTNSCDT', dpid='0000ffffffffff0d', annotations=o13ann, cls=LINCSwitch )
39 o14ann = { "latitude": 41.498333, "longitude": -81.686943, "optical.regens": 0 } 39 o14ann = { "latitude": 41.498333, "longitude": -81.686943, "optical.regens": 0 }
40 - O14 = self.addSwitch( 'CLEVOH02', dpid='0000ffffffffff0e', annotations=o14ann, cls=OpticalSwitch ) 40 + O14 = self.addSwitch( 'CLEVOH02', dpid='0000ffffffffff0e', annotations=o14ann, cls=LINCSwitch )
41 o15ann = { "latitude": 39.965279, "longitude": -82.996666, "optical.regens": 0 } 41 o15ann = { "latitude": 39.965279, "longitude": -82.996666, "optical.regens": 0 }
42 - O15 = self.addSwitch( 'CLMBOH11', dpid='0000ffffffffff0f', annotations=o15ann, cls=OpticalSwitch ) 42 + O15 = self.addSwitch( 'CLMBOH11', dpid='0000ffffffffff0f', annotations=o15ann, cls=LINCSwitch )
43 o16ann = { "latitude": 42.36745, "longitude": -71.084918, "optical.regens": 0 } 43 o16ann = { "latitude": 42.36745, "longitude": -71.084918, "optical.regens": 0 }
44 - O16 = self.addSwitch( 'CMBRMA01', dpid='0000ffffffffff10', annotations=o16ann, cls=OpticalSwitch ) 44 + O16 = self.addSwitch( 'CMBRMA01', dpid='0000ffffffffff10', annotations=o16ann, cls=LINCSwitch )
45 o17ann = { "latitude": 39.102778, "longitude": -84.516944, "optical.regens": 0 } 45 o17ann = { "latitude": 39.102778, "longitude": -84.516944, "optical.regens": 0 }
46 - O17 = self.addSwitch( 'CNCNOHWS', dpid='0000ffffffffff11', annotations=o17ann, cls=OpticalSwitch ) 46 + O17 = self.addSwitch( 'CNCNOHWS', dpid='0000ffffffffff11', annotations=o17ann, cls=LINCSwitch )
47 o18ann = { "latitude": 32.797524, "longitude": -96.780431, "optical.regens": 0 } 47 o18ann = { "latitude": 32.797524, "longitude": -96.780431, "optical.regens": 0 }
48 - O18 = self.addSwitch( 'DLLSTXTL', dpid='0000ffffffffff12', annotations=o18ann, cls=OpticalSwitch ) # DLLSTXTL Connected to packet node 48 + O18 = self.addSwitch( 'DLLSTXTL', dpid='0000ffffffffff12', annotations=o18ann, cls=LINCSwitch ) # DLLSTXTL Connected to packet node
49 o19ann = { "latitude": 39.744999, "longitude": -104.996391, "optical.regens": 0 } 49 o19ann = { "latitude": 39.744999, "longitude": -104.996391, "optical.regens": 0 }
50 - O19 = self.addSwitch( 'DNVRCOMA', dpid='0000ffffffffff13', annotations=o19ann, cls=OpticalSwitch ) 50 + O19 = self.addSwitch( 'DNVRCOMA', dpid='0000ffffffffff13', annotations=o19ann, cls=LINCSwitch )
51 o20ann = { "latitude": 42.332779, "longitude": -83.054169, "optical.regens": 5 } 51 o20ann = { "latitude": 42.332779, "longitude": -83.054169, "optical.regens": 5 }
52 - O20 = self.addSwitch( 'DTRTMIBA', dpid='0000ffffffffff14', annotations=o20ann, cls=OpticalSwitch ) 52 + O20 = self.addSwitch( 'DTRTMIBA', dpid='0000ffffffffff14', annotations=o20ann, cls=LINCSwitch )
53 o21ann = { "latitude": 31.756389, "longitude": -106.483611, "optical.regens": 0 } 53 o21ann = { "latitude": 31.756389, "longitude": -106.483611, "optical.regens": 0 }
54 - O21 = self.addSwitch( 'ELPSTXMA', dpid='0000ffffffffff15', annotations=o21ann, cls=OpticalSwitch ) 54 + O21 = self.addSwitch( 'ELPSTXMA', dpid='0000ffffffffff15', annotations=o21ann, cls=LINCSwitch )
55 o22ann = { "latitude": 36.73923, "longitude": -119.79423, "optical.regens": 0 } 55 o22ann = { "latitude": 36.73923, "longitude": -119.79423, "optical.regens": 0 }
56 - O22 = self.addSwitch( 'FRSNCA01', dpid='0000ffffffffff16', annotations=o22ann, cls=OpticalSwitch ) 56 + O22 = self.addSwitch( 'FRSNCA01', dpid='0000ffffffffff16', annotations=o22ann, cls=LINCSwitch )
57 o23ann = { "latitude": 36.072222, "longitude": -79.793889, "optical.regens": 0 } 57 o23ann = { "latitude": 36.072222, "longitude": -79.793889, "optical.regens": 0 }
58 - O23 = self.addSwitch( 'GNBONCEU', dpid='0000ffffffffff17', annotations=o23ann, cls=OpticalSwitch ) 58 + O23 = self.addSwitch( 'GNBONCEU', dpid='0000ffffffffff17', annotations=o23ann, cls=LINCSwitch )
59 o24ann = { "latitude": 41.765833, "longitude": -72.676389, "optical.regens": 0 } 59 o24ann = { "latitude": 41.765833, "longitude": -72.676389, "optical.regens": 0 }
60 - O24 = self.addSwitch( 'HRFRCT03', dpid='0000ffffffffff18', annotations=o24ann, cls=OpticalSwitch ) 60 + O24 = self.addSwitch( 'HRFRCT03', dpid='0000ffffffffff18', annotations=o24ann, cls=LINCSwitch )
61 o25ann = { "latitude": 29.748333, "longitude": -95.36528, "optical.regens": 0 } 61 o25ann = { "latitude": 29.748333, "longitude": -95.36528, "optical.regens": 0 }
62 - O25 = self.addSwitch( 'HSTNTX01', dpid='0000ffffffffff19', annotations=o25ann, cls=OpticalSwitch ) 62 + O25 = self.addSwitch( 'HSTNTX01', dpid='0000ffffffffff19', annotations=o25ann, cls=LINCSwitch )
63 o26ann = { "latitude": 30.33071, "longitude": -81.43, "optical.regens": 0 } 63 o26ann = { "latitude": 30.33071, "longitude": -81.43, "optical.regens": 0 }
64 - O26 = self.addSwitch( 'JCVLFLCL', dpid='0000ffffffffff1a', annotations=o26ann, cls=OpticalSwitch ) 64 + O26 = self.addSwitch( 'JCVLFLCL', dpid='0000ffffffffff1a', annotations=o26ann, cls=LINCSwitch )
65 o27ann = { "latitude": 39.096649, "longitude": -94.578716, "optical.regens": 0 } 65 o27ann = { "latitude": 39.096649, "longitude": -94.578716, "optical.regens": 0 }
66 - O27 = self.addSwitch( 'KSCYMO09', dpid='0000ffffffffff1b', annotations=o27ann, cls=OpticalSwitch ) 66 + O27 = self.addSwitch( 'KSCYMO09', dpid='0000ffffffffff1b', annotations=o27ann, cls=LINCSwitch )
67 o28ann = { "latitude": 40.5899999,"longitude": -73.6699993, "optical.regens": 0 } 67 o28ann = { "latitude": 40.5899999,"longitude": -73.6699993, "optical.regens": 0 }
68 - O28 = self.addSwitch( 'LGISLAND', dpid='0000ffffffffff1c', annotations=o28ann, cls=OpticalSwitch ) 68 + O28 = self.addSwitch( 'LGISLAND', dpid='0000ffffffffff1c', annotations=o28ann, cls=LINCSwitch )
69 o29ann = { "latitude": 34.051227, "longitude": -118.252958, "optical.regens": 0 } 69 o29ann = { "latitude": 34.051227, "longitude": -118.252958, "optical.regens": 0 }
70 - O29 = self.addSwitch( 'LSANCA03', dpid='0000ffffffffff1d', annotations=o29ann, cls=OpticalSwitch ) # LSANCA03 Connected to packet node 70 + O29 = self.addSwitch( 'LSANCA03', dpid='0000ffffffffff1d', annotations=o29ann, cls=LINCSwitch ) # LSANCA03 Connected to packet node
71 o30ann = { "latitude": 36.168056, "longitude": -115.138889, "optical.regens": 0 } 71 o30ann = { "latitude": 36.168056, "longitude": -115.138889, "optical.regens": 0 }
72 - O30 = self.addSwitch( 'LSVGNV02', dpid='0000ffffffffff1e', annotations=o30ann, cls=OpticalSwitch ) 72 + O30 = self.addSwitch( 'LSVGNV02', dpid='0000ffffffffff1e', annotations=o30ann, cls=LINCSwitch )
73 o31ann = { "latitude":38.249167, "longitude": -85.760833, "optical.regens": 0 } 73 o31ann = { "latitude":38.249167, "longitude": -85.760833, "optical.regens": 0 }
74 - O31 = self.addSwitch( 'LSVLKYCS', dpid='0000ffffffffff1f', annotations=o31ann, cls=OpticalSwitch ) 74 + O31 = self.addSwitch( 'LSVLKYCS', dpid='0000ffffffffff1f', annotations=o31ann, cls=LINCSwitch )
75 o32ann = { "latitude": 34.740833, "longitude": -92.271942, "optical.regens": 2 } 75 o32ann = { "latitude": 34.740833, "longitude": -92.271942, "optical.regens": 2 }
76 - O32 = self.addSwitch( 'LTRKARFR', dpid='0000ffffffffff20', annotations=o32ann, cls=OpticalSwitch ) 76 + O32 = self.addSwitch( 'LTRKARFR', dpid='0000ffffffffff20', annotations=o32ann, cls=LINCSwitch )
77 o33ann = { "latitude": 25.779167, "longitude": -80.195, "optical.regens": 0 } 77 o33ann = { "latitude": 25.779167, "longitude": -80.195, "optical.regens": 0 }
78 - O33 = self.addSwitch( 'MIAMFLAC', dpid='0000ffffffffff21', annotations=o33ann, cls=OpticalSwitch ) 78 + O33 = self.addSwitch( 'MIAMFLAC', dpid='0000ffffffffff21', annotations=o33ann, cls=LINCSwitch )
79 o34ann = { "latitude": 43.037224, "longitude": -87.922501, "optical.regens": 0 } 79 o34ann = { "latitude": 43.037224, "longitude": -87.922501, "optical.regens": 0 }
80 - O34 = self.addSwitch( 'MILWWIHE', dpid='0000ffffffffff22', annotations=o34ann, cls=OpticalSwitch ) 80 + O34 = self.addSwitch( 'MILWWIHE', dpid='0000ffffffffff22', annotations=o34ann, cls=LINCSwitch )
81 o35ann = { "latitude": 35.145158, "longitude": -90.048058, "optical.regens": 0 } 81 o35ann = { "latitude": 35.145158, "longitude": -90.048058, "optical.regens": 0 }
82 - O35 = self.addSwitch( 'MMPHTNMA', dpid='0000ffffffffff23', annotations=o35ann, cls=OpticalSwitch ) 82 + O35 = self.addSwitch( 'MMPHTNMA', dpid='0000ffffffffff23', annotations=o35ann, cls=LINCSwitch )
83 o36ann = { "latitude": 44.977365, "longitude": -93.26718, "optical.regens": 0 } 83 o36ann = { "latitude": 44.977365, "longitude": -93.26718, "optical.regens": 0 }
84 - O36 = self.addSwitch( 'MPLSMNDT', dpid='0000ffffffffff24', annotations=o36ann, cls=OpticalSwitch ) # MPLSMNDT Connected to packet node 84 + O36 = self.addSwitch( 'MPLSMNDT', dpid='0000ffffffffff24', annotations=o36ann, cls=LINCSwitch ) # MPLSMNDT Connected to packet node
85 o37ann = { "latitude": 36.853333, "longitude": -76.29, "optical.regens": 0 } 85 o37ann = { "latitude": 36.853333, "longitude": -76.29, "optical.regens": 0 }
86 - O37 = self.addSwitch( 'NRFLVABS', dpid='0000ffffffffff25', annotations=o37ann, cls=OpticalSwitch ) 86 + O37 = self.addSwitch( 'NRFLVABS', dpid='0000ffffffffff25', annotations=o37ann, cls=LINCSwitch )
87 o38ann = { "latitude": 36.163955, "longitude": -86.775558, "optical.regens": 0 } 87 o38ann = { "latitude": 36.163955, "longitude": -86.775558, "optical.regens": 0 }
88 - O38 = self.addSwitch( 'NSVLTNMT', dpid='0000ffffffffff26', annotations=o38ann, cls=OpticalSwitch ) 88 + O38 = self.addSwitch( 'NSVLTNMT', dpid='0000ffffffffff26', annotations=o38ann, cls=LINCSwitch )
89 o39ann = { "latitude": 29.949806, "longitude": -90.07222, "optical.regens": 0 } 89 o39ann = { "latitude": 29.949806, "longitude": -90.07222, "optical.regens": 0 }
90 - O39 = self.addSwitch( 'NWORLAMA', dpid='0000ffffffffff27', annotations=o39ann, cls=OpticalSwitch ) 90 + O39 = self.addSwitch( 'NWORLAMA', dpid='0000ffffffffff27', annotations=o39ann, cls=LINCSwitch )
91 o40ann = { "latitude": 40.734408, "longitude": -74.177978, "optical.regens": 0 } 91 o40ann = { "latitude": 40.734408, "longitude": -74.177978, "optical.regens": 0 }
92 - O40 = self.addSwitch( 'NWRKNJ02', dpid='0000ffffffffff28', annotations=o40ann, cls=OpticalSwitch ) # NWRKNJ02 Connected to packet node 92 + O40 = self.addSwitch( 'NWRKNJ02', dpid='0000ffffffffff28', annotations=o40ann, cls=LINCSwitch ) # NWRKNJ02 Connected to packet node
93 o41ann = { "latitude": 40.767497, "longitude": -73.989713, "optical.regens": 0 } 93 o41ann = { "latitude": 40.767497, "longitude": -73.989713, "optical.regens": 0 }
94 - O41 = self.addSwitch( 'NYCMNY54', dpid='0000ffffffffff29', annotations=o41ann, cls=OpticalSwitch ) 94 + O41 = self.addSwitch( 'NYCMNY54', dpid='0000ffffffffff29', annotations=o41ann, cls=LINCSwitch )
95 o42ann = { "latitude": 35.470833, "longitude": -97.515274, "optical.regens": 0 } 95 o42ann = { "latitude": 35.470833, "longitude": -97.515274, "optical.regens": 0 }
96 - O42 = self.addSwitch( 'OKCYOKCE', dpid='0000ffffffffff2a', annotations=o42ann, cls=OpticalSwitch ) 96 + O42 = self.addSwitch( 'OKCYOKCE', dpid='0000ffffffffff2a', annotations=o42ann, cls=LINCSwitch )
97 o43ann = { "latitude": 37.805556, "longitude": -122.268889, "optical.regens": 2 } 97 o43ann = { "latitude": 37.805556, "longitude": -122.268889, "optical.regens": 2 }
98 - O43 = self.addSwitch( 'OKLDCA03', dpid='0000ffffffffff2b', annotations=o43ann, cls=OpticalSwitch ) 98 + O43 = self.addSwitch( 'OKLDCA03', dpid='0000ffffffffff2b', annotations=o43ann, cls=LINCSwitch )
99 o44ann = { "latitude": 41.259167, "longitude":-95.940277, "optical.regens": 0 } 99 o44ann = { "latitude": 41.259167, "longitude":-95.940277, "optical.regens": 0 }
100 - O44 = self.addSwitch( 'OMAHNENW', dpid='0000ffffffffff2c', annotations=o44ann, cls=OpticalSwitch ) 100 + O44 = self.addSwitch( 'OMAHNENW', dpid='0000ffffffffff2c', annotations=o44ann, cls=LINCSwitch )
101 o45ann = { "latitude": 28.543279, "longitude": -81.377502, "optical.regens": 0 } 101 o45ann = { "latitude": 28.543279, "longitude": -81.377502, "optical.regens": 0 }
102 - O45 = self.addSwitch( 'ORLDFLMA', dpid='0000ffffffffff2d', annotations=o45ann, cls=OpticalSwitch ) # ORLDFLMA Connected to packet node 102 + O45 = self.addSwitch( 'ORLDFLMA', dpid='0000ffffffffff2d', annotations=o45ann, cls=LINCSwitch ) # ORLDFLMA Connected to packet node
103 o46ann = { "latitude": 39.946446, "longitude": -75.184139, "optical.regens": 0 } 103 o46ann = { "latitude": 39.946446, "longitude": -75.184139, "optical.regens": 0 }
104 - O46 = self.addSwitch( 'PHLAPASL', dpid='0000ffffffffff2e', annotations=o46ann, cls=OpticalSwitch ) 104 + O46 = self.addSwitch( 'PHLAPASL', dpid='0000ffffffffff2e', annotations=o46ann, cls=LINCSwitch )
105 o47ann = { "latitude": 33.450361, "longitude": -112.07709, "optical.regens": 0 } 105 o47ann = { "latitude": 33.450361, "longitude": -112.07709, "optical.regens": 0 }
106 - O47 = self.addSwitch( 'PHNXAZMA', dpid='0000ffffffffff2f', annotations=o47ann, cls=OpticalSwitch ) # PHNXAZMA Connected to packet node 106 + O47 = self.addSwitch( 'PHNXAZMA', dpid='0000ffffffffff2f', annotations=o47ann, cls=LINCSwitch ) # PHNXAZMA Connected to packet node
107 o48ann = { "latitude":40.441387, "longitude": -79.995552, "optical.regens": 0 } 107 o48ann = { "latitude":40.441387, "longitude": -79.995552, "optical.regens": 0 }
108 - O48 = self.addSwitch( 'PITBPADG', dpid='0000ffffffffff30', annotations=o48ann, cls=OpticalSwitch ) 108 + O48 = self.addSwitch( 'PITBPADG', dpid='0000ffffffffff30', annotations=o48ann, cls=LINCSwitch )
109 o49ann = { "latitude":41.818889, "longitude": -71.415278, "optical.regens": 0 } 109 o49ann = { "latitude":41.818889, "longitude": -71.415278, "optical.regens": 0 }
110 - O49 = self.addSwitch( 'PRVDRIGR', dpid='0000ffffffffff31', annotations=o49ann, cls=OpticalSwitch ) 110 + O49 = self.addSwitch( 'PRVDRIGR', dpid='0000ffffffffff31', annotations=o49ann, cls=LINCSwitch )
111 o50ann = { "latitude": 45.522499, "longitude": -122.678055, "optical.regens": 2 } 111 o50ann = { "latitude": 45.522499, "longitude": -122.678055, "optical.regens": 2 }
112 - O50 = self.addSwitch( 'PTLDOR62', dpid='0000ffffffffff32', annotations=o50ann, cls=OpticalSwitch ) 112 + O50 = self.addSwitch( 'PTLDOR62', dpid='0000ffffffffff32', annotations=o50ann, cls=LINCSwitch )
113 o51ann = { "latitude": 37.540752, "longitude": -77.436096, "optical.regens": 0 } 113 o51ann = { "latitude": 37.540752, "longitude": -77.436096, "optical.regens": 0 }
114 - O51 = self.addSwitch( 'RCMDVAGR', dpid='0000ffffffffff33', annotations=o51ann, cls=OpticalSwitch ) 114 + O51 = self.addSwitch( 'RCMDVAGR', dpid='0000ffffffffff33', annotations=o51ann, cls=LINCSwitch )
115 o52ann = { "latitude": 35.779656, "longitude": -78.640831, "optical.regens": 0 } 115 o52ann = { "latitude": 35.779656, "longitude": -78.640831, "optical.regens": 0 }
116 - O52 = self.addSwitch( 'RLGHNCMO', dpid='0000ffffffffff34', annotations=o52ann, cls=OpticalSwitch ) 116 + O52 = self.addSwitch( 'RLGHNCMO', dpid='0000ffffffffff34', annotations=o52ann, cls=LINCSwitch )
117 o53ann = { "latitude": 43.157222, "longitude": -77.616389, "optical.regens": 0 } 117 o53ann = { "latitude": 43.157222, "longitude": -77.616389, "optical.regens": 0 }
118 - O53 = self.addSwitch( 'ROCHNYXA', dpid='0000ffffffffff35', annotations=o53ann, cls=OpticalSwitch ) # ROCHNYXA Connected to packet node 118 + O53 = self.addSwitch( 'ROCHNYXA', dpid='0000ffffffffff35', annotations=o53ann, cls=LINCSwitch ) # ROCHNYXA Connected to packet node
119 o54ann = { "latitude": 38.578609, "longitude": -121.487221, "optical.regens": 0 } 119 o54ann = { "latitude": 38.578609, "longitude": -121.487221, "optical.regens": 0 }
120 - O54 = self.addSwitch( 'SCRMCA01', dpid='0000ffffffffff36', annotations=o54ann, cls=OpticalSwitch ) 120 + O54 = self.addSwitch( 'SCRMCA01', dpid='0000ffffffffff36', annotations=o54ann, cls=LINCSwitch )
121 o55ann = { "latitude": 41.415278, "longitude": -75.649167, "optical.regens": 0 } 121 o55ann = { "latitude": 41.415278, "longitude": -75.649167, "optical.regens": 0 }
122 - O55 = self.addSwitch( 'SCTNPA01', dpid='0000ffffffffff37', annotations=o55ann, cls=OpticalSwitch ) 122 + O55 = self.addSwitch( 'SCTNPA01', dpid='0000ffffffffff37', annotations=o55ann, cls=LINCSwitch )
123 o56ann = { "latitude": 40.767776, "longitude": -111.888336, "optical.regens": 0 } 123 o56ann = { "latitude": 40.767776, "longitude": -111.888336, "optical.regens": 0 }
124 - O56 = self.addSwitch( 'SLKCUTMA', dpid='0000ffffffffff38', annotations=o56ann, cls=OpticalSwitch ) 124 + O56 = self.addSwitch( 'SLKCUTMA', dpid='0000ffffffffff38', annotations=o56ann, cls=LINCSwitch )
125 o57ann = { "latitude": 29.429445, "longitude": -98.488892, "optical.regens": 0 } 125 o57ann = { "latitude": 29.429445, "longitude": -98.488892, "optical.regens": 0 }
126 - O57 = self.addSwitch( 'SNANTXCA', dpid='0000ffffffffff39', annotations=o57ann, cls=OpticalSwitch ) # SNANTXCA Connected to packet node 126 + O57 = self.addSwitch( 'SNANTXCA', dpid='0000ffffffffff39', annotations=o57ann, cls=LINCSwitch ) # SNANTXCA Connected to packet node
127 o58ann = { "latitude": 34.418889, "longitude": -119.7, "optical.regens": 0 } 127 o58ann = { "latitude": 34.418889, "longitude": -119.7, "optical.regens": 0 }
128 - O58 = self.addSwitch( 'SNBBCA01', dpid='0000ffffffffff3a', annotations=o58ann, cls=OpticalSwitch ) 128 + O58 = self.addSwitch( 'SNBBCA01', dpid='0000ffffffffff3a', annotations=o58ann, cls=LINCSwitch )
129 o59ann = { "latitude":32.746944, "longitude": -117.158611, "optical.regens": 0 } 129 o59ann = { "latitude":32.746944, "longitude": -117.158611, "optical.regens": 0 }
130 - O59 = self.addSwitch( 'SNDGCA02', dpid='0000ffffffffff3b', annotations=o59ann, cls=OpticalSwitch ) 130 + O59 = self.addSwitch( 'SNDGCA02', dpid='0000ffffffffff3b', annotations=o59ann, cls=LINCSwitch )
131 o60ann = { "latitude":37.785143, "longitude": -122.397263, "optical.regens": 0 } 131 o60ann = { "latitude":37.785143, "longitude": -122.397263, "optical.regens": 0 }
132 - O60 = self.addSwitch( 'SNFCCA21', dpid='0000ffffffffff3c', annotations=o60ann, cls=OpticalSwitch ) 132 + O60 = self.addSwitch( 'SNFCCA21', dpid='0000ffffffffff3c', annotations=o60ann, cls=LINCSwitch )
133 o61ann = { "latitude": 37.333333, "longitude": -121.892778, "optical.regens": 0 } 133 o61ann = { "latitude": 37.333333, "longitude": -121.892778, "optical.regens": 0 }
134 - O61 = self.addSwitch( 'SNJSCA02', dpid='0000ffffffffff3d', annotations=o61ann, cls=OpticalSwitch ) # SNJSCA02 Connected to packet node 134 + O61 = self.addSwitch( 'SNJSCA02', dpid='0000ffffffffff3d', annotations=o61ann, cls=LINCSwitch ) # SNJSCA02 Connected to packet node
135 o62ann = { "latitude": 39.795278, "longitude": -89.649444, "optical.regens": 0 } 135 o62ann = { "latitude": 39.795278, "longitude": -89.649444, "optical.regens": 0 }
136 - O62 = self.addSwitch( 'SPFDILSD', dpid='0000ffffffffff3e', annotations=o62ann, cls=OpticalSwitch ) 136 + O62 = self.addSwitch( 'SPFDILSD', dpid='0000ffffffffff3e', annotations=o62ann, cls=LINCSwitch )
137 o63ann = { "latitude": 47.654724, "longitude": -117.419167, "optical.regens": 0 } 137 o63ann = { "latitude": 47.654724, "longitude": -117.419167, "optical.regens": 0 }
138 - O63 = self.addSwitch( 'SPKNWA01', dpid='0000ffffffffff3f', annotations=o63ann, cls=OpticalSwitch ) 138 + O63 = self.addSwitch( 'SPKNWA01', dpid='0000ffffffffff3f', annotations=o63ann, cls=LINCSwitch )
139 o64ann = { "latitude": 38.633335, "longitude": -90.215279, "optical.regens": 0 } 139 o64ann = { "latitude": 38.633335, "longitude": -90.215279, "optical.regens": 0 }
140 - O64 = self.addSwitch( 'STLSMO09', dpid='0000ffffffffff40', annotations=o64ann, cls=OpticalSwitch ) 140 + O64 = self.addSwitch( 'STLSMO09', dpid='0000ffffffffff40', annotations=o64ann, cls=LINCSwitch )
141 o65ann = { "latitude": 47.606945, "longitude": -122.333336, "optical.regens": 0 } 141 o65ann = { "latitude": 47.606945, "longitude": -122.333336, "optical.regens": 0 }
142 - O65 = self.addSwitch( 'STTLWA06', dpid='0000ffffffffff41', annotations=o65ann, cls=OpticalSwitch ) 142 + O65 = self.addSwitch( 'STTLWA06', dpid='0000ffffffffff41', annotations=o65ann, cls=LINCSwitch )
143 o66ann = { "latitude": 43.049444, "longitude": -76.1475, "optical.regens": 3 } 143 o66ann = { "latitude": 43.049444, "longitude": -76.1475, "optical.regens": 3 }
144 - O66 = self.addSwitch( 'SYRCNYSU', dpid='0000ffffffffff42', annotations=o66ann, cls=OpticalSwitch ) 144 + O66 = self.addSwitch( 'SYRCNYSU', dpid='0000ffffffffff42', annotations=o66ann, cls=LINCSwitch )
145 o67ann = { "latitude": 28.0225, "longitude": -82.522778, "optical.regens": 0 } 145 o67ann = { "latitude": 28.0225, "longitude": -82.522778, "optical.regens": 0 }
146 - O67 = self.addSwitch( 'TAMQFLFN', dpid='0000ffffffffff43', annotations=o67ann, cls=OpticalSwitch ) 146 + O67 = self.addSwitch( 'TAMQFLFN', dpid='0000ffffffffff43', annotations=o67ann, cls=LINCSwitch )
147 o68ann = { "latitude": 32.224444, "longitude": -110.968333, "optical.regens": 0 } 147 o68ann = { "latitude": 32.224444, "longitude": -110.968333, "optical.regens": 0 }
148 - O68 = self.addSwitch( 'TCSNAZMA', dpid='0000ffffffffff44', annotations=o68ann, cls=OpticalSwitch ) 148 + O68 = self.addSwitch( 'TCSNAZMA', dpid='0000ffffffffff44', annotations=o68ann, cls=LINCSwitch )
149 o69ann = { "latitude": 30.456389, "longitude": -84.290833, "optical.regens": 0 } 149 o69ann = { "latitude": 30.456389, "longitude": -84.290833, "optical.regens": 0 }
150 - O69 = self.addSwitch( 'TLHSFLAT', dpid='0000ffffffffff45', annotations=o69ann, cls=OpticalSwitch ) 150 + O69 = self.addSwitch( 'TLHSFLAT', dpid='0000ffffffffff45', annotations=o69ann, cls=LINCSwitch )
151 o70ann = { "latitude": 41.65, "longitude": -83.538056, "optical.regens": 2 } 151 o70ann = { "latitude": 41.65, "longitude": -83.538056, "optical.regens": 2 }
152 - O70 = self.addSwitch( 'TOLDOH21', dpid='0000ffffffffff46', annotations=o70ann, cls=OpticalSwitch ) 152 + O70 = self.addSwitch( 'TOLDOH21', dpid='0000ffffffffff46', annotations=o70ann, cls=LINCSwitch )
153 o71ann = { "latitude": 36.151669, "longitude": -95.985832, "optical.regens": 0 } 153 o71ann = { "latitude": 36.151669, "longitude": -95.985832, "optical.regens": 0 }
154 - O71 = self.addSwitch( 'TULSOKTB', dpid='0000ffffffffff47', annotations=o71ann, cls=OpticalSwitch ) 154 + O71 = self.addSwitch( 'TULSOKTB', dpid='0000ffffffffff47', annotations=o71ann, cls=LINCSwitch )
155 o72ann = { "latitude": 38.88306 , "longitude": -77.01028, "optical.regens": 0 } 155 o72ann = { "latitude": 38.88306 , "longitude": -77.01028, "optical.regens": 0 }
156 - O72 = self.addSwitch( 'WASHDCSW', dpid='0000ffffffffff48', annotations=o72ann, cls=OpticalSwitch ) # WASHDCSW Connected to packet node 156 + O72 = self.addSwitch( 'WASHDCSW', dpid='0000ffffffffff48', annotations=o72ann, cls=LINCSwitch ) # WASHDCSW Connected to packet node
157 o73ann = { "latitude": 39.739167, "longitude": -75.553889, "optical.regens": 0 } 157 o73ann = { "latitude": 39.739167, "longitude": -75.553889, "optical.regens": 0 }
158 - O73 = self.addSwitch( 'WLMGDE01', dpid='0000ffffffffff49', annotations=o73ann, cls=OpticalSwitch ) 158 + O73 = self.addSwitch( 'WLMGDE01', dpid='0000ffffffffff49', annotations=o73ann, cls=LINCSwitch )
159 o74ann = { "latitude": 26.709391, "longitude": -80.05278, "optical.regens": 0 } 159 o74ann = { "latitude": 26.709391, "longitude": -80.05278, "optical.regens": 0 }
160 - O74 = self.addSwitch( 'WPBHFLAN', dpid='0000ffffffffff4a', annotations=o74ann, cls=OpticalSwitch ) 160 + O74 = self.addSwitch( 'WPBHFLAN', dpid='0000ffffffffff4a', annotations=o74ann, cls=LINCSwitch )
161 o75ann = { "latitude": 29.57, "longitude": -96.7, "optical.regens": 0 } 161 o75ann = { "latitude": 29.57, "longitude": -96.7, "optical.regens": 0 }
162 - O75 = self.addSwitch( 'AUSTTXGR', dpid='0000ffffffffff4b', annotations=o75ann, cls=OpticalSwitch ) 162 + O75 = self.addSwitch( 'AUSTTXGR', dpid='0000ffffffffff4b', annotations=o75ann, cls=LINCSwitch )
163 #o25ann = { "latitude": 29.748333, "longitude": -95.36528, "optical.regens": 0 } 163 #o25ann = { "latitude": 29.748333, "longitude": -95.36528, "optical.regens": 0 }
164 #o57ann = { "latitude": 29.429445, "longitude": -98.488892, "optical.regens": 0 } 164 #o57ann = { "latitude": 29.429445, "longitude": -98.488892, "optical.regens": 0 }
165 165
...@@ -188,162 +188,162 @@ class BigOpticalTopo( Topo ): ...@@ -188,162 +188,162 @@ class BigOpticalTopo( Topo ):
188 188
189 189
190 # Optical Links between the ROADMs (although Distance is not used; we should keep these for future reference) 190 # Optical Links between the ROADMs (although Distance is not used; we should keep these for future reference)
191 - self.addLink( O1, O18, port1=100, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 334, "durable": "true" }, cls=OpticalLink ) # ABLNTXRO DLLSTXTL 191 + self.addLink( O1, O18, port1=100, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 334, "durable": "true" }, cls=LINCLink ) # ABLNTXRO DLLSTXTL
192 - self.addLink( O1, O21, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 768, "durable": "true" }, cls=OpticalLink ) # ABLNTXRO ELPSTXMA 192 + self.addLink( O1, O21, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 768, "durable": "true" }, cls=LINCLink ) # ABLNTXRO ELPSTXMA
193 - self.addLink( O3, O16, port1=100, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 265, "durable": "true" }, cls=OpticalLink ) # ALBYNYSS CMBRMA01 193 + self.addLink( O3, O16, port1=100, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 265, "durable": "true" }, cls=LINCLink ) # ALBYNYSS CMBRMA01
194 - self.addLink( O3, O66, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 239, "durable": "true" }, cls=OpticalLink ) # ALBYNYSS SYRCNYSU 194 + self.addLink( O3, O66, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 239, "durable": "true" }, cls=LINCLink ) # ALBYNYSS SYRCNYSU
195 - self.addLink( O2, O18, port1=100, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1134, "durable": "true" }, cls=OpticalLink ) # ALBQNMMA DLLSTXTL 195 + self.addLink( O2, O18, port1=100, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1134, "durable": "true" }, cls=LINCLink ) # ALBQNMMA DLLSTXTL
196 - self.addLink( O2, O19, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 646, "durable": "true" }, cls=OpticalLink ) # ALBQNMMA DNVRCOMA 196 + self.addLink( O2, O19, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 646, "durable": "true" }, cls=LINCLink ) # ALBQNMMA DNVRCOMA
197 - self.addLink( O2, O21, port1=102, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 444, "durable": "true" }, cls=OpticalLink ) # ALBQNMMA ELPSTXMA 197 + self.addLink( O2, O21, port1=102, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 444, "durable": "true" }, cls=LINCLink ) # ALBQNMMA ELPSTXMA
198 - self.addLink( O2, O30, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 931, "durable": "true" }, cls=OpticalLink ) # ALBQNMMA LSVGNV02 198 + self.addLink( O2, O30, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 931, "durable": "true" }, cls=LINCLink ) # ALBQNMMA LSVGNV02
199 - self.addLink( O4, O8, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 271, "durable": "true" }, cls=OpticalLink ) # ATLNGATL BRHMALMT 199 + self.addLink( O4, O8, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 271, "durable": "true" }, cls=LINCLink ) # ATLNGATL BRHMALMT
200 - self.addLink( O4, O12, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 436, "durable": "true" }, cls=OpticalLink ) # ATLNGATL CHRLNCCA 200 + self.addLink( O4, O12, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 436, "durable": "true" }, cls=LINCLink ) # ATLNGATL CHRLNCCA
201 - self.addLink( O4, O26, port1=103, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 566, "durable": "true" }, cls=OpticalLink ) # ATLNGATL JCVLFLCL 201 + self.addLink( O4, O26, port1=103, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 566, "durable": "true" }, cls=LINCLink ) # ATLNGATL JCVLFLCL
202 - self.addLink( O75, O25, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 283, "durable": "true" }, cls=OpticalLink ) # AUSTTXGR HSTNTX01 202 + self.addLink( O75, O25, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 283, "durable": "true" }, cls=LINCLink ) # AUSTTXGR HSTNTX01
203 - self.addLink( O75, O57, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 141, "durable": "true" }, cls=OpticalLink ) # AUSTTXGR SNANTXCA 203 + self.addLink( O75, O57, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 141, "durable": "true" }, cls=LINCLink ) # AUSTTXGR SNANTXCA
204 - self.addLink( O7, O46, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 170, "durable": "true" }, cls=OpticalLink ) # BLTMMDCH PHLAPASL 204 + self.addLink( O7, O46, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 170, "durable": "true" }, cls=LINCLink ) # BLTMMDCH PHLAPASL
205 - self.addLink( O7, O48, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 378, "durable": "true" }, cls=OpticalLink ) # BLTMMDCH PITBPADG 205 + self.addLink( O7, O48, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 378, "durable": "true" }, cls=LINCLink ) # BLTMMDCH PITBPADG
206 - self.addLink( O7, O70, port1=103, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 68, "durable": "true" }, cls=OpticalLink ) # BLTMMDCH WASHDCSW 206 + self.addLink( O7, O70, port1=103, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 68, "durable": "true" }, cls=LINCLink ) # BLTMMDCH WASHDCSW
207 - self.addLink( O10, O25, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 491, "durable": "true" }, cls=OpticalLink ) # BTRGLAMA HSTNTX01 207 + self.addLink( O10, O25, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 491, "durable": "true" }, cls=LINCLink ) # BTRGLAMA HSTNTX01
208 - self.addLink( O10, O39, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 144, "durable": "true" }, cls=OpticalLink ) # BTRGLAMA NWORLAMA 208 + self.addLink( O10, O39, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 144, "durable": "true" }, cls=LINCLink ) # BTRGLAMA NWORLAMA
209 - self.addLink( O6, O9, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 724, "durable": "true" }, cls=OpticalLink ) # BLNGMTMA BSMRNDJC 209 + self.addLink( O6, O9, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 724, "durable": "true" }, cls=LINCLink ) # BLNGMTMA BSMRNDJC
210 - self.addLink( O6, O19, port1=102, port2=107, annotations={ "optical.wves": 80, "optical.type": "WDM", "optical.kms": 875, "durable": "true" }, cls=OpticalLink ) # BLNGMTMA DNVRCOMA 210 + self.addLink( O6, O19, port1=102, port2=107, annotations={ "optical.wves": 80, "optical.type": "WDM", "optical.kms": 875, "durable": "true" }, cls=LINCLink ) # BLNGMTMA DNVRCOMA
211 - self.addLink( O6, O63, port1=103, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 852, "durable": "true" }, cls=OpticalLink ) # BLNGMTMA SPKNWA01 211 + self.addLink( O6, O63, port1=103, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 852, "durable": "true" }, cls=LINCLink ) # BLNGMTMA SPKNWA01
212 - self.addLink( O8, O38, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 353, "durable": "true" }, cls=OpticalLink ) # BRHMALMT NSVLTNMT 212 + self.addLink( O8, O38, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 353, "durable": "true" }, cls=LINCLink ) # BRHMALMT NSVLTNMT
213 - self.addLink( O8, O39, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 602, "durable": "true" }, cls=OpticalLink ) # BRHMALMT NWORLAMA 213 + self.addLink( O8, O39, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 602, "durable": "true" }, cls=LINCLink ) # BRHMALMT NWORLAMA
214 - self.addLink( O9, O36, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 741, "durable": "true" }, cls=OpticalLink ) # BSMRNDJC MPLSMNDT 214 + self.addLink( O9, O36, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 741, "durable": "true" }, cls=LINCLink ) # BSMRNDJC MPLSMNDT
215 - self.addLink( O16, O49, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 80, "durable": "true" }, cls=OpticalLink ) # CMBRMA01 PRVDRIGR 215 + self.addLink( O16, O49, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 80, "durable": "true" }, cls=LINCLink ) # CMBRMA01 PRVDRIGR
216 - self.addLink( O5, O14, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 333, "durable": "true" }, cls=OpticalLink ) # BFLONYFR CLEVOH02 216 + self.addLink( O5, O14, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 333, "durable": "true" }, cls=LINCLink ) # BFLONYFR CLEVOH02
217 - self.addLink( O5, O53, port1=104, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 128, "durable": "true" }, cls=OpticalLink ) # BFLONYFR ROCHNYXA 217 + self.addLink( O5, O53, port1=104, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 128, "durable": "true" }, cls=LINCLink ) # BFLONYFR ROCHNYXA
218 - self.addLink( O13, O26, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 368, "durable": "true" }, cls=OpticalLink ) # CHTNSCDT JCVLFLCL 218 + self.addLink( O13, O26, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 368, "durable": "true" }, cls=LINCLink ) # CHTNSCDT JCVLFLCL
219 - self.addLink( O13, O52, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 424, "durable": "true" }, cls=OpticalLink ) # CHTNSCDT RLGHNCMO 219 + self.addLink( O13, O52, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 424, "durable": "true" }, cls=LINCLink ) # CHTNSCDT RLGHNCMO
220 - self.addLink( O12, O23, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 160, "durable": "true" }, cls=OpticalLink ) # CHRLNCCA GNBONCEU 220 + self.addLink( O12, O23, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 160, "durable": "true" }, cls=LINCLink ) # CHRLNCCA GNBONCEU
221 - self.addLink( O11, O20, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 458, "durable": "true" }, cls=OpticalLink ) # CHCGILCL DTRTMIBA 221 + self.addLink( O11, O20, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 458, "durable": "true" }, cls=LINCLink ) # CHCGILCL DTRTMIBA
222 - self.addLink( O11, O34, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 156, "durable": "true" }, cls=OpticalLink ) # CHCGILCL MILWWIHE 222 + self.addLink( O11, O34, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 156, "durable": "true" }, cls=LINCLink ) # CHCGILCL MILWWIHE
223 - self.addLink( O11, O62, port1=103, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 344, "durable": "true" }, cls=OpticalLink ) # CHCGILCL SPFDILSD 223 + self.addLink( O11, O62, port1=103, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 344, "durable": "true" }, cls=LINCLink ) # CHCGILCL SPFDILSD
224 - self.addLink( O17, O15, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 194, "durable": "true" }, cls=OpticalLink ) # CNCNOHWS CLMBOH11 224 + self.addLink( O17, O15, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 194, "durable": "true" }, cls=LINCLink ) # CNCNOHWS CLMBOH11
225 - self.addLink( O17, O31, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 172, "durable": "true" }, cls=OpticalLink ) # CNCNOHWS LSVLKYCS 225 + self.addLink( O17, O31, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 172, "durable": "true" }, cls=LINCLink ) # CNCNOHWS LSVLKYCS
226 - self.addLink( O17, O72, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 779, "durable": "true" }, cls=OpticalLink ) # CNCNOHWS WASHDCSW 226 + self.addLink( O17, O72, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 779, "durable": "true" }, cls=LINCLink ) # CNCNOHWS WASHDCSW
227 - self.addLink( O14, O15, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 243, "durable": "true" }, cls=OpticalLink ) # CLEVOH02 CLMBOH11 227 + self.addLink( O14, O15, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 243, "durable": "true" }, cls=LINCLink ) # CLEVOH02 CLMBOH11
228 - self.addLink( O14, O70, port1=102, port2=101, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 185, "durable": "true" }, cls=OpticalLink ) # CLEVOH02 TOLDOH21 228 + self.addLink( O14, O70, port1=102, port2=101, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 185, "durable": "true" }, cls=LINCLink ) # CLEVOH02 TOLDOH21
229 - self.addLink( O15, O48, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 312, "durable": "true" }, cls=OpticalLink ) # CLMBOH11 PITBPADG 229 + self.addLink( O15, O48, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 312, "durable": "true" }, cls=LINCLink ) # CLMBOH11 PITBPADG
230 - self.addLink( O18, O25, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 437, "durable": "true" }, cls=OpticalLink ) # DLLSTXTL HSTNTX01 230 + self.addLink( O18, O25, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 437, "durable": "true" }, cls=LINCLink ) # DLLSTXTL HSTNTX01
231 - self.addLink( O18, O32, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 563, "durable": "true" }, cls=OpticalLink ) # DLLSTXTL LTRKARFR 231 + self.addLink( O18, O32, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 563, "durable": "true" }, cls=LINCLink ) # DLLSTXTL LTRKARFR
232 - self.addLink( O18, O42, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 365, "durable": "true" }, cls=OpticalLink ) # DLLSTXTL OKCYOKCE 232 + self.addLink( O18, O42, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 365, "durable": "true" }, cls=LINCLink ) # DLLSTXTL OKCYOKCE
233 - self.addLink( O19, O44, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 940, "durable": "true" }, cls=OpticalLink ) # DNVRCOMA OMAHNENW 233 + self.addLink( O19, O44, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 940, "durable": "true" }, cls=LINCLink ) # DNVRCOMA OMAHNENW
234 - self.addLink( O19, O56, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 714, "durable": "true" }, cls=OpticalLink ) # DNVRCOMA SLKCUTMA 234 + self.addLink( O19, O56, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 714, "durable": "true" }, cls=LINCLink ) # DNVRCOMA SLKCUTMA
235 - self.addLink( O20, O70, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 103, "durable": "true" }, cls=OpticalLink ) # DTRTMIBA TOLDOH21 235 + self.addLink( O20, O70, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 103, "durable": "true" }, cls=LINCLink ) # DTRTMIBA TOLDOH21
236 - self.addLink( O21, O57, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 969, "durable": "true" }, cls=OpticalLink ) # ELPSTXMA SNANTXCA 236 + self.addLink( O21, O57, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 969, "durable": "true" }, cls=LINCLink ) # ELPSTXMA SNANTXCA
237 - self.addLink( O21, O68, port1=102, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 511, "durable": "true" }, cls=OpticalLink ) # ELPSTXMA TCSNAZMA 237 + self.addLink( O21, O68, port1=102, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 511, "durable": "true" }, cls=LINCLink ) # ELPSTXMA TCSNAZMA
238 - self.addLink( O22, O31, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 505, "durable": "true" }, cls=OpticalLink ) # FRSNCA01 LSVGNV02 238 + self.addLink( O22, O31, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 505, "durable": "true" }, cls=LINCLink ) # FRSNCA01 LSVGNV02
239 - self.addLink( O22, O29, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 396, "durable": "true" }, cls=OpticalLink ) # FRSNCA01 LSANCA03 239 + self.addLink( O22, O29, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 396, "durable": "true" }, cls=LINCLink ) # FRSNCA01 LSANCA03
240 - self.addLink( O22, O42, port1=103, port2=108, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 298, "durable": "true" }, cls=OpticalLink ) # FRSNCA01 OKLDCA03 240 + self.addLink( O22, O42, port1=103, port2=108, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 298, "durable": "true" }, cls=LINCLink ) # FRSNCA01 OKLDCA03
241 - self.addLink( O23, O31, port1=101, port2=108, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 697, "durable": "true" }, cls=OpticalLink ) # GNBONCEU LSVLKYCS 241 + self.addLink( O23, O31, port1=101, port2=108, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 697, "durable": "true" }, cls=LINCLink ) # GNBONCEU LSVLKYCS
242 - self.addLink( O23, O52, port1=102, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 130, "durable": "true" }, cls=OpticalLink ) # GNBONCEU RLGHNCMO 242 + self.addLink( O23, O52, port1=102, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 130, "durable": "true" }, cls=LINCLink ) # GNBONCEU RLGHNCMO
243 - self.addLink( O23, O51, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 319, "durable": "true" }, cls=OpticalLink ) # GNBONCEU RCMDVAGR 243 + self.addLink( O23, O51, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 319, "durable": "true" }, cls=LINCLink ) # GNBONCEU RCMDVAGR
244 - self.addLink( O24, O28, port1=101, port2=108, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 185, "durable": "true" }, cls=OpticalLink ) # HRFRCT03 L_Island 244 + self.addLink( O24, O28, port1=101, port2=108, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 185, "durable": "true" }, cls=LINCLink ) # HRFRCT03 L_Island
245 - self.addLink( O24, O49, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 125, "durable": "true" }, cls=OpticalLink ) # HRFRCT03 PRVDRIGR 245 + self.addLink( O24, O49, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 125, "durable": "true" }, cls=LINCLink ) # HRFRCT03 PRVDRIGR
246 - self.addLink( O26, O45, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 238, "durable": "true" }, cls=OpticalLink ) # JCVLFLCL ORLDFLMA 246 + self.addLink( O26, O45, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 238, "durable": "true" }, cls=LINCLink ) # JCVLFLCL ORLDFLMA
247 - self.addLink( O27, O44, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 320, "durable": "true" }, cls=OpticalLink ) # KSCYMO09 OMAHNENW 247 + self.addLink( O27, O44, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 320, "durable": "true" }, cls=LINCLink ) # KSCYMO09 OMAHNENW
248 - self.addLink( O27, O64, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 457, "durable": "true" }, cls=OpticalLink ) # KSCYMO09 STLSMO09 248 + self.addLink( O27, O64, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 457, "durable": "true" }, cls=LINCLink ) # KSCYMO09 STLSMO09
249 - self.addLink( O27, O71, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 420, "durable": "true" }, cls=OpticalLink ) # KSCYMO09 TULSOKTB 249 + self.addLink( O27, O71, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 420, "durable": "true" }, cls=LINCLink ) # KSCYMO09 TULSOKTB
250 - self.addLink( O30, O47, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 494, "durable": "true" }, cls=OpticalLink ) # LSVGNV02 PHNXAZMA 250 + self.addLink( O30, O47, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 494, "durable": "true" }, cls=LINCLink ) # LSVGNV02 PHNXAZMA
251 - self.addLink( O30, O56, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 701, "durable": "true" }, cls=OpticalLink ) # LSVGNV02 SLKCUTMA 251 + self.addLink( O30, O56, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 701, "durable": "true" }, cls=LINCLink ) # LSVGNV02 SLKCUTMA
252 - self.addLink( O32, O35, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 249, "durable": "true" }, cls=OpticalLink ) # LTRKARFR MMPHTNMA 252 + self.addLink( O32, O35, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 249, "durable": "true" }, cls=LINCLink ) # LTRKARFR MMPHTNMA
253 - self.addLink( O28, O41, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 40, "durable": "true" }, cls=OpticalLink ) # L_Island NYCMNY54 253 + self.addLink( O28, O41, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 40, "durable": "true" }, cls=LINCLink ) # L_Island NYCMNY54
254 - self.addLink( O29, O59, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 212, "durable": "true" }, cls=OpticalLink ) # LSANCA03 SNDGCA02 254 + self.addLink( O29, O59, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 212, "durable": "true" }, cls=LINCLink ) # LSANCA03 SNDGCA02
255 - self.addLink( O29, O58, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 167, "durable": "true" }, cls=OpticalLink ) # LSANCA03 SNBBCA01 255 + self.addLink( O29, O58, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 167, "durable": "true" }, cls=LINCLink ) # LSANCA03 SNBBCA01
256 - self.addLink( O31, O38, port1=104, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 298, "durable": "true" }, cls=OpticalLink ) # LSVLKYCS NSVLTNMT 256 + self.addLink( O31, O38, port1=104, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 298, "durable": "true" }, cls=LINCLink ) # LSVLKYCS NSVLTNMT
257 - self.addLink( O31, O64, port1=102, port2=108, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 468, "durable": "true" }, cls=OpticalLink ) # LSVLKYCS STLSMO09 257 + self.addLink( O31, O64, port1=102, port2=108, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 468, "durable": "true" }, cls=LINCLink ) # LSVLKYCS STLSMO09
258 - self.addLink( O35, O38, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 380, "durable": "true" }, cls=OpticalLink ) # MMPHTNMA NSVLTNMT 258 + self.addLink( O35, O38, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 380, "durable": "true" }, cls=LINCLink ) # MMPHTNMA NSVLTNMT
259 - self.addLink( O33, O67, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 407, "durable": "true" }, cls=OpticalLink ) # MIAMFLAC TAMQFLFN 259 + self.addLink( O33, O67, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 407, "durable": "true" }, cls=LINCLink ) # MIAMFLAC TAMQFLFN
260 - self.addLink( O33, O74, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 125, "durable": "true" }, cls=OpticalLink ) # MIAMFLAC WPBHFLAN 260 + self.addLink( O33, O74, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 125, "durable": "true" }, cls=LINCLink ) # MIAMFLAC WPBHFLAN
261 - self.addLink( O34, O36, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 574, "durable": "true" }, cls=OpticalLink ) # MILWWIHE MPLSMNDT 261 + self.addLink( O34, O36, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 574, "durable": "true" }, cls=LINCLink ) # MILWWIHE MPLSMNDT
262 - self.addLink( O36, O44, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 560, "durable": "true" }, cls=OpticalLink ) # MPLSMNDT OMAHNENW 262 + self.addLink( O36, O44, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 560, "durable": "true" }, cls=LINCLink ) # MPLSMNDT OMAHNENW
263 - self.addLink( O39, O69, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 670, "durable": "true" }, cls=OpticalLink ) # NWORLAMA TLHSFLAT 263 + self.addLink( O39, O69, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 670, "durable": "true" }, cls=LINCLink ) # NWORLAMA TLHSFLAT
264 - self.addLink( O41, O40, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 19, "durable": "true" }, cls=OpticalLink ) # NYCMNY54 NWRKNJ02 264 + self.addLink( O41, O40, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 19, "durable": "true" }, cls=LINCLink ) # NYCMNY54 NWRKNJ02
265 - self.addLink( O41, O55, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 187, "durable": "true" }, cls=OpticalLink ) # NYCMNY54 SCTNPA01 265 + self.addLink( O41, O55, port1=102, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 187, "durable": "true" }, cls=LINCLink ) # NYCMNY54 SCTNPA01
266 - self.addLink( O41, O73, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 210, "durable": "true" }, cls=OpticalLink ) # NYCMNY54 WLMGDE01 266 + self.addLink( O41, O73, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 210, "durable": "true" }, cls=LINCLink ) # NYCMNY54 WLMGDE01
267 - self.addLink( O40, O46, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 146, "durable": "true" }, cls=OpticalLink ) # NWRKNJ02 PHLAPASL 267 + self.addLink( O40, O46, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 146, "durable": "true" }, cls=LINCLink ) # NWRKNJ02 PHLAPASL
268 - self.addLink( O37, O52, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 290, "durable": "true" }, cls=OpticalLink ) # NRFLVABS RLGHNCMO 268 + self.addLink( O37, O52, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 290, "durable": "true" }, cls=LINCLink ) # NRFLVABS RLGHNCMO
269 - self.addLink( O37, O73, port1=102, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 392, "durable": "true" }, cls=OpticalLink ) # NRFLVABS WLMGDE01 269 + self.addLink( O37, O73, port1=102, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 392, "durable": "true" }, cls=LINCLink ) # NRFLVABS WLMGDE01
270 - self.addLink( O43, O54, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 131, "durable": "true" }, cls=OpticalLink ) # OKLDCA03 SCRMCA01 270 + self.addLink( O43, O54, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 131, "durable": "true" }, cls=LINCLink ) # OKLDCA03 SCRMCA01
271 - self.addLink( O43, O56, port1=102, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1142, "durable": "true" }, cls=OpticalLink ) # OKLDCA03 SLKCUTMA 271 + self.addLink( O43, O56, port1=102, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1142, "durable": "true" }, cls=LINCLink ) # OKLDCA03 SLKCUTMA
272 - self.addLink( O43, O60, port1=103, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 13, "durable": "true" }, cls=OpticalLink ) # OKLDCA03 SNFCCA21 272 + self.addLink( O43, O60, port1=103, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 13, "durable": "true" }, cls=LINCLink ) # OKLDCA03 SNFCCA21
273 - self.addLink( O42, O71, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 188, "durable": "true" }, cls=OpticalLink ) # OKCYOKCE TULSOKTB 273 + self.addLink( O42, O71, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 188, "durable": "true" }, cls=LINCLink ) # OKCYOKCE TULSOKTB
274 - self.addLink( O45, O74, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 290, "durable": "true" }, cls=OpticalLink ) # ORLDFLMA WPBHFLAN 274 + self.addLink( O45, O74, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 290, "durable": "true" }, cls=LINCLink ) # ORLDFLMA WPBHFLAN
275 - self.addLink( O46, O55, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 201, "durable": "true" }, cls=OpticalLink ) # PHLAPASL SCTNPA01 275 + self.addLink( O46, O55, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 201, "durable": "true" }, cls=LINCLink ) # PHLAPASL SCTNPA01
276 - self.addLink( O47, O59, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 575, "durable": "true" }, cls=OpticalLink ) # PHNXAZMA SNDGCA02 276 + self.addLink( O47, O59, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 575, "durable": "true" }, cls=LINCLink ) # PHNXAZMA SNDGCA02
277 - self.addLink( O47, O68, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 205, "durable": "true" }, cls=OpticalLink ) # PHNXAZMA TCSNAZMA 277 + self.addLink( O47, O68, port1=102, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 205, "durable": "true" }, cls=LINCLink ) # PHNXAZMA TCSNAZMA
278 - self.addLink( O48, O55, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 457, "durable": "true" }, cls=OpticalLink ) # PITBPADG SCTNPA01 278 + self.addLink( O48, O55, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 457, "durable": "true" }, cls=LINCLink ) # PITBPADG SCTNPA01
279 - self.addLink( O50, O54, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 934, "durable": "true" }, cls=OpticalLink ) # PTLDOR62 SCRMCA01 279 + self.addLink( O50, O54, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 934, "durable": "true" }, cls=LINCLink ) # PTLDOR62 SCRMCA01
280 - self.addLink( O50, O56, port1=102, port2=108, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1225, "durable": "true" }, cls=OpticalLink ) # PTLDOR62 SLKCUTMA 280 + self.addLink( O50, O56, port1=102, port2=108, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 1225, "durable": "true" }, cls=LINCLink ) # PTLDOR62 SLKCUTMA
281 - self.addLink( O50, O65, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 280, "durable": "true" }, cls=OpticalLink ) # PTLDOR62 STTLWA06 281 + self.addLink( O50, O65, port1=103, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 280, "durable": "true" }, cls=LINCLink ) # PTLDOR62 STTLWA06
282 - self.addLink( O51, O72, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 184, "durable": "true" }, cls=OpticalLink ) # RCMDVAGR WASHDCSW 282 + self.addLink( O51, O72, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 184, "durable": "true" }, cls=LINCLink ) # RCMDVAGR WASHDCSW
283 - self.addLink( O53, O66, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 143, "durable": "true" }, cls=OpticalLink ) # ROCHNYXA SYRCNYSU 283 + self.addLink( O53, O66, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 143, "durable": "true" }, cls=LINCLink ) # ROCHNYXA SYRCNYSU
284 - self.addLink( O60, O61, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 80., "durable": "true" }, cls=OpticalLink ) # SNFCCA21 SNJSCA02 284 + self.addLink( O60, O61, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 80., "durable": "true" }, cls=LINCLink ) # SNFCCA21 SNJSCA02
285 - self.addLink( O61, O58, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 455, "durable": "true" }, cls=OpticalLink ) # SNJSCA02 SNBBCA01 285 + self.addLink( O61, O58, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 455, "durable": "true" }, cls=LINCLink ) # SNJSCA02 SNBBCA01
286 - self.addLink( O55, O66, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 223, "durable": "true" }, cls=OpticalLink ) # SCTNPA01 SYRCNYSU 286 + self.addLink( O55, O66, port1=101, port2=105, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 223, "durable": "true" }, cls=LINCLink ) # SCTNPA01 SYRCNYSU
287 - self.addLink( O65, O63, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 442, "durable": "true" }, cls=OpticalLink ) # STTLWA06 SPKNWA01 287 + self.addLink( O65, O63, port1=101, port2=107, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 442, "durable": "true" }, cls=LINCLink ) # STTLWA06 SPKNWA01
288 - self.addLink( O62, O64, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 165, "durable": "true" }, cls=OpticalLink ) # SPFDILSD STLSMO09 288 + self.addLink( O62, O64, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 165, "durable": "true" }, cls=LINCLink ) # SPFDILSD STLSMO09
289 - self.addLink( O69, O67, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 384, "durable": "true" }, cls=OpticalLink ) # TLHSFLAT TAMQFLFN 289 + self.addLink( O69, O67, port1=101, port2=106, annotations={ "optical.waves": 80, "optical.type": "WDM", "optical.kms": 384, "durable": "true" }, cls=LINCLink ) # TLHSFLAT TAMQFLFN
290 290
291 # Packet/Optical cross connect links (this will be the tap interfaces) 291 # Packet/Optical cross connect links (this will be the tap interfaces)
292 - self.addLink( WASHDCSWR, O72, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 292 + self.addLink( WASHDCSWR, O72, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
293 - self.addLink( WASHDCSWR, O72, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 293 + self.addLink( WASHDCSWR, O72, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
294 - self.addLink( WASHDCSWR, O72, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 294 + self.addLink( WASHDCSWR, O72, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
295 - self.addLink( WASHDCSWR, O72, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 295 + self.addLink( WASHDCSWR, O72, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
296 - self.addLink( WASHDCSWR, O72, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 296 + self.addLink( WASHDCSWR, O72, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
297 - self.addLink( SNJSCA02R, O61, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 297 + self.addLink( SNJSCA02R, O61, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
298 - self.addLink( SNJSCA02R, O61, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 298 + self.addLink( SNJSCA02R, O61, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
299 - self.addLink( SNJSCA02R, O61, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 299 + self.addLink( SNJSCA02R, O61, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
300 - self.addLink( SNJSCA02R, O61, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 300 + self.addLink( SNJSCA02R, O61, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
301 - self.addLink( SNJSCA02R, O61, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 301 + self.addLink( SNJSCA02R, O61, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
302 - self.addLink( SNANTXCAR, O57, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 302 + self.addLink( SNANTXCAR, O57, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
303 - self.addLink( SNANTXCAR, O57, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 303 + self.addLink( SNANTXCAR, O57, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
304 - self.addLink( SNANTXCAR, O57, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 304 + self.addLink( SNANTXCAR, O57, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
305 - self.addLink( SNANTXCAR, O57, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 305 + self.addLink( SNANTXCAR, O57, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
306 - self.addLink( SNANTXCAR, O57, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 306 + self.addLink( SNANTXCAR, O57, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
307 - self.addLink( ROCHNYXAR, O53, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 307 + self.addLink( ROCHNYXAR, O53, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
308 - self.addLink( ROCHNYXAR, O53, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 308 + self.addLink( ROCHNYXAR, O53, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
309 - self.addLink( ROCHNYXAR, O53, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 309 + self.addLink( ROCHNYXAR, O53, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
310 - self.addLink( ROCHNYXAR, O53, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 310 + self.addLink( ROCHNYXAR, O53, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
311 - self.addLink( ROCHNYXAR, O53, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 311 + self.addLink( ROCHNYXAR, O53, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
312 - self.addLink( PHNXAZMAR, O47, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 312 + self.addLink( PHNXAZMAR, O47, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
313 - self.addLink( PHNXAZMAR, O47, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 313 + self.addLink( PHNXAZMAR, O47, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
314 - self.addLink( PHNXAZMAR, O47, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 314 + self.addLink( PHNXAZMAR, O47, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
315 - self.addLink( PHNXAZMAR, O47, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 315 + self.addLink( PHNXAZMAR, O47, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
316 - self.addLink( PHNXAZMAR, O47, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 316 + self.addLink( PHNXAZMAR, O47, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
317 - self.addLink( ORLDFLMAR, O45, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 317 + self.addLink( ORLDFLMAR, O45, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
318 - self.addLink( ORLDFLMAR, O45, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 318 + self.addLink( ORLDFLMAR, O45, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
319 - self.addLink( ORLDFLMAR, O45, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 319 + self.addLink( ORLDFLMAR, O45, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
320 - self.addLink( ORLDFLMAR, O45, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 320 + self.addLink( ORLDFLMAR, O45, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
321 - self.addLink( ORLDFLMAR, O45, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 321 + self.addLink( ORLDFLMAR, O45, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
322 - self.addLink( NWRKNJ02R, O40, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 322 + self.addLink( NWRKNJ02R, O40, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
323 - self.addLink( NWRKNJ02R, O40, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 323 + self.addLink( NWRKNJ02R, O40, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
324 - self.addLink( NWRKNJ02R, O40, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 324 + self.addLink( NWRKNJ02R, O40, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
325 - self.addLink( NWRKNJ02R, O40, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 325 + self.addLink( NWRKNJ02R, O40, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
326 - self.addLink( NWRKNJ02R, O40, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 326 + self.addLink( NWRKNJ02R, O40, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
327 - self.addLink( MPLSMNDTR, O36, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 327 + self.addLink( MPLSMNDTR, O36, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
328 - self.addLink( MPLSMNDTR, O36, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 328 + self.addLink( MPLSMNDTR, O36, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
329 - self.addLink( MPLSMNDTR, O36, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 329 + self.addLink( MPLSMNDTR, O36, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
330 - self.addLink( MPLSMNDTR, O36, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 330 + self.addLink( MPLSMNDTR, O36, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
331 - self.addLink( MPLSMNDTR, O36, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 331 + self.addLink( MPLSMNDTR, O36, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
332 - self.addLink( LSANCA03R, O29, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 332 + self.addLink( LSANCA03R, O29, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
333 - self.addLink( LSANCA03R, O29, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 333 + self.addLink( LSANCA03R, O29, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
334 - self.addLink( LSANCA03R, O29, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 334 + self.addLink( LSANCA03R, O29, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
335 - self.addLink( LSANCA03R, O29, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 335 + self.addLink( LSANCA03R, O29, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
336 - self.addLink( LSANCA03R, O29, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 336 + self.addLink( LSANCA03R, O29, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
337 - self.addLink( DLLSTXTLR, O18, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 337 + self.addLink( DLLSTXTLR, O18, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
338 - self.addLink( DLLSTXTLR, O18, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 338 + self.addLink( DLLSTXTLR, O18, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
339 - self.addLink( DLLSTXTLR, O18, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 339 + self.addLink( DLLSTXTLR, O18, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
340 - self.addLink( DLLSTXTLR, O18, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 340 + self.addLink( DLLSTXTLR, O18, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
341 - self.addLink( DLLSTXTLR, O18, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 341 + self.addLink( DLLSTXTLR, O18, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
342 - self.addLink( ATLNGATLR, O4, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 342 + self.addLink( ATLNGATLR, O4, port1=2, port2=10, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
343 - self.addLink( ATLNGATLR, O4, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 343 + self.addLink( ATLNGATLR, O4, port1=3, port2=11, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
344 - self.addLink( ATLNGATLR, O4, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 344 + self.addLink( ATLNGATLR, O4, port1=4, port2=12, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
345 - self.addLink( ATLNGATLR, O4, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 345 + self.addLink( ATLNGATLR, O4, port1=5, port2=13, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
346 - self.addLink( ATLNGATLR, O4, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=OpticalLink ) 346 + self.addLink( ATLNGATLR, O4, port1=6, port2=14, speed1=10000, annotations={ "bandwidth": 100000, "optical.type": "cross-connect", "durable": "true" }, cls=LINCLink )
347 347
348 348
349 # Attach hosts to the packet layer switches 349 # Attach hosts to the packet layer switches
...@@ -379,7 +379,7 @@ if __name__ == '__main__': ...@@ -379,7 +379,7 @@ if __name__ == '__main__':
379 if len( sys.argv ) >= 2: 379 if len( sys.argv ) >= 2:
380 controllers = sys.argv[1:] 380 controllers = sys.argv[1:]
381 else: 381 else:
382 - print 'Usage: ./opticalUtils.py (<Controller IP>)+' 382 + print 'Usage: sudo -E python opticalTestBig.py (<Controller IP>)+'
383 print 'Using localhost...\n' 383 print 'Using localhost...\n'
384 controllers = [ '127.0.0.1' ] 384 controllers = [ '127.0.0.1' ]
385 385
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
4 Notes: 4 Notes:
5 5
6 This file contains classes and methods useful for integrating LincOE with Mininet, 6 This file contains classes and methods useful for integrating LincOE with Mininet,
7 -such as startOE, stopOE, OpticalLink, and OpticalSwitch 7 +such as startOE, stopOE, LINCLink, and OpticalSwitch
8 8
9 - $ONOS_ROOT ust be set 9 - $ONOS_ROOT ust be set
10 - Need to run with sudo -E to preserve ONOS_ROOT env var 10 - Need to run with sudo -E to preserve ONOS_ROOT env var
...@@ -22,10 +22,10 @@ such as startOE, stopOE, OpticalLink, and OpticalSwitch ...@@ -22,10 +22,10 @@ such as startOE, stopOE, OpticalLink, and OpticalSwitch
22 22
23 Usage: 23 Usage:
24 ------------ 24 ------------
25 - - import OpticalLink and OpticalSwitch from this module 25 + - import LINCLink and OpticalSwitch from this module
26 - import startOE and stopOE from this module 26 - import startOE and stopOE from this module
27 - create topology as you would a normal topology. when 27 - create topology as you would a normal topology. when
28 - to an optical switch with topo.addLink, always specify cls=OpticalLink 28 + to an optical switch with topo.addLink, always specify cls=LINCLink
29 - when creating an optical switch, use cls=OpticalSwitch in topo.addSwitch 29 - when creating an optical switch, use cls=OpticalSwitch in topo.addSwitch
30 - for annotations on links and switches, a dictionary must be passed in as 30 - for annotations on links and switches, a dictionary must be passed in as
31 the annotations argument 31 the annotations argument
...@@ -51,7 +51,7 @@ switches have been started, the new Mininet start() method should also push the ...@@ -51,7 +51,7 @@ switches have been started, the new Mininet start() method should also push the
51 Topology configuration file to ONOS. 51 Topology configuration file to ONOS.
52 52
53 ''' 53 '''
54 - 54 +import sys
55 import re 55 import re
56 import json 56 import json
57 import os 57 import os
...@@ -65,25 +65,123 @@ from mininet.log import setLogLevel, info, error, warn ...@@ -65,25 +65,123 @@ from mininet.log import setLogLevel, info, error, warn
65 from mininet.link import Link, Intf 65 from mininet.link import Link, Intf
66 from mininet.cli import CLI 66 from mininet.cli import CLI
67 67
68 -class OpticalSwitch( Switch ): 68 +class OpticalSwitch(Switch):
69 - 69 + """
70 - def __init__( self, name, dpid=None, allowed=True, 70 + For now, same as Switch class.
71 - switchType='ROADM', annotations={}, **params ): 71 + """
72 + pass
73 +
74 +class OpticalIntf(Intf):
75 + """
76 + For now,same as Intf class.
77 + """
78 + pass
79 +
80 +class OpticalLink(Link):
81 + """
82 + For now, same as Link.
83 + """
84 + pass
85 +
86 +class LINCSwitch(OpticalSwitch):
87 + """
88 + LINCSwitch class
89 + """
90 + # FIXME:Sometimes LINC doesn't remove pipes and on restart increase the pipe
91 + # number from erlang.pipe.1.* to erlang.pipe.2.*, so should read and write
92 + # from latest pipe files. For now we are removing all the pipes before
93 + # starting LINC.
94 + ### User Name ###
95 + user = os.getlogin()
96 + ### pipes ###
97 + readPipe = "/tmp/home/{}/linc-oe/rel/linc/erlang.pipe.1.r".format(user)
98 + writePipe = "/tmp/home/{}/linc-oe/rel/linc/erlang.pipe.1.w".format(user)
99 + ### sys.config path ###
100 + sysConfig = "/home/{}/linc-oe/rel/linc/releases/1.0/sys.config".format(user)
101 + ### method, mapping dpid to LINC switchId ###
102 + @staticmethod
103 + def dpids_to_ids(sysConfig):
104 + '''
105 + return the dict containing switch dpids as key and LINC switch id as values
106 + '''
107 + dpids_to_ids = {}
108 + fd = None
109 + try:
110 + with open(sysConfig, 'r', 0) as fd:
111 + switch_id = 1
112 + for line in fd:
113 + dpid = re.search(r'([0-9A-Fa-f]{2}[:-]){7}([0-9A-Fa-f]{2})+', line, re.I)
114 + if dpid:
115 + dpids_to_ids[dpid.group().replace(':', '')] = switch_id
116 + switch_id += 1
117 + return dpids_to_ids
118 + except:
119 + print "Error working with {}\nError: {}\n".format(sysConfig, sys.exc_info())
120 + fd.close()
121 + return None
122 + ### dict of containing dpids as key and corresponding LINC switchId as values ###
123 + dpidsToLINCSwitchId = dpids_to_ids.__func__(sysConfig)
124 + @staticmethod
125 + def findDir(directory, userName):
126 + "finds and returns the path of any directory in the user's home directory"
127 + homeDir = '/home/' + userName
128 + Dir = quietRun('find %s -maxdepth 1 -name %s -type d' % (homeDir, directory)).strip('\n')
129 + DirList = Dir.split('\n')
130 + if not Dir:
131 + return None
132 + elif len(DirList) > 1 :
133 + warn('***WARNING: Found multiple instances of %s; using %s\n'
134 + % (directory, DirList[ 0 ]))
135 + return DirList[ 0 ]
136 + else:
137 + return Dir
138 + ### ONOS Directory ###
139 + try:
140 + onosDir = os.environ[ 'ONOS_ROOT' ]
141 + except:
142 + onosDir = findDir('onos', user)
143 + if not onosDir:
144 + error('Please set ONOS_ROOT environment variable!\n')
145 + else:
146 + os.environ[ 'ONOS_ROOT' ] = onosDir
147 + ### LINC-directory
148 + lincDir = findDir.__func__('linc-oe', user)
149 + if not lincDir:
150 + error("***ERROR: Could not find linc-oe in user's home directory\n")
151 + ### LINC config generator directory###
152 + configGen = findDir.__func__('LINC-config-generator', user)
153 + if not configGen:
154 + error("***ERROR: Could not find LINC-config-generator in user's home directory\n")
155 + # list of all the controllers
156 + controllers = None
157 + def __init__(self, name, dpid=None, allowed=True,
158 + switchType='ROADM', topo=None, annotations={}, controller=None, **params):
72 params[ 'inNamespace' ] = False 159 params[ 'inNamespace' ] = False
73 - Switch.__init__( self, name, dpid=dpid, **params ) 160 + Switch.__init__(self, name, dpid=dpid, **params)
74 self.name = name 161 self.name = name
75 self.annotations = annotations 162 self.annotations = annotations
76 self.allowed = allowed 163 self.allowed = allowed
77 self.switchType = switchType 164 self.switchType = switchType
78 - self.configDict = {} # dictionary that holds all of the JSON configuration data 165 + self.configDict = {} # dictionary that holds all of the JSON configuration data
79 - 166 + self.crossConnects = []
80 - def start( self, *opts, **params ): 167 + self.deletedCrossConnects = []
168 + self.controller = controller
169 + self.lincId = self._get_linc_id() # use to communicate with LINC
170 + self.lincStarted = False
171 +
172 + def start(self, *opts, **params):
81 '''Instead of starting a virtual switch, we build the JSON 173 '''Instead of starting a virtual switch, we build the JSON
82 dictionary for the emulated optical switch''' 174 dictionary for the emulated optical switch'''
175 + # TODO:Once LINC has the ability to spawn network element dynamically
176 + # we need to use this method to spawn new logical LINC switch rather then
177 + # bulding JSON.
178 + # if LINC is started then we can start and stop logical switches else create JSON
179 + if self.lincStarted:
180 + return self.start_oe()
83 self.configDict[ 'uri' ] = 'of:' + self.dpid 181 self.configDict[ 'uri' ] = 'of:' + self.dpid
84 self.configDict[ 'annotations' ] = self.annotations 182 self.configDict[ 'annotations' ] = self.annotations
85 - self.configDict[ 'annotations' ].setdefault( 'name', self.name ) 183 + self.configDict[ 'annotations' ].setdefault('name', self.name)
86 - self.configDict[ 'hw' ] = 'OE' 184 + self.configDict[ 'hw' ] = 'LINC-OE'
87 self.configDict[ 'mfr' ] = 'Linc' 185 self.configDict[ 'mfr' ] = 'Linc'
88 self.configDict[ 'mac' ] = 'ffffffffffff' + self.dpid[-2] + self.dpid[-1] 186 self.configDict[ 'mac' ] = 'ffffffffffff' + self.dpid[-2] + self.dpid[-1]
89 self.configDict[ 'type' ] = self.switchType 187 self.configDict[ 'type' ] = self.switchType
...@@ -92,74 +190,417 @@ class OpticalSwitch( Switch ): ...@@ -92,74 +190,417 @@ class OpticalSwitch( Switch ):
92 if intf.name == 'lo': 190 if intf.name == 'lo':
93 continue 191 continue
94 else: 192 else:
95 - self.configDict[ 'ports' ].append( intf.json() ) 193 + self.configDict[ 'ports' ].append(intf.json())
194 + self.lincStarted = True
195 +
196 + def stop(self, deleteIntfs=False):
197 + '''
198 + stop the existing switch
199 + '''
200 + # TODO:Add support for deleteIntf
201 + self.stop_oe()
202 +
203 + def dpctl( self, *args ):
204 + "Run dpctl command: ignore for now"
205 + pass
96 206
207 + def write_to_cli(self, command):
208 + '''
209 + send command to LINC
210 + '''
211 + fd = None
212 + try:
213 + fd = open(self.writePipe, 'w', 0)
214 + fd.write(command)
215 + fd.close()
216 + except:
217 + print "Error working with {}\nError: {}\n".format(self.writePipe, sys.exc_info())
218 + if fd:
219 + fd.close()
220 +
221 + def read_from_cli(self):
222 + '''
223 + read the output from the LINC CLI
224 + '''
225 + response = None
226 + fd = None
227 + try:
228 + fd = open(self.readPipe, 'r', 0)
229 + fcntl.fcntl(fd, fcntl.F_SETFL, os.O_NONBLOCK) # for non-blocking read
230 + # FIXME:Due to non-blocking read most for the time we read nothing
231 + response = fd.read()
232 + fd.close()
233 + except :
234 + # print "Error working with {}\nError: {}\n".format(self.readPipe, sys.exc_info())
235 + if fd:
236 + fd.close()
237 + return response
238 +
239 + def _get_linc_id(self):
240 + '''
241 + return the corresponding LINC switchId.
242 + '''
243 + return LINCSwitch.dpidsToLINCSwitchId.get(self.dpid)
244 + #--------------------------------------------------------------------------
245 + # LINC CLI commands
246 + #--------------------------------------------------------------------------
247 + def start_oe(self):
248 + '''
249 + start the existing LINC switch
250 + '''
251 + #starting Switch
252 + cmd = "linc:start_switch({}).\r\n".format(self.lincId)
253 + self.write_to_cli(cmd)
254 + #hanlding taps interfaces related to the switch
255 + crossConnectJSON = {}
256 + linkConfig = []
257 + for i in range(0,len(self.deletedCrossConnects)):
258 + crossConnect = self.deletedCrossConnects.pop()
259 + tap = None
260 + if isinstance(crossConnect.intf1.node, LINCSwitch):
261 + intf = crossConnect.intf2
262 + tapPort = crossConnect.intf1.port
263 + else:
264 + intf = crossConnect.intf1
265 + tapPort = crossConnect.intf2.port
266 + tap = LINCSwitch.findTap(self, tapPort)
267 + if tap:
268 + LINCSwitch.setupInts([tap])
269 + intf.node.attach(tap)
270 + self.crossConnects.append(crossConnect)
271 + linkConfig.append(crossConnect.json())
272 + #Sending crossConnect info to the ONOS.
273 + crossConnectJSON['links'] = linkConfig
274 + with open("crossConnect.json", 'w') as fd:
275 + json.dump(crossConnectJSON, fd, indent=4, separators=(',', ': '))
276 + info('*** Pushing crossConnect.json to ONOS\n')
277 + output = quietRun('%s/tools/test/bin/onos-topo-cfg %s\
278 + Topology.json' % (self.onosDir, self.controllers[ 0 ].ip), shell=True)
279 +
280 + def stop_oe(self):
281 + '''
282 + stop the existing LINC switch
283 + '''
284 + cmd = "linc:stop_switch({}).\r\n".format(self.lincId)
285 + self.write_to_cli(cmd)
286 + #handling taps if any
287 + for i in range(0, len(self.crossConnects)):
288 + crossConnect = self.crossConnects.pop()
289 + if isinstance(crossConnect.intf1.node, LINCSwitch):
290 + intf = crossConnect.intf2
291 + tapPort = crossConnect.intf1.port
292 + else:
293 + intf = crossConnect.intf1
294 + tapPort = crossConnect.intf2.port
295 + intf.node.detach(LINCSwitch.findTap(self, tapPort))
296 + self.deletedCrossConnects.append(crossConnect)
297 +
298 + def w_port_up(self, port):
299 + '''
300 + port_up
301 + '''
302 + cmd = "linc:port_up({},{}).\r\n".format(self.lincId, port)
303 + self.write_to_cli(cmd)
304 +
305 + def w_port_down(self, port):
306 + '''
307 + port_down
308 + '''
309 + cmd = "linc:port_down({},{}).\r\n".format(self.lincId, port)
310 + self.write_to_cli(cmd)
311 +
312 + # helper functions
313 + @staticmethod
314 + def switchJSON(switch):
315 + "Returns the json configuration for a packet switch"
316 + configDict = {}
317 + configDict[ 'uri' ] = 'of:' + switch.dpid
318 + configDict[ 'mac' ] = quietRun('cat /sys/class/net/%s/address' % switch.name).strip('\n').translate(None, ':')
319 + configDict[ 'hw' ] = 'PK' # FIXME what about OVS?
320 + configDict[ 'mfr' ] = 'Linc' # FIXME what about OVS?
321 + configDict[ 'type' ] = 'SWITCH' # FIXME what about OVS?
322 + annotations = switch.params.get('annotations', {})
323 + annotations.setdefault('name', switch.name)
324 + configDict[ 'annotations' ] = annotations
325 + ports = []
326 + for port, intf in switch.intfs.items():
327 + if intf.name == 'lo':
328 + continue
329 + portDict = {}
330 + portDict[ 'port' ] = port
331 + portDict[ 'type' ] = 'FIBER' if isinstance(intf.link, LINCLink) else 'COPPER'
332 + intfList = [ intf.link.intf1, intf.link.intf2 ]
333 + intfList.remove(intf)
334 + portDict[ 'speed' ] = intfList[ 0 ].speed if isinstance(intf.link, LINCLink) else 0
335 + ports.append(portDict)
336 + configDict[ 'ports' ] = ports
337 + return configDict
338 +
339 + @staticmethod
340 + def bootOE(net):
341 + "Start the LINC optical emulator within a mininet instance"
342 + opticalJSON = {}
343 + linkConfig = []
344 + devices = []
345 + #setting up the controllers for LINCSwitch class
346 + LINCSwitch.controllers = net.controllers
347 +
348 + for switch in net.switches:
349 + if isinstance(switch, OpticalSwitch):
350 + devices.append(switch.json())
351 + else:
352 + devices.append(LINCSwitch.switchJSON(switch))
353 + opticalJSON[ 'devices' ] = devices
354 +
355 + for link in net.links:
356 + if isinstance(link, LINCLink) :
357 + linkConfig.append(link.json())
358 + opticalJSON[ 'links' ] = linkConfig
359 +
360 + info('*** Writing Topology.json file\n')
361 + with open('Topology.json', 'w') as outfile:
362 + json.dump(opticalJSON, outfile, indent=4, separators=(',', ': '))
363 +
364 + info('*** Converting Topology.json to linc-oe format (TopoConfig.json) file\n')
365 + output = quietRun('%s/tools/test/bin/onos-oecfg ./Topology.json > TopoConfig.json' % LINCSwitch.onosDir, shell=True)
366 + if output:
367 + error('***ERROR: Error creating topology file: %s ' % output + '\n')
368 + return False
369 +
370 + info('*** Creating sys.config...\n')
371 + output = quietRun('%s/config_generator TopoConfig.json %s/sys.config.template %s %s'
372 + % (LINCSwitch.configGen, LINCSwitch.configGen, LINCSwitch.controllers[ 0 ].ip, LINCSwitch.controllers[ 0 ].port), shell=True)
373 + if output:
374 + error('***ERROR: Error creating sys.config file: %s\n' % output)
375 + return False
376 +
377 + info ('*** Setting multiple controllers in sys.config...\n')
378 + searchStr = '\[{"Switch.*$'
379 + ctrlStr = ''
380 + for index in range(len(LINCSwitch.controllers)):
381 + ctrlStr += '{"Switch%d-Controller","%s",%d,tcp},' % (index, net.controllers[index].ip, net.controllers[index].port)
382 + replaceStr = '[%s]},' % ctrlStr[:-1] # Cut off last comma
383 + sedCmd = 'sed -i \'s/%s/%s/\' sys.config' % (searchStr, replaceStr)
384 + output = quietRun(sedCmd, shell=True)
385 +
386 + info('*** Copying sys.config to linc-oe directory: ', output + '\n')
387 + output = quietRun('cp -v sys.config %s/rel/linc/releases/1.0/' % LINCSwitch.lincDir, shell=True).strip('\n')
388 + info(output + '\n')
389 +
390 + info('*** Adding taps and bringing them up...\n')
391 + LINCSwitch.setupInts(LINCSwitch.getTaps())
392 +
393 + info('*** removing pipes if any \n')
394 + quietRun('rm /tmp/home/%s/linc-oe/rel/linc/*' % LINCSwitch.user, shell=True)
395 +
396 + info('*** Starting linc OE...\n')
397 + output = quietRun('%s/rel/linc/bin/linc start' % LINCSwitch.lincDir, shell=True)
398 + if output:
399 + error('***ERROR: LINC-OE: %s' % output + '\n')
400 + quietRun('%s/rel/linc/bin/linc stop' % LINCSwitch.lincDir, shell=True)
401 + return False
97 402
98 - def json( self ): 403 + info('*** Waiting for linc-oe to start...\n')
404 + LINCSwitch.waitStarted(net)
405 +
406 + info('*** Adding cross-connect (tap) interfaces to packet switches...\n')
407 + for link in net.links:
408 + if isinstance(link, LINCLink):
409 + if link.annotations[ 'optical.type' ] == 'cross-connect':
410 + for intf in [ link.intf1, link.intf2 ]:
411 + if not isinstance(intf, LINCIntf):
412 + intfList = [ intf.link.intf1, intf.link.intf2 ]
413 + intfList.remove(intf)
414 + intf2 = intfList[ 0 ]
415 + intf.node.attach(LINCSwitch.findTap(intf2.node, intf2.node.ports[ intf2 ]))
416 +
417 + info('*** Press ENTER to push Topology.json to onos...\n')
418 + raw_input() # FIXME... we should eventually remove this
419 + info('*** Pushing Topology.json to ONOS\n')
420 + output = quietRun('%s/tools/test/bin/onos-topo-cfg %s Topology.json' % (LINCSwitch.onosDir, LINCSwitch.controllers[ 0 ].ip), shell=True)
421 + # successful output contains the two characters '{}'
422 + # if there is more output than this, there is an issue
423 + if output.strip('{}'):
424 + warn('***WARNING: Could not push topology file to ONOS: %s' % output)
425 +
426 + @staticmethod
427 + def waitStarted(net, timeout=None):
428 + "wait until all tap interfaces are available"
429 + tapCount = 0
430 + time = 0
431 + for link in net.links:
432 + if isinstance(link, LINCLink):
433 + if link.annotations[ 'optical.type' ] == 'cross-connect':
434 + tapCount += 1
435 +
436 + while True:
437 + if str(tapCount) == quietRun('ip addr | grep tap | wc -l', shell=True).strip('\n'):
438 + return True
439 + if timeout:
440 + if time >= timeout:
441 + error('***ERROR: Linc OE did not start within %s seconds' % timeout)
442 + return False
443 + time += .5
444 + sleep(.5)
445 +
446 + @staticmethod
447 + def shutdownOE():
448 + "stop the optical emulator"
449 + info('*** Stopping linc OE...\n')
450 + quietRun('%s/rel/linc/bin/linc stop' % LINCSwitch.lincDir, shell=True)
451 +
452 + @staticmethod
453 + def setupInts(intfs):
454 + '''
455 + add taps and bring them up.
456 + '''
457 + for i in intfs:
458 + quietRun('ip tuntap add dev %s mode tap' % i)
459 + quietRun('ip link set dev %s up' % i)
460 + info('*** Intf %s set\n' % i)
461 +
462 + @staticmethod
463 + def getTaps(path=None):
464 + '''
465 + return list of all the tops in sys.config
466 + '''
467 + if path is None:
468 + path = '%s/rel/linc/releases/1.0/sys.config' % LINCSwitch.lincDir
469 + fd = open(path, 'r', 0)
470 + sys_data = fd.read()
471 + taps = re.findall('tap\d+', sys_data)
472 + fd.close()
473 + return taps
474 +
475 + @staticmethod
476 + def findUser():
477 + "Try to return logged-in (usually non-root) user"
478 + try:
479 + # If we're running sudo
480 + return os.environ[ 'SUDO_USER' ]
481 + except:
482 + try:
483 + # Logged-in user (if we have a tty)
484 + return quietRun('who am i').split()[ 0 ]
485 + except:
486 + # Give up and return effective user
487 + return quietRun('whoami')
488 +
489 +
490 + @staticmethod
491 + def findTap(node, port, path=None):
492 + '''utility function to parse through a sys.config
493 + file to find tap interfaces for a switch'''
494 + switch = False
495 + portLine = ''
496 + intfLines = []
497 +
498 + if path is None:
499 + path = '%s/rel/linc/releases/1.0/sys.config' % LINCSwitch.lincDir
500 +
501 + with open(path) as f:
502 + for line in f:
503 + if 'tap' in line:
504 + intfLines.append(line)
505 + if node.dpid in line.translate(None, ':'):
506 + switch = True
507 + continue
508 + if switch:
509 + if 'switch' in line:
510 + switch = False
511 + if 'port_no,%s}' % port in line:
512 + portLine = line
513 + break
514 +
515 + if portLine:
516 + m = re.search('port,\d+', portLine)
517 + port = m.group(0).split(',')[ 1 ]
518 + else:
519 + error('***ERROR: Could not find any ports in sys.config\n')
520 + return
521 +
522 + for intfLine in intfLines:
523 + if 'port,%s' % port in intfLine:
524 + return re.findall('tap\d+', intfLine)[ 0 ]
525 +
526 + def json(self):
99 "return json configuration dictionary for switch" 527 "return json configuration dictionary for switch"
100 return self.configDict 528 return self.configDict
101 -
102 - def terminate( self ):
103 - pass
104 529
105 -class OpticalLink( Link ): 530 + def terminate(self):
531 + pass
106 532
107 - def __init__( self, node1, node2, port1=None, port2=None, allowed=True, 533 +class LINCLink(Link):
534 + """
535 + LINC link class
536 + """
537 + def __init__(self, node1, node2, port1=None, port2=None, allowed=True,
108 intfName1=None, intfName2=None, linkType='OPTICAL', 538 intfName1=None, intfName2=None, linkType='OPTICAL',
109 - annotations={}, speed1=0, speed2=0, **params ): 539 + annotations={}, speed1=0, speed2=0, **params):
110 "Creates a dummy link without a virtual ethernet pair." 540 "Creates a dummy link without a virtual ethernet pair."
111 self.allowed = allowed 541 self.allowed = allowed
112 self.annotations = annotations 542 self.annotations = annotations
113 self.linkType = linkType 543 self.linkType = linkType
544 + self.port1 = port1
545 + self.port2 = port2
114 params1 = { 'speed': speed1 } 546 params1 = { 'speed': speed1 }
115 params2 = { 'speed': speed2 } 547 params2 = { 'speed': speed2 }
116 - 548 + # self.isCrossConnect = True if self.annotations.get('optical.type') == 'cross-connect' else False
117 - if isinstance( node1, OpticalSwitch ): 549 + if isinstance(node1, LINCSwitch) and isinstance(node2, LINCSwitch):
118 - cls1 = OpticalIntf 550 + self.isCrossConnect = False
551 + else:
552 + self.isCrossConnect = True
553 + if isinstance(node1, LINCSwitch):
554 + cls1 = LINCIntf
555 + if self.isCrossConnect:
556 + node1.crossConnects.append(self)
119 else: 557 else:
120 cls1 = Intf 558 cls1 = Intf
121 # bad hack to stop error message from appearing when we try to set up intf in a packet switch, 559 # bad hack to stop error message from appearing when we try to set up intf in a packet switch,
122 # and there is no interface there( because we do not run makeIntfPair ). This way, we just set lo up 560 # and there is no interface there( because we do not run makeIntfPair ). This way, we just set lo up
123 intfName1 = 'lo' 561 intfName1 = 'lo'
124 - if isinstance( node2, OpticalSwitch ): 562 + if isinstance(node2, LINCSwitch):
125 - cls2 = OpticalIntf 563 + cls2 = LINCIntf
564 + if self.isCrossConnect:
565 + node2.crossConnects.append(self)
126 else: 566 else:
127 cls2 = Intf 567 cls2 = Intf
128 intfName2 = 'lo' 568 intfName2 = 'lo'
129 - Link.__init__( self, node1, node2, port1=port1, port2=port2, 569 + Link.__init__(self, node1, node2, port1=port1, port2=port2,
130 intfName1=intfName1, intfName2=intfName2, cls1=cls1, 570 intfName1=intfName1, intfName2=intfName2, cls1=cls1,
131 - cls2=cls2, params1=params1, params2=params2 ) 571 + cls2=cls2, params1=params1, params2=params2)
132 -
133 572
134 @classmethod 573 @classmethod
135 - def makeIntfPair( _cls, intfName1, intfName2, *args, **kwargs ): 574 + def makeIntfPair(_cls, intfName1, intfName2, *args, **kwargs):
136 pass 575 pass
137 576
138 - def json( self ): 577 + def json(self):
139 "build and return the json configuration dictionary for this link" 578 "build and return the json configuration dictionary for this link"
140 configData = {} 579 configData = {}
141 - configData[ 'src' ] = ( 'of:' + self.intf1.node.dpid + 580 + configData[ 'src' ] = ('of:' + self.intf1.node.dpid +
142 - '/%s' % self.intf1.node.ports[ self.intf1 ] ) 581 + '/%s' % self.intf1.node.ports[ self.intf1 ])
143 - configData[ 'dst' ] = ( 'of:' + self.intf2.node.dpid + 582 + configData[ 'dst' ] = ('of:' + self.intf2.node.dpid +
144 - '/%s' % self.intf2.node.ports[ self.intf2 ] ) 583 + '/%s' % self.intf2.node.ports[ self.intf2 ])
145 configData[ 'type' ] = self.linkType 584 configData[ 'type' ] = self.linkType
146 configData[ 'annotations' ] = self.annotations 585 configData[ 'annotations' ] = self.annotations
147 return configData 586 return configData
148 587
149 -class OpticalIntf( Intf ): 588 +class LINCIntf(OpticalIntf):
150 - 589 + """
151 - def __init__( self, name=None, node=None, speed=0, 590 + LINC interface class
152 - port=None, link=None, **params ): 591 + """
592 + def __init__(self, name=None, node=None, speed=0,
593 + port=None, link=None, **params):
153 self.node = node 594 self.node = node
154 self.speed = speed 595 self.speed = speed
155 self.port = port 596 self.port = port
156 self.link = link 597 self.link = link
157 self.name = name 598 self.name = name
158 - node.addIntf( self, port=port ) 599 + node.addIntf(self, port=port)
159 self.params = params 600 self.params = params
160 self.ip = None 601 self.ip = None
161 602
162 - def json( self ): 603 + def json(self):
163 "build and return the JSON information for this interface( not used right now )" 604 "build and return the JSON information for this interface( not used right now )"
164 configDict = {} 605 configDict = {}
165 configDict[ 'port' ] = self.port 606 configDict[ 'port' ] = self.port
...@@ -167,275 +608,34 @@ class OpticalIntf( Intf ): ...@@ -167,275 +608,34 @@ class OpticalIntf( Intf ):
167 configDict[ 'type' ] = 'FIBER' 608 configDict[ 'type' ] = 'FIBER'
168 return configDict 609 return configDict
169 610
170 - def config( self, *args, **kwargs ): 611 + def config(self, *args, **kwargs):
171 "dont configure a dummy interface" 612 "dont configure a dummy interface"
172 pass 613 pass
173 614
174 -def switchJSON( switch ): 615 + def ifconfig(self, status):
175 - "Returns the json configuration for a packet switch" 616 + "configure the status"
176 - configDict = {} 617 + if status == "up":
177 - configDict[ 'uri' ] = 'of:' + switch.dpid 618 + return self.node.w_port_up(self.port)
178 - configDict[ 'mac' ] = quietRun( 'cat /sys/class/net/%s/address' % switch.name ).strip( '\n' ).translate( None, ':' ) 619 + elif status == "down":
179 - configDict[ 'hw' ] = 'PK' # FIXME what about OVS? 620 + return self.node.w_port_down(self.port)
180 - configDict[ 'mfr' ] = 'Linc' # FIXME what about OVS?
181 - configDict[ 'type' ] = 'SWITCH' # FIXME what about OVS?
182 - annotations = switch.params.get( 'annotations', {} )
183 - annotations.setdefault( 'name', switch.name )
184 - configDict[ 'annotations' ] = annotations
185 - ports = []
186 - for port, intf in switch.intfs.items():
187 - if intf.name == 'lo':
188 - continue
189 - portDict = {}
190 - portDict[ 'port' ] = port
191 - portDict[ 'type' ] = 'FIBER' if isinstance( intf.link, OpticalLink ) else 'COPPER'
192 - intfList = [ intf.link.intf1, intf.link.intf2 ]
193 - intfList.remove( intf )
194 - portDict[ 'speed' ] = intfList[ 0 ].speed if isinstance( intf.link, OpticalLink ) else 0
195 - ports.append( portDict )
196 - configDict[ 'ports' ] = ports
197 - return configDict
198 -
199 -
200 -def startOE( net ):
201 - "Start the LINC optical emulator within a mininet instance"
202 - opticalJSON = {}
203 - linkConfig = []
204 - devices = []
205 -
206 - for switch in net.switches:
207 - if isinstance( switch, OpticalSwitch ):
208 - devices.append( switch.json() )
209 - else:
210 - devices.append( switchJSON( switch ) )
211 - opticalJSON[ 'devices' ] = devices
212 -
213 - for link in net.links:
214 - if isinstance( link, OpticalLink ) :
215 - linkConfig.append( link.json() )
216 -
217 - opticalJSON[ 'links' ] = linkConfig
218 -
219 - try:
220 - onosDir = os.environ[ 'ONOS_ROOT' ]
221 - except:
222 - onosDir = findDir( 'onos' )
223 - if not onosDir:
224 - error( 'Please set ONOS_ROOT environment variable!\n' )
225 - return False
226 - else:
227 - os.environ[ 'ONOS_ROOT' ] = onosDir
228 -
229 - info( '*** Writing Topology.json file\n' )
230 - with open( 'Topology.json', 'w' ) as outfile:
231 - json.dump( opticalJSON, outfile, indent=4, separators=(',', ': ') )
232 -
233 - info( '*** Converting Topology.json to linc-oe format (TopoConfig.json) file\n' )
234 - output = quietRun( '%s/tools/test/bin/onos-oecfg ./Topology.json > TopoConfig.json' % onosDir, shell=True )
235 - if output:
236 - error( '***ERROR: Error creating topology file: %s ' % output + '\n' )
237 - return False
238 -
239 - info( '*** Creating sys.config...\n' )
240 - configGen = findDir( 'LINC-config-generator' )
241 - if not configGen:
242 - error( "***ERROR: Could not find LINC-config-generator in user's home directory\n" )
243 - return False
244 - output = quietRun( '%s/config_generator TopoConfig.json %s/sys.config.template %s %s'
245 - % ( configGen, configGen, net.controllers[ 0 ].ip, net.controllers[ 0 ].port ), shell=True )
246 - if output:
247 - error( '***ERROR: Error creating sys.config file: %s\n' % output )
248 - return False
249 -
250 - info ('*** Setting multiple controllers in sys.config...\n' )
251 - searchStr = '\[{"Switch.*$'
252 - ctrlStr = ''
253 - for index in range(len(net.controllers)):
254 - ctrlStr += '{"Switch%d-Controller","%s",%d,tcp},' % (index, net.controllers[index].ip, net.controllers[index].port)
255 - replaceStr = '[%s]},' % ctrlStr[:-1] # Cut off last comma
256 - sedCmd = 'sed -i \'s/%s/%s/\' sys.config' % (searchStr, replaceStr)
257 - output = quietRun( sedCmd, shell=True )
258 -
259 - info( '*** Copying sys.config to linc-oe directory: ', output + '\n' )
260 - lincDir = findDir( 'linc-oe' )
261 - if not lincDir:
262 - error( "***ERROR: Could not find linc-oe in user's home directory\n" )
263 - return False
264 - output = quietRun( 'cp -v sys.config %s/rel/linc/releases/1.0/' % lincDir, shell=True ).strip( '\n' )
265 - info( output + '\n' )
266 -
267 - info( '*** Starting linc OE...\n' )
268 - output = quietRun( '%s/rel/linc/bin/linc start' % lincDir, shell=True )
269 - if output:
270 - error( '***ERROR: LINC-OE: %s' % output + '\n' )
271 - quietRun( '%s/rel/linc/bin/linc stop' % lincDir, shell=True )
272 - return False
273 -
274 - info( '*** Waiting for linc-oe to start...\n' )
275 - waitStarted( net )
276 -
277 - info( '*** Adding cross-connect (tap) interfaces to packet switches...\n' )
278 - for link in net.links:
279 - if isinstance( link, OpticalLink ):
280 - if link.annotations[ 'optical.type' ] == 'cross-connect':
281 - for intf in [ link.intf1, link.intf2 ]:
282 - if not isinstance( intf, OpticalIntf ):
283 - intfList = [ intf.link.intf1, intf.link.intf2 ]
284 - intfList.remove( intf )
285 - intf2 = intfList[ 0 ]
286 - intf.node.attach( findTap( intf2.node, intf2.node.ports[ intf2 ] ) )
287 -
288 - info( '*** Press ENTER to push Topology.json to onos...\n' )
289 - raw_input() # FIXME... we should eventually remove this
290 - info( '*** Pushing Topology.json to ONOS\n' )
291 - output = quietRun( '%s/tools/test/bin/onos-topo-cfg %s Topology.json' % ( onosDir, net.controllers[ 0 ].ip ), shell=True )
292 - # successful output contains the two characters '{}'
293 - # if there is more output than this, there is an issue
294 - if output.strip( '{}' ):
295 - warn( '***WARNING: Could not push topology file to ONOS: %s' % output )
296 -
297 -def waitStarted( net, timeout=None ):
298 - "wait until all tap interfaces are available"
299 - tapCount = 0
300 - time = 0
301 - for link in net.links:
302 - if isinstance( link, OpticalLink ):
303 - if link.annotations[ 'optical.type' ] == 'cross-connect':
304 - tapCount += 1
305 -
306 - while True:
307 - if str( tapCount ) == quietRun( 'ip addr | grep tap | wc -l', shell=True ).strip( '\n' ):
308 - return True
309 - if timeout:
310 - if time >= timeout:
311 - error( '***ERROR: Linc OE did not start within %s seconds' % timeout )
312 - return False
313 - time += .5
314 - sleep( .5 )
315 -
316 -def stopOE():
317 - "stop the optical emulator"
318 - info( '*** Stopping linc OE...\n' )
319 - lincDir = findDir( 'linc-oe' )
320 - quietRun( '%s/rel/linc/bin/linc stop' % lincDir, shell=True )
321 -
322 -def findDir( directory ):
323 - "finds and returns the path of any directory in the user's home directory"
324 - user = findUser()
325 - homeDir = '/home/' + user
326 - Dir = quietRun( 'find %s -maxdepth 1 -name %s -type d' % ( homeDir, directory ) ).strip( '\n' )
327 - DirList = Dir.split( '\n' )
328 - if not Dir:
329 - return None
330 - elif len( DirList ) > 1 :
331 - warn( '***WARNING: Found multiple instances of %s; using %s\n'
332 - % ( directory, DirList[ 0 ] ) )
333 - return DirList[ 0 ]
334 - else:
335 - return Dir
336 -
337 -def findUser():
338 - "Try to return logged-in (usually non-root) user"
339 - try:
340 - # If we're running sudo
341 - return os.environ[ 'SUDO_USER' ]
342 - except:
343 - try:
344 - # Logged-in user (if we have a tty)
345 - return quietRun( 'who am i' ).split()[ 0 ]
346 - except:
347 - # Give up and return effective user
348 - return quietRun( 'whoami' )
349 -
350 621
351 -def findTap( node, port, path=None ):
352 - '''utility function to parse through a sys.config
353 - file to find tap interfaces for a switch'''
354 - switch=False
355 - portLine = ''
356 - intfLines = []
357 622
358 - if path is None: 623 +class MininetOE(Mininet):
359 - lincDir = findDir( 'linc-oe' )
360 - if not lincDir:
361 - error( '***ERROR: Could not find linc-oe in users home directory\n' )
362 - return None
363 - path = '%s/rel/linc/releases/1.0/sys.config' % lincDir
364 -
365 - with open( path ) as f:
366 - for line in f:
367 - if 'tap' in line:
368 - intfLines.append( line )
369 - if node.dpid in line.translate( None, ':' ):
370 - switch=True
371 - continue
372 - if switch:
373 - if 'switch' in line:
374 - switch = False
375 - if 'port_no,%s}' % port in line:
376 - portLine = line
377 - break
378 -
379 - if portLine:
380 - m = re.search( 'port,\d+', portLine )
381 - port = m.group( 0 ).split( ',' )[ 1 ]
382 - else:
383 - error( '***ERROR: Could not find any ports in sys.config\n' )
384 - return
385 -
386 - for intfLine in intfLines:
387 - if 'port,%s' % port in intfLine:
388 - return re.findall( 'tap\d+', intfLine )[ 0 ]
389 -
390 -
391 -class MininetOE( Mininet ):
392 "Mininet with Linc-OE support (starts and stops linc-oe)" 624 "Mininet with Linc-OE support (starts and stops linc-oe)"
393 625
394 - def start( self ): 626 + def start(self):
395 - Mininet.start( self ) 627 + Mininet.start(self)
396 - startOE( self ) 628 + LINCSwitch.bootOE(self)
397 629
398 - def stop( self ): 630 + def stop(self):
399 - Mininet.stop( self ) 631 + Mininet.stop(self)
400 - stopOE() 632 + LINCSwitch.shutdownOE()
401 633
402 - def addControllers( self, controllers ): 634 + def addControllers(self, controllers):
403 i = 0 635 i = 0
404 for ctrl in controllers: 636 for ctrl in controllers:
405 - self.addController( RemoteController( 'c%d' % i, ip=ctrl ) ) 637 + self.addController(RemoteController('c%d' % i, ip=ctrl))
406 - 638 + i += 1
407 -
408 -class OpticalTestTopo( Topo ):
409 -
410 - def build( self ):
411 - opticalAnn = { 'optical.waves': 80, 'optical.type': "WDM", 'durable': True }
412 - switchAnn = { 'bandwidth': 100000, 'optical.type': 'cross-connect', 'durable': True }
413 - h1 = self.addHost( 'h1' )
414 - h2 = self.addHost( 'h2' )
415 - s1 = self.addSwitch( 's1' )
416 - s2 = self.addSwitch( 's2' )
417 - O4 = self.addSwitch( 'O4', cls=OpticalSwitch )
418 - O5 = self.addSwitch( 'O5', cls=OpticalSwitch )
419 - O6 = self.addSwitch( 'O6', cls=OpticalSwitch )
420 - self.addLink( O4, O5, cls=OpticalLink, annotations=opticalAnn )
421 - self.addLink( O5, O6, cls=OpticalLink, annotations=opticalAnn )
422 - self.addLink( s1, O4, cls=OpticalLink, annotations=switchAnn )
423 - self.addLink( s2, O6, cls=OpticalLink, annotations=switchAnn )
424 - self.addLink( h1, s1 )
425 - self.addLink( h2, s2 )
426 639
427 if __name__ == '__main__': 640 if __name__ == '__main__':
428 - import sys 641 + pass
429 - if len( sys.argv ) >= 2:
430 - controllers = sys.argv[1:]
431 - else:
432 - print 'Usage: ./opticalUtils.py (<Controller IP>)+'
433 - print 'Using localhost...\n'
434 - controllers = [ '127.0.0.1' ]
435 -
436 - setLogLevel( 'info' )
437 - net = MininetOE( topo=OpticalTestTopo(), controller=None, autoSetMacs=True )
438 - net.addControllers( controllers )
439 - net.start()
440 - CLI( net )
441 - net.stop()
......