def test_recover_standby_mode(self, tmpdir): backup_info = testing_helpers.build_test_backup_info() backup_manager = testing_helpers.build_backup_manager() executor = RecoveryExecutor(backup_manager) backup_info.version = 90300 destination = tmpdir.mkdir('destination').strpath # If standby mode is not enabled, recovery.conf is not generated executor._prepare_tablespaces = MagicMock() executor._backup_copy = MagicMock() executor._xlog_copy = MagicMock() executor._generate_recovery_conf = MagicMock() with closing(executor): executor.recover(backup_info, destination, standby_mode=None) executor._generate_recovery_conf.assert_not_called() # If standby mode is enabled, recovery.conf is generated executor._prepare_tablespaces.reset_mock() executor._backup_copy.reset_mock() executor._xlog_copy.reset_mock() executor._generate_recovery_conf.reset_mock() with closing(executor): executor.recover(backup_info, destination, standby_mode=True) executor._generate_recovery_conf.assert_called() # If standby mode is passed but PostgreSQL is older than 9.0, # we must raise an exception backup_info.version = 80000 with pytest.raises(RecoveryStandbyModeException): with closing(executor): executor.recover(backup_info, destination, standby_mode=True)
def test_generate_recovery_conf(self, rsync_pg_mock, tmpdir): """ Test the generation of recovery.conf file """ # Build basic folder/files structure recovery_info = { "configuration_files": ["postgresql.conf", "postgresql.auto.conf"], "tempdir": tmpdir.strpath, "results": {"changes": [], "warnings": []}, "get_wal": False, } backup_info = testing_helpers.build_test_backup_info() dest = tmpdir.mkdir("destination") # Build a recovery executor using a real server server = testing_helpers.build_real_server() executor = RecoveryExecutor(server.backup_manager) executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", ) # Check that the recovery.conf file exists recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() # Parse the generated recovery.conf recovery_conf = {} for line in recovery_conf_file.readlines(): key, value = (s.strip() for s in line.strip().split("=", 1)) recovery_conf[key] = value # check for contents assert "recovery_end_command" in recovery_conf assert "recovery_target_time" in recovery_conf assert "recovery_target_timeline" in recovery_conf assert "recovery_target_xid" not in recovery_conf assert "recovery_target_name" in recovery_conf assert recovery_conf["recovery_end_command"] == "'rm -fr barman_xlog'" assert recovery_conf["recovery_target_time"] == "'2015-06-03 16:11:03.71038+02'" assert recovery_conf["recovery_target_timeline"] == "2" assert recovery_conf["recovery_target_name"] == "'target_name'"
def test_generate_recovery_conf(self, rsync_pg_mock, tmpdir): """ Test the generation of recovery.conf file """ # Build basic folder/files structure recovery_info = { 'configuration_files': ['postgresql.conf', 'postgresql.auto.conf'], 'tempdir': tmpdir.strpath, 'results': { 'changes': [], 'warnings': [] }, 'get_wal': False, } backup_info = testing_helpers.build_test_backup_info() dest = tmpdir.mkdir('destination') # Build a recovery executor using a real server server = testing_helpers.build_real_server() executor = RecoveryExecutor(server.backup_manager) executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '') # Check that the recovery.conf file exists recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() # Parse the generated recovery.conf recovery_conf = {} for line in recovery_conf_file.readlines(): key, value = (s.strip() for s in line.strip().split('=', 1)) recovery_conf[key] = value # check for contents assert 'recovery_end_command' in recovery_conf assert 'recovery_target_time' in recovery_conf assert 'recovery_target_timeline' in recovery_conf assert 'recovery_target_xid' not in recovery_conf assert 'recovery_target_name' in recovery_conf assert recovery_conf['recovery_end_command'] == "'rm -fr barman_xlog'" assert recovery_conf['recovery_target_time'] == \ "'2015-06-03 16:11:03.71038+02'" assert recovery_conf['recovery_target_timeline'] == '2' assert recovery_conf['recovery_target_name'] == "'target_name'"
def test_generate_recovery_conf(self, rsync_pg_mock, tmpdir): """ Test the generation of recovery configuration :type tmpdir: py.path.local """ # Build basic folder/files structure recovery_info = { 'configuration_files': ['postgresql.conf', 'postgresql.auto.conf'], 'tempdir': tmpdir.strpath, 'results': {'changes': [], 'warnings': []}, 'get_wal': False, } backup_info = testing_helpers.build_test_backup_info( version=120000, ) dest = tmpdir.mkdir('destination') # Build a recovery executor using a real server server = testing_helpers.build_real_server() executor = RecoveryExecutor(server.backup_manager) executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', None) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the recovery.signal file exists signal_file = tmpdir.join("recovery.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # check for contents assert 'recovery_end_command' in pg_auto_conf assert 'recovery_target_time' in pg_auto_conf assert 'recovery_target_timeline' in pg_auto_conf assert 'recovery_target_xid' not in pg_auto_conf assert 'recovery_target_lsn' not in pg_auto_conf assert 'recovery_target_name' in pg_auto_conf assert 'recovery_target' in pg_auto_conf assert pg_auto_conf['recovery_end_command'] == "'rm -fr barman_wal'" assert pg_auto_conf['recovery_target_time'] == \ "'2015-06-03 16:11:03.71038+02'" assert pg_auto_conf['recovery_target_timeline'] == '2' assert pg_auto_conf['recovery_target_name'] == "'target_name'" # Test 'pause_at_recovery_target' recovery_info entry signal_file.remove() recovery_info['pause_at_recovery_target'] = 'on' executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', None) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the recovery.signal file exists signal_file = tmpdir.join("recovery.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # Finally check pause_at_recovery_target value assert pg_auto_conf['pause_at_recovery_target'] == "'on'" # Test 'recovery_target_action' signal_file.remove() del recovery_info['pause_at_recovery_target'] recovery_info['recovery_target_action'] = 'pause' executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', None) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the recovery.signal file exists signal_file = tmpdir.join("recovery.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # Finally check recovery_target_action value assert pg_auto_conf['recovery_target_action'] == "'pause'" # Test 'standby_mode' signal_file.remove() executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', True) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the recovery.signal file doesn't exist wrong_signal_file = tmpdir.join("recovery.signal") assert not wrong_signal_file.check() # Check that the standby.signal file exists signal_file = tmpdir.join("standby.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # standby_mode is not a valid configuration in PostgreSQL 12 assert 'standby_mode' not in pg_auto_conf signal_file.remove() executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', False) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the standby.signal file doesn't exist wrong_signal_file = tmpdir.join("standby.signal") assert not wrong_signal_file.check() # Check that the recovery.signal file exists signal_file = tmpdir.join("recovery.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # standby_mode is not a valid configuration in PostgreSQL 12 assert 'standby_mode' not in pg_auto_conf signal_file.remove() executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', None) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the standby.signal file doesn't exist wrong_signal_file = tmpdir.join("standby.signal") assert not wrong_signal_file.check() # Check that the recovery.signal file exists signal_file = tmpdir.join("recovery.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # standby_mode is not a valid configuration in PostgreSQL 12 assert 'standby_mode' not in pg_auto_conf
def test_generate_recovery_conf_pre12(self, rsync_pg_mock, tmpdir): """ Test the generation of recovery.conf file """ # Build basic folder/files structure recovery_info = { 'configuration_files': ['postgresql.conf', 'postgresql.auto.conf'], 'tempdir': tmpdir.strpath, 'results': {'changes': [], 'warnings': []}, 'get_wal': False, } backup_info = testing_helpers.build_test_backup_info() dest = tmpdir.mkdir('destination') # Build a recovery executor using a real server server = testing_helpers.build_real_server() executor = RecoveryExecutor(server.backup_manager) executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', None) # Check that the recovery.conf file exists recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() # Parse the generated recovery.conf recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) # check for contents assert 'recovery_end_command' in recovery_conf assert 'recovery_target_time' in recovery_conf assert 'recovery_target_timeline' in recovery_conf assert 'recovery_target_xid' not in recovery_conf assert 'recovery_target_lsn' not in recovery_conf assert 'recovery_target_name' in recovery_conf assert 'recovery_target' not in recovery_conf assert recovery_conf['recovery_end_command'] == "'rm -fr barman_wal'" assert recovery_conf['recovery_target_time'] == \ "'2015-06-03 16:11:03.71038+02'" assert recovery_conf['recovery_target_timeline'] == '2' assert recovery_conf['recovery_target_name'] == "'target_name'" # Test 'pause_at_recovery_target' recovery_info entry recovery_info['pause_at_recovery_target'] = 'on' executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', None) recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) assert recovery_conf['pause_at_recovery_target'] == "'on'" # Test 'recovery_target_action' del recovery_info['pause_at_recovery_target'] recovery_info['recovery_target_action'] = 'pause' executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', None) recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) assert recovery_conf['recovery_target_action'] == "'pause'" # Test 'standby_mode' executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', True) recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) assert recovery_conf['standby_mode'] == "'on'" executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', False) recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) assert 'standby_mode' not in recovery_conf executor._generate_recovery_conf(recovery_info, backup_info, dest.strpath, True, True, 'remote@command', 'target_name', '2015-06-03 16:11:03.71038+02', '2', '', '', None) recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) assert 'standby_mode' not in recovery_conf
def test_generate_recovery_conf(self, rsync_pg_mock, tmpdir): """ Test the generation of recovery configuration :type tmpdir: py.path.local """ # Build basic folder/files structure recovery_info = { "configuration_files": ["postgresql.conf", "postgresql.auto.conf"], "tempdir": tmpdir.strpath, "results": {"changes": [], "warnings": []}, "get_wal": False, } backup_info = testing_helpers.build_test_backup_info( version=120000, ) dest = tmpdir.mkdir("destination") # Build a recovery executor using a real server server = testing_helpers.build_real_server() executor = RecoveryExecutor(server.backup_manager) executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", None, ) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the recovery.signal file exists signal_file = tmpdir.join("recovery.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # check for contents assert "recovery_end_command" in pg_auto_conf assert "recovery_target_time" in pg_auto_conf assert "recovery_target_timeline" in pg_auto_conf assert "recovery_target_xid" not in pg_auto_conf assert "recovery_target_lsn" not in pg_auto_conf assert "recovery_target_name" in pg_auto_conf assert "recovery_target" in pg_auto_conf assert pg_auto_conf["recovery_end_command"] == "'rm -fr barman_wal'" assert pg_auto_conf["recovery_target_time"] == "'2015-06-03 16:11:03.71038+02'" assert pg_auto_conf["recovery_target_timeline"] == "2" assert pg_auto_conf["recovery_target_name"] == "'target_name'" # Test 'pause_at_recovery_target' recovery_info entry signal_file.remove() recovery_info["pause_at_recovery_target"] = "on" executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", None, ) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the recovery.signal file exists signal_file = tmpdir.join("recovery.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # Finally check pause_at_recovery_target value assert pg_auto_conf["pause_at_recovery_target"] == "'on'" # Test 'recovery_target_action' signal_file.remove() del recovery_info["pause_at_recovery_target"] recovery_info["recovery_target_action"] = "pause" executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", None, ) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the recovery.signal file exists signal_file = tmpdir.join("recovery.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # Finally check recovery_target_action value assert pg_auto_conf["recovery_target_action"] == "'pause'" # Test 'standby_mode' signal_file.remove() executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", True, ) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the recovery.signal file doesn't exist wrong_signal_file = tmpdir.join("recovery.signal") assert not wrong_signal_file.check() # Check that the standby.signal file exists signal_file = tmpdir.join("standby.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # standby_mode is not a valid configuration in PostgreSQL 12 assert "standby_mode" not in pg_auto_conf signal_file.remove() executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", False, ) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the standby.signal file doesn't exist wrong_signal_file = tmpdir.join("standby.signal") assert not wrong_signal_file.check() # Check that the recovery.signal file exists signal_file = tmpdir.join("recovery.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # standby_mode is not a valid configuration in PostgreSQL 12 assert "standby_mode" not in pg_auto_conf signal_file.remove() executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", None, ) # Check that the recovery.conf file doesn't exist recovery_conf_file = tmpdir.join("recovery.conf") assert not recovery_conf_file.check() # Check that the standby.signal file doesn't exist wrong_signal_file = tmpdir.join("standby.signal") assert not wrong_signal_file.check() # Check that the recovery.signal file exists signal_file = tmpdir.join("recovery.signal") assert signal_file.check() # Parse the generated recovery configuration pg_auto_conf = self.parse_auto_conf_lines(recovery_info) # standby_mode is not a valid configuration in PostgreSQL 12 assert "standby_mode" not in pg_auto_conf
def test_generate_recovery_conf_pre12(self, rsync_pg_mock, tmpdir): """ Test the generation of recovery.conf file """ # Build basic folder/files structure recovery_info = { "configuration_files": ["postgresql.conf", "postgresql.auto.conf"], "tempdir": tmpdir.strpath, "results": {"changes": [], "warnings": []}, "get_wal": False, } backup_info = testing_helpers.build_test_backup_info() dest = tmpdir.mkdir("destination") # Build a recovery executor using a real server server = testing_helpers.build_real_server() executor = RecoveryExecutor(server.backup_manager) executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", None, ) # Check that the recovery.conf file exists recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() # Parse the generated recovery.conf recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) # check for contents assert "recovery_end_command" in recovery_conf assert "recovery_target_time" in recovery_conf assert "recovery_target_timeline" in recovery_conf assert "recovery_target_xid" not in recovery_conf assert "recovery_target_lsn" not in recovery_conf assert "recovery_target_name" in recovery_conf assert "recovery_target" not in recovery_conf assert recovery_conf["recovery_end_command"] == "'rm -fr barman_wal'" assert recovery_conf["recovery_target_time"] == "'2015-06-03 16:11:03.71038+02'" assert recovery_conf["recovery_target_timeline"] == "2" assert recovery_conf["recovery_target_name"] == "'target_name'" # Test 'pause_at_recovery_target' recovery_info entry recovery_info["pause_at_recovery_target"] = "on" executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", None, ) recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) assert recovery_conf["pause_at_recovery_target"] == "'on'" # Test 'recovery_target_action' del recovery_info["pause_at_recovery_target"] recovery_info["recovery_target_action"] = "pause" executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", None, ) recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) assert recovery_conf["recovery_target_action"] == "'pause'" # Test 'standby_mode' executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", True, ) recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) assert recovery_conf["standby_mode"] == "'on'" executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", False, ) recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) assert "standby_mode" not in recovery_conf executor._generate_recovery_conf( recovery_info, backup_info, dest.strpath, True, True, "remote@command", "target_name", "2015-06-03 16:11:03.71038+02", "2", "", "", None, ) recovery_conf_file = tmpdir.join("recovery.conf") assert recovery_conf_file.check() recovery_conf = testing_helpers.parse_recovery_conf(recovery_conf_file) assert "standby_mode" not in recovery_conf