cleanup for open sourcing
diff --git a/src/emuvim/api/rest/monitor.py b/src/emuvim/api/rest/monitor.py
index 827843b..15ec014 100755
--- a/src/emuvim/api/rest/monitor.py
+++ b/src/emuvim/api/rest/monitor.py
@@ -25,6 +25,13 @@
 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
 from flask_restful import Resource
 from flask import request
diff --git a/src/emuvim/api/rest/network.py b/src/emuvim/api/rest/network.py
index eb31c3c..ee0c389 100755
--- a/src/emuvim/api/rest/network.py
+++ b/src/emuvim/api/rest/network.py
@@ -25,6 +25,13 @@
 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
 from flask_restful import Resource
 from flask import request
diff --git a/src/emuvim/api/zerorpc/compute.py b/src/emuvim/api/zerorpc/compute.py
index 5e5d0de..b612e87 100755
--- a/src/emuvim/api/zerorpc/compute.py
+++ b/src/emuvim/api/zerorpc/compute.py
@@ -34,11 +34,6 @@
 import threading
 import zerorpc
 
-import paramiko
-import ipaddress
-import time
-import gevent
-
 logging.basicConfig(level=logging.INFO)
 
 
@@ -145,108 +140,6 @@
             logging.exception("RPC error.")
             return ex.message
 
-    @zerorpc.stream
-    def compute_profile(self, dc_label, compute_name, kwargs):
-        # note: zerorpc does not support keyword arguments
-
-        ## VIM/dummy gatekeeper's tasks:
-        # start vnf
-        vnf_status = self.compute_action_start( dc_label, compute_name,
-                                  kwargs.get('image'),
-                                  kwargs.get('network'),
-                                  kwargs.get('command'))
-        # start traffic source (with fixed ip addres, no use for now...)
-        psrc_status = self.compute_action_start( dc_label, 'psrc', 'profile_source', [{'id':'output'}], None)
-        # start traffic sink (with fixed ip addres)
-        psink_status = self.compute_action_start(dc_label, 'psink', 'profile_sink', [{'id': 'input'}], None)
-        # link vnf to traffic source
-        DCNetwork = self.dcs.get(dc_label).net
-        DCNetwork.setChain('psrc', compute_name,
-                           vnf_src_interface='output',
-                           vnf_dst_interface=kwargs.get('input'),
-                           cmd='add-flow', weight=None, bidirectional=True)
-        DCNetwork.setChain('psrc', compute_name,
-                           vnf_src_interface='output',
-                           vnf_dst_interface=kwargs.get('input'),
-                           cmd='add-flow', weight=None,
-                           match='dl_type=0x0800,nw_proto=17,udp_dst=5001',
-                           cookie=10)
-        DCNetwork.setChain( compute_name, 'psink',
-                           vnf_src_interface='output',
-                           vnf_dst_interface=kwargs.get('input'),
-                           cmd='add-flow', weight=None, bidirectional=True)
-        DCNetwork.setChain(compute_name, 'psink',
-                       vnf_src_interface='output',
-                       vnf_dst_interface=kwargs.get('input'),
-                       cmd='add-flow', weight=None,
-                       match='dl_type=0x0800,nw_proto=17,udp_dst=5001',
-                       cookie=11)
-
-        ## SSM/SP tasks:
-        # start traffic generation
-        '''
-        for nw in psrc_status.get('network'):
-            if nw.get('intf_name') == 'output':
-                psrc_output_ip = unicode(nw['ip'])
-                break
-        dummy_iperf_server_ip = ipaddress.IPv4Address(psrc_output_ip) + 1
-        '''
-        for nw in psink_status.get('network'):
-            if nw.get('intf_name') == 'input':
-                psink_input_ip = nw['ip']
-                break
-
-
-        # get monitor data and analyze
-        vnf_uuid = vnf_status['id']
-        psrc_mgmt_ip = psrc_status['docker_network']
-
-        # query rate
-
-        #need to wait a bit before containers are fully up?
-        time.sleep(2)
-
-        def generate():
-            for rate in [0, 1, 2, 3]:
-                #logging.info('query:{0}'.format(query_cpu))
-
-                output_line = DCNetwork.monitor_agent.profile(psrc_mgmt_ip, rate, psink_input_ip, vnf_uuid)
-                gevent.sleep(0)
-                yield output_line
-
-            # query loss
-
-
-            # create table
-
-            ## VIM/dummy gatekeeper's tasks:
-            # remove vnfs and chain
-            DCNetwork.setChain('psrc', compute_name,
-                               vnf_src_interface='output',
-                               vnf_dst_interface=kwargs.get('input'),
-                               cmd='del-flows', weight=None, bidirectional=True)
-            DCNetwork.setChain('psrc', compute_name,
-                               vnf_src_interface='output',
-                               vnf_dst_interface=kwargs.get('input'),
-                               cmd='del-flows', weight=None,
-                               match='dl_type=0x0800,nw_proto=17,udp_dst=5001',
-                               cookie=10)
-            DCNetwork.setChain(compute_name, 'psink',
-                               vnf_src_interface='output',
-                               vnf_dst_interface=kwargs.get('input'),
-                               cmd='del-flows', weight=None, bidirectional=True)
-            DCNetwork.setChain(compute_name, 'psink',
-                               vnf_src_interface='output',
-                               vnf_dst_interface=kwargs.get('input'),
-                               cmd='del-flows', weight=None,
-                               match='dl_type=0x0800,nw_proto=17,udp_dst=5001',
-                               cookie=11)
-            self.compute_action_stop(dc_label, compute_name)
-            self.compute_action_stop(dc_label, 'psink')
-            self.compute_action_stop(dc_label, 'psrc')
-
-        return generate()
-
     def datacenter_list(self):
         logging.debug("RPC CALL: datacenter list")
         try:
