From fb10a67334868c80b13d6793188409bbeac51f39 Mon Sep 17 00:00:00 2001 From: TheBurchLog <5104941+TheBurchLog@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:48:20 +0000 Subject: [PATCH 1/2] Target Garden Header Suppoer --- brewtils/rest/client.py | 33 +++++++++++++++++++++------------ test/rest/client_test.py | 2 +- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/brewtils/rest/client.py b/brewtils/rest/client.py index 39b4115a..3501dac2 100644 --- a/brewtils/rest/client.py +++ b/brewtils/rest/client.py @@ -11,7 +11,6 @@ from requests.adapters import HTTPAdapter from requests.utils import quote from yapconf import YapconfSpec - import brewtils.plugin from brewtils.errors import _deprecate from brewtils.rest import normalize_url_prefix @@ -216,6 +215,13 @@ def _load_config(args, kwargs): return spec.load_config(*[kwargs, renamed, positional, brewtils.plugin.CONFIG]) + def _generate_target_garden_headers(self, target_garden): + if target_garden is not None: + if target_garden == quote(target_garden): + return {"Target-Garden": target_garden} + + return {} + def can_connect(self, **kwargs): # type: (**Any) -> bool """Determine if a connection to the Beer-garden server is possible @@ -365,7 +371,10 @@ def patch_garden(self, garden_name, payload): return self.session.patch( self.garden_url + quote(garden_name), data=payload, - headers={**self.JSON_HEADERS, **{"Target-Garden": garden_name}}, + headers={ + **self.JSON_HEADERS, + **self._generate_target_garden_headers(garden_name), + }, ) @enable_auth @@ -438,10 +447,8 @@ def delete_system(self, system_id, **kwargs): Returns: Requests Response object """ - if kwargs.get("target_garden"): - headers = {"Target-Garden": kwargs["target_garden"]} - return self.session.delete(self.system_url + system_id, headers=headers) - return self.session.delete(self.system_url + system_id) + headers = self._generate_target_garden_headers(kwargs.get("target_garden")) + return self.session.delete(self.system_url + system_id, headers=headers) @enable_auth def get_instance(self, instance_id): @@ -468,9 +475,10 @@ def patch_instance(self, instance_id, payload, **kwargs): Returns: Requests Response object """ - headers = self.JSON_HEADERS - if kwargs.get("target_garden"): - headers = {**headers, **{"Target-Garden": kwargs["target_garden"]}} + headers = { + **self.JSON_HEADERS, + **self._generate_target_garden_headers(kwargs.get("target_garden")), + } return self.session.patch( self.instance_url + str(instance_id), data=payload, @@ -555,9 +563,10 @@ def post_requests(self, payload, **kwargs): Returns: Requests Response object """ - headers = self.JSON_HEADERS - if kwargs.get("target_garden"): - headers = {**headers, **{"Target-Garden": kwargs["target_garden"]}} + headers = { + **self.JSON_HEADERS, + **self._generate_target_garden_headers(kwargs.get("target_garden")), + } return self.session.post( self.request_url, data=payload, headers=headers, params=kwargs ) diff --git a/test/rest/client_test.py b/test/rest/client_test.py index 5a3a765f..a05e62bc 100644 --- a/test/rest/client_test.py +++ b/test/rest/client_test.py @@ -289,7 +289,7 @@ def test_patch_system(self, client, session_mock): def test_delete_system_1(self, client, session_mock): client.delete_system("id") - session_mock.delete.assert_called_with(client.system_url + "id") + session_mock.delete.assert_called_with(client.system_url + "id", headers={}) def test_get_instance_1(self, client, session_mock): client.get_instance("id") From d8cd0a60b16631628b1659007af7ee0d69b3dd68 Mon Sep 17 00:00:00 2001 From: TheBurchLog <5104941+TheBurchLog@users.noreply.github.com> Date: Mon, 20 Apr 2026 18:51:06 +0000 Subject: [PATCH 2/2] change log --- CHANGELOG.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 07915912..e8f4ffc6 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,7 +11,7 @@ TBD - Added support for SystemClient to define choice_validation_enabled flag during initialization or command execution. Default behavior is to skip choice validation if a parent request is present. (#585) Examples: SystemClient(..., choice_validation_enabled=True) or SystemClient().call_command(..., _choice_validation_enabled=True) -- Added Target-Garden header to set target garden when provided in kwargs +- Added Target-Garden header to set target garden when provided in kwargs (#567,#578) 3.32.0 ------