+ ret = ast.literal_eval(ret)\r
+ if ret['status'] == 'success':\r
+ #logging.info('return:{0}'.format(ret))\r
+ try:\r
+ ret = ret['data']['result'][0]['value']\r
+ except:\r
+ ret = None\r
+ else:\r
+ ret = None\r
+ return ret\r
+\r
+ def start_Prometheus(self, port=9090):\r
+ # prometheus.yml configuration file is located in the same directory as this file\r
+ cmd = ["docker",\r
+ "run",\r
+ "--rm",\r
+ "-p", "{0}:9090".format(port),\r
+ "-v", "{0}/prometheus.yml:/etc/prometheus/prometheus.yml".format(os.path.dirname(os.path.abspath(__file__))),\r
+ "-v", "{0}/profile.rules:/etc/prometheus/profile.rules".format(os.path.dirname(os.path.abspath(__file__))),\r
+ "--name", "prometheus",\r
+ "prom/prometheus"\r
+ ]\r
+ logging.info('Start Prometheus container {0}'.format(cmd))\r
+ return Popen(cmd)\r
+\r
+ def start_PushGateway(self, port=9091):\r
+ cmd = ["docker",\r
+ "run",\r
+ "-d",\r
+ "-p", "{0}:9091".format(port),\r
+ "--name", "pushgateway",\r
+ "prom/pushgateway"\r
+ ]\r
+\r
+ logging.info('Start Prometheus Push Gateway container {0}'.format(cmd))\r
+ return Popen(cmd)\r
+\r
+ def start_cadvisor(self, port=8090):\r
+ cmd = ["docker",\r
+ "run",\r
+ "--rm",\r
+ "--volume=/:/rootfs:ro",\r
+ "--volume=/var/run:/var/run:rw",\r
+ "--volume=/sys:/sys:ro",\r
+ "--volume=/var/lib/docker/:/var/lib/docker:ro",\r
+ "--publish={0}:8080".format(port),\r
+ "--name=cadvisor",\r
+ "google/cadvisor:latest"\r
+ ]\r
+ logging.info('Start cAdvisor container {0}'.format(cmd))\r
+ return Popen(cmd)\r
+\r
+ def stop(self):\r
+ # stop the monitoring thread\r
+ self.start_monitoring = False\r
+ 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
+ self.prometheus_process.kill()\r
+ self._stop_container('prometheus')\r
+\r
+ if self.pushgateway_process is not None:\r
+ logging.info('stopping pushgateway container')\r
+ 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
+ self.cadvisor_process.terminate()\r
+ self.cadvisor_process.kill()\r
+ self._stop_container('cadvisor')\r
+\r
+ def switch_tx_rx(self,metric=''):\r
+ # when monitoring vnfs, the tx of the datacenter switch is actually the rx of the vnf\r
+ # so we need to change the metric name to be consistent with the vnf rx or tx\r
+ if 'tx' in metric:\r
+ metric = metric.replace('tx','rx')\r
+ elif 'rx' in metric:\r
+ metric = metric.replace('rx','tx')\r
+\r
+ return metric\r
+\r
+ def _stop_container(self, name):\r
+ cmd = ["docker",\r
+ "stop",\r
+ name]\r
+ Popen(cmd).wait()\r
+\r
+ cmd = ["docker",\r
+ "rm",\r
+ name]\r
+ Popen(cmd).wait()\r
+\r
+ def profile(self, mgmt_ip, rate, input_ip, vnf_uuid ):\r
+\r
+ ssh = paramiko.SSHClient()\r
+ ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())\r
+ #ssh.connect(mgmt_ip, username='steven', password='test')\r
+ ssh.connect(mgmt_ip, username='root', password='root')\r
+\r
+ iperf_cmd = 'iperf -c {0} -u -l18 -b{1}M -t1000 &'.format(input_ip, rate)\r
+ if rate > 0:\r
+ stdin, stdout, stderr = ssh.exec_command(iperf_cmd)\r
+\r
+ start_time = time.time()\r
+ query_cpu = '(sum(rate(container_cpu_usage_seconds_total{{id="/docker/{0}"}}[{1}s])))'.format(vnf_uuid, 1)\r
+ while (time.time() - start_time) < 15:\r
+ data = self.query_Prometheus(query_cpu)\r
+ # logging.info('rate: {1} data:{0}'.format(data, rate))\r
+ gevent.sleep(0)\r
+ time.sleep(1)\r
+\r
+ query_cpu2 = '(sum(rate(container_cpu_usage_seconds_total{{id="/docker/{0}"}}[{1}s])))'.format(vnf_uuid, 8)\r
+ cpu_load = float(self.query_Prometheus(query_cpu2)[1])\r
+ output = 'rate: {1}Mbps; cpu_load: {0}%'.format(round(cpu_load * 100, 2), rate)\r
+ output_line = output\r
+ logging.info(output_line)\r
+\r
+ stop_iperf = 'pkill -9 iperf'\r
+ stdin, stdout, stderr = ssh.exec_command(stop_iperf)\r
+\r
+ return output_line\r
+\r