# acknowledge the contributions of their colleagues of the SONATA
# partner consortium (www.sonata-nfv.eu).
import logging
-
import time
-from subprocess import Popen
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
-import networkx as nx
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)
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'
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 isinstance(node2, basestring):
+ if isinstance(node2, str):
if node2 in self.dcs:
node2 = self.dcs[node2].switch
if isinstance(node2, Datacenter):
'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,
'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))
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
- for dc in self.dcs.itervalues():
+ for dc in self.dcs.values():
dc.start()
Containernet.start(self)
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):
"""
# 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']
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']
: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'])