-"""
-Copyright (c) 2015 SONATA-NFV and Paderborn University
-ALL RIGHTS RESERVED.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-Neither the name of the SONATA-NFV [, ANY ADDITIONAL AFFILIATION]
-nor the names of its contributors may be used to endorse or promote
-products derived from this software without specific prior written
-permission.
-
-This work has been performed in the framework of the SONATA project,
-funded by the European Commission under Grant number 671517 through
-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 <steven.vanrossem@intec.ugent.be>
-"""
-
+# Copyright (c) 2015 SONATA-NFV and Paderborn University
+# ALL RIGHTS RESERVED.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Neither the name of the SONATA-NFV, Paderborn University
+# nor the names of its contributors may be used to endorse or promote
+# products derived from this software without specific prior written
+# permission.
+#
+# This work has been performed in the framework of the SONATA project,
+# funded by the European Commission under Grant number 671517 through
+# 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 <steven.vanrossem@intec.ugent.be>
import logging
from flask_restful import Resource
from flask import request
-import json
-logging.basicConfig(level=logging.INFO)
+logging.basicConfig()
CORS_HEADER = {'Access-Control-Allow-Origin': '*'}
net = None
-
class MonitorInterfaceAction(Resource):
"""
Monitor the counters of a VNF interface
"""
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)
+ c = net.monitor_agent.setup_flow(
+ vnf_name, vnf_interface, metric, cookie)
else:
- c = net.monitor_agent.setup_metric(vnf_name, vnf_interface, metric)
+ c = net.monitor_agent.setup_metric(
+ vnf_name, vnf_interface, metric)
# return monitor message response
- return str(c), 200, CORS_HEADER
+ return str(c), 200, CORS_HEADER
except Exception as ex:
logging.exception("API error.")
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)
+ c = net.monitor_agent.stop_flow(
+ vnf_name, vnf_interface, metric, cookie)
else:
- c = net.monitor_agent.stop_metric(vnf_name, vnf_interface, metric)
+ c = net.monitor_agent.stop_metric(
+ vnf_name, vnf_interface, metric)
# return monitor message response
return str(c), 200, CORS_HEADER
except Exception as ex:
"""
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)
+ c = net.monitor_agent.setup_flow(
+ vnf_name, vnf_interface, metric, cookie)
# 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, 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)
+ c = net.monitor_agent.stop_flow(
+ vnf_name, vnf_interface, metric, cookie)
# 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 MonitorLinkAction(Resource):
"""
Add or remove flow monitoring on chains between VNFs.
:return: message string indicating if the chain action is succesful or not
"""
- # the global net is set from the topology file, and connected via connectDCNetwork function in rest_api_endpoint.py
+ # 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, 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, 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")
monitor = data.get("monitor")
monitor_placement = data.get("monitor_placement")
- #first install monitor flow
+ # first install monitor flow
c1 = net.setChain(
vnf_src_name, vnf_dst_name,
vnf_src_interface=vnf_src_interface,
monitor=monitor,
monitor_placement=monitor_placement)
- #then export monitor flow
+ # then export monitor flow
metric = data.get("metric")
if 'rx' in monitor_placement:
vnf_name = vnf_dst_name
c2 = 'command unknown'
if command == 'add-flow':
- c2 = net.monitor_agent.setup_flow(vnf_name, vnf_interface, metric, cookie)
+ 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)
+ c2 = net.monitor_agent.stop_flow(
+ vnf_name, vnf_interface, metric, cookie)
# return setChain response
return (str(c1) + " " + str(c2)), 200, CORS_HEADER
except Exception as ex:
logging.exception("API error.")
- return ex.message, 500
+ return ex.message, 500, CORS_HEADER
+
class MonitorSkewAction(Resource):
"""
"""
global net
- def put(self, vnf_name, resource_name='cpu'):
+ 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')
+ c = net.monitor_agent.update_skewmon(
+ vnf_name, resource_name, action='start')
# 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, resource_name='cpu'):
+ 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')
+ c = net.monitor_agent.update_skewmon(
+ vnf_name, resource_name, action='stop')
# return monitor message response
return str(c), 200, CORS_HEADER
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, CORS_HEADER