Fix: Fixed a lot of small things in the README.md
[osm/vim-emu.git] / src / emuvim / api / zerorpc / network.py
old mode 100644 (file)
new mode 100755 (executable)
index f21ce99..7658be2
@@ -1,5 +1,34 @@
 """
+Copyright (c) 2015 SONATA-NFV
+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>
 """
 
 import logging
@@ -64,27 +93,41 @@ class DCNetworkApi(object):
     def __init__(self, net):
         self.net = net
 
-    def network_action_start(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None):
+    def network_action_start(self, vnf_src_name, vnf_dst_name, kwargs):
         # call DCNetwork method, not really datacenter specific API for now...
         # provided dc name needs to be part of API endpoint
         # no check if vnfs are really connected to this datacenter...
         logging.debug("RPC CALL: network chain start")
         try:
             c = self.net.setChain(
-                vnf_src_name, vnf_dst_name, vnf_src_interface, vnf_dst_interface)
+                vnf_src_name, vnf_dst_name,
+                vnf_src_interface=kwargs.get('vnf_src_interface'),
+                vnf_dst_interface=kwargs.get('vnf_dst_interface'),
+                cmd='add-flow',
+                weight=kwargs.get('weight'),
+                match=kwargs.get('match'),
+                bidirectional=kwargs.get('bidirectional'),
+                cookie=kwargs.get('cookie'))
             return str(c)
         except Exception as ex:
             logging.exception("RPC error.")
             return ex.message
 
-    def network_action_stop(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None):
+    def network_action_stop(self, vnf_src_name, vnf_dst_name, kwargs):
         # call DCNetwork method, not really datacenter specific API for now...
         # provided dc name needs to be part of API endpoint
         # no check if vnfs are really connected to this datacenter...
         logging.debug("RPC CALL: network chain stop")
         try:
             c = self.net.setChain(
-                vnf_src_name, vnf_dst_name, vnf_src_interface, vnf_dst_interface, cmd='del-flows')
+                vnf_src_name, vnf_dst_name,
+                vnf_src_interface=kwargs.get('vnf_src_interface'),
+                vnf_dst_interface=kwargs.get('vnf_dst_interface'),
+                cmd='del-flows',
+                weight=kwargs.get('weight'),
+                match=kwargs.get('match'),
+                bidirectional=kwargs.get('bidirectional'),
+                cookie=kwargs.get('cookie'))
             return c
         except Exception as ex:
             logging.exception("RPC error.")
@@ -101,33 +144,50 @@ class DCNetworkApi(object):
             return ex.message
 
     # remove the rate measurement for a vnf interface
-    def remove_metric(self, vnf_name, vnf_interface, metric):
-        logging.debug("RPC CALL: setup metric")
+    def stop_metric(self, vnf_name, vnf_interface, metric):
+        logging.debug("RPC CALL: stop metric")
         try:
-            c = self.net.monitor_agent.remove_metric(vnf_name, vnf_interface, metric)
+            c = self.net.monitor_agent.stop_metric(vnf_name, vnf_interface, metric)
             return c
         except Exception as ex:
             logging.exception("RPC error.")
             return ex.message
 
-    # setup the rate measurement for a vnf interface
-    def monitor_setup_rate_measurement(self, vnf_name, vnf_interface, metric):
-        logging.debug("RPC CALL: get rate")
+    # setup the flow metrics measurement
+    def setup_flow(self, vnf_name, vnf_interface, metric, cookie):
+        logging.debug("RPC CALL: setup flow")
         try:
-            c = self.net.monitor_agent.setup_rate_measurement(vnf_name, vnf_interface, metric)
+            c = self.net.monitor_agent.setup_flow(vnf_name, vnf_interface, metric, cookie)
             return c
         except Exception as ex:
             logging.exception("RPC error.")
             return ex.message
 
-    # get egress(default) or ingress rate of a vnf
-    def monitor_get_rate(self, vnf_name, vnf_interface, metric):
-        logging.debug("RPC CALL: get rate")
+    # remove the flow metrics measurement
+    def stop_flow(self, vnf_name, vnf_interface, metric, cookie):
+        logging.debug("RPC CALL: stop flow")
         try:
-            c = self.net.monitor_agent.get_rate(vnf_name, vnf_interface, metric)
+            c = self.net.monitor_agent.stop_flow(vnf_name, vnf_interface, metric, cookie)
             return c
         except Exception as ex:
             logging.exception("RPC error.")
             return ex.message
 
+    # do prometheus query
+    def prometheus(self, dc_label, vnf_name, vnf_interface, query):
+        logging.debug("RPC CALL: query prometheus")
+        vnf_status = self.net.dcs.get(dc_label).containers.get(vnf_name).getStatus()
+        uuid = vnf_status['id']
+        query = query.replace('<uuid>', uuid)
+        #if needed, replace interface id with emu-intfs name
+        # query = query.replace('<intf>', vnf_interface)
+        logging.info('query: {0}'.format(query))
+        try:
+            c = self.net.monitor_agent.query_Prometheus(query)
+            return c
+        except Exception as ex:
+            logging.exception("RPC error.")
+            return ex.message
+
+