فهرست منبع

Add missing rinfo action source files (#557).

Dan Helfman 2 سال پیش
والد
کامیت
e7a8acfb96
2فایلهای تغییر یافته به همراه257 افزوده شده و 0 حذف شده
  1. 58 0
      borgmatic/borg/rinfo.py
  2. 199 0
      tests/unit/borg/test_rinfo.py

+ 58 - 0
borgmatic/borg/rinfo.py

@@ -0,0 +1,58 @@
+import logging
+
+from borgmatic.borg import environment, feature
+from borgmatic.borg.flags import make_flags
+from borgmatic.execute import execute_command
+
+logger = logging.getLogger(__name__)
+
+
+def display_repository_info(
+    repository,
+    storage_config,
+    local_borg_version,
+    rinfo_arguments,
+    local_path='borg',
+    remote_path=None,
+):
+    '''
+    Given a local or remote repository path, a storage config dict, the local Borg version, and the
+    arguments to the rinfo action, display summary information for the Borg repository or return
+    JSON summary information.
+    '''
+    lock_wait = storage_config.get('lock_wait', None)
+
+    full_command = (
+        (local_path,)
+        + (
+            ('rinfo',)
+            if feature.available(feature.Feature.RINFO, local_borg_version)
+            else ('info',)
+        )
+        + (
+            ('--info',)
+            if logger.getEffectiveLevel() == logging.INFO and not rinfo_arguments.json
+            else ()
+        )
+        + (
+            ('--debug', '--show-rc')
+            if logger.isEnabledFor(logging.DEBUG) and not rinfo_arguments.json
+            else ()
+        )
+        + make_flags('remote-path', remote_path)
+        + make_flags('lock-wait', lock_wait)
+        + (('--json',) if rinfo_arguments.json else ())
+        + (
+            ('--repo',)
+            if feature.available(feature.Feature.SEPARATE_REPOSITORY_ARCHIVE, local_borg_version)
+            else ()
+        )
+        + (repository,)
+    )
+
+    return execute_command(
+        full_command,
+        output_log_level=None if rinfo_arguments.json else logging.WARNING,
+        borg_local_path=local_path,
+        extra_environment=environment.make_environment(storage_config),
+    )

+ 199 - 0
tests/unit/borg/test_rinfo.py

@@ -0,0 +1,199 @@
+import logging
+
+from flexmock import flexmock
+
+from borgmatic.borg import rinfo as module
+
+from ..test_verbosity import insert_logging_mock
+
+
+def test_display_repository_info_calls_borg_with_parameters():
+    flexmock(module.feature).should_receive('available').and_return(True)
+    flexmock(module.environment).should_receive('make_environment')
+    flexmock(module).should_receive('execute_command').with_args(
+        ('borg', 'rinfo', '--repo', 'repo'),
+        output_log_level=logging.WARNING,
+        borg_local_path='borg',
+        extra_environment=None,
+    )
+
+    module.display_repository_info(
+        repository='repo',
+        storage_config={},
+        local_borg_version='2.3.4',
+        rinfo_arguments=flexmock(json=False),
+    )
+
+
+def test_display_repository_info_without_borg_features_calls_borg_with_info_sub_command():
+    flexmock(module.feature).should_receive('available').and_return(False)
+    flexmock(module.environment).should_receive('make_environment')
+    flexmock(module).should_receive('execute_command').with_args(
+        ('borg', 'info', 'repo'),
+        output_log_level=logging.WARNING,
+        borg_local_path='borg',
+        extra_environment=None,
+    )
+
+    module.display_repository_info(
+        repository='repo',
+        storage_config={},
+        local_borg_version='2.3.4',
+        rinfo_arguments=flexmock(json=False),
+    )
+
+
+def test_display_repository_info_with_log_info_calls_borg_with_info_parameter():
+    flexmock(module.feature).should_receive('available').and_return(True)
+    flexmock(module.environment).should_receive('make_environment')
+    flexmock(module).should_receive('execute_command').with_args(
+        ('borg', 'rinfo', '--info', '--repo', 'repo'),
+        output_log_level=logging.WARNING,
+        borg_local_path='borg',
+        extra_environment=None,
+    )
+    insert_logging_mock(logging.INFO)
+    module.display_repository_info(
+        repository='repo',
+        storage_config={},
+        local_borg_version='2.3.4',
+        rinfo_arguments=flexmock(json=False),
+    )
+
+
+def test_display_repository_info_with_log_info_and_json_suppresses_most_borg_output():
+    flexmock(module.feature).should_receive('available').and_return(True)
+    flexmock(module.environment).should_receive('make_environment')
+    flexmock(module).should_receive('execute_command').with_args(
+        ('borg', 'rinfo', '--json', '--repo', 'repo'),
+        output_log_level=None,
+        borg_local_path='borg',
+        extra_environment=None,
+    ).and_return('[]')
+
+    insert_logging_mock(logging.INFO)
+    json_output = module.display_repository_info(
+        repository='repo',
+        storage_config={},
+        local_borg_version='2.3.4',
+        rinfo_arguments=flexmock(json=True),
+    )
+
+    assert json_output == '[]'
+
+
+def test_display_repository_info_with_log_debug_calls_borg_with_debug_parameter():
+    flexmock(module.feature).should_receive('available').and_return(True)
+    flexmock(module.environment).should_receive('make_environment')
+    flexmock(module).should_receive('execute_command').with_args(
+        ('borg', 'rinfo', '--debug', '--show-rc', '--repo', 'repo'),
+        output_log_level=logging.WARNING,
+        borg_local_path='borg',
+        extra_environment=None,
+    )
+    insert_logging_mock(logging.DEBUG)
+
+    module.display_repository_info(
+        repository='repo',
+        storage_config={},
+        local_borg_version='2.3.4',
+        rinfo_arguments=flexmock(json=False),
+    )
+
+
+def test_display_repository_info_with_log_debug_and_json_suppresses_most_borg_output():
+    flexmock(module.feature).should_receive('available').and_return(True)
+    flexmock(module.environment).should_receive('make_environment')
+    flexmock(module).should_receive('execute_command').with_args(
+        ('borg', 'rinfo', '--json', '--repo', 'repo'),
+        output_log_level=None,
+        borg_local_path='borg',
+        extra_environment=None,
+    ).and_return('[]')
+
+    insert_logging_mock(logging.DEBUG)
+    json_output = module.display_repository_info(
+        repository='repo',
+        storage_config={},
+        local_borg_version='2.3.4',
+        rinfo_arguments=flexmock(json=True),
+    )
+
+    assert json_output == '[]'
+
+
+def test_display_repository_info_with_json_calls_borg_with_json_parameter():
+    flexmock(module.feature).should_receive('available').and_return(True)
+    flexmock(module.environment).should_receive('make_environment')
+    flexmock(module).should_receive('execute_command').with_args(
+        ('borg', 'rinfo', '--json', '--repo', 'repo'),
+        output_log_level=None,
+        borg_local_path='borg',
+        extra_environment=None,
+    ).and_return('[]')
+
+    json_output = module.display_repository_info(
+        repository='repo',
+        storage_config={},
+        local_borg_version='2.3.4',
+        rinfo_arguments=flexmock(json=True),
+    )
+
+    assert json_output == '[]'
+
+
+def test_display_repository_info_with_local_path_calls_borg_via_local_path():
+    flexmock(module.feature).should_receive('available').and_return(True)
+    flexmock(module.environment).should_receive('make_environment')
+    flexmock(module).should_receive('execute_command').with_args(
+        ('borg1', 'rinfo', '--repo', 'repo'),
+        output_log_level=logging.WARNING,
+        borg_local_path='borg1',
+        extra_environment=None,
+    )
+
+    module.display_repository_info(
+        repository='repo',
+        storage_config={},
+        local_borg_version='2.3.4',
+        rinfo_arguments=flexmock(json=False),
+        local_path='borg1',
+    )
+
+
+def test_display_repository_info_with_remote_path_calls_borg_with_remote_path_parameters():
+    flexmock(module.feature).should_receive('available').and_return(True)
+    flexmock(module.environment).should_receive('make_environment')
+    flexmock(module).should_receive('execute_command').with_args(
+        ('borg', 'rinfo', '--remote-path', 'borg1', '--repo', 'repo'),
+        output_log_level=logging.WARNING,
+        borg_local_path='borg',
+        extra_environment=None,
+    )
+
+    module.display_repository_info(
+        repository='repo',
+        storage_config={},
+        local_borg_version='2.3.4',
+        rinfo_arguments=flexmock(json=False),
+        remote_path='borg1',
+    )
+
+
+def test_display_repository_info_with_lock_wait_calls_borg_with_lock_wait_parameters():
+    storage_config = {'lock_wait': 5}
+    flexmock(module.feature).should_receive('available').and_return(True)
+    flexmock(module.environment).should_receive('make_environment')
+    flexmock(module).should_receive('execute_command').with_args(
+        ('borg', 'rinfo', '--lock-wait', '5', '--repo', 'repo'),
+        output_log_level=logging.WARNING,
+        borg_local_path='borg',
+        extra_environment=None,
+    )
+
+    module.display_repository_info(
+        repository='repo',
+        storage_config=storage_config,
+        local_borg_version='2.3.4',
+        rinfo_arguments=flexmock(json=False),
+    )