Merge pull request #170 from stevenvanrossem/master

fix a bug in son-monitor (deleting flow metrics sometimes crashes)
diff --git a/src/emuvim/dcemulator/monitoring.py b/src/emuvim/dcemulator/monitoring.py
index b5f0204..9cf2a3b 100755
--- a/src/emuvim/dcemulator/monitoring.py
+++ b/src/emuvim/dcemulator/monitoring.py
@@ -248,7 +248,6 @@
             network_metric['metric_key'] = metric

 

             self.monitor_lock.acquire()

-

             self.network_metrics.append(network_metric)

             self.monitor_lock.release()

 

@@ -333,9 +332,6 @@
         return 'Error stopping monitoring metric: {0} on {1}:{2}'.format(metric, vnf_name, vnf_interface)

 

 

-

-

-

 # get all metrics defined in the list and export it to Prometheus

     def get_flow_metrics(self):

         while self.start_monitoring:

@@ -429,11 +425,10 @@
                     metric_dict['previous_measurement'] = int(port_stat[metric_key])

                     metric_dict['previous_monitor_time'] = port_uptime

                     # do first measurement

-                    time.sleep(1)

-                    self.monitor_lock.release()

-

-                    metric_rate = self.get_network_metrics()

-                    return metric_rate

+                    #time.sleep(1)

+                    #self.monitor_lock.release()

+                    # rate cannot be calculated yet (need a first measurement)

+                    metric_rate = None

 

                 else:

                     time_delta = (port_uptime - metric_dict['previous_monitor_time'])

@@ -441,9 +436,11 @@
 

                 metric_dict['previous_measurement'] = this_measurement

                 metric_dict['previous_monitor_time'] = port_uptime

-                return metric_rate

+                return

 

         logging.exception('metric {0} not found on {1}:{2}'.format(metric_key, vnf_name, vnf_interface))

+        logging.exception('monport:{0}, dpid:{1}'.format(mon_port, switch_dpid))

+        logging.exception('port dict:{0}'.format(port_stat_dict))

         return 'metric {0} not found on {1}:{2}'.format(metric_key, vnf_name, vnf_interface)

 

     def set_flow_metric(self, metric_dict, flow_stat_dict):

@@ -463,8 +460,9 @@
             elif 'packet' in metric_key:

                 counter += flow_stat['packet_count']

 

-        flow_stat = flow_stat_dict[str(switch_dpid)][0]

-        flow_uptime = flow_stat['duration_sec'] + flow_stat['duration_nsec'] * 10 ** (-9)

+        # flow_uptime disabled for now (can give error)

+        #flow_stat = flow_stat_dict[str(switch_dpid)][0]

+        #flow_uptime = flow_stat['duration_sec'] + flow_stat['duration_nsec'] * 10 ** (-9)

 

         self.prom_metrics[metric_dict['metric_key']]. \

             labels({'vnf_name': vnf_name, 'vnf_interface': vnf_interface, 'flow_id': cookie}). \

@@ -495,6 +493,7 @@
                "-d",

                "-p", "{0}:9091".format(port),

                "--name", "pushgateway",

+               "--label", 'com.containernet=""',

                "prom/pushgateway"

                ]

 

@@ -511,6 +510,7 @@
                "--volume=/var/lib/docker/:/var/lib/docker:ro",

                "--publish={0}:8080".format(port),

                "--name=cadvisor",

+               "--label",'com.containernet=""',

                "google/cadvisor:latest"

                ]

         logging.info('Start cAdvisor container {0}'.format(cmd))

@@ -532,14 +532,14 @@
         '''

         if self.pushgateway_process is not None:

             logging.info('stopping pushgateway container')

-            self.pushgateway_process.terminate()

-            self.pushgateway_process.kill()

+            #self.pushgateway_process.terminate()

+            #self.pushgateway_process.kill()

             self._stop_container('pushgateway')

 

         if self.cadvisor_process is not None:

             logging.info('stopping cadvisor container')

-            self.cadvisor_process.terminate()

-            self.cadvisor_process.kill()

+            #self.cadvisor_process.terminate()

+            #self.cadvisor_process.kill()

             self._stop_container('cadvisor')

 

     def switch_tx_rx(self,metric=''):

@@ -553,13 +553,10 @@
         return metric

 

     def _stop_container(self, name):

-        cmd = ["docker",

-               "stop",

-               name]

-        Popen(cmd).wait()

 

         cmd = ["docker",

                "rm",

+               "-f",

                name]

         Popen(cmd).wait()