diff --git a/examples/dynamicnet.py b/examples/dynamicnet.py new file mode 100644 index 0000000..5ab5a0d --- /dev/null +++ b/examples/dynamicnet.py @@ -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 " \ + " -h " + 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()