def remove_snapshot_backup(snapshot): snapshots = snapshot.group.backups.all() if snapshot.group else [snapshot] for snapshot in snapshots: if snapshot.purge_at: continue LOG.info("Removing backup for {}".format(snapshot)) provider = VolumeProviderBase(snapshot.instance) provider.delete_snapshot(snapshot) snapshot.purge_at = datetime.now() snapshot.save() return
def remove_snapshot_backup(snapshot, provider=None, force=0, msgs=None): snapshots = snapshot.group.backups.all() if snapshot.group else [snapshot] for snapshot in snapshots: if snapshot.purge_at: continue LOG.info("Removing backup for {}".format(snapshot)) if not provider: provider = VolumeProviderBase(snapshot.instance) removed = provider.delete_snapshot(snapshot, force=force) if removed: snapshot.purge_at = datetime.now() snapshot.save() msg = "Backup {} removed".format(snapshot) LOG.info(msg) if msgs is not None: msgs.append(msg) return
def purge_unused_exports(task=None): success = True for volume in Volume.objects.filter(is_active=False): if volume.backups.filter(purge_at=None).exists(): continue if task: task.add_detail('Removing: {}'.format(volume), level=2) provider = VolumeProviderBase(volume.host.instances.first()) try: provider.add_access(volume, volume.host) provider.clean_up(volume) provider.destroy_volume(volume) except Exception as e: success = False LOG.info('Error removing {} - {}'.format(volume, e)) if task: task.add_detail('Error: {}'.format(e), level=4) else: if task: task.add_detail('Success', level=4) return success
def volume_provider(self): return VolumeProviderBase(self.instance)
from backup.models import Volume from workflow.steps.util.volume_provider import VolumeProviderBase for vol in Volume.objects.all(): vol_inst = vol.host and vol.host.instances.first() if not vol_inst: continue provider = VolumeProviderBase(vol_inst) vol_path = provider.get_path(vol) if not vol_path: continue for snap in vol.backups.all(): snap.volume_path = vol_path snap.save()
def make_instance_snapshot_backup(instance, error, group): LOG.info("Make instance backup for {}".format(instance)) provider = VolumeProviderBase(instance) infra = instance.databaseinfra database = infra.databases.first() snapshot = Snapshot.create(instance, group, provider.volume) snapshot_final_status = Snapshot.SUCCESS locked = None driver = infra.get_driver() client = None try: client = driver.get_client(instance) locked = lock_instance(driver, instance, client) if not locked: snapshot_final_status = Snapshot.WARNING if 'MySQL' in type(driver).__name__: mysql_binlog_save(client, instance) response = provider.take_snapshot() snapshot.done(response) except Exception as e: errormsg = "Error creating snapshot: {}".format(e) error['errormsg'] = errormsg set_backup_error(infra, snapshot, errormsg) return snapshot finally: if locked: unlock_instance(driver, instance, client) output = {} command = "du -sb /data/.snapshot/%s | awk '{print $1}'" % ( snapshot.snapshot_name) try: exec_remote_command_host(instance.hostname, command, output) size = int(output['stdout'][0]) snapshot.size = size except Exception as e: snapshot.size = 0 LOG.error("Error exec remote command {}".format(e)) backup_path = database.backup_path if backup_path: now = datetime.now() target_path = "{}/{}/{}/{}/{}".format( backup_path, now.strftime("%Y_%m_%d"), instance.hostname.hostname.split('.')[0], now.strftime("%Y%m%d%H%M%S"), infra.name) snapshot_path = "/data/.snapshot/{}/data/".format( snapshot.snapshot_name) output = {} command = """ if [ -d "{backup_path}" ] then rm -rf {backup_path}/20[0-9][0-9]_[0-1][0-9]_[0-3][0-9] & mkdir -p {target_path} cp -r {snapshot_path} {target_path} & fi """.format(backup_path=backup_path, target_path=target_path, snapshot_path=snapshot_path) try: exec_remote_command_host(instance.hostname, command, output) except Exception as e: LOG.error("Error exec remote command {}".format(e)) snapshot.status = snapshot_final_status snapshot.end_at = datetime.now() snapshot.save() register_backup_dbmonitor(infra, snapshot) return snapshot
def path(self, obj): if not obj.identifier: return provider = VolumeProviderBase(obj.host.instances.first()) return mark_safe(provider.get_path(obj))