From 32b56050b0b373c3af61e3b9635f6bf5d1956fa7 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Fri, 3 Jul 2026 14:37:40 +0000 Subject: [PATCH] =?UTF-8?q?Abri=20relay=20requests=20share=20one=20envelop?= =?UTF-8?q?e,=20transport=20and=20rejection=20path=20across=20request=20ty?= =?UTF-8?q?pes=20=F0=9F=9F=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- infrastructure/abri/abri_client.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) 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(