Merge pull request #109 from stevenvanrossem/master
[osm/vim-emu.git] / src / emuvim / dcemulator / monitoring.py
index ab77c39..f34b37c 100755 (executable)
@@ -23,11 +23,8 @@ class to read openflow stats from the Ryu controller of the DCNetwork
 class DCNetworkMonitor():\r
     def __init__(self, net):\r
         self.net = net\r
-        # link to Ryu REST_API\r
-        ryu_ip = '0.0.0.0'\r
-        ryu_port = '8080'\r
-        self.ryu_REST_api = 'http://{0}:{1}'.format(ryu_ip, ryu_port)\r
-        prometheus_ip = '0.0.0.0'\r
+\r
+        prometheus_ip = '127.0.0.1'\r
         prometheus_port = '9090'\r
         self.prometheus_REST_api = 'http://{0}:{1}'.format(prometheus_ip, prometheus_port)\r
 \r
@@ -78,8 +75,8 @@ class DCNetworkMonitor():
         self.monitor_flow_thread.start()\r
 \r
         # helper tools\r
-        self.pushgateway_process = self.start_PushGateway()\r
-        self.prometheus_process = self.start_Prometheus()\r
+        #self.pushgateway_process = self.start_PushGateway()\r
+        #self.prometheus_process = self.start_Prometheus()\r
         self.cadvisor_process = self.start_cadvisor()\r
 \r
     # first set some parameters, before measurement can start\r
@@ -142,6 +139,28 @@ class DCNetworkMonitor():
             logging.exception("setup_metric error.")\r
             return ex.message\r
 \r
+    def stop_flow(self, vnf_name, vnf_interface=None, metric=None, cookie=0):\r
+        for flow_dict in self.flow_metrics:\r
+            if flow_dict['vnf_name'] == vnf_name and flow_dict['vnf_interface'] == vnf_interface \\r
+                    and flow_dict['metric_key'] == metric and flow_dict['cookie'] == cookie:\r
+\r
+                self.monitor_flow_lock.acquire()\r
+\r
+                self.flow_metrics.remove(flow_dict)\r
+\r
+                for collector in self.registry._collectors:\r
+                    if (vnf_name, vnf_interface, cookie) in collector._metrics:\r
+                        #logging.info('2 name:{0} labels:{1} metrics:{2}'.format(collector._name, collector._labelnames,\r
+                        #                                                        collector._metrics))\r
+                        collector.remove(vnf_name, vnf_interface, cookie)\r
+\r
+                delete_from_gateway(self.pushgateway, job='sonemu-SDNcontroller')\r
+\r
+                self.monitor_flow_lock.release()\r
+\r
+                logging.info('Stopped monitoring flow {3}: {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric, cookie))\r
+                return 'Stopped monitoring flow {3}: {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric, cookie)\r
+\r
 \r
     # first set some parameters, before measurement can start\r
     def setup_metric(self, vnf_name, vnf_interface=None, metric='tx_packets'):\r
@@ -297,10 +316,10 @@ class DCNetworkMonitor():
 \r
 \r
                 # query Ryu\r
-                ret = self.REST_cmd('stats/flow', flow_dict['switch_dpid'], data=data)\r
+                ret = self.net.ryu_REST('stats/flow', dpid=flow_dict['switch_dpid'], data=data)\r
                 flow_stat_dict = ast.literal_eval(ret)\r
 \r
-                logging.info('received flow stat:{0} '.format(flow_stat_dict))\r
+                #logging.info('received flow stat:{0} '.format(flow_stat_dict))\r
                 self.set_flow_metric(flow_dict, flow_stat_dict)\r
 \r
             self.monitor_flow_lock.release()\r
@@ -318,7 +337,7 @@ class DCNetworkMonitor():
             for dpid in dpid_set:\r
 \r
                 # query Ryu\r
-                ret = self.REST_cmd('stats/port', dpid)\r
+                ret = self.net.ryu_REST('stats/port', dpid=dpid)\r
                 port_stat_dict = ast.literal_eval(ret)\r
 \r
                 metric_list = [metric_dict for metric_dict in self.network_metrics\r
@@ -408,17 +427,6 @@ class DCNetworkMonitor():
         #logging.exception('metric {0} not found on {1}:{2}'.format(metric_key, vnf_name, vnf_interface))\r
         #return 'metric {0} not found on {1}:{2}'.format(metric_key, vnf_name, vnf_interface)\r
 \r
-    def REST_cmd(self, prefix, dpid, data=None):\r
-        url = self.ryu_REST_api + '/' + str(prefix) + '/' + str(dpid)\r
-        if data:\r
-            logging.info('POST: {0}'.format(str(data)))\r
-            req = urllib2.Request(url, str(data))\r
-        else:\r
-            req = urllib2.Request(url)\r
-\r
-        ret = urllib2.urlopen(req).read()\r
-        return ret\r
-\r
     def query_Prometheus(self, query):\r
         '''\r
         escaped_chars='{}[]'\r
@@ -488,6 +496,7 @@ class DCNetworkMonitor():
         self.monitor_thread.join()\r
         self.monitor_flow_thread.join()\r
 \r
+        '''\r
         if self.prometheus_process is not None:\r
             logging.info('stopping prometheus container')\r
             self.prometheus_process.terminate()\r
@@ -499,6 +508,7 @@ class DCNetworkMonitor():
             self.pushgateway_process.terminate()\r
             self.pushgateway_process.kill()\r
             self._stop_container('pushgateway')\r
+        '''\r
 \r
         if self.cadvisor_process is not None:\r
             logging.info('stopping cadvisor container')\r