Create API to get test case result 35/24635/3
authorchenjiankun <chenjiankun1@huawei.com>
Tue, 22 Nov 2016 00:14:57 +0000 (00:14 +0000)
committerchenjiankun <chenjiankun1@huawei.com>
Thu, 24 Nov 2016 07:44:05 +0000 (07:44 +0000)
JIRA: YARDSTICK-416

Change-Id: I722566bb0e5bc5288cd6302559e56a3f92ebbeca
Signed-off-by: chenjiankun <chenjiankun1@huawei.com>
15 files changed:
api/actions/result.py [new file with mode: 0644]
api/actions/test.py
api/conf.py
api/server.py
api/urls.py
api/utils/common.py
api/utils/daemonthread.py
api/utils/influx.py
api/views.py
tests/unit/api/actions/test_result.py [new file with mode: 0644]
tests/unit/api/actions/test_test.py
tests/unit/api/test_views.py
tests/unit/api/utils/test_common.py
tests/unit/api/utils/test_daemonthread.py
tests/unit/api/utils/test_influx.py

diff --git a/api/actions/result.py b/api/actions/result.py
new file mode 100644 (file)
index 0000000..9f606d2
--- /dev/null
@@ -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 logging
+
+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']
+    except KeyError:
+        message = 'measurement and task_id must be needed'
+        return common_utils.error_handler(message)
+
+    measurement = conf.TEST_CASE_PRE + measurement
+
+    query_sql = "select * from $table where task_id='$task_id'"
+    param = {'table': 'tasklist', 'task_id': task_id}
+    data = common_utils.translate_to_str(influx_utils.query(query_sql, param))
+
+    def _unfinished():
+        return common_utils.result_handler(0, [])
+
+    def _finished():
+        param = {'table': measurement, 'task_id': task_id}
+        data = common_utils.translate_to_str(influx_utils.query(query_sql,
+                                                                param))
+
+        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')
index 0de70bb..b1dc212 100644 (file)
@@ -1,3 +1,11 @@
+##############################################################################
+# 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 json
 import os
index b5553f4..e1da4ab 100644 (file)
@@ -1,3 +1,11 @@
+##############################################################################
+# 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
+##############################################################################
 from pyroute2 import IPDB
 
 
index d0e4d30..1cbe172 100644 (file)
@@ -1,3 +1,11 @@
+##############################################################################
+# 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
 
 from flask import Flask
index 9fa0bc9..2a9e72a 100644 (file)
@@ -1,7 +1,16 @@
+##############################################################################
+# 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
+##############################################################################
 from api import views
 from api.utils.common import Url
 
 
 urlpatterns = [
-    Url('/yardstick/test/action', views.Test, 'test')
+    Url('/yardstick/test/action', views.Test, 'test'),
+    Url('/yardstick/result/action', views.Result, 'result')
 ]
index 9d7998a..04a6fe0 100644 (file)
@@ -1,8 +1,20 @@
+##############################################################################
+# 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 collections
+import logging
+import json
 
 from api.utils.daemonthread import DaemonThread
 from yardstick.cmd.cli import YardstickCLI
 
+logger = logging.getLogger(__name__)
+
 
 def translate_to_str(object):
     if isinstance(object, collections.Mapping):
@@ -20,7 +32,7 @@ def get_command_list(command_list, opts, args):
 
     command_list.extend(('--{}'.format(k) for k in opts if 'task-args' != k))
 
-    task_args = opts.get('task_args', '')
+    task_args = opts.get('task-args', '')
     if task_args:
         command_list.extend(['--task-args', task_args])
 
@@ -32,6 +44,23 @@ def exec_command_task(command_list, task_id):   # pragma: no cover
     daemonthread.start()
 
 
+def error_handler(message):
+    logger.debug(message)
+    result = {
+        'status': 'error',
+        'message': message
+    }
+    return json.dumps(result)
+
+
+def result_handler(status, data):
+    result = {
+        'status': status,
+        'result': data
+    }
+    return json.dumps(result)
+
+
 class Url(object):
 
     def __init__(self, url, resource, endpoint):
index 77a0f6a..47c0b91 100644 (file)
@@ -1,3 +1,11 @@
+##############################################################################
+# 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 threading
 import os
 import datetime
index 1d56c95..9366ed3 100644 (file)
@@ -1,3 +1,11 @@
+##############################################################################
+# 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
 from urlparse import urlsplit
 
@@ -53,3 +61,13 @@ def write_data_tasklist(task_id, timestamp, status, error=''):
     field = {'status': status, 'error': error}
     tags = {'task_id': task_id}
     _write_data('tasklist', field, timestamp, tags)
+
+
+def query(query_sql):
+    try:
+        client = get_data_db_client()
+        logger.debug('Start to query: %s', query_sql)
+        return list(client.query(query_sql).get_points())
+    except RuntimeError:
+        logger.error('dispatcher is not influxdb')
+        raise
index 8830912..e78389f 100644 (file)
@@ -1,4 +1,11 @@
-import json
+##############################################################################
+# 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
 
 from flask import request
