Finalizing Python3 migration
[osm/vim-emu.git] / src / emuvim / dcemulator / net.py
index 6be973f..9e8c9be 100755 (executable)
 # acknowledge the contributions of their colleagues of the SONATA
 # partner consortium (www.sonata-nfv.eu).
 import logging
 # acknowledge the contributions of their colleagues of the SONATA
 # partner consortium (www.sonata-nfv.eu).
 import logging
-
 import time
 import time
-from subprocess import Popen
 import re
 import requests
 import os
 import json
 import re
 import requests
 import os
 import json
-
+import networkx as nx
+from subprocess import Popen
+# from gevent import monkey
 from mininet.net import Containernet
 from mininet.node import OVSSwitch, OVSKernelSwitch, Docker, RemoteController
 from mininet.cli import CLI
 from mininet.link import TCLink
 from mininet.clean import cleanup
 from mininet.net import Containernet
 from mininet.node import OVSSwitch, OVSKernelSwitch, Docker, RemoteController
 from mininet.cli import CLI
 from mininet.link import TCLink
 from mininet.clean import cleanup
-import networkx as nx
 from emuvim.dcemulator.monitoring import DCNetworkMonitor
 from emuvim.dcemulator.node import Datacenter, EmulatorCompute
 from emuvim.dcemulator.resourcemodel import ResourceModelRegistrar
 
 from emuvim.dcemulator.monitoring import DCNetworkMonitor
 from emuvim.dcemulator.node import Datacenter, EmulatorCompute
 from emuvim.dcemulator.resourcemodel import ResourceModelRegistrar
 
+# ensure correct functionality of all gevent based REST servers
+# monkey.patch_all()
+
+# setup logging
 LOG = logging.getLogger("dcemulator.net")
 LOG.setLevel(logging.DEBUG)
 
 LOG = logging.getLogger("dcemulator.net")
 LOG.setLevel(logging.DEBUG)
 
@@ -114,7 +117,7 @@ class DCNetwork(Containernet):
         self.DCNetwork_graph = nx.MultiDiGraph()
 
         # initialize pool of vlan tags to setup the SDN paths
         self.DCNetwork_graph = nx.MultiDiGraph()
 
         # initialize pool of vlan tags to setup the SDN paths
-        self.vlans = range(1, 4095)[::-1]
+        self.vlans = list(range(1, 4095))[::-1]
 
         # link to Ryu REST_API
         ryu_ip = 'localhost'
 
         # link to Ryu REST_API
         ryu_ip = 'localhost'
@@ -156,13 +159,13 @@ class DCNetwork(Containernet):
         assert node2 is not None
 
         # ensure type of node1
         assert node2 is not None
 
         # ensure type of node1
-        if isinstance(node1, basestring):
+        if isinstance(node1, str):
             if node1 in self.dcs:
                 node1 = self.dcs[node1].switch
         if isinstance(node1, Datacenter):
             node1 = node1.switch
         # ensure type of node2
             if node1 in self.dcs:
                 node1 = self.dcs[node1].switch
         if isinstance(node1, Datacenter):
             node1 = node1.switch
         # ensure type of node2
-        if isinstance(node2, basestring):
+        if isinstance(node2, str):
             if node2 in self.dcs:
                 node2 = self.dcs[node2].switch
         if isinstance(node2, Datacenter):
             if node2 in self.dcs:
                 node2 = self.dcs[node2].switch
         if isinstance(node2, Datacenter):
@@ -223,7 +226,7 @@ class DCNetwork(Containernet):
                       'dst_port_name': node2_port_name}
         attr_dict2.update(attr_dict)
         self.DCNetwork_graph.add_edge(
                       'dst_port_name': node2_port_name}
         attr_dict2.update(attr_dict)
         self.DCNetwork_graph.add_edge(
-            node1.name, node2.name, attr_dict=attr_dict2)
+            node1.name, node2.name, **attr_dict2)
 
         attr_dict2 = {'src_port_id': node2_port_id, 'src_port_nr': node2.ports[link.intf2],
                       'src_port_name': node2_port_name,
 
         attr_dict2 = {'src_port_id': node2_port_id, 'src_port_nr': node2.ports[link.intf2],
                       'src_port_name': node2_port_name,
@@ -231,7 +234,7 @@ class DCNetwork(Containernet):
                       'dst_port_name': node1_port_name}
         attr_dict2.update(attr_dict)
         self.DCNetwork_graph.add_edge(
                       'dst_port_name': node1_port_name}
         attr_dict2.update(attr_dict)
         self.DCNetwork_graph.add_edge(
-            node2.name, node1.name, attr_dict=attr_dict2)
+            node2.name, node1.name, **attr_dict2)
 
         LOG.debug("addLink: n1={0} intf1={1} -- n2={2} intf2={3}".format(
             str(node1), node1_port_name, str(node2), node2_port_name))
 
         LOG.debug("addLink: n1={0} intf1={1} -- n2={2} intf2={3}".format(
             str(node1), node1_port_name, str(node2), node2_port_name))
