X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Femuvim%2Fapi%2Frest%2Fmonitor.py;h=bf0f26bd42d0e8372f20583009171acffd95cafb;hb=5b428742f78d79c2c465957b01d911a3513c3d30;hp=8de0379212290976c65d4b26ac328868fb99a71e;hpb=4fac2afba3182039dae6216d267d13eb3b98a56f;p=osm%2Fvim-emu.git diff --git a/src/emuvim/api/rest/monitor.py b/src/emuvim/api/rest/monitor.py index 8de0379..bf0f26b 100755 --- a/src/emuvim/api/rest/monitor.py +++ b/src/emuvim/api/rest/monitor.py @@ -33,11 +33,13 @@ Networking and monitoring functions """ import logging -from flask_restful import Resource +from flask_restful import Resource, reqparse from flask import request import json -logging.basicConfig(level=logging.INFO) +logging.basicConfig() + +CORS_HEADER = {'Access-Control-Allow-Origin': '*'} net = None @@ -53,31 +55,49 @@ class MonitorInterfaceAction(Resource): """ global net - def put(self, vnf_name, vnf_interface=None, metric='tx_packets', cookie=None): + def put(self): logging.debug("REST CALL: start monitor VNF interface") + # get URL parameters + data = request.args + if data is None: + data = {} + vnf_name = data.get("vnf_name") + vnf_interface = data.get("vnf_interface", None) + metric = data.get("metric", 'tx_packets') + cookie = data.get("cookie") + try: if cookie: c = net.monitor_agent.setup_flow(vnf_name, vnf_interface, metric, cookie) else: c = net.monitor_agent.setup_metric(vnf_name, vnf_interface, metric) # return monitor message response - return str(c), 200 + return str(c), 200, CORS_HEADER except Exception as ex: logging.exception("API error.") - return ex.message, 500 + return ex.message, 500, CORS_HEADER - def delete(self, vnf_name, vnf_interface=None, metric='tx_packets', cookie=None): + def delete(self): logging.debug("REST CALL: stop monitor VNF interface") + # get URL parameters + data = request.args + if data is None: + data = {} + vnf_name = data.get("vnf_name") + vnf_interface = data.get("vnf_interface", None) + metric = data.get("metric", 'tx_packets') + cookie = data.get("cookie") + try: if cookie: c = net.monitor_agent.stop_flow(vnf_name, vnf_interface, metric, cookie) else: c = net.monitor_agent.stop_metric(vnf_name, vnf_interface, metric) # return monitor message response - return str(c), 200 + return str(c), 200, CORS_HEADER except Exception as ex: logging.exception("API error.") - return ex.message, 500 + return ex.message, 500, CORS_HEADER class MonitorFlowAction(Resource): @@ -91,29 +111,50 @@ class MonitorFlowAction(Resource): """ global net - def put(self, vnf_name, vnf_interface=None, metric='tx_packets', cookie=0): + def put(self): logging.debug("REST CALL: start monitor VNF interface") + # get URL parameters + data = request.args + if data is None: + data = {} + vnf_name = data.get("vnf_name") + vnf_interface = data.get("vnf_interface", None) + metric = data.get("metric", 'tx_packets') + cookie = data.get("cookie", 0) + try: c = net.monitor_agent.setup_flow(vnf_name, vnf_interface, metric, cookie) # return monitor message response - return str(c), 200 + return str(c), 200, CORS_HEADER except Exception as ex: logging.exception("API error.") - return ex.message, 500 + return ex.message, 500, CORS_HEADER - def delete(self, vnf_name, vnf_interface=None, metric='tx_packets', cookie=0): + def delete(self): logging.debug("REST CALL: stop monitor VNF interface") + # get URL parameters + data = request.args + if data is None: + data = {} + vnf_name = data.get("vnf_name") + vnf_interface = data.get("vnf_interface", None) + metric = data.get("metric", 'tx_packets') + cookie = data.get("cookie", 0) + try: c = net.monitor_agent.stop_flow(vnf_name, vnf_interface, metric, cookie) # return monitor message response - return str(c), 200 + return str(c), 200, CORS_HEADER except Exception as ex: logging.exception("API error.") - return ex.message, 500 + return ex.message, 500, CORS_HEADER class MonitorLinkAction(Resource): """ - Add or remove chains between VNFs. These chain links are implemented as flow entries in the networks' SDN switches. + Add or remove flow monitoring on chains between VNFs. + These chain links are implemented as flow entries in the networks' SDN switches. + The monitoring is an extra flow entry on top of the existing chain, with a specific match. (preserving the chaining) + The counters of this new monitoring flow are exported :param vnf_src_name: VNF name of the source of the link :param vnf_dst_name: VNF name of the destination of the link :param vnf_src_interface: VNF interface name of the source of the link @@ -133,37 +174,43 @@ class MonitorLinkAction(Resource): # the global net is set from the topology file, and connected via connectDCNetwork function in rest_api_endpoint.py global net - def put(self, vnf_src_name, vnf_dst_name): + def put(self): logging.debug("REST CALL: monitor link flow add") try: command = 'add-flow' - return self._MonitorLinkAction(vnf_src_name, vnf_dst_name, command=command) + return self._MonitorLinkAction(command=command) except Exception as ex: logging.exception("API error.") - return ex.message, 500 + return ex.message, 500, CORS_HEADER - def delete(self, vnf_src_name, vnf_dst_name): + def delete(self): logging.debug("REST CALL: monitor link flow remove") try: command = 'del-flows' - return self._MonitorLinkAction(vnf_src_name, vnf_dst_name, command=command) + return self._MonitorLinkAction(command=command) except Exception as ex: logging.exception("API error.") - return ex.message, 500 + return ex.message, 500, CORS_HEADER - def _MonitorLinkAction(self, vnf_src_name, vnf_dst_name, command=None): + def _MonitorLinkAction(self, command=None): # call DCNetwork method, not really datacenter specific API for now... # no check if vnfs are really connected to this datacenter... + try: - # check if json data is a dict + # check json payload + logging.debug("json: {}".format(request.json)) + logging.debug("args: {}".format(request.args)) + data = request.json + if data is None: + data = request.args if data is None: data = {} - elif type(data) is not dict: - data = json.loads(request.json) + vnf_src_name = data.get("vnf_src_name") + vnf_dst_name = data.get("vnf_dst_name") vnf_src_interface = data.get("vnf_src_interface") vnf_dst_interface = data.get("vnf_dst_interface") weight = data.get("weight") @@ -199,10 +246,84 @@ class MonitorLinkAction(Resource): vnf_name = vnf_src_name vnf_interface = vnf_src_interface - c2 = net.monitor_agent.setup_flow(vnf_name, vnf_interface, metric, cookie) + c2 = 'command unknown' + if command == 'add-flow': + c2 = net.monitor_agent.setup_flow(vnf_name, vnf_interface, metric, cookie) + elif command == 'del-flows': + c2 = net.monitor_agent.stop_flow(vnf_name, vnf_interface, metric, cookie) # return setChain response - return (str(c1) + " " + str(c2)), 200 + return (str(c1) + " " + str(c2)), 200, CORS_HEADER + except Exception as ex: + logging.exception("API error.") + return ex.message, 500, CORS_HEADER + +class MonitorSkewAction(Resource): + """ + Monitor the counters of a VNF interface + :param vnf_name: name of the VNF to be monitored + :param resource: the resource to be monitored (cpu, mem, ...) + :return: message string indicating if the monitor action is succesful or not + """ + global net + + def put(self): + logging.debug("REST CALL: start monitor skewness") + # get URL parameters + data = request.args + if data is None: + data = {} + vnf_name = data.get("vnf_name") + resource_name = data.get("resource_name", 'cpu') + try: + # configure skewmon + c = net.monitor_agent.update_skewmon(vnf_name, resource_name, action='start') + + # return monitor message response + return str(c), 200, CORS_HEADER + except Exception as ex: + logging.exception("API error.") + return ex.message, 500, CORS_HEADER + + def delete(self): + logging.debug("REST CALL: stop monitor skewness") + # get URL parameters + data = request.args + if data is None: + data = {} + vnf_name = data.get("vnf_name") + resource_name = data.get("resource_name", 'cpu') + try: + # configure skewmon + c = net.monitor_agent.update_skewmon(vnf_name, resource_name, action='stop') + + # return monitor message response + return str(c), 200, CORS_HEADER + except Exception as ex: + logging.exception("API error.") + return ex.message, 500, CORS_HEADER + +class MonitorTerminal(Resource): + """ + start a terminal for the selected VNFs + :param vnf_list: list of names of the VNFs to start a terminal from (all VNFs if None) + :return: message string indicating if the monitor action is succesful or not + """ + global net + + def get(self): + # get URL parameters + data = request.args + if data is None: + data = {} + vnf_list = data.get("vnf_list") + logging.debug("REST CALL: start terminal for: {}".format(vnf_list)) + try: + # start terminals + c = net.monitor_agent.term(vnf_list) + + # return monitor message response + return str(c), 200, CORS_HEADER except Exception as ex: logging.exception("API error.") - return ex.message, 500 \ No newline at end of file + return ex.message, 500, CORS_HEADER