Merge "ansible: fix urlsplit('hostname') in convert_openrc"
[yardstick.git] / yardstick / cmd / commands / env.py
index d9c0c0a..dbef303 100644 (file)
@@ -6,12 +6,83 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
+from __future__ import absolute_import
+from __future__ import print_function
+
+import os
+import sys
+import time
+
+from six.moves import range
+
+from yardstick.common import constants as consts
 from yardstick.common.httpClient import HttpClient
 
 
 class EnvCommand(object):
+    """
+
+        Set of commands to prepare environment
+    """
 
     def do_influxdb(self, args):
-        url = 'http://localhost:5000/yardstick/env/action'
-        data = {'action': 'createInfluxDBContainer'}
-        HttpClient().post(url, data)
+        data = {'action': 'create_influxdb'}
+        task_id = self._start_async_task(data)
+
+        start = '* creating influxDB'
+        self._check_status(task_id, start)
+
+    def do_grafana(self, args):
+        data = {'action': 'create_grafana'}
+        task_id = self._start_async_task(data)
+
+        start = '* creating grafana'
+        self._check_status(task_id, start)
+
+    def do_prepare(self, args):
+        data = {'action': 'prepare_env'}
+        task_id = self._start_async_task(data)
+
+        start = '* preparing yardstick environment'
+        self._check_status(task_id, start)
+
+    def _start_async_task(self, data):
+        url = consts.ENV_ACTION_API
+        return HttpClient().post(url, data)['result']['task_id']
+
+    def _check_status(self, task_id, start):
+        self._print_status(start, '[]\r')
+        url = '{}?task_id={}'.format(consts.ASYNC_TASK_API, task_id)
+
+        CHECK_STATUS_RETRY = 20
+        CHECK_STATUS_DELAY = 5
+
+        for retry in range(CHECK_STATUS_RETRY):
+            response = HttpClient().get(url)
+            status = response['status']
+
+            if status:
+                break
+
+            # wait until the async task finished
+            time.sleep(CHECK_STATUS_DELAY * (retry + 1))
+
+        switcher = {
+            0: 'Timeout',
+            1: 'Finished',
+            2: 'Error'
+        }
+        self._print_status(start, '[{}]'.format(switcher[status]))
+        if status == 2:
+            print(response['result'])
+            sys.stdout.flush()
+        return status
+
+    def _print_status(self, s, e):
+        try:
+            columns = int(os.popen('stty size', 'r').read().split()[1])
+            word = '{}{}{}'.format(s, ' ' * (columns - len(s) - len(e)), e)
+            sys.stdout.write(word)
+            sys.stdout.flush()
+        except IndexError:
+            pass