|
@@ -11,11 +11,19 @@ def test_get_datasets_to_backup_filters_datasets_by_patterns():
|
|
|
flexmock(module.borgmatic.execute).should_receive(
|
|
|
'execute_command_and_capture_output'
|
|
|
).and_return(
|
|
|
- 'dataset\t/dataset\t-\nother\t/other\t-',
|
|
|
+ 'dataset\t/dataset\ton\t-\nother\t/other\ton\t-',
|
|
|
)
|
|
|
flexmock(module.borgmatic.hooks.data_source.snapshot).should_receive(
|
|
|
'get_contained_patterns'
|
|
|
- ).with_args('/dataset', object).and_return((Pattern('/dataset'),))
|
|
|
+ ).with_args('/dataset', object).and_return(
|
|
|
+ (
|
|
|
+ Pattern(
|
|
|
+ '/dataset',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ )
|
|
|
flexmock(module.borgmatic.hooks.data_source.snapshot).should_receive(
|
|
|
'get_contained_patterns'
|
|
|
).with_args('/other', object).and_return(())
|
|
@@ -23,24 +31,128 @@ def test_get_datasets_to_backup_filters_datasets_by_patterns():
|
|
|
assert module.get_datasets_to_backup(
|
|
|
'zfs',
|
|
|
patterns=(
|
|
|
- Pattern('/foo'),
|
|
|
- Pattern('/dataset'),
|
|
|
- Pattern('/bar'),
|
|
|
+ Pattern(
|
|
|
+ '/foo',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
+ Pattern(
|
|
|
+ '/dataset',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
+ Pattern(
|
|
|
+ '/bar',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
),
|
|
|
) == (
|
|
|
module.Dataset(
|
|
|
name='dataset',
|
|
|
mount_point='/dataset',
|
|
|
- contained_patterns=(Pattern('/dataset'),),
|
|
|
+ contained_patterns=(
|
|
|
+ Pattern(
|
|
|
+ '/dataset',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
),
|
|
|
)
|
|
|
|
|
|
|
|
|
+def test_get_datasets_to_backup_skips_non_root_patterns():
|
|
|
+ flexmock(module.borgmatic.execute).should_receive(
|
|
|
+ 'execute_command_and_capture_output'
|
|
|
+ ).and_return(
|
|
|
+ 'dataset\t/dataset\ton\t-\nother\t/other\ton\t-',
|
|
|
+ )
|
|
|
+ flexmock(module.borgmatic.hooks.data_source.snapshot).should_receive(
|
|
|
+ 'get_contained_patterns'
|
|
|
+ ).with_args('/dataset', object).and_return(
|
|
|
+ (
|
|
|
+ Pattern(
|
|
|
+ '/dataset',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.EXCLUDE,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ )
|
|
|
+ flexmock(module.borgmatic.hooks.data_source.snapshot).should_receive(
|
|
|
+ 'get_contained_patterns'
|
|
|
+ ).with_args('/other', object).and_return(())
|
|
|
+
|
|
|
+ assert module.get_datasets_to_backup(
|
|
|
+ 'zfs',
|
|
|
+ patterns=(
|
|
|
+ Pattern(
|
|
|
+ '/foo',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
+ Pattern(
|
|
|
+ '/dataset',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.EXCLUDE,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
+ Pattern(
|
|
|
+ '/bar',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ) == ()
|
|
|
+
|
|
|
+
|
|
|
+def test_get_datasets_to_backup_skips_non_config_patterns():
|
|
|
+ flexmock(module.borgmatic.execute).should_receive(
|
|
|
+ 'execute_command_and_capture_output'
|
|
|
+ ).and_return(
|
|
|
+ 'dataset\t/dataset\ton\t-\nother\t/other\ton\t-',
|
|
|
+ )
|
|
|
+ flexmock(module.borgmatic.hooks.data_source.snapshot).should_receive(
|
|
|
+ 'get_contained_patterns'
|
|
|
+ ).with_args('/dataset', object).and_return(
|
|
|
+ (
|
|
|
+ Pattern(
|
|
|
+ '/dataset',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.HOOK,
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ )
|
|
|
+ flexmock(module.borgmatic.hooks.data_source.snapshot).should_receive(
|
|
|
+ 'get_contained_patterns'
|
|
|
+ ).with_args('/other', object).and_return(())
|
|
|
+
|
|
|
+ assert module.get_datasets_to_backup(
|
|
|
+ 'zfs',
|
|
|
+ patterns=(
|
|
|
+ Pattern(
|
|
|
+ '/foo',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
+ Pattern(
|
|
|
+ '/dataset',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.HOOK,
|
|
|
+ ),
|
|
|
+ Pattern(
|
|
|
+ '/bar',
|
|
|
+ module.borgmatic.borg.pattern.Pattern_type.ROOT,
|
|
|
+ source=module.borgmatic.borg.pattern.Pattern_source.CONFIG,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ) == ()
|
|
|
+
|
|
|
+
|
|
|
def test_get_datasets_to_backup_filters_datasets_by_user_property():
|
|
|
flexmock(module.borgmatic.execute).should_receive(
|
|
|
'execute_command_and_capture_output'
|
|
|
).and_return(
|
|
|
- 'dataset\t/dataset\tauto\nother\t/other\t-',
|
|
|
+ 'dataset\t/dataset\ton\tauto\nother\t/other\ton\t-',
|
|
|
)
|
|
|
flexmock(module.borgmatic.hooks.data_source.snapshot).should_receive(
|
|
|
'get_contained_patterns'
|
|
@@ -49,16 +161,47 @@ def test_get_datasets_to_backup_filters_datasets_by_user_property():
|
|
|
'get_contained_patterns'
|
|
|
).with_args('/other', object).and_return(())
|
|
|
|
|
|
- assert module.get_datasets_to_backup('zfs', patterns=(Pattern('/foo'), Pattern('/bar'))) == (
|
|
|
+ assert module.get_datasets_to_backup(
|
|
|
+ 'zfs',
|
|
|
+ patterns=(Pattern('/foo'), Pattern('/bar')),
|
|
|
+ ) == (
|
|
|
module.Dataset(
|
|
|
name='dataset',
|
|
|
mount_point='/dataset',
|
|
|
auto_backup=True,
|
|
|
- contained_patterns=(Pattern('/dataset'),),
|
|
|
+ contained_patterns=(
|
|
|
+ Pattern('/dataset', source=module.borgmatic.borg.pattern.Pattern_source.HOOK),
|
|
|
+ ),
|
|
|
),
|
|
|
)
|
|
|
|
|
|
|
|
|
+def test_get_datasets_to_backup_filters_datasets_by_canmount_property():
|
|
|
+ flexmock(module.borgmatic.execute).should_receive(
|
|
|
+ 'execute_command_and_capture_output'
|
|
|
+ ).and_return(
|
|
|
+ 'dataset\t/dataset\toff\t-\nother\t/other\ton\t-',
|
|
|
+ )
|
|
|
+ flexmock(module.borgmatic.hooks.data_source.snapshot).should_receive(
|
|
|
+ 'get_contained_patterns'
|
|
|
+ ).with_args('/dataset', object).and_return((Pattern('/dataset'),))
|
|
|
+ flexmock(module.borgmatic.hooks.data_source.snapshot).should_receive(
|
|
|
+ 'get_contained_patterns'
|
|
|
+ ).with_args('/other', object).and_return(())
|
|
|
+
|
|
|
+ assert (
|
|
|
+ module.get_datasets_to_backup(
|
|
|
+ 'zfs',
|
|
|
+ patterns=(
|
|
|
+ Pattern('/foo'),
|
|
|
+ Pattern('/dataset'),
|
|
|
+ Pattern('/bar'),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ == ()
|
|
|
+ )
|
|
|
+
|
|
|
+
|
|
|
def test_get_datasets_to_backup_with_invalid_list_output_raises():
|
|
|
flexmock(module.borgmatic.execute).should_receive(
|
|
|
'execute_command_and_capture_output'
|
|
@@ -94,13 +237,13 @@ def test_get_all_dataset_mount_points_does_not_filter_datasets():
|
|
|
(
|
|
|
(
|
|
|
Pattern('/foo/bar/baz'),
|
|
|
- Pattern('/run/borgmatic/zfs_snapshots/./foo/bar/baz'),
|
|
|
+ Pattern('/run/borgmatic/zfs_snapshots/b33f/./foo/bar/baz'),
|
|
|
),
|
|
|
- (Pattern('/foo/bar'), Pattern('/run/borgmatic/zfs_snapshots/./foo/bar')),
|
|
|
+ (Pattern('/foo/bar'), Pattern('/run/borgmatic/zfs_snapshots/b33f/./foo/bar')),
|
|
|
(
|
|
|
Pattern('^/foo/bar', Pattern_type.INCLUDE, Pattern_style.REGULAR_EXPRESSION),
|
|
|
Pattern(
|
|
|
- '^/run/borgmatic/zfs_snapshots/./foo/bar',
|
|
|
+ '^/run/borgmatic/zfs_snapshots/b33f/./foo/bar',
|
|
|
Pattern_type.INCLUDE,
|
|
|
Pattern_style.REGULAR_EXPRESSION,
|
|
|
),
|
|
@@ -108,46 +251,55 @@ def test_get_all_dataset_mount_points_does_not_filter_datasets():
|
|
|
(
|
|
|
Pattern('/foo/bar', Pattern_type.INCLUDE, Pattern_style.REGULAR_EXPRESSION),
|
|
|
Pattern(
|
|
|
- '/run/borgmatic/zfs_snapshots/./foo/bar',
|
|
|
+ '/run/borgmatic/zfs_snapshots/b33f/./foo/bar',
|
|
|
Pattern_type.INCLUDE,
|
|
|
Pattern_style.REGULAR_EXPRESSION,
|
|
|
),
|
|
|
),
|
|
|
- (Pattern('/foo'), Pattern('/run/borgmatic/zfs_snapshots/./foo')),
|
|
|
- (Pattern('/'), Pattern('/run/borgmatic/zfs_snapshots/./')),
|
|
|
+ (Pattern('/foo'), Pattern('/run/borgmatic/zfs_snapshots/b33f/./foo')),
|
|
|
+ (Pattern('/'), Pattern('/run/borgmatic/zfs_snapshots/b33f/./')),
|
|
|
),
|
|
|
)
|
|
|
def test_make_borg_snapshot_pattern_includes_slashdot_hack_and_stripped_pattern_path(
|
|
|
pattern, expected_pattern
|
|
|
):
|
|
|
- assert module.make_borg_snapshot_pattern(pattern, '/run/borgmatic') == expected_pattern
|
|
|
+ flexmock(module.hashlib).should_receive('shake_256').and_return(
|
|
|
+ flexmock(hexdigest=lambda length: 'b33f')
|
|
|
+ )
|
|
|
+
|
|
|
+ assert (
|
|
|
+ module.make_borg_snapshot_pattern(
|
|
|
+ pattern, flexmock(mount_point='/something'), '/run/borgmatic'
|
|
|
+ )
|
|
|
+ == expected_pattern
|
|
|
+ )
|
|
|
|
|
|
|
|
|
def test_dump_data_sources_snapshots_and_mounts_and_updates_patterns():
|
|
|
- flexmock(module).should_receive('get_datasets_to_backup').and_return(
|
|
|
- (
|
|
|
- flexmock(
|
|
|
- name='dataset',
|
|
|
- mount_point='/mnt/dataset',
|
|
|
- contained_patterns=(Pattern('/mnt/dataset/subdir'),),
|
|
|
- )
|
|
|
- )
|
|
|
+ dataset = flexmock(
|
|
|
+ name='dataset',
|
|
|
+ mount_point='/mnt/dataset',
|
|
|
+ contained_patterns=(Pattern('/mnt/dataset/subdir'),),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('get_datasets_to_backup').and_return((dataset,))
|
|
|
flexmock(module.os).should_receive('getpid').and_return(1234)
|
|
|
full_snapshot_name = 'dataset@borgmatic-1234'
|
|
|
flexmock(module).should_receive('snapshot_dataset').with_args(
|
|
|
'zfs',
|
|
|
full_snapshot_name,
|
|
|
).once()
|
|
|
- snapshot_mount_path = '/run/borgmatic/zfs_snapshots/./mnt/dataset'
|
|
|
+ flexmock(module.hashlib).should_receive('shake_256').and_return(
|
|
|
+ flexmock(hexdigest=lambda length: 'b33f')
|
|
|
+ )
|
|
|
+ snapshot_mount_path = '/run/borgmatic/zfs_snapshots/b33f/./mnt/dataset'
|
|
|
flexmock(module).should_receive('mount_snapshot').with_args(
|
|
|
'mount',
|
|
|
full_snapshot_name,
|
|
|
module.os.path.normpath(snapshot_mount_path),
|
|
|
).once()
|
|
|
flexmock(module).should_receive('make_borg_snapshot_pattern').with_args(
|
|
|
- Pattern('/mnt/dataset/subdir'), '/run/borgmatic'
|
|
|
- ).and_return(Pattern('/run/borgmatic/zfs_snapshots/./mnt/dataset/subdir'))
|
|
|
+ Pattern('/mnt/dataset/subdir'), dataset, '/run/borgmatic'
|
|
|
+ ).and_return(Pattern('/run/borgmatic/zfs_snapshots/b33f/./mnt/dataset/subdir'))
|
|
|
patterns = [Pattern('/mnt/dataset/subdir')]
|
|
|
|
|
|
assert (
|
|
@@ -188,30 +340,30 @@ def test_dump_data_sources_with_no_datasets_skips_snapshots():
|
|
|
|
|
|
|
|
|
def test_dump_data_sources_uses_custom_commands():
|
|
|
- flexmock(module).should_receive('get_datasets_to_backup').and_return(
|
|
|
- (
|
|
|
- flexmock(
|
|
|
- name='dataset',
|
|
|
- mount_point='/mnt/dataset',
|
|
|
- contained_patterns=(Pattern('/mnt/dataset/subdir'),),
|
|
|
- )
|
|
|
- )
|
|
|
+ dataset = flexmock(
|
|
|
+ name='dataset',
|
|
|
+ mount_point='/mnt/dataset',
|
|
|
+ contained_patterns=(Pattern('/mnt/dataset/subdir'),),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('get_datasets_to_backup').and_return((dataset,))
|
|
|
flexmock(module.os).should_receive('getpid').and_return(1234)
|
|
|
full_snapshot_name = 'dataset@borgmatic-1234'
|
|
|
flexmock(module).should_receive('snapshot_dataset').with_args(
|
|
|
'/usr/local/bin/zfs',
|
|
|
full_snapshot_name,
|
|
|
).once()
|
|
|
- snapshot_mount_path = '/run/borgmatic/zfs_snapshots/./mnt/dataset'
|
|
|
+ flexmock(module.hashlib).should_receive('shake_256').and_return(
|
|
|
+ flexmock(hexdigest=lambda length: 'b33f')
|
|
|
+ )
|
|
|
+ snapshot_mount_path = '/run/borgmatic/zfs_snapshots/b33f/./mnt/dataset'
|
|
|
flexmock(module).should_receive('mount_snapshot').with_args(
|
|
|
'/usr/local/bin/mount',
|
|
|
full_snapshot_name,
|
|
|
module.os.path.normpath(snapshot_mount_path),
|
|
|
).once()
|
|
|
flexmock(module).should_receive('make_borg_snapshot_pattern').with_args(
|
|
|
- Pattern('/mnt/dataset/subdir'), '/run/borgmatic'
|
|
|
- ).and_return(Pattern('/run/borgmatic/zfs_snapshots/./mnt/dataset/subdir'))
|
|
|
+ Pattern('/mnt/dataset/subdir'), dataset, '/run/borgmatic'
|
|
|
+ ).and_return(Pattern('/run/borgmatic/zfs_snapshots/b33f/./mnt/dataset/subdir'))
|
|
|
patterns = [Pattern('/mnt/dataset/subdir')]
|
|
|
hook_config = {
|
|
|
'zfs_command': '/usr/local/bin/zfs',
|
|
@@ -261,30 +413,30 @@ def test_dump_data_sources_with_dry_run_skips_commands_and_does_not_touch_patter
|
|
|
|
|
|
|
|
|
def test_dump_data_sources_ignores_mismatch_between_given_patterns_and_contained_patterns():
|
|
|
- flexmock(module).should_receive('get_datasets_to_backup').and_return(
|
|
|
- (
|
|
|
- flexmock(
|
|
|
- name='dataset',
|
|
|
- mount_point='/mnt/dataset',
|
|
|
- contained_patterns=(Pattern('/mnt/dataset/subdir'),),
|
|
|
- )
|
|
|
- )
|
|
|
+ dataset = flexmock(
|
|
|
+ name='dataset',
|
|
|
+ mount_point='/mnt/dataset',
|
|
|
+ contained_patterns=(Pattern('/mnt/dataset/subdir'),),
|
|
|
)
|
|
|
+ flexmock(module).should_receive('get_datasets_to_backup').and_return((dataset,))
|
|
|
flexmock(module.os).should_receive('getpid').and_return(1234)
|
|
|
full_snapshot_name = 'dataset@borgmatic-1234'
|
|
|
flexmock(module).should_receive('snapshot_dataset').with_args(
|
|
|
'zfs',
|
|
|
full_snapshot_name,
|
|
|
).once()
|
|
|
- snapshot_mount_path = '/run/borgmatic/zfs_snapshots/./mnt/dataset'
|
|
|
+ flexmock(module.hashlib).should_receive('shake_256').and_return(
|
|
|
+ flexmock(hexdigest=lambda length: 'b33f')
|
|
|
+ )
|
|
|
+ snapshot_mount_path = '/run/borgmatic/zfs_snapshots/b33f/./mnt/dataset'
|
|
|
flexmock(module).should_receive('mount_snapshot').with_args(
|
|
|
'mount',
|
|
|
full_snapshot_name,
|
|
|
module.os.path.normpath(snapshot_mount_path),
|
|
|
).once()
|
|
|
flexmock(module).should_receive('make_borg_snapshot_pattern').with_args(
|
|
|
- Pattern('/mnt/dataset/subdir'), '/run/borgmatic'
|
|
|
- ).and_return(Pattern('/run/borgmatic/zfs_snapshots/./mnt/dataset/subdir'))
|
|
|
+ Pattern('/mnt/dataset/subdir'), dataset, '/run/borgmatic'
|
|
|
+ ).and_return(Pattern('/run/borgmatic/zfs_snapshots/b33f/./mnt/dataset/subdir'))
|
|
|
patterns = [Pattern('/hmm')]
|
|
|
|
|
|
assert (
|
|
@@ -317,11 +469,13 @@ def test_remove_data_source_dumps_unmounts_and_destroys_snapshots():
|
|
|
flexmock(module.borgmatic.config.paths).should_receive(
|
|
|
'replace_temporary_subdirectory_with_glob'
|
|
|
).and_return('/run/borgmatic')
|
|
|
- flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
|
|
|
+ flexmock(module.glob).should_receive('glob').replace_with(
|
|
|
+ lambda path: [path.replace('*', 'b33f')]
|
|
|
+ )
|
|
|
flexmock(module.os.path).should_receive('isdir').and_return(True)
|
|
|
flexmock(module.shutil).should_receive('rmtree')
|
|
|
flexmock(module).should_receive('unmount_snapshot').with_args(
|
|
|
- 'umount', '/run/borgmatic/zfs_snapshots/mnt/dataset'
|
|
|
+ 'umount', '/run/borgmatic/zfs_snapshots/b33f/mnt/dataset'
|
|
|
).once()
|
|
|
flexmock(module).should_receive('get_all_snapshots').and_return(
|
|
|
('dataset@borgmatic-1234', 'dataset@other', 'other@other', 'invalid')
|
|
@@ -343,11 +497,13 @@ def test_remove_data_source_dumps_use_custom_commands():
|
|
|
flexmock(module.borgmatic.config.paths).should_receive(
|
|
|
'replace_temporary_subdirectory_with_glob'
|
|
|
).and_return('/run/borgmatic')
|
|
|
- flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
|
|
|
+ flexmock(module.glob).should_receive('glob').replace_with(
|
|
|
+ lambda path: [path.replace('*', 'b33f')]
|
|
|
+ )
|
|
|
flexmock(module.os.path).should_receive('isdir').and_return(True)
|
|
|
flexmock(module.shutil).should_receive('rmtree')
|
|
|
flexmock(module).should_receive('unmount_snapshot').with_args(
|
|
|
- '/usr/local/bin/umount', '/run/borgmatic/zfs_snapshots/mnt/dataset'
|
|
|
+ '/usr/local/bin/umount', '/run/borgmatic/zfs_snapshots/b33f/mnt/dataset'
|
|
|
).once()
|
|
|
flexmock(module).should_receive('get_all_snapshots').and_return(
|
|
|
('dataset@borgmatic-1234', 'dataset@other', 'other@other', 'invalid')
|
|
@@ -416,11 +572,13 @@ def test_remove_data_source_dumps_bails_for_missing_umount_command():
|
|
|
flexmock(module.borgmatic.config.paths).should_receive(
|
|
|
'replace_temporary_subdirectory_with_glob'
|
|
|
).and_return('/run/borgmatic')
|
|
|
- flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
|
|
|
+ flexmock(module.glob).should_receive('glob').replace_with(
|
|
|
+ lambda path: [path.replace('*', 'b33f')]
|
|
|
+ )
|
|
|
flexmock(module.os.path).should_receive('isdir').and_return(True)
|
|
|
flexmock(module.shutil).should_receive('rmtree')
|
|
|
flexmock(module).should_receive('unmount_snapshot').with_args(
|
|
|
- '/usr/local/bin/umount', '/run/borgmatic/zfs_snapshots/mnt/dataset'
|
|
|
+ '/usr/local/bin/umount', '/run/borgmatic/zfs_snapshots/b33f/mnt/dataset'
|
|
|
).and_raise(FileNotFoundError)
|
|
|
flexmock(module).should_receive('get_all_snapshots').never()
|
|
|
flexmock(module).should_receive('destroy_snapshot').never()
|
|
@@ -434,19 +592,25 @@ def test_remove_data_source_dumps_bails_for_missing_umount_command():
|
|
|
)
|
|
|
|
|
|
|
|
|
-def test_remove_data_source_dumps_bails_for_umount_command_error():
|
|
|
+def test_remove_data_source_dumps_swallows_umount_command_error():
|
|
|
flexmock(module).should_receive('get_all_dataset_mount_points').and_return(('/mnt/dataset',))
|
|
|
flexmock(module.borgmatic.config.paths).should_receive(
|
|
|
'replace_temporary_subdirectory_with_glob'
|
|
|
).and_return('/run/borgmatic')
|
|
|
- flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
|
|
|
+ flexmock(module.glob).should_receive('glob').replace_with(
|
|
|
+ lambda path: [path.replace('*', 'b33f')]
|
|
|
+ )
|
|
|
flexmock(module.os.path).should_receive('isdir').and_return(True)
|
|
|
flexmock(module.shutil).should_receive('rmtree')
|
|
|
flexmock(module).should_receive('unmount_snapshot').with_args(
|
|
|
- '/usr/local/bin/umount', '/run/borgmatic/zfs_snapshots/mnt/dataset'
|
|
|
+ '/usr/local/bin/umount', '/run/borgmatic/zfs_snapshots/b33f/mnt/dataset'
|
|
|
).and_raise(module.subprocess.CalledProcessError(1, 'wtf'))
|
|
|
- flexmock(module).should_receive('get_all_snapshots').never()
|
|
|
- flexmock(module).should_receive('destroy_snapshot').never()
|
|
|
+ flexmock(module).should_receive('get_all_snapshots').and_return(
|
|
|
+ ('dataset@borgmatic-1234', 'dataset@other', 'other@other', 'invalid')
|
|
|
+ )
|
|
|
+ flexmock(module).should_receive('destroy_snapshot').with_args(
|
|
|
+ '/usr/local/bin/zfs', 'dataset@borgmatic-1234'
|
|
|
+ ).once()
|
|
|
hook_config = {'zfs_command': '/usr/local/bin/zfs', 'umount_command': '/usr/local/bin/umount'}
|
|
|
|
|
|
module.remove_data_source_dumps(
|
|
@@ -462,7 +626,9 @@ def test_remove_data_source_dumps_skips_unmount_snapshot_directories_that_are_no
|
|
|
flexmock(module.borgmatic.config.paths).should_receive(
|
|
|
'replace_temporary_subdirectory_with_glob'
|
|
|
).and_return('/run/borgmatic')
|
|
|
- flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
|
|
|
+ flexmock(module.glob).should_receive('glob').replace_with(
|
|
|
+ lambda path: [path.replace('*', 'b33f')]
|
|
|
+ )
|
|
|
flexmock(module.os.path).should_receive('isdir').and_return(False)
|
|
|
flexmock(module.shutil).should_receive('rmtree').never()
|
|
|
flexmock(module).should_receive('unmount_snapshot').never()
|
|
@@ -486,12 +652,14 @@ def test_remove_data_source_dumps_skips_unmount_snapshot_mount_paths_that_are_no
|
|
|
flexmock(module.borgmatic.config.paths).should_receive(
|
|
|
'replace_temporary_subdirectory_with_glob'
|
|
|
).and_return('/run/borgmatic')
|
|
|
- flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
|
|
|
+ flexmock(module.glob).should_receive('glob').replace_with(
|
|
|
+ lambda path: [path.replace('*', 'b33f')]
|
|
|
+ )
|
|
|
flexmock(module.os.path).should_receive('isdir').with_args(
|
|
|
- '/run/borgmatic/zfs_snapshots'
|
|
|
+ '/run/borgmatic/zfs_snapshots/b33f'
|
|
|
).and_return(True)
|
|
|
flexmock(module.os.path).should_receive('isdir').with_args(
|
|
|
- '/run/borgmatic/zfs_snapshots/mnt/dataset'
|
|
|
+ '/run/borgmatic/zfs_snapshots/b33f/mnt/dataset'
|
|
|
).and_return(False)
|
|
|
flexmock(module.shutil).should_receive('rmtree')
|
|
|
flexmock(module).should_receive('unmount_snapshot').never()
|
|
@@ -515,12 +683,14 @@ def test_remove_data_source_dumps_skips_unmount_snapshot_mount_paths_after_rmtre
|
|
|
flexmock(module.borgmatic.config.paths).should_receive(
|
|
|
'replace_temporary_subdirectory_with_glob'
|
|
|
).and_return('/run/borgmatic')
|
|
|
- flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
|
|
|
+ flexmock(module.glob).should_receive('glob').replace_with(
|
|
|
+ lambda path: [path.replace('*', 'b33f')]
|
|
|
+ )
|
|
|
flexmock(module.os.path).should_receive('isdir').with_args(
|
|
|
- '/run/borgmatic/zfs_snapshots'
|
|
|
+ '/run/borgmatic/zfs_snapshots/b33f'
|
|
|
).and_return(True)
|
|
|
flexmock(module.os.path).should_receive('isdir').with_args(
|
|
|
- '/run/borgmatic/zfs_snapshots/mnt/dataset'
|
|
|
+ '/run/borgmatic/zfs_snapshots/b33f/mnt/dataset'
|
|
|
).and_return(True).and_return(False)
|
|
|
flexmock(module.shutil).should_receive('rmtree')
|
|
|
flexmock(module).should_receive('unmount_snapshot').never()
|
|
@@ -544,7 +714,9 @@ def test_remove_data_source_dumps_with_dry_run_skips_unmount_and_destroy():
|
|
|
flexmock(module.borgmatic.config.paths).should_receive(
|
|
|
'replace_temporary_subdirectory_with_glob'
|
|
|
).and_return('/run/borgmatic')
|
|
|
- flexmock(module.glob).should_receive('glob').replace_with(lambda path: [path])
|
|
|
+ flexmock(module.glob).should_receive('glob').replace_with(
|
|
|
+ lambda path: [path.replace('*', 'b33f')]
|
|
|
+ )
|
|
|
flexmock(module.os.path).should_receive('isdir').and_return(True)
|
|
|
flexmock(module.shutil).should_receive('rmtree').never()
|
|
|
flexmock(module).should_receive('unmount_snapshot').never()
|