blob: d56997600c9f242833181f5d025bfd204147fc14 [file] [log] [blame]
Yi Tsengc4671422017-11-01 18:22:53 -07001#!/usr/bin/python
2
Carmelo Casconed5db8a22019-02-28 22:48:38 -08003import argparse
Yi Tsengc4671422017-11-01 18:22:53 -07004import os
5import sys
Carmelo Casconed5db8a22019-02-28 22:48:38 -08006
Yi Tsengc4671422017-11-01 18:22:53 -07007sys.path.append('..')
8
Yi Tsengc4671422017-11-01 18:22:53 -07009from mininet.topo import Topo
10from mininet.net import Mininet
11from mininet.cli import CLI
12from mininet.log import setLogLevel
Carmelo Casconed5db8a22019-02-28 22:48:38 -080013from mininet.node import RemoteController
Yi Tsengc4671422017-11-01 18:22:53 -070014from routinglib import RoutedHost
Yi Tseng37c843d2018-05-26 00:55:12 +080015from trellislib import TaggedRoutedHost
Carmelo Casconed5db8a22019-02-28 22:48:38 -080016
17try:
18 from bmv2 import ONOSBmv2Switch, ONOSStratumSwitch
19except ImportError as e:
20 if os.getenv("ONOS_ROOT"):
21 sys.path.append("%s/tools/dev/mininet" % os.getenv("ONOS_ROOT"))
22 from bmv2 import ONOSBmv2Switch, ONOSStratumSwitch
23 else:
24 raise e
Yi Tsengc4671422017-11-01 18:22:53 -070025
26PIPECONF_ID = 'org.onosproject.pipelines.fabric'
27
Carmelo Casconed5db8a22019-02-28 22:48:38 -080028
29class Trellis(Topo):
Yi Tsengc4671422017-11-01 18:22:53 -070030 "Trellis basic topology"
31
Carmelo Casconed5db8a22019-02-28 22:48:38 -080032 def __init__(self, *args, **kwargs):
33 Topo.__init__(self, *args, **kwargs)
Yi Tsengc4671422017-11-01 18:22:53 -070034
35 # Spines
Carmelo Casconed5db8a22019-02-28 22:48:38 -080036 s226 = self.addP4Switch('s226')
37 s227 = self.addP4Switch('s227')
Yi Tsengc4671422017-11-01 18:22:53 -070038
39 # Leaves
Carmelo Casconed5db8a22019-02-28 22:48:38 -080040 s204 = self.addP4Switch('s204')
41 s205 = self.addP4Switch('s205')
Yi Tsengc4671422017-11-01 18:22:53 -070042
43 # Switch Links
44 self.addLink(s226, s204)
45 self.addLink(s226, s205)
46 self.addLink(s227, s204)
47 self.addLink(s227, s205)
48
49 # NOTE avoid using 10.0.1.0/24 which is the default subnet of quaggas
50 # NOTE avoid using 00:00:00:00:00:xx which is the default mac of host behind upstream router
51 # IPv4 Hosts
Carmelo Casconed5db8a22019-02-28 22:48:38 -080052 h1 = self.addHost('h1', cls=RoutedHost, mac='00:aa:00:00:00:01',
53 ips=['10.0.2.1/24'], gateway='10.0.2.254')
54 h2 = self.addHost('h2', cls=TaggedRoutedHost, mac='00:aa:00:00:00:02',
55 ips=['10.0.2.2/24'], gateway='10.0.2.254', vlan=10)
56 h3 = self.addHost('h3', cls=RoutedHost, mac='00:aa:00:00:00:03',
57 ips=['10.0.3.1/24'], gateway='10.0.3.254')
58 h4 = self.addHost('h4', cls=TaggedRoutedHost, mac='00:aa:00:00:00:04',
59 ips=['10.0.3.2/24'], gateway='10.0.3.254', vlan=20)
Yi Tsengc4671422017-11-01 18:22:53 -070060 self.addLink(h1, s204)
61 self.addLink(h2, s204)
62 self.addLink(h3, s205)
63 self.addLink(h4, s205)
64
Carmelo Casconed5db8a22019-02-28 22:48:38 -080065 def addP4Switch(self, name):
66 return self.addSwitch(name=name,
67 pipeconf=PIPECONF_ID,
68 portcfg=True,
69 onosdevid="device:" + name)
70
71
72topos = {'trellis': Trellis}
73
Yi Tsengc4671422017-11-01 18:22:53 -070074
75def main(args):
76 topo = Trellis()
77 controller = RemoteController('c0', ip=args.onos_ip)
78
Carmelo Casconed5db8a22019-02-28 22:48:38 -080079 if args.agent == "stratum":
80 switch = ONOSStratumSwitch
81 else:
82 switch = ONOSBmv2Switch
83
84 net = Mininet(topo=topo, switch=switch, controller=None)
Yi Tsengc4671422017-11-01 18:22:53 -070085 net.addController(controller)
86
87 net.start()
88 CLI(net)
89 net.stop()
90
Carmelo Casconed5db8a22019-02-28 22:48:38 -080091
Yi Tsengc4671422017-11-01 18:22:53 -070092if __name__ == "__main__":
93 parser = argparse.ArgumentParser(
94 description='BMv2 mininet demo script (2 by 2 fabric)')
95 parser.add_argument('--onos-ip', help='ONOS-BMv2 controller IP address',
96 type=str, action="store", required=True)
Carmelo Casconed5db8a22019-02-28 22:48:38 -080097 parser.add_argument("-a", "--agent",
98 help="Agent to use on Bmv2 (pi or stratum)",
99 required=False, default="pi")
Yi Tsengc4671422017-11-01 18:22:53 -0700100 args = parser.parse_args()
Carmelo Casconed5db8a22019-02-28 22:48:38 -0800101 setLogLevel('info')
Yi Tsengc4671422017-11-01 18:22:53 -0700102 main(args)