From: stevenvanrossem Date: Thu, 14 Jul 2016 09:42:09 +0000 (+0200) Subject: cleanup for open sourcing X-Git-Tag: v3.1~99 X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=commitdiff_plain;h=e131bf5fefb90aadfe698dd72126cd2fdfe2fb7a cleanup for open sourcing --- diff --git a/README.md b/README.md index da7e87e..963aec1 100755 --- a/README.md +++ b/README.md @@ -55,7 +55,6 @@ Despite of this son-emu has the following dependencies: * [flask_restful](https://pypi.python.org/pypi/Flask-RESTful) >= 0.3 (BSD) * [networkx](https://pypi.python.org/pypi/networkx/) >= 1.11 (BSD) * [oslo.config](http://docs.openstack.org/developer/oslo.config/) >= 3.9.0 (Apache 2.0) -* [paramiko](https://pypi.python.org/pypi/paramiko/1.16.0) >= 1.6 (LGPL) * [prometheus_client](https://pypi.python.org/pypi/prometheus_client) >= 0.0.13 (Apache 2.0) * [pyaml](https://pypi.python.org/pypi/pyaml) >=15.8.2 (WTFPL) * [pytest-runner](https://pypi.python.org/pypi/pytest-runner) >= 2.8 (MIT) diff --git a/ansible/install.yml b/ansible/install.yml index 7fed451..fd3aa4b 100755 --- a/ansible/install.yml +++ b/ansible/install.yml @@ -63,9 +63,6 @@ - name: install prometheus_client pip: name=prometheus_client state=latest - - name: install paramiko - pip: name=paramiko state=latest - - name: install latest urllib3 (fix error urllib3.connection.match_hostname = match_hostname) pip: name=urllib3 state=latest diff --git a/misc/sonata-demo-docker.son b/misc/sonata-demo-docker.son old mode 100644 new mode 100755 diff --git a/misc/vnfs/firewall/Dockerfile b/misc/vnfs/firewall/Dockerfile old mode 100644 new mode 100755 diff --git a/misc/vnfs/firewall/start.sh b/misc/vnfs/firewall/start.sh old mode 100644 new mode 100755 diff --git a/misc/vnfs/iperf/Dockerfile b/misc/vnfs/iperf/Dockerfile old mode 100644 new mode 100755 diff --git a/misc/vnfs/iperf/start.sh b/misc/vnfs/iperf/start.sh old mode 100644 new mode 100755 diff --git a/misc/vnfs/tcpdump/Dockerfile b/misc/vnfs/tcpdump/Dockerfile old mode 100644 new mode 100755 diff --git a/misc/vnfs/tcpdump/start.sh b/misc/vnfs/tcpdump/start.sh old mode 100644 new mode 100755 diff --git a/setup.py b/setup.py index d64279c..fbd8650 100755 --- a/setup.py +++ b/setup.py @@ -51,7 +51,6 @@ setup(name='emuvim', 'docker-py==1.7.1', 'requests', 'prometheus_client', - 'paramiko', 'urllib3' ], zip_safe=False, diff --git a/src/emuvim/api/rest/monitor.py b/src/emuvim/api/rest/monitor.py index 827843b..15ec014 100755 --- a/src/emuvim/api/rest/monitor.py +++ b/src/emuvim/api/rest/monitor.py @@ -25,6 +25,13 @@ the Horizon 2020 and 5G-PPP programmes. The authors would like to acknowledge the contributions of their colleagues of the SONATA partner consortium (www.sonata-nfv.eu). """ + +""" +Distributed Cloud Emulator (dcemulator) +Networking and monitoring functions +(c) 2015 by Steven Van Rossem +""" + import logging from flask_restful import Resource from flask import request diff --git a/src/emuvim/api/rest/network.py b/src/emuvim/api/rest/network.py index eb31c3c..ee0c389 100755 --- a/src/emuvim/api/rest/network.py +++ b/src/emuvim/api/rest/network.py @@ -25,6 +25,13 @@ the Horizon 2020 and 5G-PPP programmes. The authors would like to acknowledge the contributions of their colleagues of the SONATA partner consortium (www.sonata-nfv.eu). """ + +""" +Distributed Cloud Emulator (dcemulator) +Networking and monitoring functions +(c) 2015 by Steven Van Rossem +""" + import logging from flask_restful import Resource from flask import request diff --git a/src/emuvim/api/zerorpc/compute.py b/src/emuvim/api/zerorpc/compute.py index 5e5d0de..b612e87 100755 --- a/src/emuvim/api/zerorpc/compute.py +++ b/src/emuvim/api/zerorpc/compute.py @@ -34,11 +34,6 @@ import logging import threading import zerorpc -import paramiko -import ipaddress -import time -import gevent - logging.basicConfig(level=logging.INFO) @@ -145,108 +140,6 @@ class MultiDatacenterApi(object): logging.exception("RPC error.") return ex.message - @zerorpc.stream - def compute_profile(self, dc_label, compute_name, kwargs): - # note: zerorpc does not support keyword arguments - - ## VIM/dummy gatekeeper's tasks: - # start vnf - vnf_status = self.compute_action_start( dc_label, compute_name, - kwargs.get('image'), - kwargs.get('network'), - kwargs.get('command')) - # start traffic source (with fixed ip addres, no use for now...) - psrc_status = self.compute_action_start( dc_label, 'psrc', 'profile_source', [{'id':'output'}], None) - # start traffic sink (with fixed ip addres) - psink_status = self.compute_action_start(dc_label, 'psink', 'profile_sink', [{'id': 'input'}], None) - # link vnf to traffic source - DCNetwork = self.dcs.get(dc_label).net - DCNetwork.setChain('psrc', compute_name, - vnf_src_interface='output', - vnf_dst_interface=kwargs.get('input'), - cmd='add-flow', weight=None, bidirectional=True) - DCNetwork.setChain('psrc', compute_name, - vnf_src_interface='output', - vnf_dst_interface=kwargs.get('input'), - cmd='add-flow', weight=None, - match='dl_type=0x0800,nw_proto=17,udp_dst=5001', - cookie=10) - DCNetwork.setChain( compute_name, 'psink', - vnf_src_interface='output', - vnf_dst_interface=kwargs.get('input'), - cmd='add-flow', weight=None, bidirectional=True) - DCNetwork.setChain(compute_name, 'psink', - vnf_src_interface='output', - vnf_dst_interface=kwargs.get('input'), - cmd='add-flow', weight=None, - match='dl_type=0x0800,nw_proto=17,udp_dst=5001', - cookie=11) - - ## SSM/SP tasks: - # start traffic generation - ''' - for nw in psrc_status.get('network'): - if nw.get('intf_name') == 'output': - psrc_output_ip = unicode(nw['ip']) - break - dummy_iperf_server_ip = ipaddress.IPv4Address(psrc_output_ip) + 1 - ''' - for nw in psink_status.get('network'): - if nw.get('intf_name') == 'input': - psink_input_ip = nw['ip'] - break - - - # get monitor data and analyze - vnf_uuid = vnf_status['id'] - psrc_mgmt_ip = psrc_status['docker_network'] - - # query rate - - #need to wait a bit before containers are fully up? - time.sleep(2) - - def generate(): - for rate in [0, 1, 2, 3]: - #logging.info('query:{0}'.format(query_cpu)) - - output_line = DCNetwork.monitor_agent.profile(psrc_mgmt_ip, rate, psink_input_ip, vnf_uuid) - gevent.sleep(0) - yield output_line - - # query loss - - - # create table - - ## VIM/dummy gatekeeper's tasks: - # remove vnfs and chain - DCNetwork.setChain('psrc', compute_name, - vnf_src_interface='output', - vnf_dst_interface=kwargs.get('input'), - cmd='del-flows', weight=None, bidirectional=True) - DCNetwork.setChain('psrc', compute_name, - vnf_src_interface='output', - vnf_dst_interface=kwargs.get('input'), - cmd='del-flows', weight=None, - match='dl_type=0x0800,nw_proto=17,udp_dst=5001', - cookie=10) - DCNetwork.setChain(compute_name, 'psink', - vnf_src_interface='output', - vnf_dst_interface=kwargs.get('input'), - cmd='del-flows', weight=None, bidirectional=True) - DCNetwork.setChain(compute_name, 'psink', - vnf_src_interface='output', - vnf_dst_interface=kwargs.get('input'), - cmd='del-flows', weight=None, - match='dl_type=0x0800,nw_proto=17,udp_dst=5001', - cookie=11) - self.compute_action_stop(dc_label, compute_name) - self.compute_action_stop(dc_label, 'psink') - self.compute_action_stop(dc_label, 'psrc') - - return generate() - def datacenter_list(self): logging.debug("RPC CALL: datacenter list") try: diff --git a/src/emuvim/api/zerorpc/network.py b/src/emuvim/api/zerorpc/network.py index 92cded5..7658be2 100755 --- a/src/emuvim/api/zerorpc/network.py +++ b/src/emuvim/api/zerorpc/network.py @@ -27,6 +27,8 @@ partner consortium (www.sonata-nfv.eu). """ """ Distributed Cloud Emulator (dcemulator) +Networking and monitoring functions +(c) 2015 by Steven Van Rossem """ import logging diff --git a/src/emuvim/cli/compute.py b/src/emuvim/cli/compute.py index 25ac247..b5f775f 100755 --- a/src/emuvim/cli/compute.py +++ b/src/emuvim/cli/compute.py @@ -101,27 +101,6 @@ class ZeroRpcClient(object): args.get("datacenter"), args.get("name")) pp.pprint(r) - def profile(self, args): - nw_list = list() - if args.get("network") is not None: - nw_list = self._parse_network(args.get("network")) - - params = self._create_dict( - network=nw_list, - command=args.get("docker_command"), - image=args.get("image"), - input=args.get("input"), - output=args.get("output")) - - for output in self.c.compute_profile( - args.get("datacenter"), - args.get("name"), - params): - print(output + '\n') - - #pp.pprint(r) - #print(r) - def _create_dict(self, **kwargs): return kwargs @@ -144,7 +123,7 @@ class ZeroRpcClient(object): parser = argparse.ArgumentParser(description='son-emu compute') parser.add_argument( "command", - choices=['start', 'stop', 'list', 'status', 'profile'], + choices=['start', 'stop', 'list', 'status'], help="Action to be executed.") parser.add_argument( "--datacenter", "-d", dest="datacenter", @@ -162,13 +141,6 @@ parser.add_argument( "--net", dest="network", help="Network properties of a compute instance e.g. \ '(id=input,ip=10.0.10.3/24),(id=output,ip=10.0.10.4/24)' for multiple interfaces.") -parser.add_argument( - "--input", "-in", dest="input", - help="input interface of the vnf to profile") -parser.add_argument( - "--output", "-out", dest="output", - help="output interface of the vnf to profile") - def main(argv): args = vars(parser.parse_args(argv)) diff --git a/src/emuvim/cli/monitor.py b/src/emuvim/cli/monitor.py index 9620a98..3e872d6 100755 --- a/src/emuvim/cli/monitor.py +++ b/src/emuvim/cli/monitor.py @@ -93,17 +93,9 @@ class ZeroRpcClient(object): args.get("cookie")) pp.pprint(r) - def prometheus_zrpc(self, args): - vnf_name = self._parse_vnf_name(args.get("vnf_name")) - vnf_interface = self._parse_vnf_interface(args.get("vnf_name")) - r = self.c.prometheus( - args.get("datacenter"), - vnf_name, - vnf_interface, - args.get("query")) - pp.pprint(r) - def prometheus(self, args): + # This functions makes it more user-friendly to create the correct prometheus query + # is replaced by the correct uuid of the deployed vnf container vnf_name = self._parse_vnf_name(args.get("vnf_name")) vnf_interface = self._parse_vnf_interface(args.get("vnf_name")) dc_label = args.get("datacenter") diff --git a/src/emuvim/cli/prometheus.py b/src/emuvim/cli/prometheus.py index 4572449..58969d1 100755 --- a/src/emuvim/cli/prometheus.py +++ b/src/emuvim/cli/prometheus.py @@ -26,14 +26,16 @@ acknowledge the contributions of their colleagues of the SONATA partner consortium (www.sonata-nfv.eu). """ -#import urllib2 + import requests -#import ast + # set this to localhost for now # this is correct for son-emu started outside of a container or as a container with net=host -#TODO prometheus sdk DB is started outside of emulator, place these globals in an external SDK config file? -prometheus_ip = '127.0.0.1' +#TODO if prometheus sdk DB is started outside of emulator, place these globals in an external SDK config file? +prometheus_ip = 'localhost' +# when sdk is started with docker-compose, we could use +# prometheus_ip = 'prometheus' prometheus_port = '9090' prometheus_REST_api = 'http://{0}:{1}'.format(prometheus_ip, prometheus_port) @@ -41,10 +43,7 @@ prometheus_REST_api = 'http://{0}:{1}'.format(prometheus_ip, prometheus_port) def query_Prometheus(query): url = prometheus_REST_api + '/' + 'api/v1/query?query=' + query # logging.info('query:{0}'.format(url)) - #req = urllib2.Request(url) req = requests.get(url) - #ret = urllib2.urlopen(req).read() - #ret = ast.literal_eval(ret) ret = req.json() if ret['status'] == 'success': # logging.info('return:{0}'.format(ret)) diff --git a/src/emuvim/cli/rest/monitor.py b/src/emuvim/cli/rest/monitor.py index 88db8b2..7e9b839 100755 --- a/src/emuvim/cli/rest/monitor.py +++ b/src/emuvim/cli/rest/monitor.py @@ -94,6 +94,23 @@ class RestApiClient(): pp.pprint(response.json()) + def prometheus(self, args): + # This functions makes it more user-friendly to create the correct prometheus query + # is replaced by the correct uuid of the deployed vnf container + vnf_name = self._parse_vnf_name(args.get("vnf_name")) + vnf_interface = self._parse_vnf_interface(args.get("vnf_name")) + dc_label = args.get("datacenter") + query = args.get("query") + vnf_status = get("%s/restapi/compute/%s/%s" % + (args.get("endpoint"), + args.get("datacenter"), + vnf_name)).json() + uuid = vnf_status['id'] + query = query.replace('', uuid) + + response = prometheus.query_Prometheus(query) + pp.pprint(response) + def _parse_vnf_name(self, vnf_name_str): vnf_name = vnf_name_str.split(':')[0] return vnf_name diff --git a/src/emuvim/dcemulator/monitoring.py b/src/emuvim/dcemulator/monitoring.py index ad3b112..89d82ba 100755 --- a/src/emuvim/dcemulator/monitoring.py +++ b/src/emuvim/dcemulator/monitoring.py @@ -26,7 +26,6 @@ acknowledge the contributions of their colleagues of the SONATA partner consortium (www.sonata-nfv.eu). """ -import urllib2 import logging from mininet.node import OVSSwitch import ast @@ -34,11 +33,9 @@ import time from prometheus_client import start_http_server, Summary, Histogram, Gauge, Counter, REGISTRY, CollectorRegistry, \ pushadd_to_gateway, push_to_gateway, delete_from_gateway import threading -from subprocess import Popen, PIPE +from subprocess import Popen import os -import paramiko -import gevent logging.basicConfig(level=logging.INFO) @@ -50,16 +47,22 @@ class DCNetworkMonitor(): def __init__(self, net): self.net = net + # TODO: these global variables should be part of a config file? + ''' + # prometheus is started outside of son-emu prometheus_ip = '127.0.0.1' prometheus_port = '9090' self.prometheus_REST_api = 'http://{0}:{1}'.format(prometheus_ip, prometheus_port) - - - + ''' # helper variables to calculate the metrics + # pushgateway is started outside of son-emu and son-emu is started with net=host + # so localhost:9091 works self.pushgateway = 'localhost:9091' - # Start up the server to expose the metrics to Prometheus. + # when sdk is started with docker-compose, we could use + # self.pushgateway = 'pushgateway:9091' + # Start up the server to expose the metrics to Prometheus #start_http_server(8000) + # supported Prometheus metrics self.registry = CollectorRegistry() self.prom_tx_packet_count = Gauge('sonemu_tx_count_packets', 'Total number of packets sent', @@ -101,6 +104,7 @@ class DCNetworkMonitor(): self.monitor_flow_thread.start() # helper tools + # Prometheus pushgateway and DB are started as external contianer, outside of son-emu #self.pushgateway_process = self.start_PushGateway() #self.prometheus_process = self.start_Prometheus() self.cadvisor_process = self.start_cadvisor() @@ -124,10 +128,8 @@ class DCNetworkMonitor(): for connected_sw in self.net.DCNetwork_graph.neighbors(vnf_name): link_dict = self.net.DCNetwork_graph[vnf_name][connected_sw] for link in link_dict: - # logging.info("{0},{1}".format(link_dict[link],vnf_interface)) if link_dict[link]['src_port_id'] == vnf_interface: # found the right link and connected switch - # logging.info("{0},{1}".format(link_dict[link]['src_port_id'], vnf_source_interface)) vnf_switch = connected_sw flow_metric['mon_port'] = link_dict[link]['dst_port_nr'] break @@ -176,8 +178,6 @@ class DCNetworkMonitor(): for collector in self.registry._collectors: if (vnf_name, vnf_interface, cookie) in collector._metrics: - #logging.info('2 name:{0} labels:{1} metrics:{2}'.format(collector._name, collector._labelnames, - # collector._metrics)) collector.remove(vnf_name, vnf_interface, cookie) delete_from_gateway(self.pushgateway, job='sonemu-SDNcontroller') @@ -206,10 +206,8 @@ class DCNetworkMonitor(): for connected_sw in self.net.DCNetwork_graph.neighbors(vnf_name): link_dict = self.net.DCNetwork_graph[vnf_name][connected_sw] for link in link_dict: - # logging.info("{0},{1}".format(link_dict[link],vnf_interface)) if link_dict[link]['src_port_id'] == vnf_interface: # found the right link and connected switch - # logging.info("{0},{1}".format(link_dict[link]['src_port_id'], vnf_source_interface)) network_metric['mon_port'] = link_dict[link]['dst_port_nr'] break @@ -261,7 +259,6 @@ class DCNetworkMonitor(): def stop_metric(self, vnf_name, vnf_interface=None, metric=None): for metric_dict in self.network_metrics: - #logging.info('start Stopped monitoring: {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric_dict)) if metric_dict['vnf_name'] == vnf_name and metric_dict['vnf_interface'] == vnf_interface \ and metric_dict['metric_key'] == metric: @@ -274,7 +271,7 @@ class DCNetworkMonitor(): #self.registry.unregister(self.prom_metrics[metric_dict['metric_key']]) for collector in self.registry._collectors : - #logging.info('name:{0} labels:{1} metrics:{2}'.format(collector._name, collector._labelnames, collector._metrics)) + """ INFO:root:name:sonemu_rx_count_packets labels:('vnf_name', 'vnf_interface') @@ -284,11 +281,10 @@ class DCNetworkMonitor(): 0x7f353447fd10 >} """ logging.info('{0}'.format(collector._metrics.values())) - #if self.prom_metrics[metric_dict['metric_key']] + if (vnf_name, vnf_interface, 'None') in collector._metrics: logging.info('2 name:{0} labels:{1} metrics:{2}'.format(collector._name, collector._labelnames, collector._metrics)) - #collector._metrics = {} collector.remove(vnf_name, vnf_interface, 'None') # set values to NaN, prometheus api currently does not support removal of metrics @@ -345,7 +341,7 @@ class DCNetworkMonitor(): ret = self.net.ryu_REST('stats/flow', dpid=flow_dict['switch_dpid'], data=data) flow_stat_dict = ast.literal_eval(ret) - #logging.info('received flow stat:{0} '.format(flow_stat_dict)) + logging.debug('received flow stat:{0} '.format(flow_stat_dict)) self.set_flow_metric(flow_dict, flow_stat_dict) self.monitor_flow_lock.release() @@ -368,7 +364,7 @@ class DCNetworkMonitor(): metric_list = [metric_dict for metric_dict in self.network_metrics if int(metric_dict['switch_dpid'])==int(dpid)] - #logging.info('1set prom packets:{0} '.format(self.network_metrics)) + for metric_dict in metric_list: self.set_network_metric(metric_dict, port_stat_dict) @@ -390,23 +386,21 @@ class DCNetworkMonitor(): if int(port_stat['port_no']) == int(mon_port): port_uptime = port_stat['duration_sec'] + port_stat['duration_nsec'] * 10 ** (-9) this_measurement = int(port_stat[metric_key]) - #logging.info('set prom packets:{0} {1}:{2}'.format(this_measurement, vnf_name, vnf_interface)) # set prometheus metric self.prom_metrics[metric_dict['metric_key']].\ labels({'vnf_name': vnf_name, 'vnf_interface': vnf_interface, 'flow_id': None}).\ set(this_measurement) - #push_to_gateway(self.pushgateway, job='SDNcontroller', - # grouping_key={'metric':metric_dict['metric_key']}, registry=self.registry) # 1 single monitor job for all metrics of the SDN controller pushadd_to_gateway(self.pushgateway, job='sonemu-SDNcontroller', registry=self.registry) + # also the rate is calculated here, but not used for now + # (rate can be easily queried from prometheus also) if previous_monitor_time <= 0 or previous_monitor_time >= port_uptime: metric_dict['previous_measurement'] = int(port_stat[metric_key]) metric_dict['previous_monitor_time'] = port_uptime # do first measurement - #logging.info('first measurement') time.sleep(1) self.monitor_lock.release() @@ -416,7 +410,6 @@ class DCNetworkMonitor(): else: time_delta = (port_uptime - metric_dict['previous_monitor_time']) metric_rate = (this_measurement - metric_dict['previous_measurement']) / float(time_delta) - #logging.info('metric: {0} rate:{1}'.format(metric_dict['metric_key'], metric_rate)) metric_dict['previous_measurement'] = this_measurement metric_dict['previous_monitor_time'] = port_uptime @@ -427,7 +420,6 @@ class DCNetworkMonitor(): def set_flow_metric(self, metric_dict, flow_stat_dict): # vnf tx is the datacenter switch rx and vice-versa - #metric_key = self.switch_tx_rx(metric_dict['metric_key']) metric_key = metric_dict['metric_key'] switch_dpid = metric_dict['switch_dpid'] vnf_name = metric_dict['vnf_name'] @@ -450,30 +442,6 @@ class DCNetworkMonitor(): set(counter) pushadd_to_gateway(self.pushgateway, job='sonemu-SDNcontroller', registry=self.registry) - #logging.exception('metric {0} not found on {1}:{2}'.format(metric_key, vnf_name, vnf_interface)) - #return 'metric {0} not found on {1}:{2}'.format(metric_key, vnf_name, vnf_interface) - - def query_Prometheus(self, query): - ''' - escaped_chars='{}[]' - for old in escaped_chars: - new = '\{0}'.format(old) - query = query.replace(old, new) - ''' - url = self.prometheus_REST_api + '/' + 'api/v1/query?query=' + query - #logging.info('query:{0}'.format(url)) - req = urllib2.Request(url) - ret = urllib2.urlopen(req).read() - ret = ast.literal_eval(ret) - if ret['status'] == 'success': - #logging.info('return:{0}'.format(ret)) - try: - ret = ret['data']['result'][0]['value'] - except: - ret = None - else: - ret = None - return ret def start_Prometheus(self, port=9090): # prometheus.yml configuration file is located in the same directory as this file @@ -563,33 +531,3 @@ class DCNetworkMonitor(): name] Popen(cmd).wait() - def profile(self, mgmt_ip, rate, input_ip, vnf_uuid ): - - ssh = paramiko.SSHClient() - ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - #ssh.connect(mgmt_ip, username='steven', password='test') - ssh.connect(mgmt_ip, username='root', password='root') - - iperf_cmd = 'iperf -c {0} -u -l18 -b{1}M -t1000 &'.format(input_ip, rate) - if rate > 0: - stdin, stdout, stderr = ssh.exec_command(iperf_cmd) - - start_time = time.time() - query_cpu = '(sum(rate(container_cpu_usage_seconds_total{{id="/docker/{0}"}}[{1}s])))'.format(vnf_uuid, 1) - while (time.time() - start_time) < 15: - data = self.query_Prometheus(query_cpu) - # logging.info('rate: {1} data:{0}'.format(data, rate)) - gevent.sleep(0) - time.sleep(1) - - query_cpu2 = '(sum(rate(container_cpu_usage_seconds_total{{id="/docker/{0}"}}[{1}s])))'.format(vnf_uuid, 8) - cpu_load = float(self.query_Prometheus(query_cpu2)[1]) - output = 'rate: {1}Mbps; cpu_load: {0}%'.format(round(cpu_load * 100, 2), rate) - output_line = output - logging.info(output_line) - - stop_iperf = 'pkill -9 iperf' - stdin, stdout, stderr = ssh.exec_command(stop_iperf) - - return output_line - diff --git a/src/emuvim/dcemulator/net.py b/src/emuvim/dcemulator/net.py index b201112..0e3882c 100755 --- a/src/emuvim/dcemulator/net.py +++ b/src/emuvim/dcemulator/net.py @@ -261,7 +261,7 @@ class DCNetwork(Containernet): if kwargs.get('bidirectional'): ret = ret +'\n' + self._chainAddFlow(vnf_dst_name, vnf_src_name, vnf_dst_interface, vnf_src_interface, **kwargs) - elif cmd == 'del-flows': # TODO: del-flow to be implemented + elif cmd == 'del-flows': ret = self._chainAddFlow(vnf_src_name, vnf_dst_name, vnf_src_interface, vnf_dst_interface, **kwargs) if kwargs.get('bidirectional'): ret = ret + '\n' + self._chainAddFlow(vnf_dst_name, vnf_src_name, vnf_dst_interface, vnf_src_interface, **kwargs) @@ -274,7 +274,6 @@ class DCNetwork(Containernet): def _chainAddFlow(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None, **kwargs): - # TODO: this needs to be cleaned up #check if port is specified (vnf:port) if vnf_src_interface is None: # take first interface by default diff --git a/utils/vagrant/motd b/utils/vagrant/motd old mode 100644 new mode 100755