diff --git a/swh/icinga_plugins/tests/test_vault.py b/swh/icinga_plugins/tests/test_vault.py --- a/swh/icinga_plugins/tests/test_vault.py +++ b/swh/icinga_plugins/tests/test_vault.py @@ -35,6 +35,13 @@ "status": "failed" } +response_unknown_status = { + "obj_id": dir_id, + "obj_type": "directory", + "progress_message": "what", + "status": "boo" +} + class FakeStorage: def __init__(self, foo, **kwargs): @@ -138,6 +145,34 @@ assert result.exit_code == 2, result.output +def test_vault_unknown_status(requests_mock, mocker, mocked_time): + scenario = WebScenario() + + url = f'mock://swh-web.example.org/api/1/vault/directory/{dir_id}/' + + scenario.add_step('get', url, {}, status_code=404) + scenario.add_step('post', url, response_pending) + scenario.add_step('get', url, response_unknown_status) + + scenario.install_mock(requests_mock) + + get_storage_mock = mocker.patch('swh.icinga_plugins.vault.get_storage') + get_storage_mock.side_effect = FakeStorage + + result = invoke([ + 'check-vault', + '--swh-web-url', 'mock://swh-web.example.org', + '--swh-storage-url', 'foo://example.org', + 'directory', + ], catch_exceptions=True) + + assert result.output == ( + f"VAULT CRITICAL - cooking directory {dir_id} took " + f"10.00s and resulted in unknown status: boo\n" + f"| 'total_time' = 10.00s\n") + assert result.exit_code == 2, result.output + + def test_vault_timeout(requests_mock, mocker, mocked_time): scenario = WebScenario() @@ -166,3 +201,56 @@ f"4020.00s and has status: foo\n" f"| 'total_time' = 4020.00s\n") assert result.exit_code == 2, result.output + + +def test_vault_cached_directory(requests_mock, mocker, mocked_time): + """First serves a directory that's already in the cache, to + test that vault_check requests another one.""" + scenario = WebScenario() + + url = f'mock://swh-web.example.org/api/1/vault/directory/{dir_id}/' + + scenario.add_step('get', url, {}, status_code=200) + scenario.add_step('get', url, {}, status_code=404) + scenario.add_step('post', url, response_pending) + scenario.add_step('get', url, response_done) + + scenario.install_mock(requests_mock) + + get_storage_mock = mocker.patch('swh.icinga_plugins.vault.get_storage') + get_storage_mock.side_effect = FakeStorage + + result = invoke([ + 'check-vault', + '--swh-web-url', 'mock://swh-web.example.org', + '--swh-storage-url', 'foo://example.org', + 'directory', + ]) + + assert result.output == ( + f"VAULT OK - cooking directory {dir_id} took " + f"10.00s and succeeded.\n" + f"| 'total_time' = 10.00s\n") + assert result.exit_code == 0, result.output + + +def test_vault_no_directory(requests_mock, mocker, mocked_time): + """Tests with an empty storage""" + scenario = WebScenario() + scenario.install_mock(requests_mock) + + get_storage_mock = mocker.patch('swh.icinga_plugins.vault.get_storage') + get_storage_mock.side_effect = FakeStorage + mocker.patch( + f'{__name__}.FakeStorage.directory_get_random', return_value=None) + + result = invoke([ + 'check-vault', + '--swh-web-url', 'mock://swh-web.example.org', + '--swh-storage-url', 'foo://example.org', + 'directory', + ], catch_exceptions=True) + + assert result.output == ( + "VAULT CRITICAL - No directory exists in the archive.\n") + assert result.exit_code == 2, result.output diff --git a/swh/icinga_plugins/vault.py b/swh/icinga_plugins/vault.py --- a/swh/icinga_plugins/vault.py +++ b/swh/icinga_plugins/vault.py @@ -49,7 +49,7 @@ except NoDirectory: self.print_result( 'CRITICAL', - 'No directory exists in the archive') + 'No directory exists in the archive.') return 2 start_time = time.time()