From 9c8a412537446ca2f28132617c4a0d0d55ae660a Mon Sep 17 00:00:00 2001 From: stevenvanrossem Date: Sat, 16 Jul 2016 03:23:13 +0200 Subject: [PATCH] cleanup rest API issues --- src/emuvim/api/rest/compute.py | 3 +- src/emuvim/api/rest/monitor.py | 8 ++-- src/emuvim/api/rest/rest_api_endpoint.py | 12 ++++-- src/emuvim/cli/rest/monitor.py | 3 +- src/emuvim/cli/rest/network.py | 5 +-- src/emuvim/dcemulator/monitoring.py | 49 +++++++++++++++++++----- 6 files changed, 56 insertions(+), 24 deletions(-) diff --git a/src/emuvim/api/rest/compute.py b/src/emuvim/api/rest/compute.py index e412133..9f0516b 100755 --- a/src/emuvim/api/rest/compute.py +++ b/src/emuvim/api/rest/compute.py @@ -78,7 +78,8 @@ class ComputeStart(Resource): ''' nw_list = list() - if network_str is None or '),(' not in network_str : + # TODO make this more robust with regex check + if network_str is None : return nw_list networks = network_str[1:-1].split('),(') diff --git a/src/emuvim/api/rest/monitor.py b/src/emuvim/api/rest/monitor.py index 15ec014..45d9541 100755 --- a/src/emuvim/api/rest/monitor.py +++ b/src/emuvim/api/rest/monitor.py @@ -53,7 +53,7 @@ class MonitorInterfaceAction(Resource): """ global net - def put(self, vnf_name, vnf_interface, metric): + def put(self, vnf_name, vnf_interface=None, metric='tx_packets'): logging.debug("REST CALL: start monitor VNF interface") try: c = net.monitor_agent.setup_metric(vnf_name, vnf_interface, metric) @@ -63,7 +63,7 @@ class MonitorInterfaceAction(Resource): logging.exception("API error.") return ex.message, 500 - def delete(self, vnf_name, vnf_interface, metric): + def delete(self, vnf_name, vnf_interface=None, metric='tx_packets'): logging.debug("REST CALL: stop monitor VNF interface") try: c = net.monitor_agent.stop_metric(vnf_name, vnf_interface, metric) @@ -85,7 +85,7 @@ class MonitorFlowAction(Resource): """ global net - def put(self, vnf_name, vnf_interface, metric, cookie): + def put(self, vnf_name, vnf_interface=None, metric='tx_packets', cookie=0): logging.debug("REST CALL: start monitor VNF interface") try: c = net.monitor_agent.setup_flow(vnf_name, vnf_interface, metric, cookie) @@ -95,7 +95,7 @@ class MonitorFlowAction(Resource): logging.exception("API error.") return ex.message, 500 - def delete(self, vnf_name, vnf_interface, metric, cookie): + def delete(self, vnf_name, vnf_interface=None, metric='tx_packets', cookie=0): logging.debug("REST CALL: stop monitor VNF interface") try: c = net.monitor_agent.stop_flow(vnf_name, vnf_interface, metric, cookie) diff --git a/src/emuvim/api/rest/rest_api_endpoint.py b/src/emuvim/api/rest/rest_api_endpoint.py index d6c1185..536ed7a 100755 --- a/src/emuvim/api/rest/rest_api_endpoint.py +++ b/src/emuvim/api/rest/rest_api_endpoint.py @@ -69,10 +69,14 @@ class RestApiEndpoint(object): self.api.add_resource(DatacenterList, "/restapi/datacenter") self.api.add_resource(DatacenterStatus, "/restapi/datacenter/") - self.api.add_resource(NetworkAction, "/restapi/network//") - - self.api.add_resource(MonitorInterfaceAction, "/restapi/monitor///") - self.api.add_resource(MonitorFlowAction, "/restapi/monitor////") + self.api.add_resource(NetworkAction, "/restapi/network//",) + + self.api.add_resource(MonitorInterfaceAction, + "/restapi/monitor//", + "/restapi/monitor///") + self.api.add_resource(MonitorFlowAction, + "/restapi/flowmon///", + "/restapi/flowmon////") logging.debug("Created API endpoint %s(%s:%d)" % (self.__class__.__name__, self.ip, self.port)) diff --git a/src/emuvim/cli/rest/monitor.py b/src/emuvim/cli/rest/monitor.py index 7e9b839..858aad7 100755 --- a/src/emuvim/cli/rest/monitor.py +++ b/src/emuvim/cli/rest/monitor.py @@ -25,11 +25,10 @@ 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). """ + from requests import get, put, delete -from tabulate import tabulate import pprint import argparse -import json from emuvim.cli import prometheus pp = pprint.PrettyPrinter(indent=4) diff --git a/src/emuvim/cli/rest/network.py b/src/emuvim/cli/rest/network.py index c6e1dcc..86ed92b 100755 --- a/src/emuvim/cli/rest/network.py +++ b/src/emuvim/cli/rest/network.py @@ -26,10 +26,8 @@ acknowledge the contributions of their colleagues of the SONATA partner consortium (www.sonata-nfv.eu). """ from requests import get,put, delete -from tabulate import tabulate import pprint import argparse -import json pp = pprint.PrettyPrinter(indent=4) @@ -114,13 +112,12 @@ parser.add_argument( help="vnf name of the destination of the chain") parser.add_argument( "--weight", "-w", dest="weight", - help="weight metric to calculate the path") + help="weight edge attribute to calculate the path") parser.add_argument( "--match", "-m", dest="match", help="string holding extra matches for the flow entries") parser.add_argument( "--bidirectional", "-b", dest="bidirectional", - action='store_true', help="add/remove the flow entries from src to dst and back") parser.add_argument( "--cookie", "-c", dest="cookie", diff --git a/src/emuvim/dcemulator/monitoring.py b/src/emuvim/dcemulator/monitoring.py index 89d82ba..78d6ebb 100755 --- a/src/emuvim/dcemulator/monitoring.py +++ b/src/emuvim/dcemulator/monitoring.py @@ -107,7 +107,7 @@ class DCNetworkMonitor(): # 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() + #self.cadvisor_process = self.start_cadvisor() # first set some parameters, before measurement can start def setup_flow(self, vnf_name, vnf_interface=None, metric='tx_packets', cookie=0): @@ -167,7 +167,15 @@ class DCNetworkMonitor(): logging.exception("setup_metric error.") return ex.message - def stop_flow(self, vnf_name, vnf_interface=None, metric=None, cookie=0): + def stop_flow(self, vnf_name, vnf_interface=None, metric=None, cookie=0,): + + # check if port is specified (vnf:port) + if vnf_interface is None and metric is not None: + # take first interface by default + connected_sw = self.net.DCNetwork_graph.neighbors(vnf_name)[0] + link_dict = self.net.DCNetwork_graph[vnf_name][connected_sw] + vnf_interface = link_dict[0]['src_port_id'] + for flow_dict in self.flow_metrics: if flow_dict['vnf_name'] == vnf_name and flow_dict['vnf_interface'] == vnf_interface \ and flow_dict['metric_key'] == metric and flow_dict['cookie'] == cookie: @@ -187,6 +195,8 @@ class DCNetworkMonitor(): logging.info('Stopped monitoring flow {3}: {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric, cookie)) return 'Stopped monitoring flow {3}: {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric, cookie) + return 'Error stopping monitoring flow: {0} on {1}:{2}'.format(metric, vnf_name, vnf_interface) + # first set some parameters, before measurement can start def setup_metric(self, vnf_name, vnf_interface=None, metric='tx_packets'): @@ -258,6 +268,13 @@ class DCNetworkMonitor(): def stop_metric(self, vnf_name, vnf_interface=None, metric=None): + # check if port is specified (vnf:port) + if vnf_interface is None and metric is not None: + # take first interface by default + connected_sw = self.net.DCNetwork_graph.neighbors(vnf_name)[0] + link_dict = self.net.DCNetwork_graph[vnf_name][connected_sw] + vnf_interface = link_dict[0]['src_port_id'] + for metric_dict in self.network_metrics: if metric_dict['vnf_name'] == vnf_name and metric_dict['vnf_interface'] == vnf_interface \ and metric_dict['metric_key'] == metric: @@ -319,8 +336,13 @@ class DCNetworkMonitor(): logging.info('Stopped monitoring vnf: {0}'.format(vnf_name)) return 'Stopped monitoring: {0}'.format(vnf_name) + return 'Error stopping monitoring metric: {0} on {1}:{2}'.format(metric, vnf_name, vnf_interface) + + + - # get all metrics defined in the list and export it to Prometheus + +# get all metrics defined in the list and export it to Prometheus def get_flow_metrics(self): while self.start_monitoring: @@ -429,12 +451,20 @@ class DCNetworkMonitor(): cookie = metric_dict['cookie'] # TODO aggregate all found flow stats - flow_stat = flow_stat_dict[str(switch_dpid)][0] - if 'bytes' in metric_key: - counter = flow_stat['byte_count'] - elif 'packet' in metric_key: - counter = flow_stat['packet_count'] + #flow_stat = flow_stat_dict[str(switch_dpid)][0] + #if 'bytes' in metric_key: + # counter = flow_stat['byte_count'] + #elif 'packet' in metric_key: + # counter = flow_stat['packet_count'] + + counter = 0 + for flow_stat in flow_stat_dict[str(switch_dpid)]: + if 'bytes' in metric_key: + counter += flow_stat['byte_count'] + elif 'packet' in metric_key: + counter += flow_stat['packet_count'] + flow_stat = flow_stat_dict[str(switch_dpid)][0] flow_uptime = flow_stat['duration_sec'] + flow_stat['duration_nsec'] * 10 ** (-9) self.prom_metrics[metric_dict['metric_key']]. \ @@ -490,6 +520,7 @@ class DCNetworkMonitor(): self.monitor_thread.join() self.monitor_flow_thread.join() + # these containers are used for monitoring but are started now outside of son-emu ''' if self.prometheus_process is not None: logging.info('stopping prometheus container') @@ -502,13 +533,13 @@ class DCNetworkMonitor(): self.pushgateway_process.terminate() self.pushgateway_process.kill() self._stop_container('pushgateway') - ''' if self.cadvisor_process is not None: logging.info('stopping cadvisor container') self.cadvisor_process.terminate() self.cadvisor_process.kill() self._stop_container('cadvisor') + ''' def switch_tx_rx(self,metric=''): # when monitoring vnfs, the tx of the datacenter switch is actually the rx of the vnf -- 2.17.1