From 83fb41280ea9a413f7fc879730b7af81fd64bef6 Mon Sep 17 00:00:00 2001 From: gecong1973 Date: Thu, 25 Oct 2018 01:37:38 -0700 Subject: [PATCH] Add backup api for bp add-mysql-support-for-freezer Add backup 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: I27e010fb332e25b570aa56ac0432d71621c3929e Implements: bp add-mysql-support-for-freezer --- freezer_api/db/sqlalchemy/api.py | 123 +++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/freezer_api/db/sqlalchemy/api.py b/freezer_api/db/sqlalchemy/api.py index 7290bce9..6a278009 100644 --- a/freezer_api/db/sqlalchemy/api.py +++ b/freezer_api/db/sqlalchemy/api.py @@ -515,6 +515,129 @@ def replace_action(user_id, action_id, doc, project_id): return action_id +def get_backup(project_id, user_id, backup_id): + session = get_db_session() + with session.begin(): + try: + query = model_query(session, models.Backup, project_id=project_id) + query = query.filter_by(user_id=user_id).filter_by(id=backup_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['project_id'] = result[0].get('project_id') + values['backup_id'] = result[0].get('id') + values['user_id'] = result[0].get('user_id') + values['user_name'] = result[0].get('user_name') + values['client_id'] = result[0].get('client_id') + values['backup_uuid'] = result[0].get('id') + values['backup_metadata'] = json_utils.\ + json_decode(result[0].get('backup_metadata')) + return values + + +def add_backup(project_id, user_id, user_name, doc): + + metadatadoc = utils.BackupMetadataDoc(project_id, user_id, user_name, doc) + if not metadatadoc.is_valid(): + raise freezer_api_exc.BadDataFormat( + message='Bad Data Format') + backup_id = metadatadoc.backup_id + backupjson = metadatadoc.serialize() + backup_metadata = backupjson.get('backup_metadata') + + job_doc = backup_metadata.get('job_doc') + + existing = get_backup(project_id=project_id, user_id=user_id, + backup_id=backup_id) + if existing: + raise freezer_api_exc.DocumentExists( + message='Backup already registered with ID' + ' {0}'.format(backup_id)) + + backup = models.Backup() + backupvalue = {} + backupvalue['project_id'] = project_id + backupvalue['id'] = backup_id + backupvalue['user_id'] = user_id + backupvalue['user_name'] = user_name + backupvalue['client_id'] = job_doc.get('client_id') + backupvalue['job_id'] = backup_metadata.get('job_id') + # The field backup_metadata is json, including : + # hostname , backup_name , container etc + backupvalue['backup_metadata'] = json_utils.json_encode(backup_metadata) + backup.update(backupvalue) + + session = get_db_session() + with session.begin(): + try: + backup.save(session=session) + except Exception as e: + session.close() + raise freezer_api_exc.\ + StorageEngineError(message='mysql operation failed {0}'. + format(e)) + + LOG.info('Backup registered, backup_id: {0}'.format(backup_id)) + + session.close() + return backup_id + + +def delete_backup(project_id, user_id, backup_id): + session = get_db_session() + query = model_query(session, models.Backup, project_id=project_id) + query = query.filter_by(user_id=user_id).filter_by(id=backup_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('Backup delete, backup_id: {0} deleted'. + format(backup_id)) + else: + LOG.info('Backup delete, backup_id: {0} not found'. + format(backup_id)) + + session.close() + return backup_id + + +def search_backup(project_id, user_id, offset=0, + limit=10, search=None): + + search = search or {} + backups = [] + session = get_db_session() + query = model_query(session, models.Backup, project_id=project_id) + query = query.filter_by(user_id=user_id) + + result = query.all() + + for backup in result: + backupmap = {} + backupmap['project_id'] = project_id + backupmap['user_id'] = user_id + backupmap['backup_id'] = backup.id + backupmap['backup_uuid'] = backup.id + backupmap['user_name'] = backup.user_name + backupmap['client_id'] = backup.client_id + backupmap['backup_metadata'] = json_utils.\ + json_decode(backup.get('backup_metadata')) + backups.append(backupmap) + + session.close() + return backups + + def get_session(project_id, user_id, session_id): jobt = {} session = get_db_session()