blob: be96bfb16a28b45b1689e1343ee567afcacb3035 [file] [log] [blame]
pierventred0806a62018-01-10 11:54:17 +01001#!/usr/bin/python
2
3import sys
4sys.path.append('..')
5from mininet.topo import Topo
6from mininet.net import Mininet
7from mininet.cli import CLI
8from mininet.log import setLogLevel
9from mininet.node import RemoteController, OVSBridge, Host, OVSSwitch
pierventred0806a62018-01-10 11:54:17 +010010from ipaddress import ip_network
11from routinglib import BgpRouter
Charles Chan4bcd9562019-12-15 00:02:32 -080012from routinglib import RoutedHost, RoutedHost6, UserNAT
pierventred0806a62018-01-10 11:54:17 +010013from trellislib import DhcpClient, Dhcp6Client, DhcpRelay, DhcpServer, Dhcp6Server
Ray Milkey1df260d2018-03-28 11:52:34 -070014from trellislib import get_mininet, parse_trellis_args, set_up_zebra_config
pierventred0806a62018-01-10 11:54:17 +010015from functools import partial
16
17class Trellis( Topo ):
18 "Trellis dual-link topology"
19
20 def __init__( self, *args, **kwargs ):
21 Topo.__init__( self, *args, **kwargs )
22
23 # Spines
24 s226 = self.addSwitch('s226', dpid='226')
25 s227 = self.addSwitch('s227', dpid='227')
26
27 # Leaves
28 s204 = self.addSwitch('s204', dpid='204')
29 s205 = self.addSwitch('s205', dpid='205')
30
31 # Switch Links - dual-link
32 self.addLink(s226, s204)
33 self.addLink(s226, s204)
34
35 self.addLink(s226, s205)
36 self.addLink(s226, s205)
37
38 self.addLink(s227, s204)
39 self.addLink(s227, s204)
40
41 self.addLink(s227, s205)
42 self.addLink(s227, s205)
43
44 # NOTE avoid using 10.0.1.0/24 which is the default subnet of quaggas
45 # NOTE avoid using 00:00:00:00:00:xx which is the default mac of host behind upstream router
46 # IPv4 Hosts
47 h1 = self.addHost('h1', cls=DhcpClient, mac='00:aa:00:00:00:01')
48 h2 = self.addHost('h2', cls=DhcpClient, mac='00:aa:00:00:00:02')
49 h3 = self.addHost('h3', cls=DhcpClient, mac='00:aa:00:00:00:03')
50 h4 = self.addHost('h4', cls=DhcpClient, mac='00:aa:00:00:00:04')
51 self.addLink(h1, s204)
52 self.addLink(h2, s204)
53 self.addLink(h3, s205)
54 self.addLink(h4, s205)
55
56 # IPv6 Hosts
57 h1v6 = self.addHost('h1v6', cls=Dhcp6Client, mac='00:bb:00:00:00:01')
58 h2v6 = self.addHost('h2v6', cls=Dhcp6Client, mac='00:bb:00:00:00:02')
59 h3v6 = self.addHost('h3v6', cls=Dhcp6Client, mac='00:bb:00:00:00:03')
60 h4v6 = self.addHost('h4v6', cls=Dhcp6Client, mac='00:bb:00:00:00:04')
61 self.addLink(h1v6, s204)
62 self.addLink(h2v6, s204)
63 self.addLink(h3v6, s205)
64 self.addLink(h4v6, s205)
65
66 # DHCP server
67 dhcp = self.addHost('dhcp', cls=DhcpServer, mac='00:99:00:00:00:01', ips=['10.0.3.253/24'], gateway='10.0.3.254')
68
69 # DHCPv6 server
70 dhcp6 = self.addHost('dhcp6', cls=Dhcp6Server, mac='00:99:66:00:00:01', ips=['2000::3fd/120'], gateway='2000::3ff')
71
72 # Data plane switch (for DHCP servers)
Charles Chana60fbd12019-10-22 21:56:35 -070073 cs1 = self.addSwitch('cs1', cls=OVSBridge, datapath='user')
pierventred0806a62018-01-10 11:54:17 +010074 self.addLink(cs1, s205)
75 self.addLink(dhcp, cs1)
76 self.addLink(dhcp6, cs1)
77
78 # Control plane switch (for quagga fpm)
Charles Chana60fbd12019-10-22 21:56:35 -070079 cs0 = self.addSwitch('cs0', cls=OVSBridge, datapath='user')
pierventred0806a62018-01-10 11:54:17 +010080
81 # Control plane NAT (for quagga fpm)
Charles Chan4bcd9562019-12-15 00:02:32 -080082 nat = self.addHost('nat', cls=UserNAT,
Charles Chan947d2432018-08-17 18:13:31 -070083 ip='172.16.0.1/24',
84 subnet=str(ip_network(u'172.16.0.0/24')), inNamespace=False)
pierventred0806a62018-01-10 11:54:17 +010085 self.addLink(cs0, nat)
86
87 # Internal Quagga bgp1
88 intfs = {'bgp1-eth0': {'ipAddrs': ['10.0.1.2/24', '2000::102/120'], 'mac': '00:88:00:00:00:02'},
Charles Chan947d2432018-08-17 18:13:31 -070089 'bgp1-eth1': {'ipAddrs': ['172.16.0.2/24']}}
pierventred0806a62018-01-10 11:54:17 +010090 bgp1 = self.addHost('bgp1', cls=BgpRouter,
91 interfaces=intfs,
92 quaggaConfFile='./bgpdbgp1.conf',
93 zebraConfFile='./zebradbgp1.conf')
94 self.addLink(bgp1, s205)
95 self.addLink(bgp1, cs0)
96
97 # External Quagga r1
98 intfs = {'r1-eth0': {'ipAddrs': ['10.0.1.1/24', '2000::101/120'], 'mac': '00:88:00:00:00:01'},
99 'r1-eth1': {'ipAddrs': ['10.0.99.1/16']},
100 'r1-eth2': {'ipAddrs': ['2000::9901/120']}}
101 r1 = self.addHost('r1', cls=BgpRouter,
102 interfaces=intfs,
103 quaggaConfFile='./bgpdr1.conf')
104 self.addLink(r1, s205)
105
106 # External IPv4 Host behind r1
107 rh1 = self.addHost('rh1', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
108 self.addLink(r1, rh1)
109
110 # External IPv6 Host behind r1
111 rh1v6 = self.addHost('rh1v6', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
112 self.addLink(r1, rh1v6)
113
114topos = { 'trellis' : Trellis }
115
116if __name__ == "__main__":
117 setLogLevel('debug')
118 topo = Trellis()
Charles Chana60fbd12019-10-22 21:56:35 -0700119 switch = partial(OVSSwitch, protocols='OpenFlow13', datapath='user')
Ray Milkey1df260d2018-03-28 11:52:34 -0700120 arguments = parse_trellis_args()
121 set_up_zebra_config(arguments.controllers)
122 net = get_mininet(arguments, topo, switch)
pierventred0806a62018-01-10 11:54:17 +0100123
124 net.start()
125 CLI(net)
126 net.stop()