diff --git a/NEWS b/NEWS index cd805cf5..7edc60e4 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,7 @@ 1.6.6.dev0 * #559: Update documentation about configuring multiple consistency checks or multiple databases. + * #560: Fix all database hooks to error when the requested database to restore isn't present in the + Borg archive. * #561: Fix command-line "--override" flag to continue supporting old configuration file formats. 1.6.5 diff --git a/borgmatic/borg/extract.py b/borgmatic/borg/extract.py index 9bbc2d70..3f4df135 100644 --- a/borgmatic/borg/extract.py +++ b/borgmatic/borg/extract.py @@ -137,8 +137,8 @@ def extract_archive( extra_environment=borg_environment, ) - # Don't give Borg local path, so as to error on warnings, as Borg only gives a warning if the - # restore paths don't exist in the archive! + # Don't give Borg local path so as to error on warnings, as "borg extract" only gives a warning + # if the restore paths don't exist in the archive. execute_command( full_command, working_directory=destination_path, extra_environment=borg_environment ) diff --git a/borgmatic/hooks/mongodb.py b/borgmatic/hooks/mongodb.py index feb4955d..83b052f6 100644 --- a/borgmatic/hooks/mongodb.py +++ b/borgmatic/hooks/mongodb.py @@ -131,12 +131,13 @@ def restore_database_dump(database_config, log_prefix, location_config, dry_run, if dry_run: return + # Don't give Borg local path so as to error on warnings, as "borg extract" only gives a warning + # if the restore paths don't exist in the archive. execute_command_with_processes( restore_command, [extract_process] if extract_process else [], output_log_level=logging.DEBUG, input_file=extract_process.stdout if extract_process else None, - borg_local_path=location_config.get('local_path', 'borg'), ) diff --git a/borgmatic/hooks/mysql.py b/borgmatic/hooks/mysql.py index 96031cba..3cc82554 100644 --- a/borgmatic/hooks/mysql.py +++ b/borgmatic/hooks/mysql.py @@ -166,11 +166,12 @@ def restore_database_dump(database_config, log_prefix, location_config, dry_run, if dry_run: return + # Don't give Borg local path so as to error on warnings, as "borg extract" only gives a warning + # if the restore paths don't exist in the archive. execute_command_with_processes( restore_command, [extract_process], output_log_level=logging.DEBUG, input_file=extract_process.stdout, extra_environment=extra_environment, - borg_local_path=location_config.get('local_path', 'borg'), ) diff --git a/borgmatic/hooks/postgresql.py b/borgmatic/hooks/postgresql.py index f5660901..4f392d32 100644 --- a/borgmatic/hooks/postgresql.py +++ b/borgmatic/hooks/postgresql.py @@ -168,12 +168,13 @@ def restore_database_dump(database_config, log_prefix, location_config, dry_run, if dry_run: return + # Don't give Borg local path so as to error on warnings, as "borg extract" only gives a warning + # if the restore paths don't exist in the archive. execute_command_with_processes( restore_command, [extract_process] if extract_process else [], output_log_level=logging.DEBUG, input_file=extract_process.stdout if extract_process else None, extra_environment=extra_environment, - borg_local_path=location_config.get('local_path', 'borg'), ) execute_command(analyze_command, extra_environment=extra_environment) diff --git a/tests/unit/hooks/test_mongodb.py b/tests/unit/hooks/test_mongodb.py index cc4ae4c4..515fe962 100644 --- a/tests/unit/hooks/test_mongodb.py +++ b/tests/unit/hooks/test_mongodb.py @@ -159,7 +159,7 @@ def test_dump_databases_runs_mongodumpall_for_all_databases(): assert module.dump_databases(databases, 'test.yaml', {}, dry_run=False) == [process] -def test_restore_database_dump_runs_pg_restore(): +def test_restore_database_dump_runs_mongorestore(): database_config = [{'name': 'foo'}] extract_process = flexmock(stdout=flexmock()) @@ -170,7 +170,6 @@ def test_restore_database_dump_runs_pg_restore(): processes=[extract_process], output_log_level=logging.DEBUG, input_file=extract_process.stdout, - borg_local_path='borg', ).once() module.restore_database_dump( @@ -192,7 +191,7 @@ def test_restore_database_dump_errors_on_multiple_database_config(): ) -def test_restore_database_dump_runs_pg_restore_with_hostname_and_port(): +def test_restore_database_dump_runs_mongorestore_with_hostname_and_port(): database_config = [{'name': 'foo', 'hostname': 'database.example.org', 'port': 5433}] extract_process = flexmock(stdout=flexmock()) @@ -213,7 +212,6 @@ def test_restore_database_dump_runs_pg_restore_with_hostname_and_port(): processes=[extract_process], output_log_level=logging.DEBUG, input_file=extract_process.stdout, - borg_local_path='borg', ).once() module.restore_database_dump( @@ -221,7 +219,7 @@ def test_restore_database_dump_runs_pg_restore_with_hostname_and_port(): ) -def test_restore_database_dump_runs_pg_restore_with_username_and_password(): +def test_restore_database_dump_runs_mongorestore_with_username_and_password(): database_config = [ { 'name': 'foo', @@ -251,7 +249,6 @@ def test_restore_database_dump_runs_pg_restore_with_username_and_password(): processes=[extract_process], output_log_level=logging.DEBUG, input_file=extract_process.stdout, - borg_local_path='borg', ).once() module.restore_database_dump( @@ -270,7 +267,6 @@ def test_restore_database_dump_runs_psql_for_all_database_dump(): processes=[extract_process], output_log_level=logging.DEBUG, input_file=extract_process.stdout, - borg_local_path='borg', ).once() module.restore_database_dump( @@ -300,7 +296,6 @@ def test_restore_database_dump_without_extract_process_restores_from_disk(): processes=[], output_log_level=logging.DEBUG, input_file=None, - borg_local_path='borg', ).once() module.restore_database_dump( diff --git a/tests/unit/hooks/test_mysql.py b/tests/unit/hooks/test_mysql.py index 329c0ab4..631e500c 100644 --- a/tests/unit/hooks/test_mysql.py +++ b/tests/unit/hooks/test_mysql.py @@ -239,7 +239,6 @@ def test_restore_database_dump_runs_mysql_to_restore(): output_log_level=logging.DEBUG, input_file=extract_process.stdout, extra_environment=None, - borg_local_path='borg', ).once() module.restore_database_dump( @@ -278,7 +277,6 @@ def test_restore_database_dump_runs_mysql_with_hostname_and_port(): output_log_level=logging.DEBUG, input_file=extract_process.stdout, extra_environment=None, - borg_local_path='borg', ).once() module.restore_database_dump( @@ -296,7 +294,6 @@ def test_restore_database_dump_runs_mysql_with_username_and_password(): output_log_level=logging.DEBUG, input_file=extract_process.stdout, extra_environment={'MYSQL_PWD': 'trustsome1'}, - borg_local_path='borg', ).once() module.restore_database_dump( diff --git a/tests/unit/hooks/test_postgresql.py b/tests/unit/hooks/test_postgresql.py index 68b1c358..7547ab44 100644 --- a/tests/unit/hooks/test_postgresql.py +++ b/tests/unit/hooks/test_postgresql.py @@ -244,7 +244,6 @@ def test_restore_database_dump_runs_pg_restore(): output_log_level=logging.DEBUG, input_file=extract_process.stdout, extra_environment={'PGSSLMODE': 'disable'}, - borg_local_path='borg', ).once() flexmock(module).should_receive('execute_command').with_args( ('psql', '--no-password', '--quiet', '--dbname', 'foo', '--command', 'ANALYZE'), @@ -296,7 +295,6 @@ def test_restore_database_dump_runs_pg_restore_with_hostname_and_port(): output_log_level=logging.DEBUG, input_file=extract_process.stdout, extra_environment={'PGSSLMODE': 'disable'}, - borg_local_path='borg', ).once() flexmock(module).should_receive('execute_command').with_args( ( @@ -345,7 +343,6 @@ def test_restore_database_dump_runs_pg_restore_with_username_and_password(): output_log_level=logging.DEBUG, input_file=extract_process.stdout, extra_environment={'PGPASSWORD': 'trustsome1', 'PGSSLMODE': 'disable'}, - borg_local_path='borg', ).once() flexmock(module).should_receive('execute_command').with_args( ( @@ -380,7 +377,6 @@ def test_restore_database_dump_runs_psql_for_all_database_dump(): output_log_level=logging.DEBUG, input_file=extract_process.stdout, extra_environment={'PGSSLMODE': 'disable'}, - borg_local_path='borg', ).once() flexmock(module).should_receive('execute_command').with_args( ('psql', '--no-password', '--quiet', '--command', 'ANALYZE'), @@ -426,7 +422,6 @@ def test_restore_database_dump_without_extract_process_restores_from_disk(): output_log_level=logging.DEBUG, input_file=None, extra_environment={'PGSSLMODE': 'disable'}, - borg_local_path='borg', ).once() flexmock(module).should_receive('execute_command').with_args( ('psql', '--no-password', '--quiet', '--dbname', 'foo', '--command', 'ANALYZE'),