Merge branch 'master' into master
authorpeusterm <manuel.peuster@uni-paderborn.de>
Thu, 2 Feb 2017 16:49:22 +0000 (17:49 +0100)
committerpeusterm <manuel.peuster@uni-paderborn.de>
Thu, 2 Feb 2017 16:49:22 +0000 (17:49 +0100)
1  2 
src/emuvim/api/rest/compute.py
src/emuvim/api/rest/monitor.py
src/emuvim/api/rest/network.py
src/emuvim/dcemulator/net.py

@@@ -72,25 -69,11 +74,25 @@@ class Compute(Resource)
              c = dcs.get(dc_label).startCompute(
                  compute_name, image=image, command=command, network=nw_list)
              # return docker inspect dict
-             return c.getStatus(), 200
+             return c.getStatus(), 200, CORS_HEADER
          except Exception as ex:
              logging.exception("API error.")
-             return ex.message, 500
+             return ex.message, 500, CORS_HEADER
  
 +    def _update_resource(self, dc_label, compute_name, resource, value):
 +        #check if container exists
 +        d = dcs.get(dc_label).net.getNodeByName(compute_name)
 +        if resource == 'cpu':
 +            cpu_period = int(dcs.get(dc_label).net.cpu_period)
 +            cpu_quota = int(cpu_period * float(value))
 +            #put default values back
 +            if float(value) <= 0:
 +                cpu_period = 100000
 +                cpu_quota = -1
 +            d.updateCpuLimit(cpu_period=cpu_period, cpu_quota=cpu_quota)
 +        return d
 +
 +
      def get(self, dc_label, compute_name):
  
          logging.debug("API CALL: compute status")
@@@ -53,31 -55,25 +55,31 @@@ class MonitorInterfaceAction(Resource)
      """
      global net
  
 -    def put(self, vnf_name, vnf_interface=None, metric='tx_packets'):
 +    def put(self, vnf_name, vnf_interface=None, metric='tx_packets', cookie=None):
          logging.debug("REST CALL: start monitor VNF interface")
          try:
 -            c = net.monitor_agent.setup_metric(vnf_name, vnf_interface, metric)
 +            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'):
 +    def delete(self, vnf_name, vnf_interface=None, metric='tx_packets', cookie=None):
          logging.debug("REST CALL: stop monitor VNF interface")
          try:
 -            c = net.monitor_agent.stop_metric(vnf_name, vnf_interface, metric)
 +            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):
          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 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
 +    :param vnf_dst_interface: VNF interface name of the destination of the link
 +    :param weight: weight of the link (can be useful for routing calculations)
 +    :param match: OpenFlow match format of the flow entry
 +    :param bidirectional: boolean value if the link needs to be implemented from src to dst and back
 +    :param cookie: cookie value, identifier of the flow entry to be installed.
 +    :param priority: integer indicating the priority of the flow entry
 +    :param skip_vlan_tag: boolean to indicate whether a new vlan tag should be created for this chain
 +    :param monitor: boolean to indicate whether a new vlan tag should be created for this chain
 +    :param monitor_placement: 'tx'=place the monitoring flowrule at the beginning of the chain, 'rx'=place at the end of the chain
 +    :param metric: tx_packet_rate, tx_byte_rate, rx_packet_rate, rx_byte_rate
 +    :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
 +    global net
 +
 +    def put(self, vnf_src_name, vnf_dst_name):
 +        logging.debug("REST CALL: monitor link flow add")
 +
 +        try:
 +            command = 'add-flow'
 +            return self._MonitorLinkAction(vnf_src_name, vnf_dst_name, 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):
 +        logging.debug("REST CALL: monitor link flow remove")
 +
 +        try:
 +            command = 'del-flows'
 +            return self._MonitorLinkAction(vnf_src_name, vnf_dst_name, 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):
 +        # 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
 +            if data is None:
 +                data = {}
 +            elif type(data) is not dict:
 +                data = json.loads(request.json)
 +
 +            vnf_src_interface = data.get("vnf_src_interface")
 +            vnf_dst_interface = data.get("vnf_dst_interface")
 +            weight = data.get("weight")
 +            match = data.get("match")
 +            bidirectional = data.get("bidirectional")
 +            cookie = data.get("cookie")
 +            priority = data.get("priority")
 +            skip_vlan_tag = data.get("skip_vlan_tag")
 +            monitor = data.get("monitor")
 +            monitor_placement = data.get("monitor_placement")
 +
 +            #first install monitor flow
 +            c1 = net.setChain(
 +                vnf_src_name, vnf_dst_name,
 +                vnf_src_interface=vnf_src_interface,
 +                vnf_dst_interface=vnf_dst_interface,
 +                cmd=command,
 +                weight=weight,
 +                match=match,
 +                bidirectional=bidirectional,
 +                cookie=cookie,
 +                priority=priority,
 +                skip_vlan_tag=skip_vlan_tag,
 +                monitor=monitor,
 +                monitor_placement=monitor_placement)
 +
 +            #then export monitor flow
 +            metric = data.get("metric")
 +            if 'rx' in monitor_placement:
 +                vnf_name = vnf_dst_name
 +                vnf_interface = vnf_dst_interface
 +            elif 'tx' in monitor_placement:
 +                vnf_name = vnf_src_name
 +                vnf_interface = vnf_src_interface
 +
 +            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
 +
 +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, vnf_name, resource_name='cpu'):
 +        logging.debug("REST CALL: start monitor skewness")
 +        try:
 +            # configure skewmon
 +            c = net.monitor_agent.update_skewmon(vnf_name, resource_name, action='start')
 +
 +            # return monitor message response
 +            return  str(c), 200
 +        except Exception as ex:
 +            logging.exception("API error.")
 +            return ex.message, 500
 +
 +    def delete(self, vnf_name, resource_name='cpu'):
 +        logging.debug("REST CALL: stop monitor skewness")
 +        try:
 +            # configure skewmon
 +            c = net.monitor_agent.update_skewmon(vnf_name, resource_name, action='stop')
 +
 +            # 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
++
@@@ -38,8 -38,9 +38,9 @@@ from flask import reques
  import json
  
  logging.basicConfig(level=logging.INFO)
 -
+ CORS_HEADER = {'Access-Control-Allow-Origin': '*'}
  
 +# the global net is set from the topology file, and connected via connectDCNetwork function in rest_api_endpoint.py
  net = None
  
  
@@@ -104,12 -98,9 +105,12 @@@ class NetworkAction(Resource)
                  match=match,
                  bidirectional=bidirectional,
                  cookie=cookie,
 -                priority=priority)
 +                priority=priority,
 +                skip_vlan_tag=skip_vlan_tag,
 +                monitor=monitor,
 +                monitor_placement=monitor_placement)
              # return setChain 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
Simple merge