Refactored design: DCNetwork now inherits from Dockernet. This is much nicer and...
[osm/vim-emu.git] / emuvim / dcemulator / net.py
1 """
2 Distributed Cloud Emulator (dcemulator)
3 (c) 2015 by Manuel Peuster <manuel.peuster@upb.de>
4 """
5 import logging
6
7 from mininet.net import Dockernet
8 from mininet.node import Controller, OVSKernelSwitch, Switch, Docker, Host
9 from mininet.cli import CLI
10 from mininet.log import setLogLevel, info
11 from mininet.link import TCLink, Link
12
13 from node import Datacenter, EmulatorCompute
14
15
16 class DCNetwork(Dockernet):
17 """
18 Wraps the original Mininet/Dockernet class and provides
19 methods to add data centers, switches, etc.
20
21 This class is used by topology definition scripts.
22 """
23
24 def __init__(self, **kwargs):
25 self.dcs = {}
26 # create a Mininet/Dockernet network
27 setLogLevel('info') # set Mininet loglevel
28 # call original Docker.__init__ and setup default controller
29 Dockernet.__init__(
30 self, controller=Controller, switch=OVSKernelSwitch, **kwargs)
31 self.addController('c0')
32
33 def addDatacenter(self, name):
34 """
35 Create and add a logical cloud data center to the network.
36 """
37 if name in self.dcs:
38 raise Exception("Data center name already exists: %s" % name)
39 dc = Datacenter(name)
40 dc.net = self # set reference to network
41 self.dcs[name] = dc
42 dc.create() # finally create the data center in our Mininet instance
43 logging.info("added data center: %s" % name)
44 return dc
45
46 def addLink(self, node1, node2, **params):
47 """
48 Able to handle Datacenter objects as link
49 end points.
50 """
51 assert node1 is not None
52 assert node2 is not None
53 logging.debug("addLink: n1=%s n2=%s" % (str(node1), str(node2)))
54 # ensure type of node1
55 if isinstance( node1, basestring ):
56 if node1 in self.dcs:
57 node1 = self.dcs[node1].switch
58 if isinstance( node1, Datacenter ):
59 node1 = node1.switch
60 # ensure type of node2
61 if isinstance( node2, basestring ):
62 if node2 in self.dcs:
63 node2 = self.dcs[node2].switch
64 if isinstance( node2, Datacenter ):
65 node2 = node2.switch
66 # try to give containers a default IP
67 if isinstance( node1, Docker ):
68 if not "params1" in params:
69 params["params1"] = {}
70 if not "ip" in params["params1"]:
71 params["params1"]["ip"] = self.getNextIp()
72 if isinstance( node2, Docker ):
73 if not "params2" in params:
74 params["params2"] = {}
75 if not "ip" in params["params2"]:
76 params["params2"]["ip"] = self.getNextIp()
77
78 return Dockernet.addLink(self, node1, node2, **params) # TODO we need TCLinks with user defined performance here
79
80 def addDocker( self, name, **params ):
81 """
82 Wrapper for addDocker method to use custom container class.
83 """
84 return Dockernet.addDocker(self, name, cls=EmulatorCompute, **params)
85
86 def getAllContainers(self):
87 """
88 Returns a list with all containers within all data centers.
89 """
90 all_containers = []
91 for dc in self.dcs.itervalues():
92 all_containers += dc.listCompute()
93 return all_containers
94
95 def start(self):
96 # start
97 for dc in self.dcs.itervalues():
98 dc.start()
99 Dockernet.start(self)
100
101 def stop(self):
102 Dockernet.stop(self)
103
104 def CLI(self):
105 CLI(self)