Dynamic network creation using a remote controller
The script builds a network topology based on command line arguments and uses a remote controller
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
This script builds a network using mininet for using with
|
||||
a remote controller like POX.
|
||||
|
||||
The script receives from command line two arguments. The number
|
||||
of Switches and the number of Hosts per Switch. Then, it will build
|
||||
the network topology based on this arguments.
|
||||
|
||||
First of all, it build a topology and add the Switches to the network.
|
||||
After that, add the same number of Hosts for each Switch added. Lastly
|
||||
it make links between each switch.
|
||||
|
||||
@author: Gustavo Pantuza
|
||||
@since: 18.07.2013
|
||||
|
||||
"""
|
||||
|
||||
from os import environ
|
||||
from sys import argv
|
||||
from sys import exit
|
||||
from getopt import getopt
|
||||
from getopt import GetoptError
|
||||
|
||||
from mininet.topo import Topo
|
||||
from mininet.log import setLogLevel
|
||||
from mininet.net import Mininet
|
||||
from mininet.cli import CLI
|
||||
from mininet.node import RemoteController
|
||||
|
||||
|
||||
class MyTopo(Topo):
|
||||
""" Topology Class Used in all classes to add network components """
|
||||
def __init__(self, **opts):
|
||||
super(MyTopo, self).__init__(**opts)
|
||||
|
||||
|
||||
class Switches():
|
||||
""" Class to control switches addition """
|
||||
|
||||
def __init__(self, num, topo):
|
||||
|
||||
for i in xrange(num):
|
||||
topo.addSwitch('s%s' % str(i))
|
||||
|
||||
|
||||
class Hosts():
|
||||
""" Class to control host addition """
|
||||
|
||||
def __init__(self):
|
||||
self._seq = 0
|
||||
|
||||
def add(self, num, switch, topo):
|
||||
""" Adds hosts and its links """
|
||||
|
||||
for i in xrange(num):
|
||||
host = topo.addHost("h%s" % str(self._seq))
|
||||
topo.addLink(host, switch)
|
||||
self._seq += 1
|
||||
|
||||
|
||||
class Links():
|
||||
""" Create links between two switches """
|
||||
|
||||
def __init__(self, topo, switch0, switch1):
|
||||
|
||||
topo.addLink(switch0, switch1)
|
||||
|
||||
|
||||
class ArgParser(object):
|
||||
""" Command line arguments parser class """
|
||||
|
||||
# possible command line options
|
||||
OPTS = "s:h:"
|
||||
|
||||
def __init__(self, argv):
|
||||
""" Tries to get options from command line """
|
||||
|
||||
try:
|
||||
self.opts, self.args = getopt(argv, ArgParser.OPTS, ["help"])
|
||||
except GetoptError:
|
||||
self.usage()
|
||||
|
||||
self.switches = 2 # default value for the number of switches
|
||||
self.hosts = 5 # default value for the number of hosts
|
||||
self.parse()
|
||||
|
||||
def parse(self):
|
||||
""" Parses the arguments and set values to the script execution """
|
||||
|
||||
for opt, args in self.opts:
|
||||
|
||||
if opt == "--help":
|
||||
self.usage()
|
||||
elif opt == "-s":
|
||||
self.switches = int(args)
|
||||
elif opt == "-h":
|
||||
self.hosts = int(args)
|
||||
|
||||
def usage(self):
|
||||
""" Prints how to usage the program """
|
||||
|
||||
print "python dinamicnet.py -s <Number-of-Switches>" \
|
||||
" -h <hosts-per-switch>"
|
||||
exit()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
# Defines the log level
|
||||
setLogLevel('info')
|
||||
|
||||
# parses command line arguments
|
||||
parser = ArgParser(argv[1:])
|
||||
|
||||
# Build network topology
|
||||
topo = MyTopo()
|
||||
|
||||
# Adds Switches to network
|
||||
Switches(parser.switches, topo)
|
||||
|
||||
# Adds Hosts to network
|
||||
hosts = Hosts()
|
||||
for i, switch in enumerate(topo.switches()):
|
||||
hosts.add(parser.hosts, switch, topo)
|
||||
|
||||
try: # Add links between switches
|
||||
Links(topo, switch, topo.switches()[i + 1])
|
||||
except IndexError:
|
||||
break
|
||||
|
||||
# Creates the Network using a remote controller
|
||||
net = Mininet(topo,
|
||||
controller=lambda a: RemoteController(a, ip='127.0.0.1'))
|
||||
|
||||
# Starts the network
|
||||
net.start()
|
||||
# Run the mininet client
|
||||
CLI(net)
|
||||
# Stop the network
|
||||
net.stop()
|
||||
Reference in New Issue
Block a user