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")