def purge_backups(storage, backups): """ Core function to purge a list of node_backups Used for node purge and backup delete (using a specific backup_name) """ logging.info("{} backups are candidate to be purged".format(len(backups))) fqdns = set() nb_objects_purged = 0 total_purged_size = 0 for backup in backups: (purged_objects, purged_size) = purge_backup(storage, backup) nb_objects_purged += purged_objects total_purged_size += purged_size fqdns.add(backup.fqdn) for fqdn in fqdns: (cleaned_objects_count, cleaned_objects_size) = cleanup_obsolete_files(storage, fqdn) nb_objects_purged += cleaned_objects_count total_purged_size += cleaned_objects_size logging.info("Purged {} objects with a total size of {}".format( nb_objects_purged, format_bytes_str(total_purged_size)) )
def purge_backups(storage, backups, fqdn): logging.info("{} backups are candidate to be purged".format(len(backups))) nb_objects_purged = 0 total_purged_size = 0 for backup in backups: (purged_objects, purged_size) = purge_backup(storage, backup) nb_objects_purged += purged_objects total_purged_size += purged_size (cleaned_objects_count, cleaned_objects_size) = cleanup_obsolete_files(storage, fqdn) nb_objects_purged += cleaned_objects_count total_purged_size += cleaned_objects_size logging.info("Purged {} objects with a total size of {}".format( nb_objects_purged, format_bytes_str(total_purged_size)))
def status(config, backup_name): storage = Storage(config=config.storage) try: cluster_backup = storage.get_cluster_backup(backup_name) except KeyError: logging.error('No such backup') sys.exit(1) if cluster_backup.is_complete(): print('{.name}'.format(cluster_backup)) else: print('{.name} [Incomplete!]'.format(cluster_backup)) started = datetime.fromtimestamp( cluster_backup.started).strftime(TIMESTAMP_FORMAT) if cluster_backup.finished is None: print('- Started: {}, ' 'Finished: never'.format(started)) else: finished = datetime.fromtimestamp( cluster_backup.finished).strftime(TIMESTAMP_FORMAT) print('- Started: {}, ' 'Finished: {}'.format(started, finished)) complete_nodes = cluster_backup.complete_nodes() incomplete_nodes = cluster_backup.incomplete_nodes() missing_nodes = cluster_backup.missing_nodes() print('- {0} nodes completed, {1} nodes incomplete, {2} nodes missing'. format(len(complete_nodes), len(incomplete_nodes), len(missing_nodes))) if len(incomplete_nodes) > 0: print('- Incomplete nodes:') for node_backup in incomplete_nodes: print(' {}'.format(node_backup.fqdn)) if len(missing_nodes) > 0: print('- Missing nodes:') for fqdn in missing_nodes: print(' {}'.format(fqdn)) print('- {} files, {}'.format(cluster_backup.num_objects(), format_bytes_str(cluster_backup.size())))
def print_backup_stats(actual_backup_duration, actual_start, end, node_backup, node_backup_cache, num_files, start): logging.info('Backup done') logging.info("""- Started: {:%Y-%m-%d %H:%M:%S} - Started extracting data: {:%Y-%m-%d %H:%M:%S} - Finished: {:%Y-%m-%d %H:%M:%S}""".format( start, actual_start, end)) logging.info('- Real duration: {} (excludes time waiting ' 'for other nodes)'.format(actual_backup_duration)) logging.info('- {} files, {}'.format(num_files, format_bytes_str(node_backup.size()))) logging.info( '- {} files copied from host'.format(num_files - node_backup_cache.replaced)) if node_backup_cache.backup_name is not None: logging.info('- {} copied from previous backup ({})'.format( node_backup_cache.replaced, node_backup_cache.backup_name))
def purge_backups(storage, backups, backup_grace_period_in_days, local_fqdn): """ Core function to purge a set of node_backups Used for node purge and backup delete (using a specific backup_name) """ logging.info("{} backups are candidate to be purged".format(len(backups))) fqdns = set() nb_objects_purged = 0 total_purged_size = 0 total_objects_within_grace = 0 for backup in backups: (purged_objects, purged_size) = purge_backup(storage, backup) nb_objects_purged += purged_objects total_purged_size += purged_size fqdns.add(backup.fqdn) if len(fqdns) == 0: # If we didn't purge any backup, we still want to cleanup obsolete files for the local node fqdns.add(local_fqdn) for fqdn in fqdns: (cleaned_objects_count, cleaned_objects_size, nb_objects_within_grace) \ = cleanup_obsolete_files(storage, fqdn, backup_grace_period_in_days) nb_objects_purged += cleaned_objects_count total_purged_size += cleaned_objects_size total_objects_within_grace += nb_objects_within_grace logging.info("Purged {} objects with a total size of {}".format( nb_objects_purged, format_bytes_str(total_purged_size))) if total_objects_within_grace > 0: logging.info( "{} objects within {} days grace period were not deleted".format( total_objects_within_grace, backup_grace_period_in_days))