X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=blobdiff_plain;f=src%2Femuvim%2Fapi%2Frest%2Fmonitor.py;h=bf0f26bd42d0e8372f20583009171acffd95cafb;hp=737048d5d9a814475e83a9fe340ff7290a52dd37;hb=5b428742f78d79c2c465957b01d911a3513c3d30;hpb=9c221dbabf752546f3bbec740c13b12f9e8868ca diff --git a/src/emuvim/api/rest/monitor.py b/src/emuvim/api/rest/monitor.py index 737048d..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,25 +111,43 @@ 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): """ @@ -136,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") @@ -202,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