diff --git a/src/emuvim/api/zerorpc/network.py b/src/emuvim/api/zerorpc/network.py
index 92cded5..7658be2 100755
--- a/src/emuvim/api/zerorpc/network.py
+++ b/src/emuvim/api/zerorpc/network.py
@@ -27,6 +27,8 @@
 """
 """
 Distributed Cloud Emulator (dcemulator)
+Networking and monitoring functions
+(c) 2015 by Steven Van Rossem <steven.vanrossem@intec.ugent.be>
 """
 
 import logging
diff --git a/src/emuvim/cli/compute.py b/src/emuvim/cli/compute.py
index 25ac247..b5f775f 100755
--- a/src/emuvim/cli/compute.py
+++ b/src/emuvim/cli/compute.py
@@ -101,27 +101,6 @@
             args.get("datacenter"), args.get("name"))
         pp.pprint(r)
 
-    def profile(self, args):
-        nw_list = list()
-        if args.get("network") is not None:
-            nw_list = self._parse_network(args.get("network"))
-
-        params = self._create_dict(
-            network=nw_list,
-            command=args.get("docker_command"),
-            image=args.get("image"),
-            input=args.get("input"),
-            output=args.get("output"))
-
-        for output in self.c.compute_profile(
-            args.get("datacenter"),
-            args.get("name"),
-            params):
-            print(output + '\n')
-
-        #pp.pprint(r)
-        #print(r)
-
     def _create_dict(self, **kwargs):
         return kwargs
 
@@ -144,7 +123,7 @@
 parser = argparse.ArgumentParser(description='son-emu compute')
 parser.add_argument(
     "command",
-    choices=['start', 'stop', 'list', 'status', 'profile'],
+    choices=['start', 'stop', 'list', 'status'],
     help="Action to be executed.")
 parser.add_argument(
     "--datacenter", "-d", dest="datacenter",
@@ -162,13 +141,6 @@
     "--net", dest="network",
     help="Network properties of a compute instance e.g. \
           '(id=input,ip=10.0.10.3/24),(id=output,ip=10.0.10.4/24)' for multiple interfaces.")
-parser.add_argument(
-    "--input", "-in", dest="input",
-    help="input interface of the vnf to profile")
-parser.add_argument(
-    "--output", "-out", dest="output",
-    help="output interface of the vnf to profile")
-
 
 def main(argv):
     args = vars(parser.parse_args(argv))
diff --git a/src/emuvim/cli/monitor.py b/src/emuvim/cli/monitor.py
index 9620a98..3e872d6 100755
--- a/src/emuvim/cli/monitor.py
+++ b/src/emuvim/cli/monitor.py
@@ -93,17 +93,9 @@
             args.get("cookie"))

         pp.pprint(r)

 

-    def prometheus_zrpc(self, args):

-        vnf_name = self._parse_vnf_name(args.get("vnf_name"))

-        vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))

-        r = self.c.prometheus(

-            args.get("datacenter"),

-            vnf_name,

-            vnf_interface,

-            args.get("query"))

-        pp.pprint(r)

-

     def prometheus(self, args):

+        # This functions makes it more user-friendly to create the correct prometheus query

+        # <uuid> is replaced by the correct uuid of the deployed vnf container

         vnf_name = self._parse_vnf_name(args.get("vnf_name"))

         vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))

         dc_label = args.get("datacenter")

diff --git a/src/emuvim/cli/prometheus.py b/src/emuvim/cli/prometheus.py
index 4572449..58969d1 100755
--- a/src/emuvim/cli/prometheus.py
+++ b/src/emuvim/cli/prometheus.py
@@ -26,14 +26,16 @@
 partner consortium (www.sonata-nfv.eu).
 """
 
