The script builds a network topology based on command line arguments and uses a remote controller
143 lines
3.5 KiB
Python
143 lines
3.5 KiB
Python
# -*- 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()
|