diff --git a/swh/deposit/cli/client.py b/swh/deposit/cli/client.py --- a/swh/deposit/cli/client.py +++ b/swh/deposit/cli/client.py @@ -141,6 +141,7 @@ """ # retrieve user's collection sd_content = client.service_document() + if "error" in sd_content: raise InputError("Service document retrieval: %s" % (sd_content["error"],)) collection = sd_content["app:service"]["app:workspace"]["app:collection"][ diff --git a/swh/deposit/client.py b/swh/deposit/client.py --- a/swh/deposit/client.py +++ b/swh/deposit/client.py @@ -1,4 +1,4 @@ -# Copyright (C) 2017-2020 The Software Heritage developers +# Copyright (C) 2017-2021 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -7,7 +7,6 @@ """ -from abc import ABCMeta, abstractmethod import hashlib import logging import os @@ -253,7 +252,7 @@ raise ValueError(msg) -class BaseDepositClient(BaseApiDepositClient, metaclass=ABCMeta): +class BaseDepositClient(BaseApiDepositClient): """Base Deposit client to access the public api. """ @@ -265,23 +264,20 @@ self.error_msg = error_msg self.empty_result = empty_result - @abstractmethod def compute_url(self, *args, **kwargs): """Compute api url endpoint to query.""" - pass + raise NotImplementedError - @abstractmethod def compute_method(self, *args, **kwargs): """Http method to use on the url""" - pass + raise NotImplementedError - @abstractmethod def parse_result_ok(self, xml_content): """Given an xml result from the api endpoint, parse it and returns a dict. """ - pass + raise NotImplementedError def compute_information(self, *args, **kwargs) -> Dict[str, Any]: """Compute some more information given the inputs (e.g http headers, @@ -301,10 +297,11 @@ """ data = parse_xml(xml_content) + sword_error = data["sword:error"] return { - "summary": data["summary"], - "detail": data["detail"], - "sword:verboseDescription": data["sword:verboseDescription"], + "summary": sword_error["atom:summary"], + "detail": sword_error.get("detail", ""), + "sword:verboseDescription": sword_error.get("sword:verboseDescription", ""), } def do_execute(self, method, url, info): diff --git a/swh/deposit/tests/cli/test_client.py b/swh/deposit/tests/cli/test_client.py --- a/swh/deposit/tests/cli/test_client.py +++ b/swh/deposit/tests/cli/test_client.py @@ -1,4 +1,4 @@ -# Copyright (C) 2020 The Software Heritage developers +# Copyright (C) 2020-2021 The Software Heritage developers # See the AUTHORS file at the top-level directory of this distribution # License: GNU General Public License version 3, or any later version # See top-level LICENSE file for more information @@ -17,7 +17,11 @@ from swh.deposit.api.checks import check_metadata from swh.deposit.cli import deposit as cli from swh.deposit.cli.client import InputError, _collection, _url, generate_metadata -from swh.deposit.client import MaintenanceError, PublicApiDepositClient +from swh.deposit.client import ( + BaseDepositClient, + MaintenanceError, + PublicApiDepositClient, +) from swh.deposit.parsers import parse_xml from swh.model.exceptions import ValidationError @@ -915,3 +919,25 @@ for (_, log_level, _) in caplog.record_tuples: # all messages are info or below messages so everything is fine assert log_level < logging.WARNING + + +def test_cli_failure_should_be_parseable(atom_dataset, mocker): + summary = "Cannot load metadata" + verbose_description = ( + "Cannot load metadata on swh:1:dir:0eda267e7d3c2e37b3f6a78e542b16190ac4574e, " + "this directory object does not exist in the archive (yet?)." + ) + + error_xml = atom_dataset["error-cli"].format( + summary=summary, verboseDescription=verbose_description + ) + + api_call = BaseDepositClient(url="https://somewhere.org/") + + actual_error = api_call.parse_result_error(error_xml) + + assert actual_error == { + "summary": summary, + "detail": "", + "sword:verboseDescription": verbose_description, + } diff --git a/swh/deposit/tests/data/atom/error-cli.xml b/swh/deposit/tests/data/atom/error-cli.xml new file mode 100644 --- /dev/null +++ b/swh/deposit/tests/data/atom/error-cli.xml @@ -0,0 +1,9 @@ + + + {summary} + processing failed + + {verboseDescription} + +