blob: 0725ac12972f860838b1b08fcc46a7e56eb1c280 [file] [log] [blame]
peustermcbcd4c22015-12-28 11:33:42 +01001"""
2Distributed Cloud Emulator (dcemulator)
3(c) 2015 by Manuel Peuster <manuel.peuster@upb.de>
4"""
5import logging
6
peusterm58310762016-01-12 17:09:20 +01007from mininet.net import Dockernet
peusterme6092692016-01-11 16:32:58 +01008from mininet.node import Controller, OVSKernelSwitch, Switch, Docker, Host
peustermcbcd4c22015-12-28 11:33:42 +01009from mininet.cli import CLI
10from mininet.log import setLogLevel, info
11from mininet.link import TCLink, Link
12
peusterm7aae6852016-01-12 14:53:18 +010013from node import Datacenter, EmulatorCompute
peustermcbcd4c22015-12-28 11:33:42 +010014
15
peusterm293cbc32016-01-13 17:05:28 +010016class DCNetwork(Dockernet):
peusterme4e89d32016-01-07 09:14:54 +010017 """
peusterm293cbc32016-01-13 17:05:28 +010018 Wraps the original Mininet/Dockernet class and provides
peusterme4e89d32016-01-07 09:14:54 +010019 methods to add data centers, switches, etc.
20
21 This class is used by topology definition scripts.
22 """
peustermcbcd4c22015-12-28 11:33:42 +010023
peusterm293cbc32016-01-13 17:05:28 +010024 def __init__(self, **kwargs):
peustermcbcd4c22015-12-28 11:33:42 +010025 self.dcs = {}
peustermcbcd4c22015-12-28 11:33:42 +010026 # create a Mininet/Dockernet network
27 setLogLevel('info') # set Mininet loglevel
peusterm293cbc32016-01-13 17:05:28 +010028 # call original Docker.__init__ and setup default controller
29 Dockernet.__init__(
30 self, controller=Controller, switch=OVSKernelSwitch, **kwargs)
31 self.addController('c0')
peustermcbcd4c22015-12-28 11:33:42 +010032
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
peusterme6092692016-01-11 16:32:58 +010046 def addLink(self, node1, node2, **params):
peusterm5b844a12016-01-11 15:58:15 +010047 """
48 Able to handle Datacenter objects as link
49 end points.
50 """
peustermcbcd4c22015-12-28 11:33:42 +010051 assert node1 is not None
52 assert node2 is not None
peusterme6092692016-01-11 16:32:58 +010053 logging.debug("addLink: n1=%s n2=%s" % (str(node1), str(node2)))
peustermcbcd4c22015-12-28 11:33:42 +010054 # ensure type of node1
55 if isinstance( node1, basestring ):
56 if node1 in self.dcs:
57 node1 = self.dcs[node1].switch
peustermcbcd4c22015-12-28 11:33:42 +010058 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
peustermcbcd4c22015-12-28 11:33:42 +010064 if isinstance( node2, Datacenter ):
65 node2 = node2.switch
peustermc3b977e2016-01-12 10:09:35 +010066 # 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
peusterm293cbc32016-01-13 17:05:28 +010078 return Dockernet.addLink(self, node1, node2, **params) # TODO we need TCLinks with user defined performance here
peustermcbcd4c22015-12-28 11:33:42 +010079
peusterm5b844a12016-01-11 15:58:15 +010080 def addDocker( self, name, **params ):
81 """
peusterm293cbc32016-01-13 17:05:28 +010082 Wrapper for addDocker method to use custom container class.
peusterm5b844a12016-01-11 15:58:15 +010083 """
peusterm293cbc32016-01-13 17:05:28 +010084 return Dockernet.addDocker(self, name, cls=EmulatorCompute, **params)
peustermc3b977e2016-01-12 10:09:35 +010085
peustermbd44f4a2016-01-13 14:53:30 +010086 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
peustermcbcd4c22015-12-28 11:33:42 +010095 def start(self):
96 # start
97 for dc in self.dcs.itervalues():
98 dc.start()
peusterm293cbc32016-01-13 17:05:28 +010099 Dockernet.start(self)
peustermcbcd4c22015-12-28 11:33:42 +0100100
101 def stop(self):
peusterm293cbc32016-01-13 17:05:28 +0100102 Dockernet.stop(self)
peustermcbcd4c22015-12-28 11:33:42 +0100103
104 def CLI(self):
peusterm293cbc32016-01-13 17:05:28 +0100105 CLI(self)