Add API to create Grafana container 77/25377/5
authorchenjiankun <chenjiankun1@huawei.com>
Fri, 2 Dec 2016 00:30:58 +0000 (00:30 +0000)
committerchenjiankun <chenjiankun1@huawei.com>
Fri, 2 Dec 2016 12:40:40 +0000 (12:40 +0000)
JIRA: YARDSTICK-441

Change-Id: Ia848c4af072915ef252e8e03100dd7a4e4a6c3c2
Signed-off-by: chenjiankun <chenjiankun1@huawei.com>
api/actions/env.py
dashboard/ping_dashboard.json [new file with mode: 0644]
yardstick/cmd/commands/env.py
yardstick/common/constants.py

index 3216499..40d81c6 100644 (file)
 import logging
 import threading
 import time
+import json
 
 from docker import Client
 
 from yardstick.common import constants as config
 from yardstick.common import utils as yardstick_utils
+from yardstick.common.httpClient import HttpClient
 from api import conf as api_conf
-from api.utils import common as common_utils
 from api.utils import influx
 
 logger = logging.getLogger(__name__)
 
 
+def createGrafanaContainer(args):
+    thread = threading.Thread(target=_create_grafana)
+    thread.start()
+
+
+def _create_grafana():
+    client = Client(base_url=config.DOCKER_URL)
+
+    try:
+        if not _check_image_exist(client, '%s:%s' % (config.GRAFANA_IMAGE,
+                                                     config.GRAFANA_TAGS)):
+            client.pull(config.GRAFANA_IMAGE, config.GRAFANA_TAGS)
+
+        _create_grafana_container(client)
+
+        time.sleep(5)
+
+        _create_data_source()
+
+        _create_dashboard()
+    except Exception as e:
+        logger.debug('Error: %s', e)
+
+
+def _create_dashboard():
+    url = 'http://admin:admin@%s:3000/api/dashboards/db' % api_conf.GATEWAY_IP
+    data = json.load(file('../dashboard/ping_dashboard.json'))
+    HttpClient().post(url, data)
+
+
+def _create_data_source():
+    url = 'http://admin:admin@%s:3000/api/datasources' % api_conf.GATEWAY_IP
+    data = {
+        "name": "yardstick",
+        "type": "influxdb",
+        "access": "proxy",
+        "url": "http://%s:8086" % api_conf.GATEWAY_IP,
+        "password": "root",
+        "user": "root",
+        "database": "yardstick",
+        "basicAuth": True,
+        "basicAuthUser": "admin",
+        "basicAuthPassword": "admin",
+        "isDefault": False,
+    }
+    HttpClient().post(url, data)
+
+
+def _create_grafana_container(client):
+    ports = [3000]
+    port_bindings = {k: k for k in ports}
+    host_config = client.create_host_config(port_bindings=port_bindings)
+
+    container = client.create_container(image='%s:%s' % (config.GRAFANA_IMAGE,
+                                                         config.GRAFANA_TAGS),
+                                        ports=ports,
+                                        detach=True,
+                                        tty=True,
+                                        host_config=host_config)
+    client.start(container)
+
+
+def _check_image_exist(client, t):
+    return any(t in a['RepoTags'][0] for a in client.images() if a['RepoTags'])
+
+
 def createInfluxDBContainer(args):
+    thread = threading.Thread(target=_create_influxdb)
+    thread.start()
+
+
+def _create_influxdb():
+    client = Client(base_url=config.DOCKER_URL)
+
     try:
-        container = _create_influxdb_container()
         _config_output_file()
-        thread = threading.Thread(target=_config_influxdb)
-        thread.start()
-        return common_utils.result_handler('success', container)
+
+        if not _check_image_exist(client, '%s:%s' % (config.INFLUXDB_IMAGE,
+                                                     config.INFLUXDB_TAG)):
+            client.pull(config.INFLUXDB_IMAGE, tag=config.INFLUXDB_TAG)
+
+        _create_influxdb_container(client)
+
+        time.sleep(5)
+
+        _config_influxdb()
     except Exception as e:
-        message = 'Failed to create influxdb container: %s' % e
-        return common_utils.error_handler(message)
+        logger.debug('Error: %s', e)
 
 
-def _create_influxdb_container():
-    client = Client(base_url=config.DOCKER_URL)
+def _create_influxdb_container(client):
 
     ports = [8083, 8086]
     port_bindings = {k: k for k in ports}
     host_config = client.create_host_config(port_bindings=port_bindings)
 
