From 70d25b87c167bc13e883da2963980cce56410f98 Mon Sep 17 00:00:00 2001 From: chenjiankun Date: Wed, 21 Dec 2016 01:07:26 +0000 Subject: Yardstick API refactor JIRA: YARDSTICK-503 Now in api/views.py there are many redundant code. So I do some refactoring and make it to be a lightweight framework. Change-Id: Id7cecc95e60f5403b2d26239a3ef41d01bbb542a Signed-off-by: chenjiankun --- api/actions/__init__.py | 0 api/actions/env.py | 259 ---------------------------------------- api/actions/result.py | 63 ---------- api/actions/samples.py | 37 ------ api/actions/test.py | 38 ------ api/base.py | 55 +++++++++ api/resources/__init__.py | 0 api/resources/env_action.py | 259 ++++++++++++++++++++++++++++++++++++++++ api/resources/release_action.py | 38 ++++++ api/resources/results.py | 67 +++++++++++ api/resources/samples_action.py | 37 ++++++ api/urls.py | 6 +- api/views.py | 53 ++------ 13 files changed, 469 insertions(+), 443 deletions(-) delete mode 100644 api/actions/__init__.py delete mode 100644 api/actions/env.py delete mode 100644 api/actions/result.py delete mode 100644 api/actions/samples.py delete mode 100644 api/actions/test.py create mode 100644 api/base.py create mode 100644 api/resources/__init__.py create mode 100644 api/resources/env_action.py create mode 100644 api/resources/release_action.py create mode 100644 api/resources/results.py create mode 100644 api/resources/samples_action.py (limited to 'api') diff --git a/api/actions/__init__.py b/api/actions/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/api/actions/env.py b/api/actions/env.py deleted file mode 100644 index fa0f95d90..000000000 --- a/api/actions/env.py +++ /dev/null @@ -1,259 +0,0 @@ -############################################################################## -# Copyright (c) 2016 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 logging -import threading -import subprocess -import time -import json -import os -import errno - -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 influx -from api.utils.common import result_handler - -logger = logging.getLogger(__name__) - - -def createGrafanaContainer(args): - thread = threading.Thread(target=_create_grafana) - thread.start() - return result_handler('success', []) - - -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 - with open('../dashboard/ping_dashboard.json') as dashboard_json: - data = json.load(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() - return result_handler('success', []) - - -def _create_influxdb(): - client = Client(base_url=config.DOCKER_URL) - - try: - _config_output_file() - - 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: - logger.debug('Error: %s', e) - - -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='%s:%s' % (config.INFLUXDB_IMAGE, - config.INFLUXDB_TAG), - ports=ports, - detach=True, - tty=True, - host_config=host_config) - client.start(container) - - -def _config_influxdb(): - try: - client = influx.get_data_db_client() - client.create_user(config.USER, config.PASSWORD, config.DATABASE) - client.create_database(config.DATABASE) - logger.info('Success to config influxDB') - except Exception as e: - logger.debug('Failed to config influxDB: %s', e) - - -def _config_output_file(): - 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 - -[dispatcher_http] -timeout = 5 -# target = http://127.0.0.1:8000/results - -[dispatcher_influxdb] -timeout = 5 -target = http://%s:8086 -db_name = yardstick -username = root -password = root -""" - % api_conf.GATEWAY_IP) - - -def prepareYardstickEnv(args): - thread = threading.Thread(target=_prepare_env_daemon) - thread.start() - return result_handler('success', []) - - -def _prepare_env_daemon(): - - installer_ip = os.environ.get('INSTALLER_IP', 'undefined') - installer_type = os.environ.get('INSTALLER_TYPE', 'undefined') - - _check_variables(installer_ip, installer_type) - - _create_directories() - - rc_file = config.OPENSTACK_RC_FILE - - _get_remote_rc_file(rc_file, installer_ip, installer_type) - - _source_file(rc_file) - - _append_external_network(rc_file) - - # update the external_network - _source_file(rc_file) - - _load_images() - - -def _check_variables(installer_ip, installer_type): - - if installer_ip == 'undefined': - raise SystemExit('Missing INSTALLER_IP') - - if installer_type == 'undefined': - raise SystemExit('Missing INSTALLER_TYPE') - elif installer_type not in config.INSTALLERS: - raise SystemExit('INSTALLER_TYPE is not correct') - - -def _create_directories(): - yardstick_utils.makedirs(config.YARDSTICK_CONFIG_DIR) - - -def _source_file(rc_file): - yardstick_utils.source_env(rc_file) - - -def _get_remote_rc_file(rc_file, installer_ip, installer_type): - - os_fetch_script = os.path.join(config.RELENG_DIR, config.OS_FETCH_SCRIPT) - - try: - cmd = [os_fetch_script, '-d', rc_file, '-i', installer_type, - '-a', installer_ip] - p = subprocess.Popen(cmd, stdout=subprocess.PIPE) - p.communicate()[0] - - if p.returncode != 0: - logger.debug('Failed to fetch credentials from installer') - except OSError as e: - if e.errno != errno.EEXIST: - raise - - -def _append_external_network(rc_file): - neutron_client = yardstick_utils.get_neutron_client() - networks = neutron_client.list_networks()['networks'] - try: - ext_network = next(n['name'] for n in networks if n['router:external']) - except StopIteration: - logger.warning("Can't find external network") - else: - cmd = 'export EXTERNAL_NETWORK=%s' % ext_network - try: - with open(rc_file, 'a') as f: - f.write(cmd + '\n') - except OSError as e: - if e.errno != errno.EEXIST: - raise - - -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) diff --git a/api/actions/result.py b/api/actions/result.py deleted file mode 100644 index 1f200fbcc..000000000 --- a/api/actions/result.py +++ /dev/null @@ -1,63 +0,0 @@ -############################################################################## -# Copyright (c) 2016 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 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 - -logger = logging.getLogger(__name__) - - -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' - 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)) - - 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) - data = common_utils.translate_to_str(influx_utils.query(query_sql)) - - return common_utils.result_handler(1, data) - - def _error(): - return common_utils.result_handler(2, data[0]['error']) - - try: - status = data[0]['status'] - - switcher = { - 0: _unfinished, - 1: _finished, - 2: _error - } - return switcher.get(status, lambda: 'nothing')() - except IndexError: - return common_utils.error_handler('no such task') diff --git a/api/actions/samples.py b/api/actions/samples.py deleted file mode 100644 index 545447aec..000000000 --- a/api/actions/samples.py +++ /dev/null @@ -1,37 +0,0 @@ -############################################################################## -# Copyright (c) 2016 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 -import os -import logging - -from api import conf -from api.utils import common as common_utils - -logger = logging.getLogger(__name__) - - -def runTestCase(args): - try: - opts = args.get('opts', {}) - testcase = args['testcase'] - except KeyError: - return common_utils.error_handler('Lack of testcase argument') - - testcase = os.path.join(conf.SAMPLE_PATH, testcase + '.yaml') - - task_id = str(uuid.uuid4()) - - command_list = ['task', 'start'] - command_list = common_utils.get_command_list(command_list, opts, testcase) - 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) - - return common_utils.result_handler('success', task_id) diff --git a/api/actions/test.py b/api/actions/test.py deleted file mode 100644 index fda0ffd32..000000000 --- a/api/actions/test.py +++ /dev/null @@ -1,38 +0,0 @@ -############################################################################## -# Copyright (c) 2016 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 -import os -import logging - -from api import conf -from api.utils import common as common_utils - -logger = logging.getLogger(__name__) - - -def runTestCase(args): - try: - opts = args.get('opts', {}) - testcase = args['testcase'] - 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') - - task_id = str(uuid.uuid4()) - - command_list = ['task', 'start'] - command_list = common_utils.get_command_list(command_list, opts, testcase) - 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) - - return common_utils.result_handler('success', task_id) diff --git a/api/base.py b/api/base.py new file mode 100644 index 000000000..7671527d4 --- /dev/null +++ b/api/base.py @@ -0,0 +1,55 @@ +############################################################################## +# Copyright (c) 2016 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 re +import importlib +import logging + +from flask import request +from flask_restful import Resource + +from api.utils import common as common_utils + +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + + +class ApiResource(Resource): + + def _post_args(self): + params = common_utils.translate_to_str(request.json) + action = params.get('action', '') + args = params.get('args', {}) + logger.debug('Input args is: action: %s, args: %s', action, args) + + return action, args + + def _get_args(self): + args = common_utils.translate_to_str(request.args) + logger.debug('Input args is: args: %s', args) + + return args + + def _dispatch_post(self): + action, args = self._post_args() + return self._dispatch(args, action) + + def _dispatch_get(self): + args = self._get_args() + return self._dispatch(args) + + def _dispatch(self, args, action='default'): + module_name = re.sub(r'([A-Z][a-z]*)', r'_\1', + self.__class__.__name__)[1:].lower() + + module_name = 'api.resources.%s' % module_name + resources = importlib.import_module(module_name) + try: + return getattr(resources, action)(args) + except NameError: + common_utils.error_handler('Wrong action') diff --git a/api/resources/__init__.py b/api/resources/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/api/resources/env_action.py b/api/resources/env_action.py new file mode 100644 index 000000000..fa0f95d90 --- /dev/null +++ b/api/resources/env_action.py @@ -0,0 +1,259 @@ +############################################################################## +# Copyright (c) 2016 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 logging +import threading +import subprocess +import time +import json +import os +import errno + +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 influx +from api.utils.common import result_handler + +logger = logging.getLogger(__name__) + + +def createGrafanaContainer(args): + thread = threading.Thread(target=_create_grafana) + thread.start() + return result_handler('success', []) + + +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 + with open('../dashboard/ping_dashboard.json') as dashboard_json: + data = json.load(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() + return result_handler('success', []) + + +def _create_influxdb(): + client = Client(base_url=config.DOCKER_URL) + + try: + _config_output_file() + + 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: + logger.debug('Error: %s', e) + + +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='%s:%s' % (config.INFLUXDB_IMAGE, + config.INFLUXDB_TAG), + ports=ports, + detach=True, + tty=True, + host_config=host_config) + client.start(container) + + +def _config_influxdb(): + try: + client = influx.get_data_db_client() + client.create_user(config.USER, config.PASSWORD, config.DATABASE) + client.create_database(config.DATABASE) + logger.info('Success to config influxDB') + except Exception as e: + logger.debug('Failed to config influxDB: %s', e) + + +def _config_output_file(): + 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 + +[dispatcher_http] +timeout = 5 +# target = http://127.0.0.1:8000/results + +[dispatcher_influxdb] +timeout = 5 +target = http://%s:8086 +db_name = yardstick +username = root +password = root +""" + % api_conf.GATEWAY_IP) + + +def prepareYardstickEnv(args): + thread = threading.Thread(target=_prepare_env_daemon) + thread.start() + return result_handler('success', []) + + +def _prepare_env_daemon(): + + installer_ip = os.environ.get('INSTALLER_IP', 'undefined') + installer_type = os.environ.get('INSTALLER_TYPE', 'undefined') + + _check_variables(installer_ip, installer_type) + + _create_directories() + + rc_file = config.OPENSTACK_RC_FILE + + _get_remote_rc_file(rc_file, installer_ip, installer_type) + + _source_file(rc_file) + + _append_external_network(rc_file) + + # update the external_network + _source_file(rc_file) + + _load_images() + + +def _check_variables(installer_ip, installer_type): + + if installer_ip == 'undefined': + raise SystemExit('Missing INSTALLER_IP') + + if installer_type == 'undefined': + raise SystemExit('Missing INSTALLER_TYPE') + elif installer_type not in config.INSTALLERS: + raise SystemExit('INSTALLER_TYPE is not correct') + + +def _create_directories(): + yardstick_utils.makedirs(config.YARDSTICK_CONFIG_DIR) + + +def _source_file(rc_file): + yardstick_utils.source_env(rc_file) + + +def _get_remote_rc_file(rc_file, installer_ip, installer_type): + + os_fetch_script = os.path.join(config.RELENG_DIR, config.OS_FETCH_SCRIPT) + + try: + cmd = [os_fetch_script, '-d', rc_file, '-i', installer_type, + '-a', installer_ip] + p = subprocess.Popen(cmd, stdout=subprocess.PIPE) + p.communicate()[0] + + if p.returncode != 0: + logger.debug('Failed to fetch credentials from installer') + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def _append_external_network(rc_file): + neutron_client = yardstick_utils.get_neutron_client() + networks = neutron_client.list_networks()['networks'] + try: + ext_network = next(n['name'] for n in networks if n['router:external']) + except StopIteration: + logger.warning("Can't find external network") + else: + cmd = 'export EXTERNAL_NETWORK=%s' % ext_network + try: + with open(rc_file, 'a') as f: + f.write(cmd + '\n') + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +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) diff --git a/api/resources/release_action.py b/api/resources/release_action.py new file mode 100644 index 000000000..fda0ffd32 --- /dev/null +++ b/api/resources/release_action.py @@ -0,0 +1,38 @@ +############################################################################## +# Copyright (c) 2016 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 +import os +import logging + +from api import conf +from api.utils import common as common_utils + +logger = logging.getLogger(__name__) + + +def runTestCase(args): + try: + opts = args.get('opts', {}) + testcase = args['testcase'] + 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') + + task_id = str(uuid.uuid4()) + + command_list = ['task', 'start'] + command_list = common_utils.get_command_list(command_list, opts, testcase) + 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) + + return common_utils.result_handler('success', task_id) diff --git a/api/resources/results.py b/api/resources/results.py new file mode 100644 index 000000000..3de09fdc9 --- /dev/null +++ b/api/resources/results.py @@ -0,0 +1,67 @@ +############################################################################## +# Copyright (c) 2016 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 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 + +logger = logging.getLogger(__name__) + + +def default(args): + return getResult(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' + 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)) + + 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) + data = common_utils.translate_to_str(influx_utils.query(query_sql)) + + return common_utils.result_handler(1, data) + + def _error(): + return common_utils.result_handler(2, data[0]['error']) + + try: + status = data[0]['status'] + + switcher = { + 0: _unfinished, + 1: _finished, + 2: _error + } + return switcher.get(status, lambda: 'nothing')() + except IndexError: + return common_utils.error_handler('no such task') diff --git a/api/resources/samples_action.py b/api/resources/samples_action.py new file mode 100644 index 000000000..545447aec --- /dev/null +++ b/api/resources/samples_action.py @@ -0,0 +1,37 @@ +############################################################################## +# Copyright (c) 2016 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 +import os +import logging + +from api import conf +from api.utils import common as common_utils + +logger = logging.getLogger(__name__) + + +def runTestCase(args): + try: + opts = args.get('opts', {}) + testcase = args['testcase'] + except KeyError: + return common_utils.error_handler('Lack of testcase argument') + + testcase = os.path.join(conf.SAMPLE_PATH, testcase + '.yaml') + + task_id = str(uuid.uuid4()) + + command_list = ['task', 'start'] + command_list = common_utils.get_command_list(command_list, opts, testcase) + 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) + + return common_utils.result_handler('success', task_id) diff --git a/api/urls.py b/api/urls.py index 50be91ead..0fffd12db 100644 --- a/api/urls.py +++ b/api/urls.py @@ -11,8 +11,8 @@ from api.utils.common import Url urlpatterns = [ - Url('/yardstick/testcases/release/action', views.Release, 'release'), - Url('/yardstick/testcases/samples/action', views.Samples, 'samples'), + Url('/yardstick/testcases/release/action', views.ReleaseAction, 'release'), + Url('/yardstick/testcases/samples/action', views.SamplesAction, 'samples'), Url('/yardstick/results', views.Results, 'results'), - Url('/yardstick/env/action', views.Env, 'env') + Url('/yardstick/env/action', views.EnvAction, 'env') ] diff --git a/api/views.py b/api/views.py index 928d8e9eb..ee13b47a9 100644 --- a/api/views.py +++ b/api/views.py @@ -9,18 +9,13 @@ import logging import os -from flask import request -from flask_restful import Resource from flasgger.utils import swag_from -from api.utils import common as common_utils +from api.base import ApiResource from api.swagger import models -from api.actions import test as test_action -from api.actions import samples as samples_action -from api.actions import result as result_action -from api.actions import env as env_action logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) TestCaseActionModel = models.TestCaseActionModel @@ -29,54 +24,26 @@ TestCaseActionArgsOptsModel = models.TestCaseActionArgsOptsModel TestCaseActionArgsOptsTaskArgModel = models.TestCaseActionArgsOptsTaskArgModel -class Release(Resource): +class ReleaseAction(ApiResource): @swag_from(os.getcwd() + '/swagger/docs/testcases.yaml') def post(self): - action = common_utils.translate_to_str(request.json.get('action', '')) - args = common_utils.translate_to_str(request.json.get('args', {})) - logger.debug('Input args is: action: %s, args: %s', action, args) + return self._dispatch_post() - try: - return getattr(test_action, action)(args) - except AttributeError: - return common_utils.error_handler('Wrong action') - -class Samples(Resource): +class SamplesAction(ApiResource): def post(self): - action = common_utils.translate_to_str(request.json.get('action', '')) - args = common_utils.translate_to_str(request.json.get('args', {})) - logger.debug('Input args is: action: %s, args: %s', action, args) - - try: - return getattr(samples_action, action)(args) - except AttributeError: - return common_utils.error_handler('Wrong action') + return self._dispatch_post() ResultModel = models.ResultModel -class Results(Resource): +class Results(ApiResource): @swag_from(os.getcwd() + '/swagger/docs/results.yaml') def get(self): - args = common_utils.translate_to_str(request.args) - action = args.get('action', '') - logger.debug('Input args is: action: %s, args: %s', action, args) + return self._dispatch_get() - try: - return getattr(result_action, action)(args) - except AttributeError: - return common_utils.error_handler('Wrong action') - -class Env(Resource): +class EnvAction(ApiResource): def post(self): - action = common_utils.translate_to_str(request.json.get('action', '')) - args = common_utils.translate_to_str(request.json.get('args', {})) - logger.debug('Input args is: action: %s, args: %s', action, args) - - try: - return getattr(env_action, action)(args) - except AttributeError: - return common_utils.error_handler('Wrong action') + return self._dispatch_post() -- cgit 1.2.3-korg