-#import urllib2
+
 import requests
-#import ast
+
 
 # set this to localhost for now
 # this is correct for son-emu started outside of a container or as a container with net=host
-#TODO prometheus sdk DB is started outside of emulator, place these globals in an external SDK config file?
-prometheus_ip = '127.0.0.1'
+#TODO if prometheus sdk DB is started outside of emulator, place these globals in an external SDK config file?
+prometheus_ip = 'localhost'
+# when sdk is started with docker-compose, we could use
+# prometheus_ip = 'prometheus'
 prometheus_port = '9090'
 prometheus_REST_api = 'http://{0}:{1}'.format(prometheus_ip, prometheus_port)
 
@@ -41,10 +43,7 @@
 def query_Prometheus(query):
     url = prometheus_REST_api + '/' + 'api/v1/query?query=' + query
     # logging.info('query:{0}'.format(url))
-    #req = urllib2.Request(url)
     req = requests.get(url)
-    #ret = urllib2.urlopen(req).read()
-    #ret = ast.literal_eval(ret)
     ret = req.json()
     if ret['status'] == 'success':
         # logging.info('return:{0}'.format(ret))
diff --git a/src/emuvim/cli/rest/monitor.py b/src/emuvim/cli/rest/monitor.py
index 88db8b2..7e9b839 100755
--- a/src/emuvim/cli/rest/monitor.py
+++ b/src/emuvim/cli/rest/monitor.py
@@ -94,6 +94,23 @@
 
         pp.pprint(response.json())
 
+    def prometheus(self, args):
+        # This functions makes it more user-friendly to create the correct prometheus query
+        # <uuid> is replaced by the correct uuid of the deployed vnf container
+        vnf_name = self._parse_vnf_name(args.get("vnf_name"))
+        vnf_interface = self._parse_vnf_interface(args.get("vnf_name"))
+        dc_label = args.get("datacenter")
+        query = args.get("query")
+        vnf_status = get("%s/restapi/compute/%s/%s" %
+            (args.get("endpoint"),
+             args.get("datacenter"),
+             vnf_name)).json()
+        uuid = vnf_status['id']
+        query = query.replace('<uuid>', uuid)
+
+        response = prometheus.query_Prometheus(query)
+        pp.pprint(response)
+
     def _parse_vnf_name(self, vnf_name_str):
         vnf_name = vnf_name_str.split(':')[0]
         return vnf_name
