X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fdcemulator%2Fnet.py;h=27a07d1b21cdf3011d71510e64a959de73b6eaf2;hb=0dcb2a13c68dc5a91bd6330d4c37df604630b9ac;hp=adf17d4a3fa0778e9d1a9774833d57e83fef7842;hpb=a664eb611376fd77083f101c849b1dde7fc8bea8;p=osm%2Fvim-emu.git diff --git a/src/emuvim/dcemulator/net.py b/src/emuvim/dcemulator/net.py index adf17d4..27a07d1 100755 --- a/src/emuvim/dcemulator/net.py +++ b/src/emuvim/dcemulator/net.py @@ -44,6 +44,9 @@ from emuvim.dcemulator.monitoring import DCNetworkMonitor from emuvim.dcemulator.node import Datacenter, EmulatorCompute from emuvim.dcemulator.resourcemodel import ResourceModelRegistrar +LOG = logging.getLogger("dcemulator.net") +LOG.setLevel(logging.DEBUG) + class DCNetwork(Containernet): """ Wraps the original Mininet/Containernet class and provides @@ -65,6 +68,11 @@ class DCNetwork(Containernet): """ self.dcs = {} + # make sure any remaining Ryu processes are killed + self.killRyu() + # make sure no containers are left over from a previous emulator run. + self.removeLeftoverContainers() + # call original Docker.__init__ and setup default controller Containernet.__init__( self, switch=OVSKernelSwitch, controller=controller, **kwargs) @@ -110,7 +118,7 @@ class DCNetwork(Containernet): dc.net = self # set reference to network self.dcs[label] = dc dc.create() # finally create the data center in our Mininet instance - logging.info("added data center: %s" % label) + LOG.info("added data center: %s" % label) return dc def addLink(self, node1, node2, **params): @@ -120,7 +128,7 @@ class DCNetwork(Containernet): """ assert node1 is not None assert node2 is not None - logging.debug("addLink: n1=%s n2=%s" % (str(node1), str(node2))) + LOG.debug("addLink: n1=%s n2=%s" % (str(node1), str(node2))) # ensure type of node1 if isinstance( node1, basestring ): if node1 in self.dcs: @@ -274,6 +282,14 @@ class DCNetwork(Containernet): def _chainAddFlow(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None, **kwargs): + src_sw = None + dst_sw = None + src_sw_inport_nr = 0 + dst_sw_outport_nr = 0 + + LOG.debug("call chainAddFlow vnf_src_name=%r, vnf_src_interface=%r, vnf_dst_name=%r, vnf_dst_interface=%r", + vnf_src_name, vnf_src_interface, vnf_dst_name, vnf_dst_interface) + #check if port is specified (vnf:port) if vnf_src_interface is None: # take first interface by default @@ -284,10 +300,10 @@ class DCNetwork(Containernet): for connected_sw in self.DCNetwork_graph.neighbors(vnf_src_name): link_dict = self.DCNetwork_graph[vnf_src_name][connected_sw] for link in link_dict: - if link_dict[link]['src_port_id'] == vnf_src_interface: + if (link_dict[link]['src_port_id'] == vnf_src_interface or + link_dict[link]['src_port_name'] == vnf_src_interface): # Fix: we might also get interface names, e.g, from a son-emu-cli call # found the right link and connected switch src_sw = connected_sw - src_sw_inport_nr = link_dict[link]['dst_port_nr'] break @@ -301,7 +317,8 @@ class DCNetwork(Containernet): for connected_sw in self.DCNetwork_graph.neighbors(vnf_dst_name): link_dict = self.DCNetwork_graph[connected_sw][vnf_dst_name] for link in link_dict: - if link_dict[link]['dst_port_id'] == vnf_dst_interface: + if link_dict[link]['dst_port_id'] == vnf_dst_interface or \ + link_dict[link]['dst_port_name'] == vnf_dst_interface: # Fix: we might also get interface names, e.g, from a son-emu-cli call # found the right link and connected switch dst_sw = connected_sw dst_sw_outport_nr = link_dict[link]['src_port_nr'] @@ -314,12 +331,15 @@ class DCNetwork(Containernet): # if all shortest paths are wanted, use: all_shortest_paths path = nx.shortest_path(self.DCNetwork_graph, src_sw, dst_sw, weight=kwargs.get('weight')) except: - logging.exception("No path could be found between {0} and {1}".format(vnf_src_name, vnf_dst_name)) - logging.debug("Graph nodes: %r" % self.DCNetwork_graph.nodes()) - logging.debug("Graph edges: %r" % self.DCNetwork_graph.edges()) + LOG.exception("No path could be found between {0} and {1} using src_sw={2} and dst_sw={3}".format( + vnf_src_name, vnf_dst_name, src_sw, dst_sw)) + LOG.debug("Graph nodes: %r" % self.DCNetwork_graph.nodes()) + LOG.debug("Graph edges: %r" % self.DCNetwork_graph.edges()) + for e, v in self.DCNetwork_graph.edges(): + LOG.debug("%r" % self.DCNetwork_graph[e][v]) return "No path could be found between {0} and {1}".format(vnf_src_name, vnf_dst_name) - logging.info("Path between {0} and {1}: {2}".format(vnf_src_name, vnf_dst_name, path)) + LOG.info("Path between {0} and {1}: {2}".format(vnf_src_name, vnf_dst_name, path)) current_hop = src_sw switch_inport_nr = src_sw_inport_nr @@ -344,9 +364,9 @@ class DCNetwork(Containernet): if next_hop == vnf_dst_name: switch_outport_nr = dst_sw_outport_nr - logging.info("end node reached: {0}".format(vnf_dst_name)) + LOG.info("end node reached: {0}".format(vnf_dst_name)) elif not isinstance( next_node, OVSSwitch ): - logging.info("Next node: {0} is not a switch".format(next_hop)) + LOG.info("Next node: {0} is not a switch".format(next_hop)) return "Next node: {0} is not a switch".format(next_hop) else: # take first link between switches by default @@ -476,7 +496,7 @@ class DCNetwork(Containernet): ofcmd = '' node.dpctl(cmd, ofcmd) - logging.info("{3} in switch: {0} in_port: {1} out_port: {2}".format(node.name, switch_inport_nr, + LOG.info("{3} in switch: {0} in_port: {1} out_port: {2}".format(node.name, switch_inport_nr, switch_outport_nr, cmd)) # start Ryu Openflow controller as Remote Controller for the DCNetwork @@ -502,6 +522,16 @@ class DCNetwork(Containernet): if self.ryu_process is not None: self.ryu_process.terminate() self.ryu_process.kill() + self.killRyu() + + @staticmethod + def removeLeftoverContainers(): + # TODO can be more python-based using eg. docker-py? + Popen('docker ps -a -q --filter="name=mn.*" | xargs -r docker rm -f', shell=True) + + @staticmethod + def killRyu(): + Popen(['pkill', '-f', 'ryu-manager']) def ryu_REST(self, prefix, dpid=None, data=None): try: @@ -510,7 +540,7 @@ class DCNetwork(Containernet): else: url = self.ryu_REST_api + '/' + str(prefix) if data: - #logging.info('POST: {0}'.format(str(data))) + #LOG.info('POST: {0}'.format(str(data))) req = urllib2.Request(url, str(data)) else: req = urllib2.Request(url) @@ -518,8 +548,8 @@ class DCNetwork(Containernet): ret = urllib2.urlopen(req).read() return ret except: - logging.info('error url: {0}'.format(str(url))) - if data: logging.info('error POST: {0}'.format(str(data))) + LOG.info('error url: {0}'.format(str(url))) + if data: LOG.info('error POST: {0}'.format(str(data))) # need to respect that some match fields must be integers # http://ryu.readthedocs.io/en/latest/app/ofctl_rest.html#description-of-match-and-actions