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 94624872a4 NIFI-14599 Use Parameter Context Revision when updating
multiple Groups from Parameter Provider (#10145)
94624872a4 is described below
commit 94624872a4e7a2a86d7f4c72c86e68b3fb23c6d9
Author: Pierre Villard <[email protected]>
AuthorDate: Sat Aug 2 03:03:25 2025 +0200
NIFI-14599 Use Parameter Context Revision when updating multiple Groups
from Parameter Provider (#10145)
Signed-off-by: David Handermann <[email protected]>
---
.../nifi/web/util/ParameterUpdateManager.java | 7 ++-
.../tests/system/PropertiesParameterProvider.java | 37 +++++++++++--
.../system/parameters/ParameterContextIT.java | 63 ++++++++++++++++++++++
3 files changed, 101 insertions(+), 6 deletions(-)
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/ParameterUpdateManager.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/ParameterUpdateManager.java
index 80b9d15362..b60f643537 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/ParameterUpdateManager.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/ParameterUpdateManager.java
@@ -169,7 +169,12 @@ public class ParameterUpdateManager {
for (final ParameterContextEntity updatedContextEntity :
updatedContextEntities) {
logger.info("Updating Parameter Context with ID {}",
updatedContextEntity.getId());
-
updatedEntities.add(performParameterContextUpdate(asyncRequest, uri,
replicateRequest, revision, updatedContextEntity));
+ final Revision contextRevision = new Revision(
+ updatedContextEntity.getRevision().getVersion(),
+ updatedContextEntity.getRevision().getClientId(),
+ updatedContextEntity.getId());
+
+
updatedEntities.add(performParameterContextUpdate(asyncRequest, uri,
replicateRequest, contextRevision, updatedContextEntity));
logger.info("Successfully updated Parameter Context with ID
{}", updatedContextEntity.getId());
}
asyncRequest.markStepComplete();
diff --git
a/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/parameter/tests/system/PropertiesParameterProvider.java
b/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/parameter/tests/system/PropertiesParameterProvider.java
index ae3b23b4a2..0a176314ad 100644
---
a/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/parameter/tests/system/PropertiesParameterProvider.java
+++
b/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/parameter/tests/system/PropertiesParameterProvider.java
@@ -16,8 +16,10 @@
*/
package org.apache.nifi.parameter.tests.system;
+import org.apache.nifi.annotation.behavior.DynamicProperty;
import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.controller.ConfigurationContext;
+import org.apache.nifi.expression.ExpressionLanguageScope;
import org.apache.nifi.parameter.AbstractParameterProvider;
import org.apache.nifi.parameter.Parameter;
import org.apache.nifi.parameter.ParameterGroup;
@@ -27,15 +29,19 @@ import org.apache.nifi.processor.util.StandardValidators;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;
/**
* Parameters are provided by properties-style configuration.
*/
+@DynamicProperty(name = "Parameter Group Name", value = "Parameters for the
group",
+ expressionLanguageScope = ExpressionLanguageScope.NONE,
+ description = "Specifies parameters in a properties file format for
the group")
public class PropertiesParameterProvider extends AbstractParameterProvider
implements ParameterProvider {
private PropertyDescriptor PARAMETERS = new PropertyDescriptor.Builder()
@@ -51,13 +57,34 @@ public class PropertiesParameterProvider extends
AbstractParameterProvider imple
return Collections.singletonList(PARAMETERS);
}
+ @Override
+ protected PropertyDescriptor getSupportedDynamicPropertyDescriptor(final
String propertyDescriptorName) {
+ return new PropertyDescriptor.Builder()
+ .name(propertyDescriptorName)
+ .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+ .dynamic(true)
+ .required(false)
+ .build();
+ }
+
@Override
public List<ParameterGroup> fetchParameters(final ConfigurationContext
context) {
+ final List<ParameterGroup> groups = new ArrayList<>();
+
+ if (context.getProperty(PARAMETERS).isSet()) {
+ final List<Parameter> parameters =
fetchParametersFromProperties(context.getProperty(PARAMETERS).getValue());
+ groups.add(new ParameterGroup("Parameters", parameters));
+ }
+
+ for (final Map.Entry<PropertyDescriptor, String> entry :
context.getProperties().entrySet()) {
+ if (entry.getKey().isDynamic()) {
+ final String groupName = entry.getKey().getName();
+ final List<Parameter> parameters =
fetchParametersFromProperties(entry.getValue());
+ groups.add(new ParameterGroup(groupName, parameters));
+ }
+ }
- final List<Parameter> parameters =
context.getProperty(PARAMETERS).isSet()
- ?
fetchParametersFromProperties(context.getProperty(PARAMETERS).getValue())
- : Collections.emptyList();
- return Arrays.asList(new ParameterGroup("Parameters", parameters));
+ return groups;
}
private List<Parameter> fetchParametersFromProperties(final String
parametersPropertiesValue) {
diff --git
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/parameters/ParameterContextIT.java
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/parameters/ParameterContextIT.java
index 7b84ee6695..d9a84ac088 100644
---
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/parameters/ParameterContextIT.java
+++
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/parameters/ParameterContextIT.java
@@ -278,6 +278,69 @@ public class ParameterContextIT extends NiFiSystemIT {
assertThrows(NiFiClientException.class, () ->
updateParameterContext(createdContextEntity, "non.sensitive", "value"));
}
+ @Test
+ public void testParameterProviderUpdateMultipleGroups() throws
NiFiClientException, IOException, InterruptedException {
+ ParameterProviderEntity parameterProvider =
createParameterProvider("PropertiesParameterProvider");
+
+ final Map<String, String> initialProperties = new HashMap<>();
+ initialProperties.put("group1", "A1=1\nA2=1");
+ initialProperties.put("group2", "B1=2\nB2=2");
+ parameterProvider =
updateParameterProviderProperties(parameterProvider, initialProperties);
+
+ final String parameterGroupName1 = "group1";
+ final String parameterContextName1 = "PC-group-1";
+ final ParameterContextEntity contextEntity1 =
createParameterContextEntity(parameterContextName1, null,
Collections.emptySet(),
+ Collections.emptyList(), parameterProvider,
parameterGroupName1);
+ final ParameterContextEntity createdContextEntity1 =
getNifiClient().getParamContextClient().createParamContext(contextEntity1);
+
+ final String parameterGroupName2 = "group2";
+ final String parameterContextName2 = "PC-group-2";
+ final ParameterContextEntity contextEntity2 =
createParameterContextEntity(parameterContextName2, null,
Collections.emptySet(),
+ Collections.emptyList(), parameterProvider,
parameterGroupName2);
+ final ParameterContextEntity createdContextEntity2 =
getNifiClient().getParamContextClient().createParamContext(contextEntity2);
+
+ final Map<String, ParameterSensitivity> sensitivities = new
HashMap<>();
+ sensitivities.put("A1", ParameterSensitivity.NON_SENSITIVE);
+ sensitivities.put("A2", ParameterSensitivity.NON_SENSITIVE);
+ sensitivities.put("B1", ParameterSensitivity.NON_SENSITIVE);
+ sensitivities.put("B2", ParameterSensitivity.NON_SENSITIVE);
+ sensitivities.put("C", ParameterSensitivity.NON_SENSITIVE);
+ sensitivities.put("D", ParameterSensitivity.NON_SENSITIVE);
+
+ final ParameterGroupConfigurationEntity config1 = new
ParameterGroupConfigurationEntity();
+ config1.setSynchronized(true);
+ config1.setGroupName("group1");
+ config1.setParameterContextName(parameterContextName1);
+ config1.setParameterSensitivities(sensitivities);
+
+ final ParameterGroupConfigurationEntity config2 = new
ParameterGroupConfigurationEntity();
+ config2.setSynchronized(true);
+ config2.setGroupName("group2");
+ config2.setParameterContextName(parameterContextName2);
+ config2.setParameterSensitivities(sensitivities);
+
+ fetchAndWaitForAppliedParameters(parameterProvider,
Arrays.asList(config1, config2));
+
+ ParameterContextEntity fetchedContext1 =
getNifiClient().getParamContextClient().getParamContext(createdContextEntity1.getId(),
false);
+ ParameterContextEntity fetchedContext2 =
getNifiClient().getParamContextClient().getParamContext(createdContextEntity2.getId(),
false);
+
+ assertEquals(Set.of("A1", "A2"), getParameterNames(fetchedContext1));
+ assertEquals(Set.of("B1", "B2"), getParameterNames(fetchedContext2));
+
+ final Map<String, String> updatedProperties = new HashMap<>();
+ updatedProperties.put("group1", "A2=1\nC=3");
+ updatedProperties.put("group2", "B1=2\nD=4");
+ parameterProvider =
updateParameterProviderProperties(parameterProvider, updatedProperties);
+
+ fetchAndWaitForAppliedParameters(parameterProvider,
Arrays.asList(config1, config2));
+
+ fetchedContext1 =
getNifiClient().getParamContextClient().getParamContext(createdContextEntity1.getId(),
false);
+ fetchedContext2 =
getNifiClient().getParamContextClient().getParamContext(createdContextEntity2.getId(),
false);
+
+ assertEquals(Set.of("A2", "C"), getParameterNames(fetchedContext1));
+ assertEquals(Set.of("B1", "D"), getParameterNames(fetchedContext2));
+ }
+
@Test
public void testParameterRemovalThroughProvider() throws
NiFiClientException, IOException, InterruptedException {
final ParameterProviderEntity parameterProvider =
createParameterProvider("PropertiesParameterProvider");