Merge "Improvement: support more parameters in fio testcase"
[yardstick.git] / api / resources / v2 / projects.py
1 import uuid
2 import logging
3
4 from datetime import datetime
5
6 from api import ApiResource
7 from api.database.v2.handlers import V2ProjectHandler
8 from api.database.v2.handlers import V2TaskHandler
9 from yardstick.common.utils import result_handler
10 from yardstick.common.utils import change_obj_to_dict
11 from yardstick.common import constants as consts
12
13 LOG = logging.getLogger(__name__)
14 LOG.setLevel(logging.DEBUG)
15
16
17 class V2Projects(ApiResource):
18
19     def get(self):
20         project_handler = V2ProjectHandler()
21         projects = [change_obj_to_dict(p) for p in project_handler.list_all()]
22
23         for p in projects:
24             tasks = p['tasks']
25             p['tasks'] = tasks.split(',') if tasks else []
26
27         return result_handler(consts.API_SUCCESS, {'projects': projects})
28
29     def post(self):
30         return self._dispatch_post()
31
32     def create_project(self, args):
33         try:
34             name = args['name']
35         except KeyError:
36             return result_handler(consts.API_ERROR, 'name must be provided')
37
38         project_id = str(uuid.uuid4())
39         create_time = datetime.now()
40         project_handler = V2ProjectHandler()
41
42         project_init_data = {
43             'uuid': project_id,
44             'name': name,
45             'time': create_time
46         }
47         project_handler.insert(project_init_data)
48
49         return result_handler(consts.API_SUCCESS, {'uuid': project_id})
50
51
52 class V2Project(ApiResource):
53
54     def get(self, project_id):
55         try:
56             uuid.UUID(project_id)
57         except ValueError:
58             return result_handler(consts.API_ERROR, 'invalid project id')
59
60         project_handler = V2ProjectHandler()
61         try:
62             project = project_handler.get_by_uuid(project_id)
63         except ValueError:
64             return result_handler(consts.API_ERROR, 'no such project id')
65
66         project_info = change_obj_to_dict(project)
67         tasks = project_info['tasks']
68         project_info['tasks'] = tasks.split(',') if tasks else []
69
70         return result_handler(consts.API_SUCCESS, {'project': project_info})
71
72     def delete(self, project_id):
73         try:
74             uuid.UUID(project_id)
75         except ValueError:
76             return result_handler(consts.API_ERROR, 'invalid project id')
77
78         project_handler = V2ProjectHandler()
79         try:
80             project = project_handler.get_by_uuid(project_id)
81         except ValueError:
82             return result_handler(consts.API_ERROR, 'no such project id')
83
84         if project.tasks:
85             LOG.info('delete related task')
86             task_handler = V2TaskHandler()
87             for task_id in project.tasks.split(','):
88                 LOG.debug('delete task: %s', task_id)
89                 try:
90                     task_handler.delete_by_uuid(task_id)
91                 except ValueError:
92                     LOG.exception('no such task id: %s', task_id)
93
94         LOG.info('delete project in database')
95         project_handler.delete_by_uuid(project_id)
96
97         return result_handler(consts.API_SUCCESS, {'project': project_id})