Update mount action for Borg 2 support (#557).

This commit is contained in:
Dan Helfman 2022-08-15 19:32:37 -07:00
parent d807ce095e
commit f36e38ec20
3 changed files with 77 additions and 3 deletions

View file

@ -1,6 +1,6 @@
import logging import logging
from borgmatic.borg import environment from borgmatic.borg import environment, feature, flags
from borgmatic.execute import DO_NOT_CAPTURE, execute_command from borgmatic.execute import DO_NOT_CAPTURE, execute_command
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -14,13 +14,15 @@ def mount_archive(
foreground, foreground,
options, options,
storage_config, storage_config,
local_borg_version,
local_path='borg', local_path='borg',
remote_path=None, remote_path=None,
): ):
''' '''
Given a local or remote repository path, an optional archive name, a filesystem mount point, Given a local or remote repository path, an optional archive name, a filesystem mount point,
zero or more paths to mount from the archive, extra Borg mount options, a storage configuration zero or more paths to mount from the archive, extra Borg mount options, a storage configuration
dict, and optional local and remote Borg paths, mount the archive onto the mount point. dict, the local Borg version, and optional local and remote Borg paths, mount the archive onto
the mount point.
''' '''
umask = storage_config.get('umask', None) umask = storage_config.get('umask', None)
lock_wait = storage_config.get('lock_wait', None) lock_wait = storage_config.get('lock_wait', None)
@ -34,7 +36,14 @@ def mount_archive(
+ (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ()) + (('--debug', '--show-rc') if logger.isEnabledFor(logging.DEBUG) else ())
+ (('--foreground',) if foreground else ()) + (('--foreground',) if foreground else ())
+ (('-o', options) if options else ()) + (('-o', options) if options else ())
+ (('::'.join((repository, archive)),) if archive else (repository,)) + (
(
flags.make_repository_flags(repository, local_borg_version)
+ ('--glob-archives', archive)
)
if feature.available(feature.Feature.SEPARATE_REPOSITORY_ARCHIVE, local_borg_version)
else flags.make_repository_archive_flags(repository, archive, local_borg_version)
)
+ (mount_point,) + (mount_point,)
+ (tuple(paths) if paths else ()) + (tuple(paths) if paths else ())
) )

View file

@ -517,6 +517,7 @@ def run_actions(
arguments['mount'].foreground, arguments['mount'].foreground,
arguments['mount'].options, arguments['mount'].options,
storage, storage,
local_borg_version,
local_path=local_path, local_path=local_path,
remote_path=remote_path, remote_path=remote_path,
) )

View file

