def restore_snapshot(database, group, task, retry_from=None): restore = DatabaseRestore() restore.task = task restore.database = database restore.group = group new_group = retry_from.new_group if retry_from else BackupGroup() new_group.save() restore.new_group = new_group restore.save() restore.load_instances(retry_from) topology_path = database.plan.replication_topology.class_path steps = get_restore_snapshot_settings(topology_path) since_step = retry_from.current_step if retry_from else None if steps_for_instances( steps, restore.instances, task, restore.update_step, since_step=since_step ): restore.set_success() task.set_status_success('Restore is done') else: restore.set_error() task.set_status_error( 'Could not do restore\n' 'Please check error message and do retry' )
def restore_snapshot(self, database, snapshot, user, task_history): try: from dbaas_nfsaas.models import HostAttr LOG.info("Restoring snapshot") worker_name = get_worker_name() task_history = models.TaskHistory.objects.get(id=task_history) task_history = TaskHistory.register(request=self.request, task_history=task_history, user=user, worker_name=worker_name) databaseinfra = database.databaseinfra snapshot = Snapshot.objects.get(id=snapshot) snapshot_id = snapshot.snapshopt_id host_attr_snapshot = HostAttr.objects.get(nfsaas_path=snapshot.export_path) host = host_attr_snapshot.host host_attr = HostAttr.objects.get(host=host, is_active=True) export_id_snapshot = host_attr_snapshot.nfsaas_export_id export_id = host_attr.nfsaas_export_id export_path = host_attr.nfsaas_path steps = get_restore_snapshot_settings( database.plan.replication_topology.class_path ) not_primary_instances = databaseinfra.instances.exclude(hostname=host).exclude(instance_type__in=[Instance.MONGODB_ARBITER, Instance.REDIS_SENTINEL]) not_primary_hosts = [ instance.hostname for instance in not_primary_instances] workflow_dict = build_dict(databaseinfra=databaseinfra, database=database, snapshot_id=snapshot_id, export_path=export_path, export_id=export_id, export_id_snapshot=export_id_snapshot, host=host, steps=steps, not_primary_hosts=not_primary_hosts, ) start_workflow(workflow_dict=workflow_dict, task=task_history) if workflow_dict['exceptions']['traceback']: raise Exception('Restore could not be finished') else: task_history.update_status_for( TaskHistory.STATUS_SUCCESS, details='Database sucessfully recovered!') except Exception, e: if 'workflow_dict' in locals(): error = "\n".join(": ".join(err) for err in workflow_dict['exceptions']['error_codes']) traceback = "\nException Traceback\n".join(workflow_dict['exceptions']['traceback']) error = "{}\n{}\n{}".format(error, traceback, error) else: error = str(e) task_history.update_status_for( TaskHistory.STATUS_ERROR, details=error)