X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fdcemulator%2Fnet.py;h=110256e5619b042b83742659f6576bb43178e931;hb=adfd06fbf80d9d12065bc7bb8903cb1c784fab60;hp=47b4a7ef99093745162b4b50c2c28d9043f30c1e;hpb=9315da41a33ef046bc82a589028e8bd471e75200;p=osm%2Fvim-emu.git diff --git a/src/emuvim/dcemulator/net.py b/src/emuvim/dcemulator/net.py index 47b4a7e..110256e 100755 --- a/src/emuvim/dcemulator/net.py +++ b/src/emuvim/dcemulator/net.py @@ -18,7 +18,6 @@ from emuvim.dcemulator.monitoring import DCNetworkMonitor from emuvim.dcemulator.node import Datacenter, EmulatorCompute from emuvim.dcemulator.resourcemodel import ResourceModelRegistrar - class DCNetwork(Dockernet): """ Wraps the original Mininet/Dockernet class and provides @@ -27,7 +26,7 @@ class DCNetwork(Dockernet): This class is used by topology definition scripts. """ - def __init__(self, controller=RemoteController, + def __init__(self, controller=RemoteController, monitor=False, dc_emulation_max_cpu=1.0, # fraction of overall CPU time for emulation dc_emulation_max_mem=512, # emulation max mem in MB **kwargs): @@ -56,7 +55,10 @@ class DCNetwork(Dockernet): self.DCNetwork_graph = nx.MultiDiGraph() # monitoring agent - self.monitor_agent = DCNetworkMonitor(self) + if monitor: + self.monitor_agent = DCNetworkMonitor(self) + else: + self.monitor_agent = None # initialize resource model registrar self.rm_registrar = ResourceModelRegistrar( @@ -176,32 +178,37 @@ class DCNetwork(Dockernet): Dockernet.start(self) def stop(self): - # stop Ryu controller + + # stop the monitor agent + if self.monitor_agent is not None: + self.monitor_agent.stop() + + # stop emulator net Dockernet.stop(self) + + # stop Ryu controller self.stopRyu() + def CLI(self): CLI(self) # to remove chain do setChain( src, dst, cmd='del-flows') - def setChain(self, vnf_src_name, vnf_dst_name, cmd='add-flow'): + def setChain(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None, cmd='add-flow'): #check if port is specified (vnf:port) - try: - vnf_source_interface = vnf_src_name.split(':')[1] - except: + if vnf_src_interface is None: # take first interface by default connected_sw = self.DCNetwork_graph.neighbors(vnf_src_name)[0] link_dict = self.DCNetwork_graph[vnf_src_name][connected_sw] - vnf_source_interface = link_dict[0]['src_port_id'] + vnf_src_interface = link_dict[0]['src_port_id'] #vnf_source_interface = 0 - vnf_src_name = vnf_src_name.split(':')[0] 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: #logging.info("{0},{1}".format(link_dict[link],vnf_source_interface)) - if link_dict[link]['src_port_id'] == vnf_source_interface: + if link_dict[link]['src_port_id'] == vnf_src_interface: # found the right link and connected switch #logging.info("{0},{1}".format(link_dict[link]['src_port_id'], vnf_source_interface)) src_sw = connected_sw @@ -209,20 +216,18 @@ class DCNetwork(Dockernet): src_sw_inport = link_dict[link]['dst_port'] break - try: - vnf_dest_interface = vnf_dst_name.split(':')[1] - except: + if vnf_dst_interface is None: # take first interface by default connected_sw = self.DCNetwork_graph.neighbors(vnf_dst_name)[0] link_dict = self.DCNetwork_graph[connected_sw][vnf_dst_name] - vnf_dest_interface = link_dict[0]['dst_port_id'] + vnf_dst_interface = link_dict[0]['dst_port_id'] #vnf_dest_interface = 0 vnf_dst_name = vnf_dst_name.split(':')[0] 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_dest_interface: + if link_dict[link]['dst_port_id'] == vnf_dst_interface: # found the right link and connected switch dst_sw = connected_sw dst_sw_outport = link_dict[link]['src_port'] @@ -260,6 +265,7 @@ class DCNetwork(Dockernet): logging.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 index_edge_out = 0 switch_outport = self.DCNetwork_graph[current_hop][next_hop][index_edge_out]['src_port'] @@ -292,9 +298,10 @@ class DCNetwork(Dockernet): current_node.dpctl(cmd, ofcmd) logging.info("add flow in switch: {0} in_port: {1} out_port: {2}".format(current_node.name, switch_inport, switch_outport)) - - switch_inport = self.DCNetwork_graph[current_hop][next_hop][index_edge_out]['dst_port'] - current_hop = next_hop + # take first link between switches by default + if isinstance( next_node, OVSSwitch ): + switch_inport = self.DCNetwork_graph[current_hop][next_hop][0]['dst_port'] + current_hop = next_hop return "path added between {0} and {1}".format(vnf_src_name, vnf_dst_name) #return "destination node: {0} not reached".format(vnf_dst_name)