X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=blobdiff_plain;f=src%2Femuvim%2Fdcemulator%2Fnet.py;h=3eee2e54c78007f6c807983ffae1fc53291c62cb;hp=9dfef3655af7cc5a0990160603e50c1ec8f51e0e;hb=9019253fdf31e920d5a9e0146dac0eabdb655c9d;hpb=fa91cf2172cfdddc74e76a49a47404f81c83e049 diff --git a/src/emuvim/dcemulator/net.py b/src/emuvim/dcemulator/net.py index 9dfef36..3eee2e5 100755 --- a/src/emuvim/dcemulator/net.py +++ b/src/emuvim/dcemulator/net.py @@ -33,6 +33,7 @@ from subprocess import Popen import re import requests import os +import json from mininet.net import Containernet from mininet.node import Controller, DefaultController, OVSSwitch, OVSKernelSwitch, Docker, RemoteController @@ -50,6 +51,11 @@ LOG.setLevel(logging.DEBUG) # default CPU period used for cpu percentage-based cfs values (microseconds) CPU_PERIOD = 1000000 +# default priority setting for added flow-rules +DEFAULT_PRIORITY = 1000 +# default cookie number for new flow-rules +DEFAULT_COOKIE = 10 + class DCNetwork(Containernet): """ Wraps the original Mininet/Containernet class and provides @@ -107,7 +113,7 @@ class DCNetwork(Containernet): self.DCNetwork_graph = nx.MultiDiGraph() # initialize pool of vlan tags to setup the SDN paths - self.vlans = range(4096)[::-1] + self.vlans = range(1, 4096)[::-1] # link to Ryu REST_API ryu_ip = 'localhost' @@ -233,8 +239,21 @@ class DCNetwork(Containernet): """ Remove the link from the Containernet and the networkx graph """ + if link is not None: + node1 = link.intf1.node + node2 = link.intf2.node + assert node1 is not None + assert node2 is not None Containernet.removeLink(self, link=link, node1=node1, node2=node2) - self.DCNetwork_graph.remove_edge(node2.name, node1.name) + # TODO we might decrease the loglevel to debug: + try: + self.DCNetwork_graph.remove_edge(node2.name, node1.name) + except: + LOG.warning("%s, %s not found in DCNetwork_graph." % ((node2.name, node1.name))) + try: + self.DCNetwork_graph.remove_edge(node1.name, node2.name) + except: + LOG.warning("%s, %s not found in DCNetwork_graph." % ((node1.name, node2.name))) def addDocker( self, label, **params ): """ @@ -549,7 +568,7 @@ class DCNetwork(Containernet): pass - cmd = kwargs.get('cmd') + cmd = kwargs.get('cmd', 'add-flow') if cmd == 'add-flow' or cmd == 'del-flows': ret = self._chainAddFlow(vnf_src_name, vnf_dst_name, vnf_src_interface, vnf_dst_interface, **kwargs) if kwargs.get('bidirectional'): @@ -697,7 +716,15 @@ class DCNetwork(Containernet): switch_inport_nr = self.DCNetwork_graph[current_hop][next_hop][0]['dst_port_nr'] current_hop = next_hop - return "path {2} between {0} and {1}".format(vnf_src_name, vnf_dst_name, cmd) + flow_options = { + 'priority':kwargs.get('priority', DEFAULT_PRIORITY), + 'cookie':kwargs.get('cookie', DEFAULT_COOKIE), + 'vlan':kwargs['vlan'], + 'path':kwargs['path'], + 'match_input':kwargs.get('match') + } + flow_options_str = json.dumps(flow_options, indent=1) + return "success: {2} between {0} and {1} with options: {3}".format(vnf_src_name, vnf_dst_name, cmd, flow_options_str) def _set_flow_entry_ryu_rest(self, node, switch_inport_nr, switch_outport_nr, **kwargs): match = 'in_port=%s' % switch_inport_nr @@ -709,7 +736,7 @@ class DCNetwork(Containernet): index = kwargs.get('pathindex') vlan = kwargs.get('vlan') - priority = kwargs.get('priority') + priority = kwargs.get('priority', DEFAULT_PRIORITY) # flag to not set the ovs port vlan tag skip_vlan_tag = kwargs.get('skip_vlan_tag') # table id to put this flowentry