Merge "Add API to delete certain test case"
authorRex Lee <limingjiang@huawei.com>
Fri, 21 Jul 2017 01:14:50 +0000 (01:14 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Fri, 21 Jul 2017 01:14:50 +0000 (01:14 +0000)
api/__init__.py
api/database/v2/handlers.py
api/resources/v2/projects.py [new file with mode: 0644]
api/resources/v2/tasks.py [new file with mode: 0644]

index 3195c97..c5aefff 100644 (file)
@@ -45,8 +45,9 @@ class ApiResource(Resource):
 
         return args
 
-    def _dispatch_post(self):
+    def _dispatch_post(self, **kwargs):
         action, args = self._post_args()
+        args.update(kwargs)
         return self._dispatch(args, action)
 
     def _dispatch(self, args, action):
index 3474af2..44c14df 100644 (file)
@@ -136,6 +136,9 @@ class V2ContainerHandler(object):
 
 class V2ProjectHandler(object):
 
+    def list_all(self):
+        return V2Project.query.all()
+
     def insert(self, kwargs):
         project = V2Project(**kwargs)
         db_session.add(project)
diff --git a/api/resources/v2/projects.py b/api/resources/v2/projects.py
new file mode 100644 (file)
index 0000000..376cf1a
--- /dev/null
@@ -0,0 +1,97 @@
+import uuid
+import logging
+
+from datetime import datetime
+
+from api import ApiResource
+from api.database.v2.handlers import V2ProjectHandler
+from api.database.v2.handlers import V2TaskHandler
+from yardstick.common.utils import result_handler
+from yardstick.common.utils import change_obj_to_dict
+from yardstick.common import constants as consts
+
+LOG = logging.getLogger(__name__)
+LOG.setLevel(logging.DEBUG)
+
+
+class V2Projects(ApiResource):
+
+    def get(self):
+        project_handler = V2ProjectHandler()
+        projects = [change_obj_to_dict(p) for p in project_handler.list_all()]
+
+        for p in projects:
+            tasks = p['tasks']
+            p['tasks'] = tasks.split(',') if tasks else []
+
+        return result_handler(consts.API_SUCCESS, {'projects': projects})
+
+    def post(self):
+        return self._dispatch_post()
+
+    def create_project(self, args):
+        try:
+            name = args['name']
+        except KeyError:
+            return result_handler(consts.API_ERROR, 'name must be provided')
+
+        project_id = str(uuid.uuid4())
+        create_time = datetime.now()
+        project_handler = V2ProjectHandler()
+
+        project_init_data = {
+            'uuid': project_id,
+            'name': name,
+            'time': create_time
+        }
+        project_handler.insert(project_init_data)
+
+        return result_handler(consts.API_SUCCESS, {'uuid': project_id})
+
+
+class V2Project(ApiResource):
+
+    def get(self, project_id):
+        try:
+            uuid.UUID(project_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'invalid project id')
+
+        project_handler = V2ProjectHandler()
+        try:
+            project = project_handler.get_by_uuid(project_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'no such project id')
+
+        project_info = change_obj_to_dict(project)
+        tasks = project_info['tasks']
+        project_info['tasks'] = tasks.split(',') if tasks else []
+
+        return result_handler(consts.API_SUCCESS, {'project': project_info})
+
+    def delete(self, project_id):
+        try:
+            uuid.UUID(project_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'invalid project id')
+
+        project_handler = V2ProjectHandler()
+        try:
+            project = project_handler.get_by_uuid(project_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'no such project id')
+
+        if project.tasks:
+            LOG.info('delete related task')
+            task_handler = V2TaskHandler()
+            for task_id in project.tasks.split(','):
+                LOG.debug('delete task: %s', task_id)
+                try:
+                    task_handler.delete_by_uuid(task_id)
+                except ValueError:
+                    LOG.exception('no such task id: %s', task_id)
+
+        LOG.info('delete project in database')
+        project_handler.delete_by_uuid(project_id)
+
+        return result_handler(consts.API_SUCCESS, {'project': project_id})
diff --git a/api/resources/v2/tasks.py b/api/resources/v2/tasks.py
new file mode 100644 (file)
index 0000000..26da671
--- /dev/null
@@ -0,0 +1,166 @@
+import uuid
+import logging
+from datetime import datetime
+
+from oslo_serialization import jsonutils
+
+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 yardstick.common.utils import result_handler
+from yardstick.common.utils import change_obj_to_dict
+from yardstick.common import constants as consts
+
+LOG = logging.getLogger(__name__)
+LOG.setLevel(logging.DEBUG)
+
+
+class V2Tasks(ApiResource):
+
+    def post(self):
+        return self._dispatch_post()
+
+    def create_task(self, args):
+        try:
+            name = args['name']
+        except KeyError:
+            return result_handler(consts.API_ERROR, 'name must be provided')
+
+        try:
+            project_id = args['project_id']
+        except KeyError:
+            return result_handler(consts.API_ERROR, 'project_id must be provided')
+
+        task_id = str(uuid.uuid4())
+        create_time = datetime.now()
+        task_handler = V2TaskHandler()
+
+        LOG.info('create task in database')
+        task_init_data = {
+            'uuid': task_id,
+            'project_id': project_id,
+            'name': name,
+            'time': create_time,
+            'status': -1
+        }
+        task_handler.insert(task_init_data)
+
+        LOG.info('create task in project')
+        project_handler = V2ProjectHandler()
+        project_handler.append_attr(project_id, {'tasks': task_id})
+
+        return result_handler(consts.API_SUCCESS, {'uuid': task_id})
+
+
+class V2Task(ApiResource):
+
+    def get(self, task_id):
+        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')
+
+        task_info = change_obj_to_dict(task)
+        result = task_info['result']
+        task_info['result'] = jsonutils.loads(result) if result else None
+
+        return result_handler(consts.API_SUCCESS, {'task': task_info})
+
+    def delete(self, task_id):
+        try:
+            uuid.UUID(task_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'invalid task id')
+
+        task_handler = V2TaskHandler()
+        try:
+            project_id = task_handler.get_by_uuid(task_id).project_id
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'no such task id')
+
+        LOG.info('delete task in database')
+        task_handler.delete_by_uuid(task_id)
+
+        project_handler = V2ProjectHandler()
+        project = project_handler.get_by_uuid(project_id)
+
+        if project.tasks:
+            LOG.info('update tasks in project')
+            new_task_list = project.tasks.split(',').remove(task_id)
+            if new_task_list:
+                new_tasks = ','.join(new_task_list)
+            else:
+                new_tasks = None
+            project_handler.update_attr(project_id, {'tasks': new_tasks})
+
+        return result_handler(consts.API_SUCCESS, {'task': task_id})
+
+    def put(self, task_id):
+
+        try:
+            uuid.UUID(task_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'invalid task id')
+
+        task_handler = V2TaskHandler()
+        try:
+            task_handler.get_by_uuid(task_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'no such task id')
+
+        return self._dispatch_post(task_id=task_id)
+
+    def add_environment(self, args):
+
+        task_id = args['task_id']
+        try:
+            environment_id = args['environment_id']
+        except KeyError:
+            return result_handler(consts.API_ERROR, 'environment_id must be provided')
+
+        try:
+            uuid.UUID(environment_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'invalid environment id')
+
+        environment_handler = V2EnvironmentHandler()
+        try:
+            environment_handler.get_by_uuid(environment_id)
+        except ValueError:
+            return result_handler(consts.API_ERROR, 'no such environment id')
+
+        LOG.info('update environment_id in task')
+        task_handler = V2TaskHandler()
+        task_handler.update_attr(task_id, {'environment_id': environment_id})
+
+        return result_handler(consts.API_SUCCESS, {'uuid': task_id})
+
+    def add_case(self, args):
+        task_id = args['task_id']
+        try:
+            name = args['case_name']
+        except KeyError:
+            return result_handler(consts.API_ERROR, 'case_name must be provided')
+
+        try:
+            content = args['case_content']
+        except KeyError:
+            return result_handler(consts.API_ERROR, 'case_content must be provided')
+
+        LOG.info('update case info in task')
+        task_handler = V2TaskHandler()
+        task_update_data = {
+            'case_name': name,
+            'content': content,
+            'suite': False
+        }
+        task_handler.update_attr(task_id, task_update_data)
+
+        return result_handler(consts.API_SUCCESS, {'uuid': task_id})