From 60b1cb7eb40e39cf0ece0861c0faa8fa310f36c4 Mon Sep 17 00:00:00 2001 From: gengchc2 Date: Thu, 25 Oct 2018 01:50:22 -0700 Subject: [PATCH] Add jobs api for bp add-mysql-support-for-freezer Add jobs api in v2. The other tables,api and test will be added in following patch. ref: https://storyboard.openstack.org/#!/story/2004132 Story: #2004132 Task: #27578 Change-Id: Ia64d6d49e692a3d2875662252eb270fb04d9df33 Implements: bp add-mysql-support-for-freezer --- freezer_api/db/sqlalchemy/api.py | 209 +++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) diff --git a/freezer_api/db/sqlalchemy/api.py b/freezer_api/db/sqlalchemy/api.py index 6a278009..215ed3ce 100644 --- a/freezer_api/db/sqlalchemy/api.py +++ b/freezer_api/db/sqlalchemy/api.py @@ -515,6 +515,215 @@ def replace_action(user_id, action_id, doc, project_id): return action_id +def delete_job(user_id, job_id, project_id): + session = get_db_session() + query = model_query(session, models.Job, project_id=project_id) + query = query.filter_by(user_id=user_id).filter_by(id=job_id) + result = query.all() + if 1 == len(result): + try: + result[0].delete(session=session) + except Exception as e: + session.close() + raise freezer_api_exc.StorageEngineError( + message='mysql operation failed {0}'.format(e)) + LOG.info('Job delete, job_id: {0} deleted'.format(job_id)) + else: + LOG.info('Action delete, job_id: {0} not found'. + format(job_id)) + session.close() + return job_id + + +def add_job(user_id, doc, project_id): + job_doc = utils.JobDoc.create(doc, project_id, user_id) + + job_id = job_doc.get('job_id') + existing = get_job(project_id=project_id, user_id=user_id, + job_id=job_id) + if existing: + raise freezer_api_exc.\ + DocumentExists(message='Job already registered with ID {0}'. + format(job_id)) + + job = models.Job() + jobvalue = {} + jobvalue['id'] = job_id + jobvalue['project_id'] = project_id + jobvalue['user_id'] = user_id + jobvalue['schedule'] = json_utils.\ + json_encode(job_doc.pop('job_schedule', '')) + jobvalue['client_id'] = job_doc.get('client_id', '') + jobvalue['session_id'] = job_doc.pop('session_id', '') + jobvalue['session_tag'] = job_doc.pop('session_tag', 0) + jobvalue['description'] = job_doc.pop('description', '') + jobvalue['job_actions'] = json_utils.\ + json_encode(job_doc.pop('job_actions', '')) + job.update(jobvalue) + + session = get_db_session() + with session.begin(): + try: + job.save(session=session) + except Exception as e: + session.close() + raise freezer_api_exc.StorageEngineError( + message='mysql operation failed {0}'.format(e)) + + LOG.info('Job registered, job_id: {0}'.format(job_id)) + + return job_id + + +def get_job(project_id, user_id, job_id): + session = get_db_session() + with session.begin(): + try: + query = model_query(session, models.Job, project_id=project_id) + query = query.filter_by(user_id=user_id).filter_by(id=job_id) + result = query.all() + except Exception as e: + raise freezer_api_exc.StorageEngineError( + message='mysql operation failed {0}'.format(e)) + + session.close() + values = {} + if 1 == len(result): + values['job_id'] = result[0].get('id') + values['project_id'] = result[0].get('project_id') + values['user_id'] = result[0].get('user_id') + values['job_schedule'] = json_utils.\ + json_decode(result[0].get('schedule')) + values['client_id'] = result[0].get('client_id') + values['session_id'] = result[0].get('session_id') + values['session_tag'] = result[0].get('session_tag') + values['description'] = result[0].get('description') + values['job_actions'] = json_utils.\ + json_decode(result[0].get('job_actions')) + return values + + +def search_job(project_id, user_id, offset=0, + limit=10, search=None): + + search = search or {} + jobs = [] + session = get_db_session() + query = model_query(session, models.Job, project_id=project_id) + query = query.filter_by(user_id=user_id) + + result = query.all() + + for job in result: + jobmap = {} + jobmap['job_id'] = job.get('id') + jobmap['project_id'] = job.get('project_id') + jobmap['user_id'] = job.get('user_id') + jobmap['job_schedule'] = json_utils.json_decode(job.get('schedule')) + jobmap['client_id'] = job.get('client_id') + jobmap['session_id'] = job.get('session_id') + jobmap['session_tag'] = job.get('session_tag') + jobmap['description'] = job.get('description') + jobmap['job_actions'] = json_utils.json_decode( + job.get('job_actions')) + + jobs.append(jobmap) + + session.close() + return jobs + + +def update_job(user_id, job_id, patch_doc, project_id): + valid_patch = utils.JobDoc.create_patch(patch_doc) + + values = {} + for key in valid_patch.keys(): + if key == 'job_schedule': + values['schedule'] = json_utils.\ + json_encode(valid_patch.get(key, None)) + elif key == 'job_actions': + values[key] = json_utils.json_encode(valid_patch.get(key, None)) + else: + values[key] = valid_patch.get(key, None) + + session = get_db_session() + with session.begin(): + try: + query = model_query(session, models.Job, project_id=project_id) + query = query.filter_by(user_id=user_id).filter_by(id=job_id) + result = query.update(values) + except Exception as e: + session.close() + raise freezer_api_exc.StorageEngineError( + message='mysql operation failed {0}'.format(e)) + + session.close() + + if not result: + raise freezer_api_exc.DocumentNotFound( + message='Job not registered with ID' + ' {0}'.format(job_id)) + else: + LOG.info('job updated, job_id: {0}'.format(job_id)) + return 0 + + +def replace_job(user_id, job_id, doc, project_id): + + valid_doc = utils.JobDoc.update(doc, user_id, job_id, project_id) + values = {} + valuesnew = {} + bCreate = False + + values['id'] = job_id + values['project_id'] = project_id + values['user_id'] = user_id + values['schedule'] = json_utils.\ + json_encode(valid_doc.pop('job_schedule', None)) + values['client_id'] = valid_doc.get('client_id', None) + values['session_id'] = valid_doc.pop('session_id', None) + values['session_tag'] = valid_doc.pop('session_tag', None) + values['description'] = valid_doc.pop('description', None) + values['job_actions'] = json_utils.\ + json_encode(valid_doc.pop('job_actions', None)) + + for key in values: + if values[key] is not None: + valuesnew[key] = values[key] + + session = get_db_session() + with session.begin(): + try: + query = model_query(session, models.Job, project_id=project_id) + query = query.filter_by(user_id=user_id).filter_by(id=job_id) + result = query.update(valuesnew) + if not result: + bCreate = True + except Exception as e: + session.close() + raise freezer_api_exc.StorageEngineError( + message='mysql operation failed {0}'.format(e)) + + session.close() + + if bCreate: + job = models.Job() + job.update(valuesnew) + session = get_db_session() + with session.begin(): + try: + job.save(session=session) + except Exception as e: + session.close() + raise freezer_api_exc.\ + StorageEngineError(message='mysql operation failed {0}'. + format(e)) + session.close() + + LOG.info('job replaced, job_id: {0}'.format(job_id)) + return job_id + + def get_backup(project_id, user_id, backup_id): session = get_db_session() with session.begin():