blob: da6b399cde4f40ea95ed59061684e1e420212ea8 [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
10from mininet.nodelib import NAT
11from ipaddress import ip_network
12from routinglib import BgpRouter
13from routinglib import RoutedHost, RoutedHost6
14from trellislib import DhcpClient, Dhcp6Client, DhcpRelay, DhcpServer, Dhcp6Server
Ray Milkey1df260d2018-03-28 11:52:34 -070015from trellislib import get_mininet, parse_trellis_args, set_up_zebra_config
pierventred0806a62018-01-10 11:54:17 +010016from functools import partial
17
18class Trellis( Topo ):
19 "Trellis dual-link topology"
20
21 def __init__( self, *args, **kwargs ):
22 Topo.__init__( self, *args, **kwargs )
23
24 # Spines
25 s226 = self.addSwitch('s226', dpid='226')
26 s227 = self.addSwitch('s227', dpid='227')
27
28 # Leaves
29 s204 = self.addSwitch('s204', dpid='204')
30 s205 = self.addSwitch('s205', dpid='205')
31
32 # Switch Links - dual-link
33 self.addLink(s226, s204)
34 self.addLink(s226, s204)
35
36 self.addLink(s226, s205)
37 self.addLink(s226, s205)
38
39 self.addLink(s227, s204)
40 self.addLink(s227, s204)
41
42 self.addLink(s227, s205)
43 self.addLink(s227, s205)
44
45 # NOTE avoid using 10.0.1.0/24 which is the default subnet of quaggas
46 # NOTE avoid using 00:00:00:00:00:xx which is the default mac of host behind upstream router
47 # IPv4 Hosts
48 h1 = self.addHost('h1', cls=DhcpClient, mac='00:aa:00:00:00:01')
49 h2 = self.addHost('h2', cls=DhcpClient, mac='00:aa:00:00:00:02')
50 h3 = self.addHost('h3', cls=DhcpClient, mac='00:aa:00:00:00:03')
51 h4 = self.addHost('h4', cls=DhcpClient, mac='00:aa:00:00:00:04')
52 self.addLink(h1, s204)
53 self.addLink(h2, s204)
54 self.addLink(h3, s205)
55 self.addLink(h4, s205)
56
57 # IPv6 Hosts
58 h1v6 = self.addHost('h1v6', cls=Dhcp6Client, mac='00:bb:00:00:00:01')
59 h2v6 = self.addHost('h2v6', cls=Dhcp6Client, mac='00:bb:00:00:00:02')
60 h3v6 = self.addHost('h3v6', cls=Dhcp6Client, mac='00:bb:00:00:00:03')
61 h4v6 = self.addHost('h4v6', cls=Dhcp6Client, mac='00:bb:00:00:00:04')
62 self.addLink(h1v6, s204)
63 self.addLink(h2v6, s204)
64 self.addLink(h3v6, s205)
65 self.addLink(h4v6, s205)
66
67 # DHCP server
68 dhcp = self.addHost('dhcp', cls=DhcpServer, mac='00:99:00:00:00:01', ips=['10.0.3.253/24'], gateway='10.0.3.254')
69
70 # DHCPv6 server
71 dhcp6 = self.addHost('dhcp6', cls=Dhcp6Server, mac='00:99:66:00:00:01', ips=['2000::3fd/120'], gateway='2000::3ff')
72
73 # Data plane switch (for DHCP servers)
74 cs1 = self.addSwitch('cs1', cls=OVSBridge)
75 self.addLink(cs1, s205)
76 self.addLink(dhcp, cs1)
77 self.addLink(dhcp6, cs1)
78
79 # Control plane switch (for quagga fpm)
80 cs0 = self.addSwitch('cs0', cls=OVSBridge)
81
82 # Control plane NAT (for quagga fpm)
83 nat = self.addHost('nat', cls=NAT,
84 ip='172.16.0.1/12',
85 subnet=str(ip_network(u'172.16.0.0/12')), inNamespace=False)
86 self.addLink(cs0, nat)
87
88 # Internal Quagga bgp1
89 intfs = {'bgp1-eth0': {'ipAddrs': ['10.0.1.2/24', '2000::102/120'], 'mac': '00:88:00:00:00:02'},
90 'bgp1-eth1': {'ipAddrs': ['172.16.0.2/12']}}
91 bgp1 = self.addHost('bgp1', cls=BgpRouter,
92 interfaces=intfs,
93 quaggaConfFile='./bgpdbgp1.conf',
94 zebraConfFile='./zebradbgp1.conf')
95 self.addLink(bgp1, s205)
96 self.addLink(bgp1, cs0)
97
98 # External Quagga r1
99 intfs = {'r1-eth0': {'ipAddrs': ['10.0.1.1/24', '2000::101/120'], 'mac': '00:88:00:00:00:01'},
100 'r1-eth1': {'ipAddrs': ['10.0.99.1/16']},
101 'r1-eth2': {'ipAddrs': ['2000::9901/120']}}
102 r1 = self.addHost('r1', cls=BgpRouter,
103 interfaces=intfs,
104 quaggaConfFile='./bgpdr1.conf')
105 self.addLink(r1, s205)
106
107 # External IPv4 Host behind r1
108 rh1 = self.addHost('rh1', cls=RoutedHost, ips=['10.0.99.2/24'], gateway='10.0.99.1')
109 self.addLink(r1, rh1)
110
111 # External IPv6 Host behind r1
112 rh1v6 = self.addHost('rh1v6', cls=RoutedHost, ips=['2000::9902/120'], gateway='2000::9901')
113 self.addLink(r1, rh1v6)
114
115topos = { 'trellis' : Trellis }
116
117if __name__ == "__main__":
118 setLogLevel('debug')
119 topo = Trellis()
pierventred0806a62018-01-10 11:54:17 +0100120 switch = partial(OVSSwitch, protocols='OpenFlow13')
Ray Milkey1df260d2018-03-28 11:52:34 -0700121 arguments = parse_trellis_args()
122 set_up_zebra_config(arguments.controllers)
123 net = get_mininet(arguments, topo, switch)
pierventred0806a62018-01-10 11:54:17 +0100124
125 net.start()
126 CLI(net)
127 net.stop()