diff --git a/src/emuvim/dcemulator/monitoring.py b/src/emuvim/dcemulator/monitoring.py
index ad3b112..89d82ba 100755
--- a/src/emuvim/dcemulator/monitoring.py
+++ b/src/emuvim/dcemulator/monitoring.py
@@ -26,7 +26,6 @@
 partner consortium (www.sonata-nfv.eu).

 """

 

-import urllib2

 import logging

 from mininet.node import  OVSSwitch

 import ast

@@ -34,11 +33,9 @@
 from prometheus_client import start_http_server, Summary, Histogram, Gauge, Counter, REGISTRY, CollectorRegistry, \

     pushadd_to_gateway, push_to_gateway, delete_from_gateway

 import threading

-from subprocess import Popen, PIPE

+from subprocess import Popen

 import os

 

-import paramiko

-import gevent

 

 logging.basicConfig(level=logging.INFO)

 

@@ -50,16 +47,22 @@
     def __init__(self, net):

         self.net = net

 

+        # TODO: these global variables should be part of a config file?

+        '''

+        # prometheus is started outside of son-emu

         prometheus_ip = '127.0.0.1'

         prometheus_port = '9090'

         self.prometheus_REST_api = 'http://{0}:{1}'.format(prometheus_ip, prometheus_port)

-

-

-

+        '''

         # helper variables to calculate the metrics

+        # pushgateway is started outside of son-emu and son-emu is started with net=host

+        # so localhost:9091 works

         self.pushgateway = 'localhost:9091'

-        # Start up the server to expose the metrics to Prometheus.

+        # when sdk is started with docker-compose, we could use

+        # self.pushgateway = 'pushgateway:9091'

+        # Start up the server to expose the metrics to Prometheus

         #start_http_server(8000)

+

         # supported Prometheus metrics

         self.registry = CollectorRegistry()

         self.prom_tx_packet_count = Gauge('sonemu_tx_count_packets', 'Total number of packets sent',

@@ -101,6 +104,7 @@
         self.monitor_flow_thread.start()

 

         # helper tools

+        # Prometheus pushgateway and DB are started as external contianer, outside of son-emu

         #self.pushgateway_process = self.start_PushGateway()

         #self.prometheus_process = self.start_Prometheus()

         self.cadvisor_process = self.start_cadvisor()

@@ -124,10 +128,8 @@
         for connected_sw in self.net.DCNetwork_graph.neighbors(vnf_name):

             link_dict = self.net.DCNetwork_graph[vnf_name][connected_sw]

             for link in link_dict:

-                # logging.info("{0},{1}".format(link_dict[link],vnf_interface))

                 if link_dict[link]['src_port_id'] == vnf_interface:

                     # found the right link and connected switch

-                    # logging.info("{0},{1}".format(link_dict[link]['src_port_id'], vnf_source_interface))

                     vnf_switch = connected_sw

                     flow_metric['mon_port'] = link_dict[link]['dst_port_nr']

                     break

@@ -176,8 +178,6 @@
 

                 for collector in self.registry._collectors:

                     if (vnf_name, vnf_interface, cookie) in collector._metrics:

-                        #logging.info('2 name:{0} labels:{1} metrics:{2}'.format(collector._name, collector._labelnames,

-                        #                                                        collector._metrics))

                         collector.remove(vnf_name, vnf_interface, cookie)

 

                 delete_from_gateway(self.pushgateway, job='sonemu-SDNcontroller')

@@ -206,10 +206,8 @@
         for connected_sw in self.net.DCNetwork_graph.neighbors(vnf_name):

             link_dict = self.net.DCNetwork_graph[vnf_name][connected_sw]

             for link in link_dict:

-                # logging.info("{0},{1}".format(link_dict[link],vnf_interface))

                 if link_dict[link]['src_port_id'] == vnf_interface:

                     # found the right link and connected switch

-                    # logging.info("{0},{1}".format(link_dict[link]['src_port_id'], vnf_source_interface))

                     network_metric['mon_port'] = link_dict[link]['dst_port_nr']

                     break

 

@@ -261,7 +259,6 @@
     def stop_metric(self, vnf_name, vnf_interface=None, metric=None):

 

         for metric_dict in self.network_metrics:

-            #logging.info('start Stopped monitoring: {2} on {0}:{1}'.format(vnf_name, vnf_interface, metric_dict))

             if metric_dict['vnf_name'] == vnf_name and metric_dict['vnf_interface'] == vnf_interface \

                     and metric_dict['metric_key'] == metric:

 

@@ -274,7 +271,7 @@
                 #self.registry.unregister(self.prom_metrics[metric_dict['metric_key']])

 

                 for collector in self.registry._collectors :

-                    #logging.info('name:{0} labels:{1} metrics:{2}'.format(collector._name, collector._labelnames, collector._metrics))

+

                     """

                     INFO:root:name:sonemu_rx_count_packets

                     labels:('vnf_name', 'vnf_interface')

