pylint fixes: remove redundant parens, fix comparison order
[yardstick.git] / api / resources / env_action.py
index fa0f95d..917681c 100644 (file)
@@ -6,33 +6,44 @@
 # which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
+from __future__ import absolute_import
+
+import errno
+import json
 import logging
-import threading
+import os
 import subprocess
+import threading
 import time
-import json
-import os
-import errno
+import uuid
 
-from docker import Client
+from six.moves import configparser
 
-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.database.handler import AsyncTaskHandler
 from api.utils import influx
 from api.utils.common import result_handler
+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
 
 logger = logging.getLogger(__name__)
+logger.setLevel(logging.DEBUG)
 
 
 def createGrafanaContainer(args):
-    thread = threading.Thread(target=_create_grafana)
+    task_id = str(uuid.uuid4())
+
+    thread = threading.Thread(target=_create_grafana, args=(task_id,))
     thread.start()
-    return result_handler('success', [])
+
+    return result_handler('success', {'task_id': task_id})
 
 
-def _create_grafana():
+def _create_grafana(task_id):
+    _create_task(task_id)
+
     client = Client(base_url=config.DOCKER_URL)
 
     try:
@@ -47,7 +58,10 @@ def _create_grafana():
         _create_data_source()
 
         _create_dashboard()
+
+        _update_task_status(task_id)
     except Exception as e:
+        _update_task_error(task_id, str(e))
         logger.debug('Error: %s', e)
 
 
@@ -95,16 +109,21 @@ def _check_image_exist(client, t):
 
 
 def createInfluxDBContainer(args):
-    thread = threading.Thread(target=_create_influxdb)
+    task_id = str(uuid.uuid4())
+
+    thread = threading.Thread(target=_create_influxdb, args=(task_id,))
     thread.start()
-    return result_handler('success', [])
 
+    return result_handler('success', {'task_id': task_id})
+
+
+def _create_influxdb(task_id):
+    _create_task(task_id)
 
-def _create_influxdb():
     client = Client(base_url=config.DOCKER_URL)
 
     try:
-        _config_output_file()
+        _change_output_to_influxdb()
 
         if not _check_image_exist(client, '%s:%s' % (config.INFLUXDB_IMAGE,
                                                      config.INFLUXDB_TAG)):
@@ -115,7 +134,10 @@ def _create_influxdb():
         time.sleep(5)
 
         _config_influxdb()
+
+        _update_task_status(task_id)
     except Exception as e:
+        _update_task_error(task_id, str(e))
         logger.debug('Error: %s', e)
 
 
@@ -144,58 +166,59 @@ def _config_influxdb():
         logger.debug('Failed to config influxDB: %s', e)
 
 
-def _config_output_file():
+def _change_output_to_influxdb():
     yardstick_utils.makedirs(config.YARDSTICK_CONFIG_DIR)
-    with open(config.YARDSTICK_CONFIG_FILE, 'w') as f:
-        f.write("""\
-[DEFAULT]
-debug = False
-dispatcher = influxdb
 
-[dispatcher_file]
-file_path = /tmp/yardstick.out
+    parser = configparser.ConfigParser()
+    parser.read(config.YARDSTICK_CONFIG_SAMPLE_FILE)
 
-[dispatcher_http]
-timeout = 5
-# target = http://127.0.0.1:8000/results
+    parser.set('DEFAULT', 'dispatcher', 'influxdb')
+    parser.set('dispatcher_influxdb', 'target',
+               'http://%s:8086' % api_conf.GATEWAY_IP)
 
-[dispatcher_influxdb]
-timeout = 5
-target = http://%s:8086
-db_name = yardstick
-username = root
-password = root
-"""
-                % api_conf.GATEWAY_IP)
+    with open(config.YARDSTICK_CONFIG_FILE, 'w') as f:
+        parser.write(f)
 
 
 def prepareYardstickEnv(args):
-    thread = threading.Thread(target=_prepare_env_daemon)
+    task_id = str(uuid.uuid4())
+
+    thread = threading.Thread(target=_prepare_env_daemon, args=(task_id,))
     thread.start()
-    return result_handler('success', [])
 
+    return result_handler('success', {'task_id': task_id})
 
-def _prepare_env_daemon():
+
+def _prepare_env_daemon(task_id):
+    _create_task(task_id)
 
     installer_ip = os.environ.get('INSTALLER_IP', 'undefined')
     installer_type = os.environ.get('INSTALLER_TYPE', 'undefined')
 
-    _check_variables(installer_ip, installer_type)
+    try:
+        _check_variables(installer_ip, installer_type)
+
+        _create_directories()
 
-    _create_directories()
+        rc_file = config.OPENSTACK_RC_FILE
 
-    rc_file = config.OPENSTACK_RC_FILE
+        _get_remote_rc_file(rc_file, installer_ip, installer_type)
 
-    _get_remote_rc_file(rc_file, installer_ip, installer_type)
+        _source_file(rc_file)
 
-    _source_file(rc_file)
+        _append_external_network(rc_file)
 
-    _append_external_network(rc_file)
+        # update the external_network
+        _source_file(rc_file)
 
-    # update the external_network
-    _source_file(rc_file)
+        _clean_images()
 
-    _load_images()
+        _load_images()
+
+        _update_task_status(task_id)
+    except Exception as e:
+        _update_task_error(task_id, str(e))
+        logger.debug('Error: %s', e)
 
 
 def _check_variables(installer_ip, installer_type):
@@ -225,7 +248,7 @@ def _get_remote_rc_file(rc_file, installer_ip, installer_type):
         cmd = [os_fetch_script, '-d', rc_file, '-i', installer_type,
                '-a', installer_ip]
         p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
-        p.communicate()[0]
+        p.communicate()
 
         if p.returncode != 0:
             logger.debug('Failed to fetch credentials from installer')
@@ -251,9 +274,41 @@ def _append_external_network(rc_file):
                 raise
 
 
+def _clean_images():
+    cmd = [config.CLEAN_IMAGES_SCRIPT]
+    p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+                         cwd=config.YARDSTICK_REPOS_DIR)
+    output = p.communicate()[0]
+    logger.debug('The result is: %s', output)
+
+
 def _load_images():
     cmd = [config.LOAD_IMAGES_SCRIPT]
     p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                          cwd=config.YARDSTICK_REPOS_DIR)
     output = p.communicate()[0]
     logger.debug('The result is: %s', output)
+
+
+def _create_task(task_id):
+    async_handler = AsyncTaskHandler()
+    task_dict = {
+        'task_id': task_id,
+        'status': 0
+    }
+    async_handler.insert(task_dict)
+
+
+def _update_task_status(task_id):
+    async_handler = AsyncTaskHandler()
+
+    task = async_handler.get_task_by_taskid(task_id)
+    async_handler.update_status(task, 1)
+
+
+def _update_task_error(task_id, error):
+    async_handler = AsyncTaskHandler()
+
+    task = async_handler.get_task_by_taskid(task_id)
+    async_handler.update_status(task, 2)
+    async_handler.update_error(task, error)