-
Notifications
You must be signed in to change notification settings - Fork 13
/
mininet_builder.py
74 lines (61 loc) · 2.08 KB
/
mininet_builder.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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...
return [i for i in who.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()