From 63e75aad3b01de4fc20468d5dd9cdb9b15c5e11e Mon Sep 17 00:00:00 2001 From: chenjiankun Date: Wed, 4 Jan 2017 17:41:18 +0000 Subject: Add API to get the status of async task JIRA: YARDSTICK-526 Currently there are many API run a task using sub thread. But we don't know the status of this task. So we need to offer a API to query the status of this task. Change-Id: I8d2cc558750bf9270aed4a7abb8bf35d17894d83 Signed-off-by: chenjiankun --- api/resources/asynctask.py | 35 +++++++++++++++++ api/resources/env_action.py | 91 +++++++++++++++++++++++++++++++++++---------- 2 files changed, 107 insertions(+), 19 deletions(-) create mode 100644 api/resources/asynctask.py (limited to 'api/resources') 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 59a1692a1..7e2487158 100644 --- a/api/resources/env_action.py +++ b/api/resources/env_action.py @@ -10,6 +10,7 @@ import logging import threading import subprocess import time +import uuid import json import os import errno @@ -23,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(task_id): + _create_task(task_id) -def _create_grafana(): client = Client(base_url=config.DOCKER_URL) try: @@ -48,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) @@ -96,12 +107,17 @@ 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: @@ -116,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) @@ -160,34 +179,44 @@ def _change_output_to_influxdb(): 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() + _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): @@ -257,3 +286,27 @@ def _load_images(): 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) -- cgit 1.2.3-korg