@@ -6,7 +13,7 @@ from flask_restful import Resource
 
 from api.utils import common as common_utils
 from api.actions import test as test_action
-from api import conf
+from api.actions import result as result_action
 
 logger = logging.getLogger(__name__)
 
@@ -17,13 +24,19 @@ class Test(Resource):
         args = common_utils.translate_to_str(request.json.get('args', {}))
         logger.debug('Input args is: action: %s, args: %s', action, args)
 
-        if action not in conf.TEST_ACTION:
-            logger.error('Wrong action')
-            result = {
-                'status': 'error',
-                'message': 'wrong action'
-            }
-            return json.dumps(result)
+        try:
+            return getattr(test_action, action)(args)
+        except AttributeError:
+            return common_utils.error_handler('Wrong action')
 
-        method = getattr(test_action, action)
-        return method(args)
+
+class Result(Resource):
+    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)
+
+        try:
+            return getattr(result_action, action)(args)
+        except AttributeError:
+            return common_utils.error_handler('Wrong action')
diff --git a/tests/unit/api/actions/test_result.py b/tests/unit/api/actions/test_result.py
new file mode 100644 (file)
index 0000000..1686319
--- /dev/null
@@ -0,0 +1,29 @@
+##############################################################################
+# 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 unittest
+import json
+
+from api.actions import result
+
+
+class GetResultTestCase(unittest.TestCase):
+
+    def test_getResult_with_no_taskid_arg(self):
+        args = {}
+        output = json.loads(result.getResult(args))
+
+        self.assertEqual('error', output['status'])
+
+
+def main():
+    unittest.main()
+
+
+if __name__ == '__main__':
+    main()
index 158062f..7ebe9fc 100644 (file)
@@ -1,3 +1,11 @@
+##############################################################################
+# 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 unittest
 import json
 
index 650ed56..e57ec08 100644 (file)
@@ -1,21 +1,42 @@
+##############################################################################
+# 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 unittest
 import mock
 import json
 
 from api.views import Test
+from api.views import Result
 
 
 class TestTestCase(unittest.TestCase):
 
     @mock.patch('api.views.request')
     def test_post(self, mock_request):
-        mock_request.json.get.side_effect = ['runTestSuite', {}]
+        mock_request.json.get.side_effect = ['hello', {}]
 
         result = json.loads(Test().post())
 
         self.assertEqual('error', result['status'])
 
 
+class ResultTestCase(unittest.TestCase):
+
+    @mock.patch('api.views.request')
+    def test_get(self, mock_request):
+        mock_request.args.get.return_value = 'hello'
+
+        print Result().get()
+        result = json.loads(Result().get())
+
+        self.assertEqual('error', result['status'])
+
+
 def main():
     unittest.main()
 
index 5d858a3..9e050c7 100644 (file)
@@ -1,4 +1,13 @@
+##############################################################################
+# 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 unittest
+import json
 
 from api.utils import common
 
@@ -49,6 +58,35 @@ class GetCommandListTestCase(unittest.TestCase):
         self.assertEqual(result_list, output_list)
 
 
+class ErrorHandlerTestCase(unittest.TestCase):
+
+    def test_error_handler(self):
+        message = 'hello world'
+        output_dict = json.loads(common.error_handler(message))
+
+        result = {
+            'status': 'error',
+            'message': message
+        }
+
+        self.assertEqual(result, output_dict)
+
+
+class ResultHandlerTestCase(unittest.TestCase):
+
+    def test_result_handler(self):
+        status = 1
+        data = ['hello world']
+        output_dict = json.loads(common.result_handler(status, data))
+
+        result = {
+            'status': status,
+            'result': data
+        }
+
+        self.assertEqual(result, output_dict)
+
+
 def main():
     unittest.main()
 
index 918f1f5..f07f0fe 100644 (file)
@@ -1,3 +1,11 @@
+##############################################################################
+# 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 unittest
 import mock
 
index 5f1e2c3..0852da2 100644 (file)
@@ -1,3 +1,11 @@
+##############################################################################
+# 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 unittest
 import mock
 import uuid
@@ -13,7 +21,7 @@ class GetDataDbClientTestCase(unittest.TestCase):
         mock_parser.ConfigParser().get.return_value = 'file'
         try:
             influx.get_data_db_client()
-        except Exception, e:
+        except Exception as e:
             self.assertIsInstance(e, RuntimeError)
 
 
@@ -54,6 +62,18 @@ class WriteDataTasklistTestCase(unittest.TestCase):
         mock_write_data.assert_called_with('tasklist', field, timestamp, tags)
 
 
+class QueryTestCase(unittest.TestCase):
+
+    @mock.patch('api.utils.influx.ConfigParser')
+    def test_query_dispatcher_not_influxdb(self, mock_parser):
+        mock_parser.ConfigParser().get.return_value = 'file'
+        try:
+            sql = 'select * form tasklist'
+            influx.query(sql)
+        except Exception as e:
+            self.assertIsInstance(e, RuntimeError)
+
+
 def main():
     unittest.main()