This is an automated email from the ASF dual-hosted git repository.
exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 0b9b2b249b7 NIFI-15320 AwsSecretsManagerParameterProvider should
retrieve non-string parameters (#10624)
0b9b2b249b7 is described below
commit 0b9b2b249b71a5a3f0e3f8cca3a7f7e058739f17
Author: Pierre Villard <[email protected]>
AuthorDate: Thu Dec 11 19:26:22 2025 +0100
NIFI-15320 AwsSecretsManagerParameterProvider should retrieve non-string
parameters (#10624)
Signed-off-by: David Handermann <[email protected]>
---
.../aws/AwsSecretsManagerParameterProvider.java | 7 +--
.../TestAwsSecretsManagerParameterProvider.java | 53 ++++++++++++++++++++++
.../AwsSecretsManagerParameterValueProvider.java | 6 ++-
.../TestSecretsManagerParameterValueProvider.java | 35 ++++++++++++++
4 files changed, 97 insertions(+), 4 deletions(-)
diff --git
a/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-providers/src/main/java/org/apache/nifi/parameter/aws/AwsSecretsManagerParameterProvider.java
b/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-providers/src/main/java/org/apache/nifi/parameter/aws/AwsSecretsManagerParameterProvider.java
index db02c50c836..9bd54e89a49 100644
---
a/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-providers/src/main/java/org/apache/nifi/parameter/aws/AwsSecretsManagerParameterProvider.java
+++
b/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-providers/src/main/java/org/apache/nifi/parameter/aws/AwsSecretsManagerParameterProvider.java
@@ -282,11 +282,12 @@ public class AwsSecretsManagerParameterProvider extends
AbstractParameterProvide
for (final Map.Entry<String, JsonNode> field :
secretObject.properties()) {
final String parameterName = field.getKey();
- final String parameterValue = field.getValue().textValue();
- if (parameterValue == null) {
- getLogger().debug("Secret [{}] Parameter [{}] has no
value", secretName, parameterName);
+ final JsonNode valueNode = field.getValue();
+ if (!valueNode.isValueNode() || valueNode.isNull()) {
+ getLogger().debug("Secret [{}] Parameter [{}] is null or
not a supported value type", secretName, parameterName);
continue;
}
+ final String parameterValue = valueNode.asText();
parameters.add(createParameter(parameterName, parameterValue));
}
diff --git
a/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-providers/src/test/java/org/apache/nifi/parameter/aws/TestAwsSecretsManagerParameterProvider.java
b/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-providers/src/test/java/org/apache/nifi/parameter/aws/TestAwsSecretsManagerParameterProvider.java
index a71549dff1d..da913ffcf98 100644
---
a/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-providers/src/test/java/org/apache/nifi/parameter/aws/TestAwsSecretsManagerParameterProvider.java
+++
b/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-providers/src/test/java/org/apache/nifi/parameter/aws/TestAwsSecretsManagerParameterProvider.java
@@ -130,6 +130,59 @@ public class TestAwsSecretsManagerParameterProvider {
runProviderTest(defaultSecretsManager, 0,
ConfigVerificationResult.Outcome.FAILED, "PATTERN", null);
}
+ @Test
+ public void testFetchParametersWithNonStringValues() throws
InitializationException {
+ // JSON with string, number, boolean, and null values
+ final String secretString = "{ \"stringParam\": \"stringValue\",
\"numberParam\": 5432, \"booleanParam\": true, \"nullParam\": null }";
+
+ final SecretsManagerClient secretsManager =
mock(SecretsManagerClient.class);
+ final GetSecretValueResponse response =
GetSecretValueResponse.builder()
+ .name("MixedSecret")
+ .secretString(secretString)
+ .build();
+
when(secretsManager.getSecretValue(argThat(matchesGetSecretValueRequest("MixedSecret")))).thenReturn(response);
+
+ final List<ParameterGroup> parameterGroups =
runProviderTest(secretsManager, 3, ConfigVerificationResult.Outcome.SUCCESSFUL,
"ENUMERATION", "MixedSecret");
+
+ assertEquals(1, parameterGroups.size());
+ final ParameterGroup group = parameterGroups.get(0);
+ assertEquals("MixedSecret", group.getGroupName());
+
+ final Map<String, String> parameterValues =
group.getParameters().stream()
+ .collect(Collectors.toMap(p -> p.getDescriptor().getName(),
Parameter::getValue));
+
+ assertEquals("stringValue", parameterValues.get("stringParam"));
+ assertEquals("5432", parameterValues.get("numberParam"));
+ assertEquals("true", parameterValues.get("booleanParam"));
+ // nullParam should not be included
+ assertEquals(3, parameterValues.size());
+ }
+
+ @Test
+ public void testFetchParametersWithNestedObjectsIgnored() throws
InitializationException {
+ // JSON with nested objects and arrays that should be ignored
+ final String secretString = "{ \"validParam\": \"validValue\",
\"nestedObject\": { \"inner\": \"value\" }, \"arrayParam\": [1, 2, 3] }";
+
+ final SecretsManagerClient secretsManager =
mock(SecretsManagerClient.class);
+ final GetSecretValueResponse response =
GetSecretValueResponse.builder()
+ .name("NestedSecret")
+ .secretString(secretString)
+ .build();
+
when(secretsManager.getSecretValue(argThat(matchesGetSecretValueRequest("NestedSecret")))).thenReturn(response);
+
+ final List<ParameterGroup> parameterGroups =
runProviderTest(secretsManager, 1, ConfigVerificationResult.Outcome.SUCCESSFUL,
"ENUMERATION", "NestedSecret");
+
+ assertEquals(1, parameterGroups.size());
+ final ParameterGroup group = parameterGroups.get(0);
+
+ final Map<String, String> parameterValues =
group.getParameters().stream()
+ .collect(Collectors.toMap(p -> p.getDescriptor().getName(),
Parameter::getValue));
+
+ // Only the simple value param should be included
+ assertEquals(1, parameterValues.size());
+ assertEquals("validValue", parameterValues.get("validParam"));
+ }
+
private AwsSecretsManagerParameterProvider getParameterProvider() {
return spy(new AwsSecretsManagerParameterProvider());
}
diff --git
a/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-value-providers/src/main/java/org/apache/nifi/stateless/parameter/AwsSecretsManagerParameterValueProvider.java
b/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-value-providers/src/main/java/org/apache/nifi/stateless/parameter/AwsSecretsManagerParameterValueProvider.java
index 6701418a5c1..7dac4d47248 100644
---
a/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-value-providers/src/main/java/org/apache/nifi/stateless/parameter/AwsSecretsManagerParameterValueProvider.java
+++
b/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-value-providers/src/main/java/org/apache/nifi/stateless/parameter/AwsSecretsManagerParameterValueProvider.java
@@ -118,8 +118,12 @@ public class AwsSecretsManagerParameterValueProvider
extends AbstractSecretBased
logger.debug("Parameter [{}] not found", parameterName);
return null;
}
+ if (!parameter.isValueNode() || parameter.isNull()) {
+ logger.debug("Parameter [{}] is null or not a supported value
type", parameterName);
+ return null;
+ }
- return parameter.textValue();
+ return parameter.asText();
} catch (final JsonProcessingException e) {
throw new IllegalArgumentException(String.format("Secret String
for [%s] could not be parsed", parameterName), e);
}
diff --git
a/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-value-providers/src/test/java/org/apache/nifi/stateless/parameter/TestSecretsManagerParameterValueProvider.java
b/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-value-providers/src/test/java/org/apache/nifi/stateless/parameter/TestSecretsManagerParameterValueProvider.java
index 25489bc5634..4341541c512 100644
---
a/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-value-providers/src/test/java/org/apache/nifi/stateless/parameter/TestSecretsManagerParameterValueProvider.java
+++
b/nifi-extension-bundles/nifi-aws-bundle/nifi-aws-parameter-value-providers/src/test/java/org/apache/nifi/stateless/parameter/TestSecretsManagerParameterValueProvider.java
@@ -122,6 +122,34 @@ public class TestSecretsManagerParameterValueProvider {
assertNull(provider.getParameterValue("Does not exist", PARAMETER));
}
+ @Test
+ public void testGetParameterValueWithNonStringValues() {
+ // JSON with string, number, boolean, and null values
+ final String secretString = "{ \"stringParam\": \"stringValue\",
\"numberParam\": 5432, \"booleanParam\": true, \"nullParam\": null }";
+ mockGetSecretValueWithRawJson("MixedSecret", secretString);
+
+ provider.init(createContext(CONFIG_FILE, null,
Collections.emptyMap()));
+
+ assertEquals("stringValue", provider.getParameterValue("MixedSecret",
"stringParam"));
+ assertEquals("5432", provider.getParameterValue("MixedSecret",
"numberParam"));
+ assertEquals("true", provider.getParameterValue("MixedSecret",
"booleanParam"));
+ assertNull(provider.getParameterValue("MixedSecret", "nullParam"));
+ }
+
+ @Test
+ public void testGetParameterValueWithNestedObjectsReturnsNull() {
+ // JSON with nested objects and arrays that should return null
+ final String secretString = "{ \"validParam\": \"validValue\",
\"nestedObject\": { \"inner\": \"value\" }, \"arrayParam\": [1, 2, 3] }";
+ mockGetSecretValueWithRawJson("NestedSecret", secretString);
+
+ provider.init(createContext(CONFIG_FILE, null,
Collections.emptyMap()));
+
+ assertEquals("validValue", provider.getParameterValue("NestedSecret",
"validParam"));
+ // Nested objects and arrays should return null
+ assertNull(provider.getParameterValue("NestedSecret", "nestedObject"));
+ assertNull(provider.getParameterValue("NestedSecret", "arrayParam"));
+ }
+
private void runGetParameterValueTest(final String configFileName) throws
JsonProcessingException {
runGetParameterValueTest(CONTEXT, PARAMETER, configFileName);
}
@@ -155,6 +183,13 @@ public class TestSecretsManagerParameterValueProvider {
}
}
+ private void mockGetSecretValueWithRawJson(final String context, final
String rawJsonSecretString) {
+ final GetSecretValueResponse response =
GetSecretValueResponse.builder()
+ .secretString(rawJsonSecretString)
+ .build();
+
when(secretsManager.getSecretValue(argThat(matchesGetSecretValueRequest(context)))).thenReturn(response);
+ }
+
private static String getSecretName(final String context) {
return context == null ? DEFAULT_SECRET_NAME : context;
}