@ -15,6 +15,10 @@ def insert_execute_command_mock(command):
def test_mount_archive_calls_borg_with_required_parameters(): def test_mount_archive_calls_borg_with_required_parameters():
flexmock(module.feature).should_receive('available').and_return(False)
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
('repo::archive',)
)
insert_execute_command_mock(('borg', 'mount', 'repo::archive', '/mnt')) insert_execute_command_mock(('borg', 'mount', 'repo::archive', '/mnt'))
module.mount_archive( module.mount_archive(
@ -25,10 +29,34 @@ def test_mount_archive_calls_borg_with_required_parameters():
foreground=False, foreground=False,
options=None, options=None,
storage_config={}, storage_config={},
local_borg_version='1.2.3',
)
def test_mount_archive_with_borg_features_calls_borg_with_repository_and_glob_archives_flags():
flexmock(module.feature).should_receive('available').and_return(True)
flexmock(module.flags).should_receive('make_repository_flags').and_return(('--repo', 'repo',))
insert_execute_command_mock(
('borg', 'mount', '--repo', 'repo', '--glob-archives', 'archive', '/mnt')
)
module.mount_archive(
repository='repo',
archive='archive',
mount_point='/mnt',
paths=None,
foreground=False,
options=None,
storage_config={},
local_borg_version='1.2.3',
) )
def test_mount_archive_calls_borg_with_path_parameters(): def test_mount_archive_calls_borg_with_path_parameters():
flexmock(module.feature).should_receive('available').and_return(False)
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
('repo::archive',)
)
insert_execute_command_mock(('borg', 'mount', 'repo::archive', '/mnt', 'path1', 'path2')) insert_execute_command_mock(('borg', 'mount', 'repo::archive', '/mnt', 'path1', 'path2'))
module.mount_archive( module.mount_archive(
@ -39,10 +67,15 @@ def test_mount_archive_calls_borg_with_path_parameters():
foreground=False, foreground=False,
options=None, options=None,
storage_config={}, storage_config={},
local_borg_version='1.2.3',
) )
def test_mount_archive_calls_borg_with_remote_path_parameters(): def test_mount_archive_calls_borg_with_remote_path_parameters():
flexmock(module.feature).should_receive('available').and_return(False)
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
('repo::archive',)
)
insert_execute_command_mock( insert_execute_command_mock(
('borg', 'mount', '--remote-path', 'borg1', 'repo::archive', '/mnt') ('borg', 'mount', '--remote-path', 'borg1', 'repo::archive', '/mnt')
) )
@ -55,11 +88,16 @@ def test_mount_archive_calls_borg_with_remote_path_parameters():
foreground=False, foreground=False,
options=None, options=None,
storage_config={}, storage_config={},
local_borg_version='1.2.3',
remote_path='borg1', remote_path='borg1',
) )
def test_mount_archive_calls_borg_with_umask_parameters(): def test_mount_archive_calls_borg_with_umask_parameters():
flexmock(module.feature).should_receive('available').and_return(False)
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
('repo::archive',)
)
insert_execute_command_mock(('borg', 'mount', '--umask', '0770', 'repo::archive', '/mnt')) insert_execute_command_mock(('borg', 'mount', '--umask', '0770', 'repo::archive', '/mnt'))
module.mount_archive( module.mount_archive(
@ -70,10 +108,15 @@ def test_mount_archive_calls_borg_with_umask_parameters():
foreground=False, foreground=False,
options=None, options=None,
storage_config={'umask': '0770'}, storage_config={'umask': '0770'},
local_borg_version='1.2.3',
) )
def test_mount_archive_calls_borg_with_lock_wait_parameters(): def test_mount_archive_calls_borg_with_lock_wait_parameters():
flexmock(module.feature).should_receive('available').and_return(False)
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
('repo::archive',)
)
insert_execute_command_mock(('borg', 'mount', '--lock-wait', '5', 'repo::archive', '/mnt')) insert_execute_command_mock(('borg', 'mount', '--lock-wait', '5', 'repo::archive', '/mnt'))
module.mount_archive( module.mount_archive(
@ -84,10 +127,15 @@ def test_mount_archive_calls_borg_with_lock_wait_parameters():
foreground=False, foreground=False,
options=None, options=None,
storage_config={'lock_wait': '5'}, storage_config={'lock_wait': '5'},
local_borg_version='1.2.3',
) )
def test_mount_archive_with_log_info_calls_borg_with_info_parameter(): def test_mount_archive_with_log_info_calls_borg_with_info_parameter():
flexmock(module.feature).should_receive('available').and_return(False)
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
('repo::archive',)
)
insert_execute_command_mock(('borg', 'mount', '--info', 'repo::archive', '/mnt')) insert_execute_command_mock(('borg', 'mount', '--info', 'repo::archive', '/mnt'))
insert_logging_mock(logging.INFO) insert_logging_mock(logging.INFO)
@ -99,10 +147,15 @@ def test_mount_archive_with_log_info_calls_borg_with_info_parameter():
foreground=False, foreground=False,
options=None, options=None,
storage_config={}, storage_config={},
local_borg_version='1.2.3',
) )
def test_mount_archive_with_log_debug_calls_borg_with_debug_parameters(): def test_mount_archive_with_log_debug_calls_borg_with_debug_parameters():
flexmock(module.feature).should_receive('available').and_return(False)
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
('repo::archive',)
)
insert_execute_command_mock(('borg', 'mount', '--debug', '--show-rc', 'repo::archive', '/mnt')) insert_execute_command_mock(('borg', 'mount', '--debug', '--show-rc', 'repo::archive', '/mnt'))
insert_logging_mock(logging.DEBUG) insert_logging_mock(logging.DEBUG)
@ -114,10 +167,15 @@ def test_mount_archive_with_log_debug_calls_borg_with_debug_parameters():
foreground=False, foreground=False,
options=None, options=None,
storage_config={}, storage_config={},
local_borg_version='1.2.3',
) )
def test_mount_archive_calls_borg_with_foreground_parameter(): def test_mount_archive_calls_borg_with_foreground_parameter():
flexmock(module.feature).should_receive('available').and_return(False)
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
('repo::archive',)
)
flexmock(module.environment).should_receive('make_environment') flexmock(module.environment).should_receive('make_environment')
flexmock(module).should_receive('execute_command').with_args( flexmock(module).should_receive('execute_command').with_args(
('borg', 'mount', '--foreground', 'repo::archive', '/mnt'), ('borg', 'mount', '--foreground', 'repo::archive', '/mnt'),
@ -134,10 +192,15 @@ def test_mount_archive_calls_borg_with_foreground_parameter():
foreground=True, foreground=True,
options=None, options=None,
storage_config={}, storage_config={},
local_borg_version='1.2.3',
) )
def test_mount_archive_calls_borg_with_options_parameters(): def test_mount_archive_calls_borg_with_options_parameters():
flexmock(module.feature).should_receive('available').and_return(False)
flexmock(module.flags).should_receive('make_repository_archive_flags').and_return(
('repo::archive',)
)
insert_execute_command_mock(('borg', 'mount', '-o', 'super_mount', 'repo::archive', '/mnt')) insert_execute_command_mock(('borg', 'mount', '-o', 'super_mount', 'repo::archive', '/mnt'))
module.mount_archive( module.mount_archive(
@ -148,4 +211,5 @@ def test_mount_archive_calls_borg_with_options_parameters():
foreground=False, foreground=False,
options='super_mount', options='super_mount',
storage_config={}, storage_config={},
local_borg_version='1.2.3',
) )