diff --git a/infrastructure/abri/abri_client.py b/infrastructure/abri/abri_client.py index 99ef095e8..a0cedd5f7 100644 --- a/infrastructure/abri/abri_client.py +++ b/infrastructure/abri/abri_client.py @@ -1,4 +1,5 @@ import xml.etree.ElementTree as ET +from typing import List, Tuple, Union import requests @@ -23,7 +24,7 @@ class AbriClient: self._session = requests.Session() def log_job(self, request: LogJobRequest) -> LogJobResult: - body = serialise_relay_request( + outcome = self._exchange( request_type="logjob", parameters=[ ("place_ref", request.place_ref), @@ -37,6 +38,23 @@ class AbriClient: ("resource", self._config.default_resource), ("resource_group", RESOURCE_GROUP), ], + ) + if isinstance(outcome, AbriRequestRejected): + return outcome + return self._parse_job_logged(outcome) + + def _exchange( + self, request_type: str, parameters: List[Tuple[str, str]] + ) -> Union[ET.Element, AbriRequestRejected]: + """Send one relay request; return the success root or the typed rejection. + + Shared by all four relay request types: transport failures raise + AbriTransportError, ambiguous bodies raise AbriResponseParseError, and + only a well-formed false body becomes a rejection. + """ + body = serialise_relay_request( + request_type=request_type, + parameters=parameters, username=self._config.username, password=self._config.password, ) @@ -51,6 +69,10 @@ class AbriClient: raise AbriResponseParseError(str(error)) from error if root.tag == "response": return self._parse_rejection(root) + return root + + @staticmethod + def _parse_job_logged(root: ET.Element) -> JobLogged: job_logged = root.find("Jobs/Job_logged") if job_logged is None: raise AbriResponseParseError(