-    container = client.create_container(image='tutum/influxdb',
+    container = client.create_container(image='%s:%s' % (config.INFLUXDB_IMAGE,
+                                                         config.INFLUXDB_TAG),
                                         ports=ports,
                                         detach=True,
                                         tty=True,
                                         host_config=host_config)
     client.start(container)
-    return container
 
 
 def _config_influxdb():
-    time.sleep(20)
     try:
         client = influx.get_data_db_client()
         client.create_user(config.USER, config.PASSWORD, config.DATABASE)
diff --git a/dashboard/ping_dashboard.json b/dashboard/ping_dashboard.json
new file mode 100644 (file)
index 0000000..cbc4f67
--- /dev/null
@@ -0,0 +1 @@
+{"meta":{"type":"db","canSave":true,"canEdit":true,"canStar":true,"slug":null,"expires":"0001-01-01T00:00:00Z","created":"2016-10-09T00:45:46Z","updated":"2016-10-09T03:12:01Z","updatedBy":"admin","createdBy":"admin","version":7},"dashboard":{"annotations":{"list":[]},"editable":true,"gnetId":null,"hideControls":false,"id":null,"links":[],"refresh":false,"rows":[{"collapse":false,"editable":true,"height":"250px","panels":[{"aliasColors":{},"bars":false,"datasource":"yardstick","editable":true,"error":false,"fill":1,"grid":{"threshold1":1,"threshold1Color":"rgba(216, 200, 27, 0.27)","threshold2":0.5,"threshold2Color":"rgba(234, 112, 112, 0.22)","thresholdLine":false},"id":1,"isNew":true,"legend":{"alignAsTable":false,"avg":false,"current":false,"max":true,"min":true,"rightSide":false,"show":false,"total":false,"values":true},"lines":true,"linewidth":2,"links":[],"nullPointMode":"connected","percentage":false,"pointradius":5,"points":false,"renderer":"flot","seriesOverrides":[],"span":12,"stack":false,"steppedLine":false,"targets":[{"dsType":"influxdb","groupBy":[{"params":["$interval"],"type":"time"},{"params":["null"],"type":"fill"}],"measurement":"ping","policy":"default","refId":"A","resultFormat":"time_series","select":[[{"params":["rtt.ares"],"type":"field"},{"params":[],"type":"mean"}]],"tags":[]}],"timeFrom":null,"timeShift":null,"title":"Ping","tooltip":{"msResolution":true,"shared":true,"sort":0,"value_type":"cumulative"},"type":"graph","xaxis":{"show":true},"yaxes":[{"format":"short","label":null,"logBase":1,"max":null,"min":null,"show":true},{"format":"short","label":null,"logBase":1,"max":null,"min":null,"show":true}]}],"title":"Row"}],"schemaVersion":12,"sharedCrosshair":false,"style":"dark","tags":[],"templating":{"list":[]},"time":{"from":"now-24h","to":"now"},"timepicker":{"refresh_intervals":["5s","10s","30s","1m","5m","15m","30m","1h","2h","1d"],"time_options":["5m","15m","1h","6h","12h","24h","2d","7d","30d"]},"timezone":"browser","title":"Ping_Sample","version":7}}
index d9c0c0a..ed46b84 100644 (file)
@@ -15,3 +15,8 @@ class EnvCommand(object):
         url = 'http://localhost:5000/yardstick/env/action'
         data = {'action': 'createInfluxDBContainer'}
         HttpClient().post(url, data)
+
+    def do_grafana(self, args):
+        url = 'http://localhost:5000/yardstick/env/action'
+        data = {'action': 'createGrafanaContainer'}
+        HttpClient().post(url, data)
index 8fbc82f..07d8697 100644 (file)
@@ -8,3 +8,9 @@ DOCKER_URL = 'unix://var/run/docker.sock'
 USER = 'root'
 PASSWORD = 'root'
 DATABASE = 'yardstick'
+
+INFLUXDB_IMAGE = 'tutum/influxdb'
+INFLUXDB_TAG = '0.13'
+
+GRAFANA_IMAGE = 'grafana/grafana'
+GRAFANA_TAGS = '3.1.1'