def do_delete_target_ref(backup, target, target_ref):

    if target_ref.preserve:
        logger.info("Skipping deletion for target ref %s (backup '%s') because"
                    " it is preserved" % (target_ref, backup.id))
        return
    try:
        target_ref.deleted_date = date_now()
        # if the target reference is a cloud storage one then make the cloud
        # storage object take care of it
        if isinstance(target_ref, CloudBlockStorageSnapshotReference):
            logger.info("Deleting backup '%s' snapshot " % backup.id)
            return target_ref.cloud_block_storage.delete_snapshot(target_ref)
        else:
            logger.info("Deleting backup '%s file" % backup.id)
            return target.delete_file(target_ref)
    except TargetInaccessibleError as e:
        msg = "Target %s for backup %s is no longer accessible.\n%s" % (
            target, backup.id, e.message
        )
        logger.warn(msg)
        persistence.update_backup(backup,
                                  event_name="DELETE_ERROR",
                                  message=msg,
                                  event_type=EventType.WARNING)
        return False
def mark_backup_never_expire(backup):
    logger.info("Mark backup '%s' as not expirable...." % backup.id)

    backup.dont_expire = True
    persistence.update_backup(backup, properties=["dontExpire"],
                              event_name="MARK_UNEXPIRABLE",
                              message="Marking as dontExpire")
    def delete_backup_targets(self, backup):
        logger.info("Attempt to delete targets for backup '%s'" % backup.id)
        self.validate_backup_target_delete(backup)
        try:
            if not self.test_mode:
                robustified_delete_backup(backup)
                return True
            else:
                logger.info("NOOP. Running in test mode. Not deleting "
                            "targets for backup '%s'" % backup.id)
        except Exception, e:
            msg = "Error while attempting to expire backup '%s': " % e
            logger.exception(msg)
            # if the backup expiration has errored out for 5 times (including this time) then mark as deleted
            if backup.event_logged_count("DELETE_ERROR") > 5:
                msg = ("Giving up on delete backup '%s'. Failed at least 5 times. Marking backup as deleted" %
                       backup.id)
                logger.warning(msg)
                # set deleted date
                backup.deleted_date = date_now()

            persistence.update_backup(backup,
                                      event_name="DELETE_ERROR",
                                      message=msg,
                                      properties=["deletedDate"],
                                      event_type=EventType.ERROR)
def robustified_delete_backup(backup):
    """
        deletes the backup targets
    """
    # do some validation,
    target_ref = backup.target_reference

    if backup.state == State.SUCCEEDED and not target_ref:
        raise BackupSweepError("Cannot delete backup '%s'. "
                               "Backup never uploaded" % backup.id)

    logger.info("Deleting target references for backup '%s'." % backup.id)



    logger.info("Deleting primary target reference for backup '%s'." %
                backup.id)
    # target ref can be None for CANCELED backups
    if target_ref:
        do_delete_target_ref(backup, backup.target, target_ref)

    # delete log file
    if backup.log_target_reference:
        logger.info("Deleting log target reference for backup '%s'." %
                    backup.id)
        do_delete_target_ref(backup, backup.target,
                             backup.log_target_reference)

    if backup.secondary_target_references:
        logger.info("Deleting secondary target references for backup '%s'." %
                    backup.id)
        sec_targets = backup.secondary_targets
        sec_target_refs = backup.secondary_target_references
        for (sec_target, sec_tgt_ref) in zip(sec_targets, sec_target_refs):
            logger.info("Deleting secondary target reference %s for backup "
                        "'%s'." % (sec_tgt_ref, backup.id))
            do_delete_target_ref(backup, sec_target, sec_tgt_ref)

    # set deleted date
    backup.deleted_date = date_now()
    update_props = ["deletedDate", "targetReference",
                    "secondaryTargetReferences"]
    persistence.update_backup(backup, properties=update_props,
                              event_name="DELETING",
                              message="Deleting target references")

    logger.info("Backup %s target references deleted successfully!" %
                backup.id)
    def expire_backup(self, backup, force=False):
        # do some validation
        if backup.state == State.SUCCEEDED and not backup.target_reference:
            raise BackupExpirationError("Cannot expire backup '%s'. "
                                        "Backup never uploaded" % backup.id)

        if not(force or backup.state == State.CANCELED):
            self.validate_backup_expiration(backup)

        if not self.test_mode:
            try:
                logger.info("BackupExpirationManager: Expiring backup '%s'" %
                            backup.id)
                backup.expired_date = date_now()
                persistence.update_backup(backup, properties="expiredDate",
                                          event_name="EXPIRING",
                                          message="Expiring")

            except Exception, e:
                msg = "Error while attempting to expire backup '%s': " % e
                logger.exception(msg)
 def cancel_backup(self, backup):
     backup.cancel_requested_at = date_utils.date_now()
     persistence.update_backup(backup, properties="cancelRequestedAt",
                               message="Backup canceled through API")