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
예제 #2
0
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
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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
예제 #6
0
 def volume_provider(self):
     return VolumeProviderBase(self.instance)
예제 #7
0
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()
예제 #8
0
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
예제 #9
0
 def path(self, obj):
     if not obj.identifier:
         return
     provider = VolumeProviderBase(obj.host.instances.first())
     return mark_safe(provider.get_path(obj))