mininet-sample/mininet_builder.py
2020-07-13 09:55:16 +02:00

76 lines
2.1 KiB
Python

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.link import TCLink
from mininet.node import OVSBridge
from mininet.cli import CLI
from subprocess import Popen, PIPE
import logging
class MininetBuilder(Topo):
def __init__(self):
Topo.__init__( self )
self.net = None
def command_to(self, who, cmd):
"""
Launch command `cmd` to the specific name space of `who`
"""
return who.cmd(cmd)
def command_global(self, cmd):
"""
Launch command `cmd` over the global system, i.e., not specific to a name space
"""
p = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
if stderr:
logging.error("Got error when running cmd: {}".format(cmd))
return "Error"
return stdout
def start_network(self):
"""
Start the network using Mininet
Note that the use of OVSBridge avoid facing issues with OVS controllers.
"""
self.net = Mininet(topo=self, link=TCLink, switch=OVSBridge, controller=None)
self.net.start()
def get_cli(self):
"""
Get the Mininet command line interface
"""
if self.net is None:
logging.error("Cannot get the CLI")
else:
CLI(self.net)
def get_host(self, who):
if self.net is None:
logging.error("Network not available...")
raise Exception("Network not ready")
else:
return self.net.getNodeByName(who)
def get_interface_names(self, who):
# NOTE: bs1.intfNames()[0] is lo...
host = self.get_host(who)
return [i for i in host.intfNames() if i != "lo"]
def add_host(self, host):
return self.addHost(host)
def add_switch(self, switch):
return self.addSwitch(switch)
def add_link(self, from_a, to_b, **kwargs):
return self.addLink(from_a, to_b, **kwargs)
def stop_network(self):
if self.net is None:
logging.warning("Unable to stop the network: net is None")
else:
self.net.stop()