diff options
-rw-r--r-- | docker/Dockerfile | 2 | ||||
-rw-r--r-- | qtip/api/cmd/__init__.py | 0 | ||||
-rw-r--r-- | qtip/api/cmd/server.py | 30 | ||||
-rw-r--r-- | qtip/api/handler/__init__.py | 0 | ||||
-rw-r--r-- | qtip/api/handler/db.py (renamed from qtip/api/db.py) | 0 | ||||
-rw-r--r-- | qtip/api/handler/job_handler.py (renamed from qtip/api/qtip_server.py) | 52 | ||||
-rw-r--r-- | qtip/api/handler/result_handler.py | 58 | ||||
-rw-r--r-- | qtip/api/model/__init__.py | 0 | ||||
-rw-r--r-- | qtip/api/model/job_model.py | 25 | ||||
-rw-r--r-- | qtip/api/result_handler.py | 22 | ||||
-rw-r--r-- | qtip/api/router/__init__.py | 0 | ||||
-rw-r--r-- | qtip/api/router/mapper.py | 7 | ||||
-rw-r--r-- | setup.cfg | 1 | ||||
-rw-r--r-- | tests/unit/api/test_server.py (renamed from tests/unit/api/qtip_server_test.py) | 16 |
14 files changed, 139 insertions, 74 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile index 7cd24533..369fa6c8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -35,7 +35,7 @@ supervisor \ python-setuptools \ --no-install-recommends -RUN easy_install -U setuptools +RUN pip install 'setuptools>=17.1' RUN apt-add-repository ppa:ansible/ansible -y RUN apt-key update -y diff --git a/qtip/api/cmd/__init__.py b/qtip/api/cmd/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/qtip/api/cmd/__init__.py diff --git a/qtip/api/cmd/server.py b/qtip/api/cmd/server.py new file mode 100644 index 00000000..852073a7 --- /dev/null +++ b/qtip/api/cmd/server.py @@ -0,0 +1,30 @@ +############################################################################## +# Copyright (c) 2016 ZTE Corp 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 +############################################################################## + +from flask import Flask +from flask_restful import Api +from flask_restful_swagger import swagger +import qtip.api.router.mapper as mapper + +app = Flask(__name__) +api = swagger.docs(Api(app), apiVersion='0.1') + + +def add_routers(): + for (handler, url) in mapper.mappers: + api.add_resource(handler, url) + + +def main(): + add_routers() + app.run(host='0.0.0.0') + + +if __name__ == "__main__": + main() diff --git a/qtip/api/handler/__init__.py b/qtip/api/handler/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/qtip/api/handler/__init__.py diff --git a/qtip/api/db.py b/qtip/api/handler/db.py index 24fc27a5..24fc27a5 100644 --- a/qtip/api/db.py +++ b/qtip/api/handler/db.py diff --git a/qtip/api/qtip_server.py b/qtip/api/handler/job_handler.py index e2ee0d27..f230e596 100644 --- a/qtip/api/qtip_server.py +++ b/qtip/api/handler/job_handler.py @@ -1,46 +1,13 @@ -############################################################################## -# Copyright (c) 2016 ZTE Corp 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 -############################################################################## -from flask import Flask, abort -from flask_restful import Api, Resource, fields, reqparse -from flask_restful_swagger import swagger import threading from copy import copy -import db -import qtip.utils.args_handler as args_handler -import qtip.api.result_handler as result_handler +from flask.ext.restful import Resource, reqparse +from flask.ext.restful_swagger import swagger +from werkzeug.exceptions import abort -app = Flask(__name__) -api = swagger.docs(Api(app), apiVersion='0.1') - - -@swagger.model -class JobModel: - resource_fields = { - 'installer_type': fields.String, - 'installer_ip': fields.String, - 'max_minutes': fields.Integer, - 'pod_name': fields.String, - 'suite_name': fields.String, - 'type': fields.String, - 'benchmark_name': fields.String, - 'testdb_url': fields.String, - 'node_name': fields.String - } - required = ['installer_type', 'installer_ip'] - - -@swagger.model -class JobResponseModel: - resource_fields = { - 'job_id': fields.String - } +from qtip.api.handler import db, result_handler +from qtip.api.model.job_model import JobResponseModel +from qtip.utils import args_handler as args_handler class Job(Resource): @@ -197,10 +164,3 @@ default is all benchmarks in suite with specified type, if (result_handler.dump_suite_result(suite_name) and testdb_url): result_handler.push_suite_result_to_db(suite_name, testdb_url, installer_type, node_name) db.finish_job(job_id) - - -api.add_resource(JobList, '/api/v1.0/jobs') -api.add_resource(Job, '/api/v1.0/jobs/<string:id>') - -if __name__ == "__main__": - app.run(host='0.0.0.0') diff --git a/qtip/api/handler/result_handler.py b/qtip/api/handler/result_handler.py new file mode 100644 index 00000000..3d1d592e --- /dev/null +++ b/qtip/api/handler/result_handler.py @@ -0,0 +1,58 @@ +############################################################################## +# Copyright (c) 2016 ZTE Corp 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 importlib +import json +from os.path import expanduser + +import qtip.utils.dashboard.pushtoDB as push_to_db +from qtip.utils import logger_utils + +logger = logger_utils.QtipLogger('suite_result').get + + +def get_benchmark_result(benchmark_name, suite_name): + benchmark_indices = importlib.import_module('scripts.ref_results' + '.{0}_benchmarks_indices'.format(suite_name)) + methodToCall = getattr(benchmark_indices, '{0}_index'.format(benchmark_name)) + return methodToCall() + + +def dump_suite_result(suite_name): + suite_dict = {} + suite_bench_list = {'compute': ['DPI', 'Dhrystone', 'Whetstone', 'SSL', 'RamSpeed'], + 'storage': ['FIO'], + 'network': ['IPERF']} + temp = 0 + l = len(suite_bench_list[suite_name]) + for benchmark in suite_bench_list[suite_name]: + try: + suite_dict[benchmark] = get_benchmark_result(benchmark.lower(), suite_name) + temp = temp + float(suite_dict[benchmark]['index']) + except OSError: + l = l - 1 + pass + + if l == 0: + logger.info("No {0} suite results found".format(suite_name)) + return False + else: + suite_index = temp / l + suite_dict_f = {'index': suite_index, + 'suite_results': suite_dict} + result_path = expanduser('~') + '/qtip/results' + with open('{0}/{1}_result.json'.format(result_path, suite_name), 'w+') as result_json: + json.dump(suite_dict_f, result_json, indent=4, sort_keys=True) + return True + + +def push_suite_result_to_db(suite_name, test_db_url, installer_type, node_name): + with open('results/{0}_result.json'.format(suite_name), 'r') as result_file: + j = json.load(result_file) + push_to_db.push_results_to_db(test_db_url, '{0}_test_suite'.format(suite_name), + j, installer_type, node_name) diff --git a/qtip/api/model/__init__.py b/qtip/api/model/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/qtip/api/model/__init__.py diff --git a/qtip/api/model/job_model.py b/qtip/api/model/job_model.py new file mode 100644 index 00000000..eef771b0 --- /dev/null +++ b/qtip/api/model/job_model.py @@ -0,0 +1,25 @@ +from flask.ext.restful import fields +from flask.ext.restful_swagger import swagger + + +@swagger.model +class JobModel: + resource_fields = { + 'installer_type': fields.String, + 'installer_ip': fields.String, + 'max_minutes': fields.Integer, + 'pod_name': fields.String, + 'suite_name': fields.String, + 'type': fields.String, + 'benchmark_name': fields.String, + 'testdb_url': fields.String, + 'node_name': fields.String + } + required = ['installer_type', 'installer_ip'] + + +@swagger.model +class JobResponseModel: + resource_fields = { + 'job_id': fields.String + } diff --git a/qtip/api/result_handler.py b/qtip/api/result_handler.py deleted file mode 100644 index de91cd2c..00000000 --- a/qtip/api/result_handler.py +++ /dev/null @@ -1,22 +0,0 @@ -############################################################################## -# Copyright (c) 2016 ZTE Corp 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 json -import scripts.ref_results.suite_result as suite_result -import qtip.utils.dashboard.pushtoDB as push_to_db - - -def dump_suite_result(suite_name): - return suite_result.get_suite_result(suite_name) - - -def push_suite_result_to_db(suite_name, test_db_url, installer_type, node_name): - with open('results/{0}_result.json'.format(suite_name), 'r') as result_file: - j = json.load(result_file) - push_to_db.push_results_to_db(test_db_url, '{0}_test_suite'.format(suite_name), - j, installer_type, node_name) diff --git a/qtip/api/router/__init__.py b/qtip/api/router/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/qtip/api/router/__init__.py diff --git a/qtip/api/router/mapper.py b/qtip/api/router/mapper.py new file mode 100644 index 00000000..a5f029ac --- /dev/null +++ b/qtip/api/router/mapper.py @@ -0,0 +1,7 @@ +from qtip.api.handler.job_handler import Job, JobList + + +mappers = [ + (JobList, '/api/v1.0/jobs'), + (Job, '/api/v1.0/jobs/<string:id>'), +] @@ -14,6 +14,7 @@ setup-hooks = [entry_points] console_scripts = qtip = qtip.cli.entry:cli + qtip-server = qtip.api.cmd.server:main [files] packages = diff --git a/tests/unit/api/qtip_server_test.py b/tests/unit/api/test_server.py index 96544c95..e9364d3d 100644 --- a/tests/unit/api/qtip_server_test.py +++ b/tests/unit/api/test_server.py @@ -1,9 +1,15 @@ -import qtip.api.qtip_server as server -import pytest import json -import mock import time +import mock +import pytest + +import qtip.api.cmd.server as server + + +def setup_module(): + server.add_routers() + @pytest.fixture def app(): @@ -66,7 +72,7 @@ class TestClass: 'state_detail': [{u'state': u'finished', u'benchmark': u'dhrystone_vm.yaml'}], 'result': 0}) ]) - @mock.patch('qtip.api.qtip_server.args_handler.prepare_and_run_benchmark') + @mock.patch('qtip.utils.args_handler.prepare_and_run_benchmark') def test_post_get_delete_job_successful(self, mock_args_handler, app_client, body, expected): mock_args_handler.return_value = {'result': 0, 'detail': {'host': [(u'10.20.6.14', {'unreachable': 0, @@ -107,7 +113,7 @@ class TestClass: ['job_id', 'It already has one job running now!']) ]) - @mock.patch('qtip.api.qtip_server.args_handler.prepare_and_run_benchmark', + @mock.patch('qtip.utils.args_handler.prepare_and_run_benchmark', side_effect=[side_effect_sleep(0.5), side_effect_pass]) def test_post_two_jobs_unsuccessful(self, mock_args_hanler, app_client, body, expected): reply_1 = app_client.post("/api/v1.0/jobs", data=body[0]) |