Merge "add ppm into result of pktgen to make result clear"
[yardstick.git] / api / resources / v1 / env.py
index 4632f15..98b8ec7 100644 (file)
@@ -31,7 +31,7 @@ from yardstick.common import utils
 from yardstick.common.utils import result_handler
 from yardstick.common import openstack_utils
 from yardstick.common.httpClient import HttpClient
-
+from yardstick.common.yaml_loader import yaml_load
 
 LOG = logging.getLogger(__name__)
 LOG.setLevel(logging.DEBUG)
@@ -65,16 +65,20 @@ class V1Env(ApiResource):
                 client.pull(consts.GRAFANA_IMAGE, consts.GRAFANA_TAG)
 
             LOG.info('Createing grafana container')
-            self._create_grafana_container(client)
+            container = self._create_grafana_container(client)
             LOG.info('Grafana container is created')
 
             time.sleep(5)
 
+            container = client.inspect_container(container['Id'])
+            ip = container['NetworkSettings']['Networks']['bridge']['IPAddress']
+            LOG.debug('container ip is: %s', ip)
+
             LOG.info('Creating data source for grafana')
-            self._create_data_source()
+            self._create_data_source(ip)
 
             LOG.info('Creating dashboard for grafana')
-            self._create_dashboard()
+            self._create_dashboard(ip)
 
             self._update_task_status(task_id)
             LOG.info('Finished')
@@ -82,8 +86,8 @@ class V1Env(ApiResource):
             self._update_task_error(task_id, str(e))
             LOG.exception('Create grafana failed')
 
-    def _create_dashboard(self):
-        url = 'http://admin:admin@%s:3000/api/dashboards/db' % consts.GRAFANA_IP
+    def _create_dashboard(self, ip):
+        url = 'http://admin:admin@{}:{}/api/dashboards/db'.format(ip, consts.GRAFANA_PORT)
         path = os.path.join(consts.REPOS_DIR, 'dashboard', '*dashboard.json')
 
         for i in sorted(glob.iglob(path)):
@@ -95,13 +99,21 @@ class V1Env(ApiResource):
                 LOG.exception('Create dashboard %s failed', i)
                 raise
 
-    def _create_data_source(self):
-        url = 'http://admin:admin@%s:3000/api/datasources' % consts.GRAFANA_IP
+    def _create_data_source(self, ip):
+        url = 'http://admin:admin@{}:{}/api/datasources'.format(ip, consts.GRAFANA_PORT)
+        influx_conf = utils.parse_ini_file(consts.CONF_FILE)
+
+        try:
+            influx_url = influx_conf['dispatcher_influxdb']['target']
+        except KeyError:
+            LOG.exception('influxdb url not set in yardstick.conf')
+            raise
+
         data = {
             "name": "yardstick",
             "type": "influxdb",
             "access": "proxy",
-            "url": "http://%s:8086" % consts.INFLUXDB_IP,
+            "url": influx_url,
             "password": "root",
             "user": "root",
             "database": "yardstick",
@@ -117,8 +129,8 @@ class V1Env(ApiResource):
             raise
 
     def _create_grafana_container(self, client):
-        ports = [3000]
-        port_bindings = {k: k for k in ports}
+        ports = [consts.GRAFANA_PORT]
+        port_bindings = {consts.GRAFANA_PORT: consts.GRAFANA_MAPPING_PORT}
         restart_policy = {"MaximumRetryCount": 0, "Name": "always"}
         host_config = client.create_host_config(port_bindings=port_bindings,
                                                 restart_policy=restart_policy)
@@ -133,6 +145,7 @@ class V1Env(ApiResource):
                                             host_config=host_config)
         LOG.info('Starting container')
         client.start(container)
+        return container
 
     def _check_image_exist(self, client, t):
         return any(t in a['RepoTags'][0]
@@ -152,9 +165,6 @@ class V1Env(ApiResource):
         client = Client(base_url=consts.DOCKER_URL)
 
         try:
-            LOG.info('Changing output to influxdb')
-            self._change_output_to_influxdb()
-
             LOG.info('Checking if influxdb image exist')
             if not self._check_image_exist(client, '%s:%s' %
                                            (consts.INFLUXDB_IMAGE,
@@ -163,11 +173,18 @@ class V1Env(ApiResource):
                 client.pull(consts.INFLUXDB_IMAGE, tag=consts.INFLUXDB_TAG)
 
             LOG.info('Createing influxdb container')
-            self._create_influxdb_container(client)
+            container = self._create_influxdb_container(client)
             LOG.info('Influxdb container is created')
 
             time.sleep(5)
 
+            container = client.inspect_container(container['Id'])
+            ip = container['NetworkSettings']['Networks']['bridge']['IPAddress']
+            LOG.debug('container ip is: %s', ip)
+
+            LOG.info('Changing output to influxdb')
+            self._change_output_to_influxdb(ip)
+
             LOG.info('Config influxdb')
             self._config_influxdb()
 
@@ -180,7 +197,7 @@ class V1Env(ApiResource):
 
     def _create_influxdb_container(self, client):
 
-        ports = [8083, 8086]
+        ports = [consts.INFLUXDB_DASHBOARD_PORT, consts.INFLUXDB_PORT]
         port_bindings = {k: k for k in ports}
         restart_policy = {"MaximumRetryCount": 0, "Name": "always"}
         host_config = client.create_host_config(port_bindings=port_bindings,
@@ -196,6 +213,7 @@ class V1Env(ApiResource):
                                             host_config=host_config)
         LOG.info('Starting container')
         client.start(container)
+        return container
 
     def _config_influxdb(self):
         try:
@@ -208,7 +226,7 @@ class V1Env(ApiResource):
         except Exception:
             LOG.exception('Config influxdb failed')
 
-    def _change_output_to_influxdb(self):
+    def _change_output_to_influxdb(self, ip):
         utils.makedirs(consts.CONF_DIR)
 
         parser = configparser.ConfigParser()
@@ -218,7 +236,7 @@ class V1Env(ApiResource):
         LOG.info('Set dispatcher to influxdb')
         parser.set('DEFAULT', 'dispatcher', 'influxdb')
         parser.set('dispatcher_influxdb', 'target',
-                   'http://%s:8086' % consts.INFLUXDB_IP)
+                   'http://{}:{}'.format(ip, consts.INFLUXDB_PORT))
 
         LOG.info('Writing to %s', consts.CONF_FILE)
         with open(consts.CONF_FILE, 'w') as f:
@@ -375,7 +393,7 @@ class V1Env(ApiResource):
             return result_handler(consts.API_ERROR, 'file must be provided')
 
         LOG.info('Checking file')
-        data = yaml.load(pod_file.read())
+        data = yaml_load(pod_file.read())
         if not isinstance(data, collections.Mapping):
             return result_handler(consts.API_ERROR, 'invalid yaml file')