Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 3 | import argparse |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 4 | import os |
| 5 | import sys |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 6 | |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 7 | sys.path.append('..') |
| 8 | |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 9 | from mininet.topo import Topo |
| 10 | from mininet.net import Mininet |
| 11 | from mininet.cli import CLI |
| 12 | from mininet.log import setLogLevel |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 13 | from mininet.node import RemoteController |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 14 | from routinglib import RoutedHost |
Yi Tseng | 37c843d | 2018-05-26 00:55:12 +0800 | [diff] [blame] | 15 | from trellislib import TaggedRoutedHost |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 16 | |
| 17 | try: |
| 18 | from bmv2 import ONOSBmv2Switch, ONOSStratumSwitch |
| 19 | except 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 Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 25 | |
| 26 | PIPECONF_ID = 'org.onosproject.pipelines.fabric' |
| 27 | |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 28 | |
| 29 | class Trellis(Topo): |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 30 | "Trellis basic topology" |
| 31 | |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 32 | def __init__(self, *args, **kwargs): |
| 33 | Topo.__init__(self, *args, **kwargs) |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 34 | |
| 35 | # Spines |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 36 | s226 = self.addP4Switch('s226') |
| 37 | s227 = self.addP4Switch('s227') |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 38 | |
| 39 | # Leaves |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 40 | s204 = self.addP4Switch('s204') |
| 41 | s205 = self.addP4Switch('s205') |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 42 | |
| 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 Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 52 | 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 Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 60 | self.addLink(h1, s204) |
| 61 | self.addLink(h2, s204) |
| 62 | self.addLink(h3, s205) |
| 63 | self.addLink(h4, s205) |
| 64 | |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 65 | def addP4Switch(self, name): |
| 66 | return self.addSwitch(name=name, |
| 67 | pipeconf=PIPECONF_ID, |
| 68 | portcfg=True, |
| 69 | onosdevid="device:" + name) |
| 70 | |
| 71 | |
| 72 | topos = {'trellis': Trellis} |
| 73 | |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 74 | |
| 75 | def main(args): |
| 76 | topo = Trellis() |
| 77 | controller = RemoteController('c0', ip=args.onos_ip) |
| 78 | |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 79 | if args.agent == "stratum": |
| 80 | switch = ONOSStratumSwitch |
| 81 | else: |
| 82 | switch = ONOSBmv2Switch |
| 83 | |
| 84 | net = Mininet(topo=topo, switch=switch, controller=None) |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 85 | net.addController(controller) |
| 86 | |
| 87 | net.start() |
| 88 | CLI(net) |
| 89 | net.stop() |
| 90 | |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 91 | |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 92 | if __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 Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 97 | parser.add_argument("-a", "--agent", |
| 98 | help="Agent to use on Bmv2 (pi or stratum)", |
| 99 | required=False, default="pi") |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 100 | args = parser.parse_args() |
Carmelo Cascone | d5db8a2 | 2019-02-28 22:48:38 -0800 | [diff] [blame] | 101 | setLogLevel('info') |
Yi Tseng | c467142 | 2017-11-01 18:22:53 -0700 | [diff] [blame] | 102 | main(args) |