install ryu,networkx
[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 # call original Docker.__init__ and setup default controller
28 Dockernet.__init__(
29 self, controller=Controller, switch=OVSKernelSwitch, **kwargs)
30 self.addController('c0')
31
32 def addDatacenter(self, label, metadata={}):
33 """
34 Create and add a logical cloud data center to the network.
35 """
36 if label in self.dcs:
37 raise Exception("Data center label already exists: %s" % label)
38 dc = Datacenter(label, metadata=metadata)
39 dc.net = self # set reference to network
40 self.dcs[label] = dc
41 dc.create() # finally create the data center in our Mininet instance
42 logging.info("added data center: %s" % label)
43 return dc
44
45 def addLink(self, node1, node2, **params):
46 """
47 Able to handle Datacenter objects as link
48 end points.
49 """
50 assert node1 is not None
51 assert node2 is not None
52 logging.debug("addLink: n1=%s n2=%s" % (str(node1), str(node2)))
53 # ensure type of node1
54 if isinstance( node1, basestring ):
55 if node1 in self.dcs:
56 node1 = self.dcs[node1].switch
57 if isinstance( node1, Datacenter ):
58 node1 = node1.switch
59 # ensure type of node2
60 if isinstance( node2, basestring ):
61 if node2 in self.dcs:
62 node2 = self.dcs[node2].switch
63 if isinstance( node2, Datacenter ):
64 node2 = node2.switch
65 # try to give containers a default IP
66 if isinstance( node1, Docker ):
67 if not "params1" in params:
68 params["params1"] = {}
69 if not "ip" in params["params1"]:
70 params["params1"]["ip"] = self.getNextIp()
71 if isinstance( node2, Docker ):
72 if not "params2" in params:
73 params["params2"] = {}
74 if not "ip" in params["params2"]:
75 params["params2"]["ip"] = self.getNextIp()
76
77 return Dockernet.addLink(self, node1, node2, **params) # TODO we need TCLinks with user defined performance here
78
79 def addDocker( self, label, **params ):
80 """
81 Wrapper for addDocker method to use custom container class.
82 """
83 return Dockernet.addDocker(self, label, cls=EmulatorCompute, **params)
84
85 def getAllContainers(self):
86 """
87 Returns a list with all containers within all data centers.
88 """
89 all_containers = []
90 for dc in self.dcs.itervalues():
91 all_containers += dc.listCompute()
92 return all_containers
93
94 def start(self):
95 # start
96 for dc in self.dcs.itervalues():
97 dc.start()
98 Dockernet.start(self)
99
100 def stop(self):
101 Dockernet.stop(self)
102
103 def CLI(self):
104 CLI(self)