Skip to content

Commit 4810265

Browse files
fix(parameters): honor auto transform in batched get_parameters_by_name (#8436)
transform="auto" infers the transform method from the parameter name suffix, but _transform_and_cache_get_parameters_response called transform_value() without key=name. The batched GetParameters path therefore inferred from an empty string and silently fell back to the identity transform, returning raw strings instead of parsed values. Parameters routed to the single GetParameter path (decrypt=True) already pass the key via BaseProvider.get(), so a single get_parameters_by_name call could return a parsed dict for some parameters and a raw string for others. Co-authored-by: Leandro Damascena <lcdama@amazon.pt>
1 parent 78ce2cb commit 4810265

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

aws_lambda_powertools/utilities/parameters/ssm.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,12 @@ def _transform_and_cache_get_parameters_response(
654654

655655
# NOTE: If transform is set, we do it before caching to reduce number of operations
656656
if transform:
657-
value = transform_value(value=value, transform=transform, raise_on_transform_error=raise_on_error) # type: ignore[assignment]
657+
value = transform_value(
658+
value=value,
659+
transform=transform,
660+
raise_on_transform_error=raise_on_error,
661+
key=name,
662+
) # type: ignore[assignment]
658663

659664
_cache_key = (name, transform)
660665
self.add_to_cache(key=_cache_key, value=value, max_age=options["max_age"])

tests/functional/parameters/_boto3/test_utilities_parameters.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,34 @@ def test_ssm_provider_get_parameters_by_name_do_not_raise_on_failure_transform(m
11421142
stubber.deactivate()
11431143

11441144

1145+
def test_ssm_provider_get_parameters_by_name_auto_transform_infers_from_parameter_name(mock_name, mock_value, config):
1146+
# GIVEN transform="auto" and a parameter name suffixed with ".json"
1147+
# (auto-transform must infer the transform method from the parameter name, not its value)
1148+
success = f"/dev/{mock_name}.json"
1149+
fail = "/does_not_exist" # stub model doesn't support all-success yet
1150+
params = {success: {}, fail: {}}
1151+
param_names = list(params.keys())
1152+
expected_value = {"value": mock_value}
1153+
stub_params = {success: json.dumps(expected_value)}
1154+
1155+
expected_stub_response = build_get_parameters_stub(params=stub_params, invalid_parameters=[fail])
1156+
expected_stub_params = {"Names": param_names}
1157+
1158+
provider = parameters.SSMProvider(boto_config=config)
1159+
stubber = stub.Stubber(provider.client)
1160+
stubber.add_response("get_parameters", expected_stub_response, expected_stub_params)
1161+
stubber.activate()
1162+
1163+
try:
1164+
ret = provider.get_parameters_by_name(parameters=params, transform="auto", raise_on_error=False)
1165+
1166+
stubber.assert_no_pending_responses()
1167+
# THEN the value should be parsed as JSON, not returned as a raw string
1168+
assert ret[success] == expected_value
1169+
finally:
1170+
stubber.deactivate()
1171+
1172+
11451173
def test_ssm_provider_get_parameters_by_name_do_not_raise_on_failure_with_decrypt(mock_name, config):
11461174
# GIVEN one parameter requires decryption and an arbitrary SDK error occurs
11471175
param = f"/{mock_name}"

0 commit comments

Comments
 (0)