blob: ac647d282137394880b79f21a9d16d6997c7507c [file] [log] [blame]
pingping-linf565dd82016-04-28 18:10:36 -07001#!/usr/bin/python
2
3"""
Jeremy Ronquillob27ce4c2017-07-17 12:41:28 -07004Copyright 2016 Open Networking Foundation (ONF)
5
6Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
7the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
8or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
9
10 TestON is free software: you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation, either version 2 of the License, or
13 (at your option) any later version.
14
15 TestON is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with TestON. If not, see <http://www.gnu.org/licenses/>.
22"""
23
24"""
pingping-linf565dd82016-04-28 18:10:36 -070025Set up the SDN-IP topology as same as it on Internet2
26"""
27
28"""
29AS 64513, (SDN AS)
30AS 64514, reachable by 10.0.4.1
31AS 64515, reachable by 10.0.5.1
32AS 64516, reachable by 10.0.6.1
33"""
34
35from mininet.net import Mininet
36from mininet.node import Controller, RemoteController
37from mininet.log import setLogLevel, info
38from mininet.cli import CLI
39from mininet.topo import Topo
40from mininet.util import quietRun
41from mininet.moduledeps import pathCheck
42
43import os.path
44import time
45from subprocess import Popen, STDOUT, PIPE
46
47QUAGGA_DIR = '/usr/lib/quagga'
48QUAGGA_RUN_DIR = '/usr/local/var/run/quagga'
49QUAGGA_CONFIG_DIR = '~/OnosSystemTest/TestON/tests/ReactiveRouting/Dependency/'
50onos1IP = '10.128.4.52'
51numSw = 39
52
53
54class SDNTopo( Topo ):
55 "SDN Topology"
56
57 def __init__( self, *args, **kwargs ):
58
59 Topo.__init__( self, *args, **kwargs )
60
61 # BGP peer hosts
62 peer64514 = self.addHost( 'peer64514' )
63 peer64515 = self.addHost( 'peer64515' )
64 peer64516 = self.addHost( 'peer64516' )
65
66 sw1 = self.addSwitch( 'sw1', dpid = '00000000000000a1' )
67 sw2 = self.addSwitch( 'sw2', dpid = '00000000000000a2' )
68 sw3 = self.addSwitch( 'sw3', dpid = '00000000000000a3' )
69 sw4 = self.addSwitch( 'sw4', dpid = '00000000000000a4' )
70 sw5 = self.addSwitch( 'sw5', dpid = '00000000000000a5' )
71 sw6 = self.addSwitch( 'sw6', dpid = '00000000000000a6' )
72 sw7 = self.addSwitch( 'sw7', dpid = '00000000000000a7' )
73 sw8 = self.addSwitch( 'sw8', dpid = '00000000000000a8' )
74 sw9 = self.addSwitch( 'sw9', dpid = '00000000000000a9' )
75 sw10 = self.addSwitch( 'sw10', dpid = '0000000000000a10' )
76 sw11 = self.addSwitch( 'sw11', dpid = '0000000000000a11' )
77 sw12 = self.addSwitch( 'sw12', dpid = '0000000000000a12' )
78 sw13 = self.addSwitch( 'sw13', dpid = '0000000000000a13' )
79 sw14 = self.addSwitch( 'sw14', dpid = '0000000000000a14' )
80 sw15 = self.addSwitch( 'sw15', dpid = '0000000000000a15' )
81 sw16 = self.addSwitch( 'sw16', dpid = '0000000000000a16' )
82 sw17 = self.addSwitch( 'sw17', dpid = '0000000000000a17' )
83 sw18 = self.addSwitch( 'sw18', dpid = '0000000000000a18' )
84 sw19 = self.addSwitch( 'sw19', dpid = '0000000000000a19' )
85 sw20 = self.addSwitch( 'sw20', dpid = '0000000000000a20' )
86 sw21 = self.addSwitch( 'sw21', dpid = '0000000000000a21' )
87 sw22 = self.addSwitch( 'sw22', dpid = '0000000000000a22' )
88 sw23 = self.addSwitch( 'sw23', dpid = '0000000000000a23' )
89 sw24 = self.addSwitch( 'sw24', dpid = '0000000000000a24' )
90 sw25 = self.addSwitch( 'sw25', dpid = '0000000000000a25' )
91 sw26 = self.addSwitch( 'sw26', dpid = '0000000000000a26' )
92 sw27 = self.addSwitch( 'sw27', dpid = '0000000000000a27' )
93 sw28 = self.addSwitch( 'sw28', dpid = '0000000000000a28' )
94 sw29 = self.addSwitch( 'sw29', dpid = '0000000000000a29' )
95 sw30 = self.addSwitch( 'sw30', dpid = '0000000000000a30' )
96 sw31 = self.addSwitch( 'sw31', dpid = '0000000000000a31' )
97 sw32 = self.addSwitch( 'sw32', dpid = '0000000000000a32' )
98 sw33 = self.addSwitch( 'sw33', dpid = '0000000000000a33' )
99 sw34 = self.addSwitch( 'sw34', dpid = '0000000000000a34' )
100 sw35 = self.addSwitch( 'sw35', dpid = '0000000000000a35' )
101 sw36 = self.addSwitch( 'sw36', dpid = '0000000000000a36' )
102 sw37 = self.addSwitch( 'sw37', dpid = '0000000000000a37' )
103 sw38 = self.addSwitch( 'sw38', dpid = '0000000000000a38' )
104 sw39 = self.addSwitch( 'sw39', dpid = '0000000000000a39' )
105
106
107 # Add a layer2 switch for control plane connectivity
108 # This switch isn't part of the SDN topology
109 # We'll use the ovs-controller to turn this into a learning switch
110 swCtl100 = self.addSwitch( 'swCtl100', dpid = '0000000000000100' )
111
112
113 # BGP speaker hosts
114 speaker1 = self.addHost( 'speaker1' )
115 speaker2 = self.addHost( 'speaker2' )
116
117 root = self.addHost( 'root', inNamespace = False , ip = '0' )
118
119 # hosts behind each AS
120 host64514 = self.addHost( 'host64514' )
121 host64515 = self.addHost( 'host64515' )
122 host64516 = self.addHost( 'host64516' )
123
124 host1 = self.addHost( 'host1' )
125 host2 = self.addHost( 'host2' )
126 host6 = self.addHost( 'host6' )
127 host13 = self.addHost( 'host13' )
128
129 self.addLink( 'speaker1', sw24 )
130 self.addLink( 'speaker2', sw24 )
131
132 # connect all switches
133 self.addLink( sw1, sw2 )
134 self.addLink( sw1, sw6 )
135 self.addLink( sw1, sw8 )
136 self.addLink( sw2, sw3 )
137 self.addLink( sw3, sw4 )
138 self.addLink( sw3, sw5 )
139 self.addLink( sw4, sw8 )
140 self.addLink( sw5, sw7 )
141 self.addLink( sw5, sw9 )
142 self.addLink( sw6, sw13 )
143 self.addLink( sw7, sw8 )
144 self.addLink( sw8, sw11 )
145 self.addLink( sw9, sw10 )
146 self.addLink( sw10, sw12 )
147 self.addLink( sw11, sw12 )
148 self.addLink( sw11, sw14 )
149 self.addLink( sw12, sw17 )
150 self.addLink( sw13, sw14 )
151 self.addLink( sw13, sw21 )
152 self.addLink( sw14, sw15 )
153 self.addLink( sw14, sw18 )
154 self.addLink( sw14, sw23 )
155 self.addLink( sw15, sw16 )
156 self.addLink( sw16, sw17 )
157 self.addLink( sw17, sw19 )
158 self.addLink( sw17, sw20 )
159 self.addLink( sw18, sw23 )
160 self.addLink( sw19, sw27 )
161 self.addLink( sw20, sw28 )
162 self.addLink( sw21, sw22 )
163 self.addLink( sw21, sw29 )
164 self.addLink( sw22, sw23 )
165 self.addLink( sw23, sw24 )
166 self.addLink( sw23, sw31 )
167 self.addLink( sw24, sw25 )
168 self.addLink( sw25, sw26 )
169 self.addLink( sw26, sw27 )
170 self.addLink( sw27, sw28 )
171 self.addLink( sw27, sw34 )
172 self.addLink( sw29, sw30 )
173 self.addLink( sw29, sw35 )
174 self.addLink( sw30, sw31 )
175 self.addLink( sw31, sw32 )
176 self.addLink( sw32, sw33 )
177 self.addLink( sw32, sw39 )
178 self.addLink( sw33, sw34 )
179 self.addLink( sw35, sw36 )
180 self.addLink( sw36, sw37 )
181 self.addLink( sw37, sw38 )
182 self.addLink( sw38, sw39 )
183
184 # connection between switches and peers
185 self.addLink( peer64514, sw32 )
186 self.addLink( peer64515, sw8 )
187 self.addLink( peer64516, sw28 )
188
189 # connection between BGP peer and hosts behind the BGP peer
190 self.addLink( peer64514, host64514 )
191 self.addLink( peer64515, host64515 )
192 self.addLink( peer64516, host64516 )
193
194 self.addLink( sw1, host1 )
195 self.addLink( sw2, host2 )
196 self.addLink( sw6, host6 )
197 self.addLink( sw13, host13 )
198
199 # Internal Connection To Hosts
200 self.addLink( swCtl100, peer64514 )
201 self.addLink( swCtl100, peer64515 )
202 self.addLink( swCtl100, peer64516 )
203 self.addLink( swCtl100, speaker1 )
204 self.addLink( swCtl100, speaker2 )
205
206
207
208 # add host64514 to control plane for ping test
209 self.addLink( swCtl100, host64514 )
210 self.addLink( swCtl100, root )
211
212
213def startsshd( host ):
214 "Start sshd on host"
215 info( '*** Starting sshd\n' )
216 name, intf, ip = host.name, host.defaultIntf(), host.IP()
217 banner = '/tmp/%s.banner' % name
218 host.cmd( 'echo "Welcome to %s at %s" > %s' % ( name, ip, banner ) )
219 host.cmd( '/usr/sbin/sshd -o "Banner %s"' % banner, '-o "UseDNS no"' )
220 info( '***', host.name, 'is running sshd on', intf, 'at', ip, '\n' )
221
222def startsshds ( hosts ):
223 for h in hosts:
224 startsshd( h )
225
226def stopsshd():
227 "Stop *all* sshd processes with a custom banner"
228 info( '*** Shutting down stale sshd/Banner processes ',
229 quietRun( "pkill -9 -f Banner" ), '\n' )
230
231def startquagga( host, num, config_file ):
232 info( '*** Starting Quagga on %s\n' % host )
233 host.cmd( "cd %s" % QUAGGA_CONFIG_DIR )
234 zebra_cmd = \
235 '%s/zebra -d -f ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid'\
236 % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
237 quagga_cmd = '%s/bgpd -d -f %s -z %s/zserv%s.api -i %s/bgpd%s.pid' \
238 % ( QUAGGA_DIR, config_file, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
239
240 print zebra_cmd
241 print quagga_cmd
242
243 host.cmd( zebra_cmd )
244 host.cmd( quagga_cmd )
245
246def startquaggahost5( host, num ):
247 info( '*** Starting Quagga on %s\n' % host )
248 zebra_cmd = \
249 '%s/zebra -d -f ./zebra.conf -z %s/zserv%s.api -i %s/zebra%s.pid' \
250 % ( QUAGGA_DIR, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
251 quagga_cmd = \
252 '%s/bgpd -d -f ./as4quaggas/quagga%s.conf -z %s/zserv%s.api -i %s/bgpd%s.pid'\
253 % ( QUAGGA_DIR, num, QUAGGA_RUN_DIR, num, QUAGGA_RUN_DIR, num )
254
255 host.cmd( zebra_cmd )
256 host.cmd( quagga_cmd )
257
258
259def stopquagga():
260 quietRun( 'sudo pkill -9 -f bgpd' )
261 quietRun( 'sudo pkill -9 -f zebra' )
262
263def sdn1net():
264 topo = SDNTopo()
265 info( '*** Creating network\n' )
266 # time.sleep( 30 )
267 net = Mininet( topo = topo, controller = RemoteController )
268
269
270 speaker1, speaker2, peer64514, peer64515, peer64516 = \
271 net.get( 'speaker1', 'speaker2' ,
272 'peer64514', 'peer64515', 'peer64516' )
273
274 # Adding addresses to host64513_1 interface connected to sw24
275 # for BGP peering
276 speaker1.setMAC( '00:00:00:00:00:01', 'speaker1-eth0' )
277 speaker1.cmd( 'ip addr add 10.0.4.101/24 dev speaker1-eth0' )
278 speaker1.cmd( 'ip addr add 10.0.5.101/24 dev speaker1-eth0' )
279 speaker1.cmd( 'ip addr add 10.0.6.101/24 dev speaker1-eth0' )
280
281 speaker1.defaultIntf().setIP( '10.1.4.101/24' )
282 speaker1.defaultIntf().setMAC( '00:00:00:00:00:01' )
283
284 # Net has to be start after adding the above link
285 net.start()
286
287 # setup configuration on the interface connected to switch
288 peer64514.cmd( "ifconfig peer64514-eth0 10.0.4.1 up" )
289 peer64514.setMAC( '00:00:00:00:00:04', 'peer64514-eth0' )
290 peer64515.cmd( "ifconfig peer64515-eth0 10.0.5.1 up" )
291 peer64515.setMAC( '00:00:00:00:00:05', 'peer64515-eth0' )
292 peer64516.cmd( "ifconfig peer64516-eth0 10.0.6.1 up" )
293 peer64516.setMAC( '00:00:00:00:00:06', 'peer64516-eth0' )
294
295 # setup configuration on the interface connected to hosts
296 peer64514.setIP( "4.0.0.254", 8, "peer64514-eth1" )
297 peer64514.setMAC( '00:00:00:00:00:44', 'peer64514-eth1' )
298 peer64515.setIP( "5.0.0.254", 8, "peer64515-eth1" )
299 peer64515.setMAC( '00:00:00:00:00:55', 'peer64515-eth1' )
300 peer64516.setIP( "6.0.0.254", 8, "peer64516-eth1" )
301 peer64516.setMAC( '00:00:00:00:00:66', 'peer64516-eth1' )
302
303 # enable forwarding on BGP peer hosts
304 peer64514.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
305 peer64515.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
306 peer64516.cmd( 'sysctl net.ipv4.conf.all.forwarding=1' )
307
308 # config interface for control plane connectivity
309 peer64514.setIP( "192.168.0.4", 24, "peer64514-eth2" )
310 peer64515.setIP( "192.168.0.5", 24, "peer64515-eth2" )
311 peer64516.setIP( "192.168.0.6", 24, "peer64516-eth2" )
312
313 # Setup hosts in each non-SDN AS
314 host64514, host64515, host64516 = \
315 net.get( 'host64514', 'host64515', 'host64516' )
316 host64514.cmd( 'ifconfig host64514-eth0 4.0.0.1 up' )
317 host64514.cmd( 'ip route add default via 4.0.0.254' )
318 host64514.setIP( '192.168.0.44', 24, 'host64514-eth1' ) # for control plane
319 host64515.cmd( 'ifconfig host64515-eth0 5.0.0.1 up' )
320 host64515.cmd( 'ip route add default via 5.0.0.254' )
321 host64516.cmd( 'ifconfig host64516-eth0 6.0.0.1 up' )
322 host64516.cmd( 'ip route add default via 6.0.0.254' )
323
324 host1, host2, host6, host13 = \
325 net.get( 'host1', 'host2', 'host6', 'host13' )
326 host1.cmd( 'ifconfig host1-eth0 201.0.0.1 up' )
327 host1.cmd( 'route add default gw 201.0.0.254' )
328 host2.cmd( 'ifconfig host2-eth0 202.0.0.1 up' )
329 host2.cmd( 'route add default gw 202.0.0.254' )
330 host6.cmd( 'ifconfig host6-eth0 206.0.0.1 up' )
331 host6.cmd( 'route add default gw 206.0.0.254' )
332 host13.cmd( 'ifconfig host13-eth0 213.0.0.13 up' )
333 host13.cmd( 'route add default gw 213.0.0.254' )
334
335
336 # set up swCtl100 as a learning
337 swCtl100 = net.get( 'swCtl100' )
338 swCtl100.cmd( 'ovs-vsctl set-controller swCtl100 none' )
339 swCtl100.cmd( 'ovs-vsctl set-fail-mode swCtl100 standalone' )
340
341 # connect all switches to controller
342
343 for i in range ( 1, numSw + 1 ):
344 swX = net.get( 'sw%s' % ( i ) )
345 swX.cmd( 'ovs-vsctl set-controller sw%s tcp:%s:6653' % ( i, onos1IP ) )
346
347 # Start Quagga on border routers
348 '''
349 for i in range ( 64514, 64516 + 1 ):
350 startquagga( 'peer%s' % ( i ), i, 'quagga%s.conf' % ( i ) )
351 '''
352 startquagga( peer64514, 64514, 'quagga64514.conf' )
353 startquagga( peer64515, 64515, 'quagga64515.conf' )
354 startquagga( peer64516, 64516, 'quagga64516.conf' )
355
356 # start Quagga in SDN network
357 startquagga( speaker1, 64513, 'quagga-sdn.conf' )
358
359
360 root = net.get( 'root' )
361 root.intf( 'root-eth0' ).setIP( '1.1.1.2/24' )
362 root.cmd( 'ip addr add 192.168.0.100/24 dev root-eth0' )
363
364 speaker1.intf( 'speaker1-eth1' ).setIP( '1.1.1.1/24' )
365
366
367 stopsshd()
368
369 hosts = [ peer64514, peer64515, peer64516, host64514];
370 startsshds( hosts )
371 #
372
373 forwarding1 = '%s:2000:%s:2000' % ( '1.1.1.2', onos1IP )
374 root.cmd( 'ssh -nNT -o "PasswordAuthentication no" \
375 -o "StrictHostKeyChecking no" -l sdn -L %s %s & ' % ( forwarding1, onos1IP ) )
376
377 # time.sleep( 3000000000 )
378 CLI( net )
379
380
381 stopsshd()
382 stopquagga()
383 net.stop()
384
385if __name__ == '__main__':
386 setLogLevel( 'debug' )
387 sdn1net()