blob: d56997600c9f242833181f5d025bfd204147fc14 [file] [log] [blame]
#!/usr/bin/python
import argparse
import os
import sys
sys.path.append('..')
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.node import RemoteController
from routinglib import RoutedHost
from trellislib import TaggedRoutedHost
try:
from bmv2 import ONOSBmv2Switch, ONOSStratumSwitch
except ImportError as e:
if os.getenv("ONOS_ROOT"):
sys.path.append("%s/tools/dev/mininet" % os.getenv("ONOS_ROOT"))
from bmv2 import ONOSBmv2Switch, ONOSStratumSwitch
else:
raise e
PIPECONF_ID = 'org.onosproject.pipelines.fabric'
class Trellis(Topo):
"Trellis basic topology"
def __init__(self, *args, **kwargs):
Topo.__init__(self, *args, **kwargs)
# Spines
s226 = self.addP4Switch('s226')
s227 = self.addP4Switch('s227')
# Leaves
s204 = self.addP4Switch('s204')
s205 = self.addP4Switch('s205')
# Switch Links
self.addLink(s226, s204)
self.addLink(s226, s205)
self.addLink(s227, s204)
self.addLink(s227, s205)
# NOTE avoid using 10.0.1.0/24 which is the default subnet of quaggas
# NOTE avoid using 00:00:00:00:00:xx which is the default mac of host behind upstream router
# IPv4 Hosts
h1 = self.addHost('h1', cls=RoutedHost, mac='00:aa:00:00:00:01',
ips=['10.0.2.1/24'], gateway='10.0.2.254')
h2 = self.addHost('h2', cls=TaggedRoutedHost, mac='00:aa:00:00:00:02',
ips=['10.0.2.2/24'], gateway='10.0.2.254', vlan=10)
h3 = self.addHost('h3', cls=RoutedHost, mac='00:aa:00:00:00:03',
ips=['10.0.3.1/24'], gateway='10.0.3.254')
h4 = self.addHost('h4', cls=TaggedRoutedHost, mac='00:aa:00:00:00:04',
ips=['10.0.3.2/24'], gateway='10.0.3.254', vlan=20)
self.addLink(h1, s204)
self.addLink(h2, s204)
self.addLink(h3, s205)
self.addLink(h4, s205)
def addP4Switch(self, name):
return self.addSwitch(name=name,
pipeconf=PIPECONF_ID,
portcfg=True,
onosdevid="device:" + name)
topos = {'trellis': Trellis}
def main(args):
topo = Trellis()
controller = RemoteController('c0', ip=args.onos_ip)
if args.agent == "stratum":
switch = ONOSStratumSwitch
else:
switch = ONOSBmv2Switch
net = Mininet(topo=topo, switch=switch, controller=None)
net.addController(controller)
net.start()
CLI(net)
net.stop()
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description='BMv2 mininet demo script (2 by 2 fabric)')
parser.add_argument('--onos-ip', help='ONOS-BMv2 controller IP address',
type=str, action="store", required=True)
parser.add_argument("-a", "--agent",
help="Agent to use on Bmv2 (pi or stratum)",
required=False, default="pi")
args = parser.parse_args()
setLogLevel('info')
main(args)