Add API(v2) to run task 17/37817/2
authorchenjiankun <chenjiankun1@huawei.com>
Thu, 20 Jul 2017 03:12:05 +0000 (03:12 +0000)
committerchenjiankun <chenjiankun1@huawei.com>
Fri, 21 Jul 2017 02:33:56 +0000 (02:33 +0000)
JIRA: YARDSTICK-741

API: /api/v2/yardstick/tasks/<task_id>
METHOD: PUT
PARAMS:
{
    'action': 'run'
}

Change-Id: Ia5340c6ff45e3e7e70ab4597c39476138e7016f2
Signed-off-by: chenjiankun <chenjiankun1@huawei.com>
api/resources/v1/testcases.py
api/resources/v2/tasks.py
api/utils/thread.py

index fbeb36f..f159472 100644 (file)
@@ -22,6 +22,7 @@ from yardstick.common.utils import result_handler
 from api.utils.thread import TaskThread
 from api import ApiResource
 from api.swagger import models
+from api.database.v1.handlers import TasksHandler
 
 LOG = logging.getLogger(__name__)
 LOG.setLevel(logging.DEBUG)
@@ -80,7 +81,7 @@ class V1ReleaseCase(ApiResource):
         task_args.update(args.get('opts', {}))
 
         param = Param(task_args)
-        task_thread = TaskThread(Task().start, param)
+        task_thread = TaskThread(Task().start, param, TasksHandler())
         task_thread.start()
 
         return result_handler(consts.API_SUCCESS, {'task_id': task_id})
@@ -108,7 +109,7 @@ class V1SampleCase(ApiResource):
         task_args.update(args.get('opts', {}))
 
         param = Param(task_args)
-        task_thread = TaskThread(Task().start, param)
+        task_thread = TaskThread(Task().start, param, TasksHandler())
         task_thread.start()
 
         return result_handler(consts.API_SUCCESS, {'task_id': task_id})
index 668f764..0eb9577 100644 (file)
@@ -8,9 +8,12 @@ from api import ApiResource
 from api.database.v2.handlers import V2TaskHandler
 from api.database.v2.handlers import V2ProjectHandler
 from api.database.v2.handlers import V2EnvironmentHandler
+from api.utils.thread import TaskThread
 from yardstick.common.utils import result_handler
 from yardstick.common.utils import change_obj_to_dict
 from yardstick.common import constants as consts
+from yardstick.benchmark.core.task import Task
+from yardstick.benchmark.core import Param
 
 LOG = logging.getLogger(__name__)
 LOG.setLevel(logging.DEBUG)
@@ -187,3 +190,46 @@ class V2Task(ApiResource):
         task_handler.update_attr(task_id, task_update_data)
 
         return result_handler(consts.API_SUCCESS, {'uuid': task_id})
+
+    def run(self, args):
+        try:
+            task_id = args['task_id']
+        except KeyError:
+            return result_handler(consts.API_ERROR, 'task_id must be provided')
+
+        try:
+            uuid.UUID(task_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'invalid task id')
+
+        task_handler = V2TaskHandler()
+        try:
+            task = task_handler.get_by_uuid(task_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'no such task id')
+
+        if not task.environment_id:
+            return result_handler(consts.API_ERROR, 'environment not set')
+
+        if not task.case_name or not task.content:
+            return result_handler(consts.API_ERROR, 'case not set')
+
+        if task.status == 0:
+            return result_handler(consts.API_ERROR, 'task is already running')
+
+        with open('/tmp/{}.yaml'.format(task.case_name), 'w') as f:
+            f.write(task.content)
+
+        data = {
+            'inputfile': ['/tmp/{}.yaml'.format(task.case_name)],
+            'task_id': task_id
+        }
+        if task.suite:
+            data.update({'suite': True})
+
+        LOG.info('start task thread')
+        param = Param(data)
+        task_thread = TaskThread(Task().start, param, task_handler)
+        task_thread.start()
+
+        return result_handler(consts.API_SUCCESS, {'uuid': task_id})
index 2106548..5f4ec7e 100644 (file)
@@ -1,37 +1,45 @@
 import threading
+import os
 import logging
 
 from oslo_serialization import jsonutils
 
-from api.database.v1.handlers import TasksHandler
 from yardstick.common import constants as consts
 
-logger = logging.getLogger(__name__)
-logger.setLevel(logging.DEBUG)
+LOG = logging.getLogger(__name__)
+LOG.setLevel(logging.DEBUG)
 
 
 class TaskThread(threading.Thread):
 
-    def __init__(self, target, args):
+    def __init__(self, target, args, handler):
         super(TaskThread, self).__init__(target=target, args=args)
         self.target = target
         self.args = args
+        self.handler = handler
 
     def run(self):
-        task_handler = TasksHandler()
-        data = {'task_id': self.args.task_id, 'status': consts.TASK_NOT_DONE}
-        task_handler.insert(data)
+        if self.handler.__class__.__name__.lower().startswith('v2'):
+            self.handler.update_attr(self.args.task_id, {'status': consts.TASK_NOT_DONE})
+        else:
+            update_data = {'task_id': self.args.task_id, 'status': consts.TASK_NOT_DONE}
+            self.handler.insert(update_data)
 
-        logger.info('Starting run task')
+        LOG.info('Starting run task')
         try:
             data = self.target(self.args)
         except Exception as e:
-            logger.exception('Task Failed')
+            LOG.exception('Task Failed')
             update_data = {'status': consts.TASK_FAILED, 'error': str(e)}
-            task_handler.update_attr(self.args.task_id, update_data)
+            self.handler.update_attr(self.args.task_id, update_data)
         else:
-            logger.info('Task Finished')
-            logger.debug('Result: %s', data)
-
-            data['result'] = jsonutils.dumps(data.get('result', {}))
-            task_handler.update_attr(self.args.task_id, data)
+            LOG.info('Task Finished')
+            LOG.debug('Result: %s', data)
+
+            if self.handler.__class__.__name__.lower().startswith('v2'):
+                new_data = {'status': consts.TASK_DONE, 'result': jsonutils.dumps(data['result'])}
+                self.handler.update_attr(self.args.task_id, new_data)
+                os.remove(self.args.inputfile[0])
+            else:
+                data['result'] = jsonutils.dumps(data.get('result', {}))
+                self.handler.update_attr(self.args.task_id, data)