"""
import logging
-from flask_restful import Resource
+from flask_restful import Resource, reqparse
from flask import request
import json
"""
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)
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)
"""
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
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)
# return monitor message response
# 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
- data = request.json
+ # get URL parameters
+ data = request.args
+ #then no data
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")
"""
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')
logging.exception("API error.")
return ex.message, 500
- 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')
global net
- def put(self, vnf_src_name, vnf_dst_name):
+ def put(self):
logging.debug("REST CALL: network chain add")
command = 'add-flow'
- return self._NetworkAction(vnf_src_name, vnf_dst_name, command=command)
+ return self._NetworkAction(command=command)
- def delete(self, vnf_src_name, vnf_dst_name):
+ def delete(self):
logging.debug("REST CALL: network chain remove")
command = 'del-flows'
- return self._NetworkAction(vnf_src_name, vnf_dst_name, command=command)
+ return self._NetworkAction(command=command)
- def _NetworkAction(self, vnf_src_name, vnf_dst_name, command=None):
+ def _NetworkAction(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
- data = request.json
+ data = request.args
+ # try json payload
+ if data is None:
+ data = request.json
+ # then no data
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")
# network related actions (setup chaining between VNFs)
self.api.add_resource(NetworkAction,
- "/restapi/network/<vnf_src_name>/<vnf_dst_name>")
+ "/restapi/network")
# monitoring related actions
# export a network interface traffic rate counter
self.api.add_resource(MonitorInterfaceAction,
- "/restapi/monitor/interface/<vnf_name>/<metric>",
- "/restapi/monitor/interface/<vnf_name>/<vnf_interface>/<metric>",
- "/restapi/monitor/interface/<vnf_name>/<vnf_interface>/<metric>/<cookie>")
+ "/restapi/monitor/interface")
# export flow traffic counter, of a manually pre-installed flow entry, specified by its cookie
self.api.add_resource(MonitorFlowAction,
- "/restapi/monitor/flow/<vnf_name>/<metric>/<cookie>",
- "/restapi/monitor/flow/<vnf_name>/<vnf_interface>/<metric>/<cookie>")
+ "/restapi/monitor/flow")
# install monitoring of a specific flow on a pre-existing link in the service.
# the traffic counters of the newly installed monitor flow are exported
self.api.add_resource(MonitorLinkAction,
- "/restapi/monitor/link/<vnf_src_name>/<vnf_dst_name>")
+ "/restapi/monitor/link")
# install skewness monitor of resource usage disribution
# the skewness metric is exported
self.api.add_resource(MonitorSkewAction,
- "/restapi/monitor/skewness/<vnf_name>/<resource_name>")
+ "/restapi/monitor/skewness")
logging.debug("Created API endpoint %s(%s:%d)" % (self.__class__.__name__, self.ip, self.port))
labels=['com.containernet'],\r
name='skewmon'\r
)\r
+ # Wait a while for containers to be completely started\r
+ started = False\r
+ wait_time = 0\r
+ while not started:\r
+ list1 = self.dockercli.containers.list(filters={'status': 'running', 'name': 'prometheus'})\r
+ if len(list1) >= 1:\r
+ started = True\r
+ if wait_time > 5:\r
+ return 'skewmon not started'\r
+ time.sleep(1)\r
+ wait_time += 1\r
return ret\r
\r
\r
kwargs['switch_inport_name'] = src_sw_inport_name
kwargs['switch_outport_name'] = dst_sw_outport_name
kwargs['skip_vlan_tag'] = True
+ kwargs['pathindex'] = i
monitor_placement = kwargs.get('monitor_placement').strip()
# put monitor flow at the dst switch
:param cookie: cookie for the installed flowrules (can be used later as identifier for a set of installed chains)
:param match: custom match entry to be added to the flowrules (default: only in_port and vlan tag)
:param priority: custom flowrule priority
-<<<<<<< HEAD
:param monitor: boolean to indicate whether this chain is a monitoring chain
:param tag: vlan tag to be used for this chain (pre-defined or new one if none is specified)
-=======
+ :param skip_vlan_tag: boolean to indicate if a vlan tag should be appointed to this flow or not
:param path: custom path between the two VNFs (list of switches)
->>>>>>> upstream/master
:return: output log string
"""
switch_inport_nr = src_sw_inport_nr
# choose free vlan
- ## if path contains more than 1 switch
cmd = kwargs.get('cmd')
vlan = None
if cmd == 'add-flow':
switch_outport_nr = self.DCNetwork_graph[current_hop][next_hop][index_edge_out]['src_port_nr']
- # set of entry via ovs-ofctl
+ # set OpenFlow entry
if isinstance( current_node, OVSSwitch ):
kwargs['vlan'] = vlan
kwargs['path'] = path
--- /dev/null
+# 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).
+
+FROM ubuntu:14.04
+MAINTAINER steven.vanrossem@intec.ugent.be
+
+ENV SON_EMU_IN_DOCKER 1
+
+RUN apt-get update \
+ && apt-get install -y ansible git aptitude
+
+
+# install containernet
+WORKDIR /
+RUN git clone https://github.com/containernet/containernet.git
+WORKDIR containernet/ansible
+RUN echo 'localhost ansible_connection=local' >> /etc/ansible/hosts
+RUN ansible-playbook install.yml
+
+# install son-emu
+WORKDIR /
+RUN git clone https://github.com/sonata-nfv/son-emu.git
+WORKDIR /son-emu/ansible
+RUN ansible-playbook install.yml
+
+RUN echo 'Done'
+
+
+ENTRYPOINT ["/son-emu/utils/docker/entrypoint.sh"]
+
+# dummy GK, cAdvisor, Prometheus Push Gateway, son-emu REST API
+EXPOSE 5000 8081 9091 5001
--- /dev/null
+# Docker build scripts for son-emu
+
+This directory holds the Dockerfile to build son-emu as a docker container.
+This is an easy way to deploy son-emu.
+The docker container can be pulled from sonatanfv on Docker Hub.
+`docker pull sonatanfv/son-emu`
\ No newline at end of file
--- /dev/null
+#! /bin/bash -e
+set -x
+
+#cp /containernet/util/docker/entrypoint.sh /tmp/x.sh
+#cat /tmp/x.sh | awk 'NR==1{print; print "set -x"} NR!=1' > /conteinernet/util/docker/entrypoint.sh
+
+# this cannot be done from the Dockerfile since we have the socket not mounted during build
+# this image is needed for the monitoring in son-emu
+#echo 'Pulling the "google/cadvisor" image ... please wait'
+#docker pull 'google/cadvisor'
+
+exec /containernet/util/docker/entrypoint.sh $*
\ No newline at end of file