+ # try to give containers a default IP
+ if isinstance( node1, Docker ):
+ if not "params1" in params:
+ params["params1"] = {}
+ if not "ip" in params["params1"]:
+ params["params1"]["ip"] = self.getNextIp()
+ if isinstance( node2, Docker ):
+ if not "params2" in params:
+ params["params2"] = {}
+ if not "ip" in params["params2"]:
+ params["params2"]["ip"] = self.getNextIp()
+
+ link = Dockernet.addLink(self, node1, node2, **params) # TODO we need TCLinks with user defined performance here
+
+ # add edge and assigned port number to graph in both directions between node1 and node2
+ self.DCNetwork_graph.add_edge(node1.name, node2.name, \
+ {'src_port': node1.ports[link.intf1], 'dst_port': node2.ports[link.intf2]})
+ self.DCNetwork_graph.add_edge(node2.name, node1.name, \
+ {'src_port': node2.ports[link.intf2], 'dst_port': node1.ports[link.intf1]})
+
+ return link
+
+ def addDocker( self, label, **params ):
+ """
+ Wrapper for addDocker method to use custom container class.
+ """
+ self.DCNetwork_graph.add_node(label)
+ return Dockernet.addDocker(self, label, cls=EmulatorCompute, **params)
+
+ def removeDocker( self, label, **params ):
+ """
+ Wrapper for removeDocker method to update graph.
+ """
+ self.DCNetwork_graph.remove_node(label)
+ return Dockernet.removeDocker(self, label, **params)
+
+ def addSwitch( self, name, add_to_graph=True, **params ):
+ """
+ Wrapper for addSwitch method to store switch also in graph.
+ """
+ if add_to_graph:
+ self.DCNetwork_graph.add_node(name)
+ return Dockernet.addSwitch(self, name, protocols='OpenFlow10,OpenFlow12,OpenFlow13', **params)
+
+ def getAllContainers(self):
+ """
+ Returns a list with all containers within all data centers.
+ """
+ all_containers = []
+ for dc in self.dcs.itervalues():
+ all_containers += dc.listCompute()
+ return all_containers