blob: 81cfca538dd20d63668bfd4fa3b326fe06568803 [file] [log] [blame]
pingping-linffca7e22015-11-13 15:43:08 -08001#!/usr/bin/python
2
3"""
4Set up the SDN-IP topology as same as it on Internet2
5"""
6
7"""
8AS 64513, (SDN AS)
9AS 64514, reachable by 10.0.4.1
10AS 64515, reachable by 10.0.5.1
11AS 64516, reachable by 10.0.6.1
12"""
13
14from mininet.net import Mininet
15from mininet.node import Controller, RemoteController
16from mininet.log import setLogLevel, info
17from mininet.cli import CLI
18from mininet.topo import Topo
19from mininet.util import quietRun
20from mininet.moduledeps import pathCheck
21
22import os.path
23import time
24from subprocess import Popen, STDOUT, PIPE
25
26QUAGGA_DIR = '/usr/lib/quagga'
27QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
pingping-lin2b2a8df2015-11-16 15:41:21 -080028QUAGGA_CONFIG_DIR = '~/OnosSystemTest/TestON/tests/USECASE_SdnipFunction_fsfw/Dependency/'
pingping-linffca7e22015-11-13 15:43:08 -080029# onos1IP = '10.254.1.201'
30numSw = 39
pingping-lin983c7a32015-12-15 16:20:45 -080031vlanId = 8
pingping-linffca7e22015-11-13 15:43:08 -080032
33
34class SDNTopo( Topo ):
35 "SDN Topology"
36
37 def __init__( self, *args, **kwargs ):
38
39 Topo.__init__( self, *args, **kwargs )
40
41 # BGP peer hosts
42 peer64514 = self.addHost( 'peer64514' )
43 peer64515 = self.addHost( 'peer64515' )
44 peer64516 = self.addHost( 'peer64516' )
45
46 '''
47 sw1 = self.addSwitch( 'SEAT', dpid = '00000000000000a1' )
48 sw2 = self.addSwitch( 'PORT', dpid = '00000000000000a2' )
49 sw3 = self.addSwitch( 'SUNN', dpid = '00000000000000a3' )
50 sw4 = self.addSwitch( 'RENO', dpid = '00000000000000a4' )
51 sw5 = self.addSwitch( 'LOSA', dpid = '00000000000000a5' )
52 sw6 = self.addSwitch( 'MISS', dpid = '00000000000000a6' )
53 sw7 = self.addSwitch( 'LASV', dpid = '00000000000000a7' )
54 sw8 = self.addSwitch( 'SALT', dpid = '00000000000000a8' )
55 sw9 = self.addSwitch( 'PHOE', dpid = '00000000000000a9' )
56 sw10 = self.addSwitch( 'TUCS', dpid = '0000000000000a10' )
57 sw11 = self.addSwitch( 'DENV', dpid = '0000000000000a11' )
58 sw12 = self.addSwitch( 'ELPA', dpid = '0000000000000a12' )
59 sw13 = self.addSwitch( 'MINN', dpid = '0000000000000a13' )
60 sw14 = self.addSwitch( 'KANS', dpid = '0000000000000a14' )
61 sw15 = self.addSwitch( 'TULS', dpid = '0000000000000a15' )
62 sw16 = self.addSwitch( 'DALL', dpid = '0000000000000a16' )
63 sw17 = self.addSwitch( 'HOUH', dpid = '0000000000000a17' )
64 sw18 = self.addSwitch( 'COLU', dpid = '0000000000000a18' )
65 sw19 = self.addSwitch( 'JCSN', dpid = '0000000000000a19' )
66 sw20 = self.addSwitch( 'BATO', dpid = '0000000000000a20' )
67 sw21 = self.addSwitch( 'EQCH', dpid = '0000000000000a21' )
68 sw22 = self.addSwitch( 'STAR', dpid = '0000000000000a22' )
69 sw23 = self.addSwitch( 'CHIC', dpid = '0000000000000a23' )
70 sw24 = self.addSwitch( 'INDI', dpid = '0000000000000a24' )
71 sw25 = self.addSwitch( 'CINC', dpid = '0000000000000a25' )
72 sw26 = self.addSwitch( 'LOUI', dpid = '0000000000000a26' )
73 sw27 = self.addSwitch( 'ATLA', dpid = '0000000000000a27' )
74 sw28 = self.addSwitch( 'JACK', dpid = '0000000000000a28' )
75 sw29 = self.addSwitch( 'CLEV', dpid = '0000000000000a29' )
76 sw30 = self.addSwitch( 'PITT', dpid = '0000000000000a30' )
77 sw31 = self.addSwitch( 'ASHB', dpid = '0000000000000a31' )
78 sw32 = self.addSwitch( 'WASH', dpid = '0000000000000a32' )
79 sw33 = self.addSwitch( 'RALE', dpid = '0000000000000a33' )
80 sw34 = self.addSwitch( 'CHAR', dpid = '0000000000000a34' )
81 sw35 = self.addSwitch( 'ALBA', dpid = '0000000000000a35' )
82 sw36 = self.addSwitch( 'BOST', dpid = '0000000000000a36' )
83 sw37 = self.addSwitch( 'HART', dpid = '0000000000000a37' )
84 sw38 = self.addSwitch( 'NEWY', dpid = '0000000000000a38' )
85 sw39 = self.addSwitch( 'PHIL', dpid = '0000000000000a39' )
86 '''
87 sw1 = self.addSwitch( 'sw1', dpid = '00000000000000a1' )
88 sw2 = self.addSwitch( 'sw2', dpid = '00000000000000a2' )
89 sw3 = self.addSwitch( 'sw3', dpid = '00000000000000a3' )
90 sw4 = self.addSwitch( 'sw4', dpid = '00000000000000a4' )
91 sw5 = self.addSwitch( 'sw5', dpid = '00000000000000a5' )
92 sw6 = self.addSwitch( 'sw6', dpid = '00000000000000a6' )
93 sw7 = self.addSwitch( 'sw7', dpid = '00000000000000a7' )
94 sw8 = self.addSwitch( 'sw8', dpid = '00000000000000a8' )
95 sw9 = self.addSwitch( 'sw9', dpid = '00000000000000a9' )
96 sw10 = self.addSwitch( 'sw10', dpid = '0000000000000a10' )
97 sw11 = self.addSwitch( 'sw11', dpid = '0000000000000a11' )
98 sw12 = self.addSwitch( 'sw12', dpid = '0000000000000a12' )
99 sw13 = self.addSwitch( 'sw13', dpid = '0000000000000a13' )
100 sw14 = self.addSwitch( 'sw14', dpid = '0000000000000a14' )
101 sw15 = self.addSwitch( 'sw15', dpid = '0000000000000a15' )
102 sw16 = self.addSwitch( 'sw16', dpid = '0000000000000a16' )
103 sw17 = self.addSwitch( 'sw17', dpid = '0000000000000a17' )
104 sw18 = self.addSwitch( 'sw18', dpid = '0000000000000a18' )
105 sw19 = self.addSwitch( 'sw19', dpid = '0000000000000a19' )
106 sw20 = self.addSwitch( 'sw20', dpid = '0000000000000a20' )
107 sw21 = self.addSwitch( 'sw21', dpid = '0000000000000a21' )
108 sw22 = self.addSwitch( 'sw22', dpid = '0000000000000a22' )
109 sw23 = self.addSwitch( 'sw23', dpid = '0000000000000a23' )
110 sw24 = self.addSwitch( 'sw24', dpid = '0000000000000a24' )
111 sw25 = self.addSwitch( 'sw25', dpid = '0000000000000a25' )
112 sw26 = self.addSwitch( 'sw26', dpid = '0000000000000a26' )
113 sw27 = self.addSwitch( 'sw27', dpid = '0000000000000a27' )
114 sw28 = self.addSwitch( 'sw28', dpid = '0000000000000a28' )
115 sw29 = self.addSwitch( 'sw29', dpid = '0000000000000a29' )
116 sw30 = self.addSwitch( 'sw30', dpid = '0000000000000a30' )
117 sw31 = self.addSwitch( 'sw31', dpid = '0000000000000a31' )
118 sw32 = self.addSwitch( 'sw32', dpid = '0000000000000a32' )
119 sw33 = self.addSwitch( 'sw33', dpid = '0000000000000a33' )
120 sw34 = self.addSwitch( 'sw34', dpid = '0000000000000a34' )
121 sw35 = self.addSwitch( 'sw35', dpid = '0000000000000a35' )
122 sw36 = self.addSwitch( 'sw36', dpid = '0000000000000a36' )
123 sw37 = self.addSwitch( 'sw37', dpid = '0000000000000a37' )
124 sw38 = self.addSwitch( 'sw38', dpid = '0000000000000a38' )
125 sw39 = self.addSwitch( 'sw39', dpid = '0000000000000a39' )
126
127
128 # Add a layer2 switch for control plane connectivity
129 # This switch isn't part of the SDN topology
130 # We'll use the ovs-controller to turn this into a learning switch
131 swCtl100 = self.addSwitch( 'swCtl100', dpid = '0000000000000100' )
132
133
134 # BGP speaker hosts
135 speaker1 = self.addHost( 'speaker1' )
136 speaker2 = self.addHost( 'speaker2' )
137
138 root = self.addHost( 'root', inNamespace = False , ip = '0' )
139
140 # hosts behind each AS
141 host64514 = self.addHost( 'host64514' )
142 host64515 = self.addHost( 'host64515' )
143 host64516 = self.addHost( 'host64516' )
144
145 self.addLink( 'speaker1', sw24 )
146 self.addLink( 'speaker2', sw24 )
147
148 # connect all switches
149 self.addLink( sw1, sw2 )
150 self.addLink( sw1, sw6 )
151 self.addLink( sw1, sw8 )
152 self.addLink( sw2, sw3 )
153 self.addLink( sw3, sw4 )
154 self.addLink( sw3, sw5 )
155 self.addLink( sw4, sw8 )
156 self.addLink( sw5, sw7 )
157 self.addLink( sw5, sw9 )
158 self.addLink( sw6, sw13 )
159 self.addLink( sw7, sw8 )
160 self.addLink( sw8, sw11 )
161 self.addLink( sw9, sw10 )
162 self.addLink( sw10, sw12 )
163 self.addLink( sw11, sw12 )
164 self.addLink( sw11, sw14 )
165 self.addLink( sw12, sw17 )
166 self.addLink( sw13, sw14 )
167 self.addLink( sw13, sw21 )
168 self.addLink( sw14, sw15 )
169 self.addLink( sw14, sw18 )
170 self.addLink( sw14, sw23 )
171 self.addLink( sw15, sw16 )
172 self.addLink( sw16, sw17 )
173 self.addLink( sw17, sw19 )
174 self.addLink( sw17, sw20 )
175 self.addLink( sw18, sw23 )
176 self.addLink( sw19, sw27 )
177 self.addLink( sw20, sw28 )
178 self.addLink( sw21, sw22 )
179 self.addLink( sw21, sw29 )
180 self.addLink( sw22, sw23 )
181 self.addLink( sw23, sw24 )
182 self.addLink( sw23, sw31 )
183 self.addLink( sw24, sw25 )
184 self.addLink( sw25, sw26 )
185 self.addLink( sw26, sw27 )
186 self.addLink( sw27, sw28 )
187 self.addLink( sw27, sw34 )
188 self.addLink( sw29, sw30 )
189 self.addLink( sw29, sw35 )
190 self.addLink( sw30, sw31 )
191 self.addLink( sw31, sw32 )
192 self.addLink( sw32, sw33 )
193 self.addLink( sw32, sw39 )
194 self.addLink( sw33, sw34 )
195 self.addLink( sw35, sw36 )
196 self.addLink( sw36, sw37 )
197 self.addLink( sw37, sw38 )
198 self.addLink( sw38, sw39 )
199
200 # connection between switches and peers
201 self.addLink( peer64514, sw32 )
202 self.addLink( peer64515, sw8 )
203 self.addLink( peer64516, sw28 )
204
205 # connection between BGP peer and hosts behind the BGP peer
206 self.addLink( peer64514, host64514 )
207 self.addLink( peer64515, host64515 )
208 self.addLink( peer64516, host64516 )
209
210 # Internal Connection To Hosts
211 self.addLink( swCtl100, peer64514 )
212 self.addLink( swCtl100, peer64515 )
213 self.addLink( swCtl100, peer64516 )
214 self.addLink( swCtl100, speaker1 )
215 self.addLink( swCtl100, speaker2 )
216
217
218
219 # add host64514 to control plane for ping test
220 self.addLink( swCtl100, host64514 )
221 self.addLink( swCtl100, root )
222
223
224def startsshd( host ):
225 "Start sshd on host"
226 info( '*** Starting sshd\n' )
227 name, intf, ip = host.name, host.defaultIntf(), host.IP()
228 banner = '/tmp/%s.banner' % name
229 host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
230 host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
231 info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
232
233def startsshds ( hosts ):
234 for h in hosts:
235 startsshd( h )
236
237def stopsshd():
238 "Stop *all* sshd processes with a custom banner"
239 info( '*** Shutting down stale sshd/Banner processes ',
240 quietRun( "pkill -9 -f Banner" ), '\n' )
241
242def startquagga( host, num, config_file ):
243 info( '*** Starting Quagga on %s\n' % host )
244 host.cmd( "cd %s" % QUAGGA_CONFIG_DIR )
245 zebra_cmd = \
246 '%s/zebra -d -f ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid'\
247 % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
248 quagga_cmd = '%s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' \
249 % ( QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
250
251 print zebra_cmd
252 print quagga_cmd
253
254 host.cmd( zebra_cmd )
255 host.cmd( quagga_cmd )
256
257def startquaggahost5( host, num ):
258 info( '*** Starting Quagga on %s\n' % host )
259 zebra_cmd = \
260 '%s/zebra -d -f ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' \
261 % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
262 quagga_cmd = \
263 '%s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid'\
264 % ( QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
265
266 host.cmd( zebra_cmd )
267 host.cmd( quagga_cmd )
268
269
270def stopquagga():
271 quietRun( 'sudo pkill -9 -f bgpd' )
272 quietRun( 'sudo pkill -9 -f zebra' )
273
274def sdn1net():
275 topo = SDNTopo()
276 info( '*** Creating network\n' )
277 # time.sleep( 30 )
278 net = Mininet( topo = topo, controller = RemoteController )
279
280
281 speaker1, speaker2, peer64514, peer64515, peer64516 = \
282 net.get( 'speaker1', 'speaker2' ,
283 'peer64514', 'peer64515', 'peer64516' )
284
285 # Adding addresses to host64513_1 interface connected to sw24
286 # for BGP peering
287 speaker1.setMAC( '00:00:00:00:00:01', 'speaker1-eth0' )
pingping-lin983c7a32015-12-15 16:20:45 -0800288 speaker1.cmd( "sudo vconfig add speaker1-eth0 %d" % vlanId )
289 speaker1.cmd( 'ip addr add 10.0.4.101/24 dev speaker1-eth0.%d' % vlanId )
290 speaker1.cmd( 'ip addr add 10.0.5.101/24 dev speaker1-eth0.%d' % vlanId )
291 speaker1.cmd( 'ip addr add 10.0.6.101/24 dev speaker1-eth0.%d' % vlanId )
pingping-linffca7e22015-11-13 15:43:08 -0800292
293 speaker1.defaultIntf().setIP( '10.1.4.101/24' )
294 speaker1.defaultIntf().setMAC( '00:00:00:00:00:01' )
295
296 # Net has to be start after adding the above link
297 net.start()
298
299 # setup configuration on the interface connected to switch
pingping-lin983c7a32015-12-15 16:20:45 -0800300
pingping-linffca7e22015-11-13 15:43:08 -0800301 peer64514.setMAC( '00:00:00:00:00:04', 'peer64514-eth0' )
pingping-lin983c7a32015-12-15 16:20:45 -0800302 peer64514.cmd( "sudo vconfig add peer64514-eth0 %d" % vlanId )
303 peer64514.cmd( "ip addr add 10.0.4.1/24 dev peer64514-eth0.%d" % vlanId )
304
pingping-linffca7e22015-11-13 15:43:08 -0800305 peer64515.setMAC( '00:00:00:00:00:05', 'peer64515-eth0' )
pingping-lin983c7a32015-12-15 16:20:45 -0800306 peer64515.cmd( "sudo vconfig add peer64515-eth0 %d" % vlanId )
307 peer64515.cmd( "ip addr add 10.0.5.1/24 dev peer64515-eth0.%d" % vlanId )
308
pingping-linffca7e22015-11-13 15:43:08 -0800309 peer64516.setMAC( '00:00:00:00:00:06', 'peer64516-eth0' )
pingping-lin983c7a32015-12-15 16:20:45 -0800310 peer64516.cmd( "sudo vconfig add peer64516-eth0 %d" % vlanId )
311 peer64516.cmd( "ip addr add 10.0.6.1/24 dev peer64516-eth0.%d" % vlanId )
pingping-linffca7e22015-11-13 15:43:08 -0800312
313 # setup configuration on the interface connected to hosts
314 peer64514.setIP( "4.0.0.254", 8, "peer64514-eth1" )
315 peer64514.setMAC( '00:00:00:00:00:44', 'peer64514-eth1' )
316 peer64515.setIP( "5.0.0.254", 8, "peer64515-eth1" )
317 peer64515.setMAC( '00:00:00:00:00:55', 'peer64515-eth1' )
318 peer64516.setIP( "6.0.0.254", 8, "peer64516-eth1" )
319 peer64516.setMAC( '00:00:00:00:00:66', 'peer64516-eth1' )
320
321 # enable forwarding on BGP peer hosts
322 peer64514.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
323 peer64515.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
324 peer64516.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
325
326 # config interface for control plane connectivity
327 peer64514.setIP( "192.168.0.4", 24, "peer64514-eth2" )
328 peer64515.setIP( "192.168.0.5", 24, "peer64515-eth2" )
329 peer64516.setIP( "192.168.0.6", 24, "peer64516-eth2" )
330
331 # Setup hosts in each non-SDN AS
332 host64514, host64515, host64516 = \
333 net.get( 'host64514', 'host64515', 'host64516' )
334 host64514.cmd( 'ifconfig host64514-eth0 4.0.0.1 up' )
335 host64514.cmd( 'ip route add default via 4.0.0.254' )
336 host64514.setIP( '192.168.0.44', 24, 'host64514-eth1' ) # for control plane
337 host64515.cmd( 'ifconfig host64515-eth0 5.0.0.1 up' )
338 host64515.cmd( 'ip route add default via 5.0.0.254' )
339 host64516.cmd( 'ifconfig host64516-eth0 6.0.0.1 up' )
340 host64516.cmd( 'ip route add default via 6.0.0.254' )
341
342
343 # set up swCtl100 as a learning
344 swCtl100 = net.get( 'swCtl100' )
345 swCtl100.cmd( 'ovs-vsctl set-controller swCtl100 none' )
346 swCtl100.cmd( 'ovs-vsctl set-fail-mode swCtl100 standalone' )
347
348 # connect all switches to controller
349 '''
350 for i in range ( 1, numSw + 1 ):
351 swX = net.get( 'sw%s' % ( i ) )
352 swX.cmd( 'ovs-vsctl set-controller sw%s tcp:%s:6653' % ( i, onos1IP ) )
353 '''
354 # Start Quagga on border routers
355 '''
356 for i in range ( 64514, 64516 + 1 ):
357 startquagga( 'peer%s' % ( i ), i, 'quagga%s.conf' % ( i ) )
358 '''
359 startquagga( peer64514, 64514, 'quagga64514.conf' )
360 startquagga( peer64515, 64515, 'quagga64515.conf' )
361 startquagga( peer64516, 64516, 'quagga64516.conf' )
362
363 # start Quagga in SDN network
364 startquagga( speaker1, 64513, 'quagga-sdn.conf' )
365
366
367 root = net.get( 'root' )
368 root.intf( 'root-eth0' ).setIP( '1.1.1.2/24' )
369 root.cmd( 'ip addr add 192.168.0.100/24 dev root-eth0' )
370
371 speaker1.intf( 'speaker1-eth1' ).setIP( '1.1.1.1/24' )
372
373
374 stopsshd()
375
376 hosts = [ peer64514, peer64515, peer64516, host64514];
377 startsshds( hosts )
378 #
379 '''
380 forwarding1 = '%s:2000:%s:2000' % ( '1.1.1.2', onos1IP )
381 root.cmd( 'ssh -nNT -o "PasswordAuthentication no" \
382 -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % ( forwarding1, onos1IP ) )
383
384 '''
385 # time.sleep( 3000000000 )
386 CLI( net )
387
388
389 stopsshd()
390 stopquagga()
391 net.stop()
392
393if __name__ == '__main__':
394 setLogLevel( 'debug' )
395 sdn1net()