Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def test_info_with_args(self, caplog):
# See all logs
caplog.set_level(0)
# preparation
writer = self._mock_writer()
msg = 'test format %02d %s'
args = (1, '2nd')
output.info(msg, *args)
# logging test
for record in caplog.records:
assert record.levelname == 'INFO'
assert record.name == __name__
assert msg % args in caplog.text
# writer test
assert not writer.error_occurred.called
writer.info.assert_called_once_with(msg, *args)
# global status test
assert not output.error_occurred
force_str(e), self.config.name)
output.close_and_exit()
# If WAL files are put directly in the pg_xlog directory,
# avoid shipping of just recovered files
# by creating the corresponding archive status file
if not recovery_info['is_pitr']:
output.info("Generating archive status files")
self._generate_archive_status(recovery_info,
remote_command,
required_xlog_files)
# Generate recovery.conf file (only if needed by PITR or get_wal)
is_pitr = recovery_info['is_pitr']
get_wal = recovery_info['get_wal']
if is_pitr or get_wal or standby_mode:
output.info("Generating recovery configuration")
self._generate_recovery_conf(recovery_info, backup_info, dest,
target_immediate, exclusive,
remote_command, target_name,
target_time, target_tli, target_xid,
target_lsn, standby_mode)
# Create archive_status directory if necessary
archive_status_dir = os.path.join(recovery_info['wal_dest'],
'archive_status')
try:
recovery_info['cmd'].create_dir_if_not_exists(archive_status_dir)
except FsOperationFailed as e:
output.error("unable to create the archive_status directory "
"'%s': %s", archive_status_dir, e)
output.close_and_exit()
but can be executed manually using the barman archive-wal command
:param bool verbose: if false outputs something only if there is
at least one file
"""
output.debug("Starting archive-wal for server %s", self.config.name)
try:
# Take care of the archive lock.
# Only one archive job per server is admitted
with ServerWalArchiveLock(self.config.barman_lock_directory,
self.config.name):
self.backup_manager.archive_wal(verbose)
except LockFileBusy:
# If another process is running for this server,
# warn the user and skip to the next server
output.info("Another archive-wal process is already running "
"on server %s. Skipping to the next server"
% self.config.name)
if batch.errors:
output.info("Some unknown objects have been found while "
"processing xlog segments for %s. "
"Objects moved to errors directory:",
self.config.name,
log=False)
# Log unexpected files
_logger.warning("Archiver is about to move %s unexpected file(s) "
"to errors directory for %s from %s",
len(batch.errors),
self.config.name,
self.name)
for error in batch.errors:
basename = os.path.basename(error)
output.info("\t%s", basename, log=False)
# Print informative log line.
_logger.warning("Moving unexpected file for %s from %s: %s",
self.config.name, self.name, basename)
error_dst = os.path.join(
self.config.errors_directory,
"%s.%s.unknown" % (basename, stamp))
try:
shutil.move(error, error_dst)
except IOError as e:
if e.errno == errno.ENOENT:
_logger.warning('%s not found' % error)
def _stop_backup_copy_message(self, backup_info):
"""
Output message for backup end
:param barman.infofile.LocalBackupInfo backup_info: backup information
"""
output.info("Copy done (time: %s)",
human_readable_timedelta(datetime.timedelta(
seconds=backup_info.copy_stats['copy_time'])))
else:
# only history files are here
if xlog.is_history_file(fullname):
history_count += 1
wal_info = comp_manager.get_wal_file_info(
fullname)
fxlogdb_new.write(wal_info.to_xlogdb_line())
else:
_logger.warning(
'unexpected file '
'rebuilding the wal database: %s',
fullname)
os.fsync(fxlogdb_new.fileno())
shutil.move(xlogdb_new, fxlogdb.name)
fsync_dir(os.path.dirname(fxlogdb.name))
output.info('Done rebuilding xlogdb for server %s '
'(history: %s, backup_labels: %s, wal_file: %s)',
self.config.name, history_count, label_count, wal_count)
:param str|None target_time: the target time
:param str|None target_xid: the target xid
:param str|None target_lsn: the target LSN
:param str|None target_name: the target name created previously with
pg_create_restore_point() function call
:param str|None target_immediate: end recovery as soon as consistency
is reached
:param bool exclusive: whether the recovery is exclusive or not
:param str|None target_action: The recovery target action
:param bool|None standby_mode: standby mode
"""
# Run the cron to be sure the wal catalog is up to date
# Prepare a map that contains all the objects required for a recovery
recovery_info = self._setup(backup_info, remote_command, dest)
output.info("Starting %s restore for server %s using backup %s",
recovery_info['recovery_dest'], self.server.config.name,
backup_info.backup_id)
output.info("Destination directory: %s", dest)
if remote_command:
output.info("Remote command: %s", remote_command)
# If the backup we are recovering is still not validated and we
# haven't requested the get-wal feature, display a warning message
if not recovery_info['get_wal']:
if backup_info.status == BackupInfo.WAITING_FOR_WALS:
output.warning(
"IMPORTANT: You have requested a recovery operation for "
"a backup that does not have yet all the WAL files that "
"are required for consistency.")
# Set targets for PITR
recovery_info['pause_at_recovery_target'] = "on"
elif target_action:
raise RecoveryTargetActionException(
"Illegal target action '%s' "
"for this version of PostgreSQL" %
target_action)
else:
if target_action in ('pause', 'shutdown', 'promote'):
recovery_info['recovery_target_action'] = target_action
elif target_action:
raise RecoveryTargetActionException(
"Illegal target action '%s' "
"for this version of PostgreSQL" %
target_action)
output.info(
"Doing PITR. Recovery target %s",
(", ".join(["%s: %r" % (k, v) for k, v in targets.items()])))
recovery_info['wal_dest'] = os.path.join(dest, 'barman_wal')
# With a PostgreSQL version older than 8.4, it is the user's
# responsibility to delete the "barman_wal" directory as the
# restore_command option in recovery.conf is not supported
if backup_info.version < 80400 and \
not recovery_info['get_wal']:
recovery_info['results']['delete_barman_wal'] = True
else:
# Raise an error if target_lsn is used with a pgversion < 10
if backup_info.version < 100000:
if target_lsn:
raise RecoveryInvalidTargetException(
"Illegal use of recovery_target_lsn '%s' "
def _start_backup_copy_message(self, backup_info):
output.info("Starting backup copy via pg_basebackup for %s",
backup_info.backup_id)