aboutsummaryrefslogtreecommitdiffstats
path: root/api/resources
diff options
context:
space:
mode:
Diffstat (limited to 'api/resources')
-rw-r--r--api/resources/asynctask.py35
-rw-r--r--api/resources/env_action.py129
-rw-r--r--api/resources/release_action.py10
-rw-r--r--api/resources/results.py32
-rw-r--r--api/resources/samples_action.py10
5 files changed, 154 insertions, 62 deletions
diff --git a/api/resources/asynctask.py b/api/resources/asynctask.py
new file mode 100644
index 000000000..dd2a71003
--- /dev/null
+++ b/api/resources/asynctask.py
@@ -0,0 +1,35 @@
+# ############################################################################
+# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+# ############################################################################
+import uuid
+
+from api.utils import common as common_utils
+from api.database.models import AsyncTasks
+
+
+def default(args):
+ return _get_status(args)
+
+
+def _get_status(args):
+ try:
+ task_id = args['task_id']
+ uuid.UUID(task_id)
+ except KeyError:
+ message = 'measurement and task_id must be provided'
+ return common_utils.error_handler(message)
+
+ asynctask = AsyncTasks.query.filter_by(task_id=task_id).first()
+
+ try:
+ status = asynctask.status
+ error = asynctask.error if asynctask.error else []
+
+ return common_utils.result_handler(status, error)
+ except AttributeError:
+ return common_utils.error_handler('no such task')
diff --git a/api/resources/env_action.py b/api/resources/env_action.py
index fa0f95d90..7e2487158 100644
--- a/api/resources/env_action.py
+++ b/api/resources/env_action.py
@@ -10,9 +10,11 @@ import logging
import threading
import subprocess
import time
+import uuid
import json
import os
import errno
+import ConfigParser
from docker import Client
@@ -22,17 +24,24 @@ from yardstick.common.httpClient import HttpClient
from api import conf as api_conf
from api.utils import influx
from api.utils.common import result_handler
+from api.database.handler import AsyncTaskHandler
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 +56,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 +107,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():
+def _create_influxdb(task_id):
+ _create_task(task_id)
+
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 +132,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 +164,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):
@@ -251,9 +272,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)
diff --git a/api/resources/release_action.py b/api/resources/release_action.py
index fda0ffd32..d4dc246ef 100644
--- a/api/resources/release_action.py
+++ b/api/resources/release_action.py
@@ -23,8 +23,8 @@ def runTestCase(args):
except KeyError:
return common_utils.error_handler('Lack of testcase argument')
- testcase = os.path.join(conf.TEST_CASE_PATH,
- conf.TEST_CASE_PRE + testcase + '.yaml')
+ testcase_name = conf.TEST_CASE_PRE + testcase
+ testcase = os.path.join(conf.TEST_CASE_PATH, testcase_name + '.yaml')
task_id = str(uuid.uuid4())
@@ -33,6 +33,10 @@ def runTestCase(args):
logger.debug('The command_list is: %s', command_list)
logger.debug('Start to execute command list')
- common_utils.exec_command_task(command_list, task_id)
+ task_dict = {
+ 'task_id': task_id,
+ 'details': testcase_name
+ }
+ common_utils.exec_command_task(command_list, task_dict)
return common_utils.result_handler('success', task_id)
diff --git a/api/resources/results.py b/api/resources/results.py
index 3de09fdc9..fd518958c 100644
--- a/api/resources/results.py
+++ b/api/resources/results.py
@@ -8,11 +8,10 @@
##############################################################################
import logging
import uuid
-import re
from api.utils import influx as influx_utils
from api.utils import common as common_utils
-from api import conf
+from api.database.handlers import TasksHandler
logger = logging.getLogger(__name__)
@@ -23,39 +22,36 @@ def default(args):
def getResult(args):
try:
- measurement = args['measurement']
task_id = args['task_id']
- if re.search("[^a-zA-Z0-9_-]", measurement):
- raise ValueError('invalid measurement parameter')
-
uuid.UUID(task_id)
except KeyError:
- message = 'measurement and task_id must be provided'
+ message = 'task_id must be provided'
return common_utils.error_handler(message)
- query_template = "select * from %s where task_id='%s'"
- query_sql = query_template % ('tasklist', task_id)
- data = common_utils.translate_to_str(influx_utils.query(query_sql))
+ task = TasksHandler().get_task_by_taskid(task_id)
def _unfinished():
return common_utils.result_handler(0, [])
def _finished():
- query_sql = query_template % (conf.TEST_CASE_PRE + measurement,
- task_id)
- data = common_utils.translate_to_str(influx_utils.query(query_sql))
- if not data:
- query_sql = query_template % (measurement, task_id)
+ testcases = task.details.split(',')
+
+ def get_data(testcase):
+ query_template = "select * from %s where task_id='%s'"
+ query_sql = query_template % (testcase, task_id)
data = common_utils.translate_to_str(influx_utils.query(query_sql))
+ return data
+
+ result = {k: get_data(k) for k in testcases}
- return common_utils.result_handler(1, data)
+ return common_utils.result_handler(1, result)
def _error():
- return common_utils.result_handler(2, data[0]['error'])
+ return common_utils.result_handler(2, task.error)
try:
- status = data[0]['status']
+ status = task.status
switcher = {
0: _unfinished,
diff --git a/api/resources/samples_action.py b/api/resources/samples_action.py
index 545447aec..df6db17ee 100644
--- a/api/resources/samples_action.py
+++ b/api/resources/samples_action.py
@@ -19,11 +19,11 @@ logger = logging.getLogger(__name__)
def runTestCase(args):
try:
opts = args.get('opts', {})
- testcase = args['testcase']
+ testcase_name = args['testcase']
except KeyError:
return common_utils.error_handler('Lack of testcase argument')
- testcase = os.path.join(conf.SAMPLE_PATH, testcase + '.yaml')
+ testcase = os.path.join(conf.SAMPLE_PATH, testcase_name + '.yaml')
task_id = str(uuid.uuid4())
@@ -32,6 +32,10 @@ def runTestCase(args):
logger.debug('The command_list is: %s', command_list)
logger.debug('Start to execute command list')
- common_utils.exec_command_task(command_list, task_id)
+ task_dict = {
+ 'task_id': task_id,
+ 'details': testcase_name
+ }
+ common_utils.exec_command_task(command_list, task_dict)
return common_utils.result_handler('success', task_id)