@@ -317,13 +320,13 @@ class DCNetwork(Containernet):
         Returns a list with all containers within all data centers.
         """
         all_containers = []
         Returns a list with all containers within all data centers.
         """
         all_containers = []
-        for dc in self.dcs.itervalues():
+        for dc in self.dcs.values():
             all_containers += dc.listCompute()
         return all_containers
 
     def start(self):
         # start
             all_containers += dc.listCompute()
         return all_containers
 
     def start(self):
         # start
-        for dc in self.dcs.itervalues():
+        for dc in self.dcs.values():
             dc.start()
         Containernet.start(self)
 
             dc.start()
         Containernet.start(self)
 
@@ -382,6 +385,18 @@ class DCNetwork(Containernet):
             switch_node = self.getNodeByName(src_sw)
             self._set_vlan_tag(switch_node, src_sw_inport_name, vlan)
 
             switch_node = self.getNodeByName(src_sw)
             self._set_vlan_tag(switch_node, src_sw_inport_name, vlan)
 
+    def getNodeByName(self, name):
+        """
+        Wraps Containernet's getNodeByName method to avoid
+        key not found exceptions.
+        """
+        try:
+            return super(DCNetwork, self).getNodeByName(name)
+        except BaseException as ex:
+            LOG.warning("Node not found: {}".format(name))
+            LOG.debug("Node not found: {}".format(ex))
+        return None
+
     def _addMonitorFlow(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None,
                         tag=None, **kwargs):
         """
     def _addMonitorFlow(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None,
                         tag=None, **kwargs):
         """
@@ -614,7 +629,7 @@ class DCNetwork(Containernet):
         # check if port is specified (vnf:port)
         if vnf_src_interface is None:
             # take first interface by default
         # check if port is specified (vnf:port)
         if vnf_src_interface is None:
             # take first interface by default
-            connected_sw = self.DCNetwork_graph.neighbors(vnf_src_name)[0]
+            connected_sw = list(self.DCNetwork_graph.neighbors(vnf_src_name))[0]
             link_dict = self.DCNetwork_graph[vnf_src_name][connected_sw]
             vnf_src_interface = link_dict[0]['src_port_id']
 
             link_dict = self.DCNetwork_graph[vnf_src_name][connected_sw]
             vnf_src_interface = link_dict[0]['src_port_id']
 
@@ -631,7 +646,7 @@ class DCNetwork(Containernet):
 
         if vnf_dst_interface is None:
             # take first interface by default
 
         if vnf_dst_interface is None:
             # take first interface by default
-            connected_sw = self.DCNetwork_graph.neighbors(vnf_dst_name)[0]
+            connected_sw = list(self.DCNetwork_graph.neighbors(vnf_dst_name))[0]
             link_dict = self.DCNetwork_graph[connected_sw][vnf_dst_name]
             vnf_dst_interface = link_dict[0]['dst_port_id']
 
             link_dict = self.DCNetwork_graph[connected_sw][vnf_dst_name]
             vnf_dst_interface = link_dict[0]['dst_port_id']
 
@@ -934,9 +949,12 @@ class DCNetwork(Containernet):
         :return:
         """
         # try it nicely
         :return:
         """
         # try it nicely
-        if self.ryu_process is not None:
-            self.ryu_process.terminate()
-            self.ryu_process.kill()
+        try:
+            if self.ryu_process is not None:
+                self.ryu_process.terminate()
+                self.ryu_process.kill()
+        except BaseException as ex:
+            LOG.warning("Error during Ryu stop: {}".format(ex))
         # ensure its death ;-)
         Popen(['pkill', '-f', 'ryu-manager'])
 
         # ensure its death ;-)
         Popen(['pkill', '-f', 'ryu-manager'])