class MininetManager(object): def __init__(self): self.logger = logging.getLogger(__name__) self.net = None @Pyro4.expose def create_mininet(self, topo, tunnels=[], switch=UserSwitch, controller=None, STT=False): if(not self.net is None): self.logger.warn("running mininet instance detected!\ Shutting it down...") self.destroy_mininet() self.logger.info("Creating mininet instance") if controller: self.net = Mininet(topo=topo, intf=TCIntf, link=TCLink, switch=switch, controller=controller) else: self.net = Mininet(topo=topo, intf=TCIntf, link=TCLink, switch=switch) if STT: self.logger.info("Starting Mininet...") self.net.start() self.logger.info("Adding tunnels to mininet instance") for tunnel in tunnels: port = None cls = None if "port" in tunnel[2].keys(): port = tunnel[2]["port"] del tunnel[2]["port"] if "cls" in tunnel[2].keys(): cls = tunnel[2]["cls"] del tunnel[2]["cls"] self.addTunnel(tunnel[0], tunnel[1], port, cls, STT=STT, **tunnel[2]) if not STT: self.logger.info("Starting Mininet...") self.net.start() self.logger.info("Startup complete.") self.x11popens = [] return True @Pyro4.expose def destroy_mininet(self): """shut down mininet instance""" if self.net: for popen in self.x11popens: popen.terminate() popen.communicate() popen.wait() self.net.stop() # remove mininet instance and running docker container cleanup() self.logger.info("mininet instance terminated") self.net = None @Pyro4.expose def configLinkStatus(self, src, dst, status): self.net.configLinkStatus(src, dst, status) @Pyro4.expose def rpc(self, hostname, cmd, *params1, **params2): h = self.net.get(hostname) return getattr(h, cmd)(*params1, **params2) @Pyro4.expose def attr(self, hostname, name): h = self.net.get(hostname) return getattr(h, name) @Pyro4.expose def addHost(self, name, cls=None, **params): self.net.addHost(name, cls, **params) return name @Pyro4.expose def removeHost(self, name, **params): # Method of Containernet to remove a host return self.net.removeHost(name, **params) @Pyro4.expose def addSwitch(self, name, cls=None, **params): self.net.addSwitch(name, cls, **params) #TODO: This should not be done here self.net.get(name).start(self.net.controllers) return name @Pyro4.expose def addController(self, name="c0", controller=None, **params): self.net.addController(name, controller, **params) return name @Pyro4.expose def addTunnel(self, name, switch, port, intf, STT=False, **params): switch_i = self.net.get(switch) if not intf: intf = TCIntf if STT: subprocess.check_output(["ovs-vsctl","add-port", switch, name]) else: intf(name, node=switch_i, port=port, link=None, **params) @Pyro4.expose def tunnelX11(self, node, display): node = self.net.get(node) (tunnel, popen) = mininet.term.tunnelX11(node, display) self.x11popens.append(popen) @Pyro4.expose def addLink(self, node1, node2, port1=None, port2=None, cls=None, **params): node1 = self.net.get(node1) node2 = self.net.get(node2) l = self.net.addLink(node1, node2, port1, port2, cls, **params) return ((node1.name, l.intf1.name), (node2.name, l.intf2.name)) @Pyro4.expose def runCmdOnHost(self, hostname, command, noWait=False): ''' e.g. runCmdOnHost('h1', 'ifconfig') ''' h1 = self.net.get(hostname) if noWait: return h1.sendCmd(command) else: return h1.cmd(command)