blob: eace03a9c40d32470a1c9590cfde3630d8279354 [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
peusterm293cbc32016-01-13 17:05:28 +010027 # call original Docker.__init__ and setup default controller
28 Dockernet.__init__(
29 self, controller=Controller, switch=OVSKernelSwitch, **kwargs)
30 self.addController('c0')
peustermcbcd4c22015-12-28 11:33:42 +010031
32 def addDatacenter(self, name):
33 """
34 Create and add a logical cloud data center to the network.
35 """
36 if name in self.dcs:
37 raise Exception("Data center name already exists: %s" % name)
38 dc = Datacenter(name)
39 dc.net = self # set reference to network
40 self.dcs[name] = dc
41 dc.create() # finally create the data center in our Mininet instance
42 logging.info("added data center: %s" % name)
43 return dc
44
peusterme6092692016-01-11 16:32:58 +010045 def addLink(self, node1, node2, **params):
peusterm5b844a12016-01-11 15:58:15 +010046 """
47 Able to handle Datacenter objects as link
48 end points.
49 """
peustermcbcd4c22015-12-28 11:33:42 +010050 assert node1 is not None
51 assert node2 is not None
peusterme6092692016-01-11 16:32:58 +010052 logging.debug("addLink: n1=%s n2=%s" % (str(node1), str(node2)))
peustermcbcd4c22015-12-28 11:33:42 +010053 # ensure type of node1
54 if isinstance( node1, basestring ):
55 if node1 in self.dcs:
56 node1 = self.dcs[node1].switch
peustermcbcd4c22015-12-28 11:33:42 +010057 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
peustermcbcd4c22015-12-28 11:33:42 +010063 if isinstance( node2, Datacenter ):
64 node2 = node2.switch
peustermc3b977e2016-01-12 10:09:35 +010065 # 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
peusterm293cbc32016-01-13 17:05:28 +010077 return Dockernet.addLink(self, node1, node2, **params) # TODO we need TCLinks with user defined performance here
peustermcbcd4c22015-12-28 11:33:42 +010078
peusterm5b844a12016-01-11 15:58:15 +010079 def addDocker( self, name, **params ):
80 """
peusterm293cbc32016-01-13 17:05:28 +010081 Wrapper for addDocker method to use custom container class.
peusterm5b844a12016-01-11 15:58:15 +010082 """
peusterm293cbc32016-01-13 17:05:28 +010083 return Dockernet.addDocker(self, name, cls=EmulatorCompute, **params)
peustermc3b977e2016-01-12 10:09:35 +010084
peustermbd44f4a2016-01-13 14:53:30 +010085 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
peustermcbcd4c22015-12-28 11:33:42 +010094 def start(self):
95 # start
96 for dc in self.dcs.itervalues():
97 dc.start()
peusterm293cbc32016-01-13 17:05:28 +010098 Dockernet.start(self)
peustermcbcd4c22015-12-28 11:33:42 +010099
100 def stop(self):
peusterm293cbc32016-01-13 17:05:28 +0100101 Dockernet.stop(self)
peustermcbcd4c22015-12-28 11:33:42 +0100102
103 def CLI(self):
peusterm293cbc32016-01-13 17:05:28 +0100104 CLI(self)