X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fdcemulator%2Fnet.py;h=625854337f4d5808cf8e1508410e1478585afabf;hb=2bbd459ee30a19ecb77bb0a0aeda73db16ef5244;hp=1bbc5bf0bbc0b06e53a30fffb7e1bb4d4b5ff562;hpb=06dc125e4ec3149194604cb9b5483160b52cd425;p=osm%2Fvim-emu.git diff --git a/src/emuvim/dcemulator/net.py b/src/emuvim/dcemulator/net.py index 1bbc5bf..6258543 100755 --- a/src/emuvim/dcemulator/net.py +++ b/src/emuvim/dcemulator/net.py @@ -24,24 +24,27 @@ # 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) @@ -759,6 +762,7 @@ class DCNetwork(Containernet): cmd = kwargs.get('cmd') path = kwargs.get('path') index = kwargs.get('pathindex') + mod_dl_dst = kwargs.get('mod_dl_dst') vlan = kwargs.get('vlan') priority = kwargs.get('priority', DEFAULT_PRIORITY) @@ -826,6 +830,12 @@ class DCNetwork(Containernet): else: # middle nodes match += ',dl_vlan=%s' % vlan + if mod_dl_dst: + action = {} + action['type'] = 'SET_FIELD' + action['field'] = 'eth_dst' + action['value'] = mod_dl_dst + flow['actions'].append(action) # output action must come last action = {} @@ -927,9 +937,12 @@ class DCNetwork(Containernet): :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']) @@ -939,6 +952,8 @@ class DCNetwork(Containernet): url = self.ryu_REST_api + '/' + str(prefix) + '/' + str(dpid) else: url = self.ryu_REST_api + '/' + str(prefix) + + LOG.debug('sending RYU command: %s, payload: %s', url, data) if data: req = self.RyuSession.post(url, json=data) else: @@ -946,7 +961,7 @@ class DCNetwork(Containernet): # do extra logging if status code is not 200 (OK) if req.status_code is not requests.codes.ok: - logging.info( + LOG.info( 'type {0} encoding: {1} text: {2} headers: {3} history: {4}'.format(req.headers['content-type'], req.encoding, req.text, req.headers, req.history))