Create stc net-setup topo for SDN-IP

Updated to latest routinglib version.

Change-Id: I939f5562cc88c30671f8f2f4b074699bd5367a79
diff --git a/tools/test/topos/sdnip.py b/tools/test/topos/sdnip.py
new file mode 100755
index 0000000..7739d58
--- /dev/null
+++ b/tools/test/topos/sdnip.py
@@ -0,0 +1,107 @@
+#!/usr/bin/env python
+
+from mininet.cli import CLI
+from mininet.log import setLogLevel
+from mininet.node import Link, Host
+from mininet.net import Mininet
+from mininet.node import RemoteController, OVSSwitch, OVSBridge
+from mininet.term import makeTerm
+from mininet.topo import Topo
+from functools import partial
+from routinglib import RoutingCli as CLI
+from routinglib import AutonomousSystem, BasicAutonomousSystem, SdnAutonomousSystem
+from routinglib import generateRoutes
+
+class SdnIpTopo( Topo ):
+
+    "SDN-IP topology"
+
+    def __init__( self, onoses, **kwargs ):
+        Topo.__init__( self, **kwargs )
+        coreMesh = []
+
+        # Create first 4 switches
+        for i in range( 1, 5 ):
+            coreMesh.append( self.addSwitch( 's%s' %i ) )
+
+        # create full mesh between middle 4 switches
+        remaining = list( coreMesh )
+        while True:
+            first = remaining[ 0 ]
+            for switch in tuple( remaining ):
+                if switch is not first:
+                    self.addLink( switch, first )
+            remaining.remove( first )
+            if not remaining:
+                break
+
+        # Add more switches
+        s5 = self.addSwitch( 's5', dpid='00:00:00:00:00:00:00:05' )
+        s6 = self.addSwitch( 's6', dpid='00:00:00:00:00:00:00:06' )
+        s7 = self.addSwitch( 's7', dpid='00:00:00:00:00:00:00:07' )
+        s8 = self.addSwitch( 's8', dpid='00:00:00:00:00:00:00:08' )
+        s9 = self.addSwitch( 's9', dpid='00:00:00:00:00:00:00:09' )
+        s10 = self.addSwitch( 's10', dpid='00:00:00:00:00:00:00:0A' )
+
+        # Add more links
+        self.addLink( s5, s6 )
+        self.addLink( s5, s8 )
+        self.addLink( s6, s7 )
+        self.addLink( s8, s9 )
+        self.addLink( s9, s10 )
+        self.addLink( coreMesh[ 0 ], s5 )
+        self.addLink( coreMesh[ 0 ], s6 )
+        self.addLink( coreMesh[ 0 ], s7 )
+        self.addLink( coreMesh[ 1 ], s8 )
+        self.addLink( coreMesh[ 1 ], s9 )
+        self.addLink( coreMesh[ 1 ], s10 )
+        self.addLink( coreMesh[ 2 ], s7 )
+        self.addLink( coreMesh[ 3 ], s10 )
+        
+        # SDN AS        
+        sdnAs = SdnAutonomousSystem(onoses, numBgpSpeakers=3, asNum=65000, externalOnos=True)
+        cs0 = self.addSwitch('cs0', cls=OVSBridge)
+
+        numRoutesPerAs = 32
+
+        # Add external ASes
+        as1 = BasicAutonomousSystem(1, generateRoutes(u'192.168.1.0/24', numRoutesPerAs))
+        AutonomousSystem.addPeering(as1, sdnAs)
+        AutonomousSystem.addPeering(as1, sdnAs, router2=3, intf1=2)
+        as1.addLink(s5)
+        as1.addLink(s6)
+        as1.build(self)
+        
+        as2 = BasicAutonomousSystem(2, generateRoutes(u'192.168.2.0/24', numRoutesPerAs))
+        AutonomousSystem.addPeering(as2, sdnAs)
+        AutonomousSystem.addPeering(as2, sdnAs, router2=2)
+        as2.addLink(s7)
+        as2.build(self)
+        
+        as3 = BasicAutonomousSystem(3, generateRoutes(u'192.168.3.0/24', numRoutesPerAs))
+        AutonomousSystem.addPeering(as3, sdnAs, router2=2)
+        AutonomousSystem.addPeering(as3, sdnAs, router2=3)
+        as3.addLink(s8)
+        as3.build(self)
+        
+        as4 = BasicAutonomousSystem(4, generateRoutes(u'192.168.4.0/24', numRoutesPerAs), numRouters=2)
+        AutonomousSystem.addPeering(as4, sdnAs)
+        AutonomousSystem.addPeering(as4, sdnAs, router1=2, router2=3)
+        as4.addLink(s9)
+        as4.addLink(s10, router=2)
+        as4.build(self)
+
+        # add links between nets
+        #self.addLink( BGP1, coreMesh[ 0 ], port2=10 )
+        #self.addLink( BGP2, coreMesh[ 1 ], port2=10 )
+        #self.addLink( BGP3, coreMesh[ 2 ], port2=10 )
+        
+        sdnAs.build(self, coreMesh[ 0 ], cs0)
+        # TODO multihome the BGP speakers to different switches
+
+topos = { 'sdnip': ( lambda: SdnIpTopo() ) }
+
+if __name__ == '__main__':
+    setLogLevel( 'debug' )
+    from onosnet import run, parse_args
+    run(SdnIpTopo(onoses=parse_args().ipAddrs))
\ No newline at end of file