3 from datetime import datetime
5 from oslo_serialization import jsonutils
7 from api import ApiResource
8 from api.database.v2.handlers import V2TaskHandler
9 from api.database.v2.handlers import V2ProjectHandler
10 from api.database.v2.handlers import V2EnvironmentHandler
11 from api.utils.thread import TaskThread
12 from yardstick.common.utils import result_handler
13 from yardstick.common.utils import change_obj_to_dict
14 from yardstick.common import constants as consts
15 from yardstick.benchmark.core.task import Task
16 from yardstick.benchmark.core import Param
18 LOG = logging.getLogger(__name__)
19 LOG.setLevel(logging.DEBUG)
22 class V2Tasks(ApiResource):
25 return self._dispatch_post()
27 def create_task(self, args):
31 return result_handler(consts.API_ERROR, 'name must be provided')
34 project_id = args['project_id']
36 return result_handler(consts.API_ERROR, 'project_id must be provided')
38 task_id = str(uuid.uuid4())
39 create_time = datetime.now()
40 task_handler = V2TaskHandler()
42 LOG.info('create task in database')
45 'project_id': project_id,
50 task_handler.insert(task_init_data)
52 LOG.info('create task in project')
53 project_handler = V2ProjectHandler()
54 project_handler.append_attr(project_id, {'tasks': task_id})
56 return result_handler(consts.API_SUCCESS, {'uuid': task_id})
59 class V2Task(ApiResource):
61 def get(self, task_id):
65 return result_handler(consts.API_ERROR, 'invalid task id')
67 task_handler = V2TaskHandler()
69 task = task_handler.get_by_uuid(task_id)
71 return result_handler(consts.API_ERROR, 'no such task id')
73 task_info = change_obj_to_dict(task)
74 result = task_info['result']
75 task_info['result'] = jsonutils.loads(result) if result else None
77 return result_handler(consts.API_SUCCESS, {'task': task_info})
79 def delete(self, task_id):
83 return result_handler(consts.API_ERROR, 'invalid task id')
85 task_handler = V2TaskHandler()
87 project_id = task_handler.get_by_uuid(task_id).project_id
89 return result_handler(consts.API_ERROR, 'no such task id')
91 LOG.info('delete task in database')
92 task_handler.delete_by_uuid(task_id)
94 project_handler = V2ProjectHandler()
95 project = project_handler.get_by_uuid(project_id)
98 LOG.info('update tasks in project')
99 new_task_list = project.tasks.split(',').remove(task_id)
101 new_tasks = ','.join(new_task_list)
104 project_handler.update_attr(project_id, {'tasks': new_tasks})
106 return result_handler(consts.API_SUCCESS, {'task': task_id})
108 def put(self, task_id):
113 return result_handler(consts.API_ERROR, 'invalid task id')
115 task_handler = V2TaskHandler()
117 task_handler.get_by_uuid(task_id)
119 return result_handler(consts.API_ERROR, 'no such task id')
121 return self._dispatch_post(task_id=task_id)
123 def add_environment(self, args):
125 task_id = args['task_id']
127 environment_id = args['environment_id']
129 return result_handler(consts.API_ERROR, 'environment_id must be provided')
132 uuid.UUID(environment_id)
134 return result_handler(consts.API_ERROR, 'invalid environment id')
136 environment_handler = V2EnvironmentHandler()
138 environment_handler.get_by_uuid(environment_id)
140 return result_handler(consts.API_ERROR, 'no such environment id')
142 LOG.info('update environment_id in task')
143 task_handler = V2TaskHandler()
144 task_handler.update_attr(task_id, {'environment_id': environment_id})
146 return result_handler(consts.API_SUCCESS, {'uuid': task_id})
148 def add_case(self, args):
149 task_id = args['task_id']
151 name = args['case_name']
153 return result_handler(consts.API_ERROR, 'case_name must be provided')
156 content = args['case_content']
158 return result_handler(consts.API_ERROR, 'case_content must be provided')
160 LOG.info('update case info in task')
161 task_handler = V2TaskHandler()
167 task_handler.update_attr(task_id, task_update_data)
169 return result_handler(consts.API_SUCCESS, {'uuid': task_id})
171 def add_suite(self, args):
172 task_id = args['task_id']
174 name = args['suite_name']
176 return result_handler(consts.API_ERROR, 'suite_name must be provided')
179 content = args['suite_content']
181 return result_handler(consts.API_ERROR, 'suite_content must be provided')
183 LOG.info('update suite info in task')
184 task_handler = V2TaskHandler()
190 task_handler.update_attr(task_id, task_update_data)
192 return result_handler(consts.API_SUCCESS, {'uuid': task_id})
196 task_id = args['task_id']
198 return result_handler(consts.API_ERROR, 'task_id must be provided')
203 return result_handler(consts.API_ERROR, 'invalid task id')
205 task_handler = V2TaskHandler()
207 task = task_handler.get_by_uuid(task_id)
209 return result_handler(consts.API_ERROR, 'no such task id')
211 if not task.environment_id:
212 return result_handler(consts.API_ERROR, 'environment not set')
214 if not task.case_name or not task.content:
215 return result_handler(consts.API_ERROR, 'case not set')
218 return result_handler(consts.API_ERROR, 'task is already running')
220 with open('/tmp/{}.yaml'.format(task.case_name), 'w') as f:
221 f.write(task.content)
224 'inputfile': ['/tmp/{}.yaml'.format(task.case_name)],
228 data.update({'suite': True})
230 LOG.info('start task thread')
232 task_thread = TaskThread(Task().start, param, task_handler)
235 return result_handler(consts.API_SUCCESS, {'uuid': task_id})