@@ -284,11 +281,10 @@
                     0x7f353447fd10 >}

                     """

                     logging.info('{0}'.format(collector._metrics.values()))

-                    #if self.prom_metrics[metric_dict['metric_key']]

+

                     if (vnf_name, vnf_interface, 'None') in collector._metrics:

                         logging.info('2 name:{0} labels:{1} metrics:{2}'.format(collector._name, collector._labelnames,

                                                                               collector._metrics))

-                        #collector._metrics = {}

                         collector.remove(vnf_name, vnf_interface, 'None')

 

                 # set values to NaN, prometheus api currently does not support removal of metrics

@@ -345,7 +341,7 @@
                 ret = self.net.ryu_REST('stats/flow', dpid=flow_dict['switch_dpid'], data=data)

                 flow_stat_dict = ast.literal_eval(ret)

 

-                #logging.info('received flow stat:{0} '.format(flow_stat_dict))

+                logging.debug('received flow stat:{0} '.format(flow_stat_dict))

                 self.set_flow_metric(flow_dict, flow_stat_dict)

 

             self.monitor_flow_lock.release()

@@ -368,7 +364,7 @@
 

                 metric_list = [metric_dict for metric_dict in self.network_metrics

                                if int(metric_dict['switch_dpid'])==int(dpid)]

-                #logging.info('1set prom packets:{0} '.format(self.network_metrics))

+

                 for metric_dict in metric_list:

                     self.set_network_metric(metric_dict, port_stat_dict)

 

@@ -390,23 +386,21 @@
             if int(port_stat['port_no']) == int(mon_port):

                 port_uptime = port_stat['duration_sec'] + port_stat['duration_nsec'] * 10 ** (-9)

                 this_measurement = int(port_stat[metric_key])

-                #logging.info('set prom packets:{0} {1}:{2}'.format(this_measurement, vnf_name, vnf_interface))

 

                 # set prometheus metric

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

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

                     set(this_measurement)

-                #push_to_gateway(self.pushgateway, job='SDNcontroller',

-                #                grouping_key={'metric':metric_dict['metric_key']}, registry=self.registry)

 

                 # 1 single monitor job for all metrics of the SDN controller

                 pushadd_to_gateway(self.pushgateway, job='sonemu-SDNcontroller', registry=self.registry)

 

+                # also the rate is calculated here, but not used for now

+                # (rate can be easily queried from prometheus also)

                 if previous_monitor_time <= 0 or previous_monitor_time >= port_uptime:

                     metric_dict['previous_measurement'] = int(port_stat[metric_key])

                     metric_dict['previous_monitor_time'] = port_uptime

                     # do first measurement

-                    #logging.info('first measurement')

                     time.sleep(1)

                     self.monitor_lock.release()

 

@@ -416,7 +410,6 @@
                 else:

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

                     metric_rate = (this_measurement - metric_dict['previous_measurement']) / float(time_delta)

-                    #logging.info('metric: {0} rate:{1}'.format(metric_dict['metric_key'], metric_rate))

 

                 metric_dict['previous_measurement'] = this_measurement

                 metric_dict['previous_monitor_time'] = port_uptime

@@ -427,7 +420,6 @@
 

     def set_flow_metric(self, metric_dict, flow_stat_dict):

         # vnf tx is the datacenter switch rx and vice-versa

-        #metric_key = self.switch_tx_rx(metric_dict['metric_key'])

         metric_key = metric_dict['metric_key']

         switch_dpid = metric_dict['switch_dpid']

         vnf_name = metric_dict['vnf_name']

@@ -450,30 +442,6 @@
             set(counter)

         pushadd_to_gateway(self.pushgateway, job='sonemu-SDNcontroller', registry=self.registry)

 

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

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

-

-    def query_Prometheus(self, query):

-        '''

-        escaped_chars='{}[]'

-        for old in escaped_chars:

-            new = '\{0}'.format(old)

-            query = query.replace(old, new)

-        '''

-        url = self.prometheus_REST_api + '/' + 'api/v1/query?query=' + query

-        #logging.info('query:{0}'.format(url))

-        req = urllib2.Request(url)

-        ret = urllib2.urlopen(req).read()

-        ret = ast.literal_eval(ret)

-        if ret['status'] == 'success':

-            #logging.info('return:{0}'.format(ret))

-            try:

-                ret = ret['data']['result'][0]['value']

-            except:

-                ret = None

-        else:

-            ret = None

-        return ret

 

     def start_Prometheus(self, port=9090):

         # prometheus.yml configuration file is located in the same directory as this file

@@ -563,33 +531,3 @@
                name]

         Popen(cmd).wait()

 

-    def profile(self, mgmt_ip, rate, input_ip, vnf_uuid ):

-

-        ssh = paramiko.SSHClient()

-        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

-        #ssh.connect(mgmt_ip, username='steven', password='test')

-        ssh.connect(mgmt_ip, username='root', password='root')

-

-        iperf_cmd = 'iperf -c {0} -u -l18 -b{1}M -t1000 &'.format(input_ip, rate)

-        if rate > 0:

-            stdin, stdout, stderr = ssh.exec_command(iperf_cmd)

-

-        start_time = time.time()

-        query_cpu = '(sum(rate(container_cpu_usage_seconds_total{{id="/docker/{0}"}}[{1}s])))'.format(vnf_uuid, 1)

-        while (time.time() - start_time) < 15:

-            data = self.query_Prometheus(query_cpu)

-            # logging.info('rate: {1} data:{0}'.format(data, rate))

-            gevent.sleep(0)

-            time.sleep(1)

-

-        query_cpu2 = '(sum(rate(container_cpu_usage_seconds_total{{id="/docker/{0}"}}[{1}s])))'.format(vnf_uuid, 8)

-        cpu_load = float(self.query_Prometheus(query_cpu2)[1])

-        output = 'rate: {1}Mbps; cpu_load: {0}%'.format(round(cpu_load * 100, 2), rate)

-        output_line = output

-        logging.info(output_line)

-

-        stop_iperf = 'pkill -9 iperf'

-        stdin, stdout, stderr = ssh.exec_command(stop_iperf)

-

-        return output_line

-

diff --git a/src/emuvim/dcemulator/net.py b/src/emuvim/dcemulator/net.py
index b201112..0e3882c 100755
--- a/src/emuvim/dcemulator/net.py
+++ b/src/emuvim/dcemulator/net.py
@@ -261,7 +261,7 @@
             if kwargs.get('bidirectional'):
                 ret = ret +'\n' + self._chainAddFlow(vnf_dst_name, vnf_src_name, vnf_dst_interface, vnf_src_interface, **kwargs)
 
-        elif cmd == 'del-flows':  # TODO: del-flow to be implemented
+        elif cmd == 'del-flows':
             ret = self._chainAddFlow(vnf_src_name, vnf_dst_name, vnf_src_interface, vnf_dst_interface, **kwargs)
             if kwargs.get('bidirectional'):
                 ret = ret + '\n' + self._chainAddFlow(vnf_dst_name, vnf_src_name, vnf_dst_interface, vnf_src_interface, **kwargs)
@@ -274,7 +274,6 @@
 
     def _chainAddFlow(self, vnf_src_name, vnf_dst_name, vnf_src_interface=None, vnf_dst_interface=None, **kwargs):
 
-        # TODO: this needs to be cleaned up
         #check if port is specified (vnf:port)
         if vnf_src_interface is None:
             # take first interface by default