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 f61b8f49a68 NIFI-15470 Fixed applying Parameter Context recursively to
versioned child Groups (#11230)
f61b8f49a68 is described below
commit f61b8f49a686d27929ad88dcf1a243b3fc504538
Author: Pierre Villard <[email protected]>
AuthorDate: Mon Jun 1 09:06:25 2026 -0700
NIFI-15470 Fixed applying Parameter Context recursively to versioned child
Groups (#11230)
Signed-off-by: David Handermann <[email protected]>
---
.../apache/nifi/web/api/ProcessGroupResource.java | 17 +++++----
.../apache/nifi/tests/system/NiFiClientUtil.java | 8 +++++
.../registry/ParameterContextPreservationIT.java | 41 ++++++++++++++++++++++
3 files changed, 60 insertions(+), 6 deletions(-)
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
index c42ff3273a0..f8a390c9421 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
@@ -593,12 +593,17 @@ public class ProcessGroupResource extends
FlowUpdateResource<ProcessGroupImportE
updatableProcessGroups.put(requestProcessGroupEntity,
getRevision(requestProcessGroupEntity, requestGroupId));
if (updateStrategy == ProcessGroupRecursivity.ALL_DESCENDANTS) {
- for (ProcessGroupEntity processGroupEntity :
serviceFacade.getProcessGroups(requestGroupId, updateStrategy)) {
- final ProcessGroupDTO processGroupDTO =
processGroupEntity.getComponent();
- final String processGroupId = processGroupDTO == null ?
processGroupEntity.getId() : processGroupDTO.getId();
- if (processGroupDTO != null) {
- processGroupDTO.setParameterContext(requestParamContext);
- }
+ for (final ProcessGroupEntity processGroupEntity :
serviceFacade.getProcessGroups(requestGroupId, updateStrategy)) {
+ final ProcessGroupDTO existingDto =
processGroupEntity.getComponent();
+ final String processGroupId = existingDto == null ?
processGroupEntity.getId() : existingDto.getId();
+
+ // Recursive update only changes the Parameter Context
binding. Use a minimal DTO so unrelated
+ // fields from the existing Process Group do not flow into the
verify / update pipeline.
+ final ProcessGroupDTO updateDto = new ProcessGroupDTO();
+ updateDto.setId(processGroupId);
+ updateDto.setParameterContext(requestParamContext);
+ processGroupEntity.setComponent(updateDto);
+
updatableProcessGroups.put(processGroupEntity,
getRevision(processGroupEntity, processGroupId));
}
}
diff --git
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/NiFiClientUtil.java
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/NiFiClientUtil.java
index 8960e202ce3..495339734e2 100644
---
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/NiFiClientUtil.java
+++
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/NiFiClientUtil.java
@@ -113,6 +113,7 @@ import org.apache.nifi.web.api.entity.PasteResponseEntity;
import org.apache.nifi.web.api.entity.PortEntity;
import org.apache.nifi.web.api.entity.ProcessGroupEntity;
import org.apache.nifi.web.api.entity.ProcessGroupFlowEntity;
+import org.apache.nifi.web.api.entity.ProcessGroupRecursivity;
import org.apache.nifi.web.api.entity.ProcessGroupStatusEntity;
import org.apache.nifi.web.api.entity.ProcessorEntity;
import org.apache.nifi.web.api.entity.ProvenanceEntity;
@@ -937,6 +938,13 @@ public class NiFiClientUtil {
return
nifiClient.getProcessGroupClient().updateProcessGroup(processGroup);
}
+ public ProcessGroupEntity setParameterContextRecursively(final String
groupId, final ParameterContextEntity parameterContext) throws
NiFiClientException, IOException {
+ final ProcessGroupEntity processGroup =
nifiClient.getProcessGroupClient().getProcessGroup(groupId);
+
processGroup.getComponent().setParameterContext(createReferenceEntity(parameterContext.getId()));
+
processGroup.setProcessGroupUpdateStrategy(ProcessGroupRecursivity.ALL_DESCENDANTS.name());
+ return
nifiClient.getProcessGroupClient().updateProcessGroup(processGroup);
+ }
+
public ParameterContextEntity createParameterContext(final String
contextName, final String parameterName, final String parameterValue, final
boolean sensitive)
throws NiFiClientException, IOException {
diff --git
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/registry/ParameterContextPreservationIT.java
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/registry/ParameterContextPreservationIT.java
index 80318021501..ee66dc130ad 100644
---
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/registry/ParameterContextPreservationIT.java
+++
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/registry/ParameterContextPreservationIT.java
@@ -560,4 +560,45 @@ class ParameterContextPreservationIT extends NiFiSystemIT {
}
return null;
}
+
+ /**
+ * Verifies that applying a Parameter Context recursively succeeds when
one of the descendant Process Groups is
+ * under version control. The descendant must end up rebound to the new
Parameter Context while continuing to be
+ * tracked by Version Control (NIFI-15470).
+ */
+ @Test
+ void testApplyParameterContextRecursivelyAcrossVersionedDescendant()
throws NiFiClientException, IOException {
+ final FlowRegistryClientEntity clientEntity = registerClient();
+ final NiFiClientUtil util = getClientUtil();
+
+ final ParameterContextEntity firstContext =
util.createParameterContext("recursive-vc-first", Map.of(PARAMETER_NAME,
PARAMETER_VALUE));
+ final ParameterContextEntity secondContext =
util.createParameterContext("recursive-vc-second", Map.of(PARAMETER_NAME,
"secondValue"));
+
+ final ProcessGroupEntity parentGroup =
util.createProcessGroup("recursive-vc-parent", "root");
+ util.setParameterContext(parentGroup.getId(), firstContext);
+
+ final ProcessGroupEntity childGroup =
util.createProcessGroup("recursive-vc-child", parentGroup.getId());
+ util.setParameterContext(childGroup.getId(), firstContext);
+
+ final ProcessorEntity childProcessor =
util.createProcessor(PROCESSOR_TYPE, childGroup.getId());
+ util.updateProcessorProperties(childProcessor,
Collections.singletonMap(PROCESSOR_PROPERTY_TEXT, PARAMETER_REFERENCE));
+ util.setAutoTerminatedRelationships(childProcessor,
RELATIONSHIP_SUCCESS);
+
+ final ProcessGroupEntity childForVersioning =
getNifiClient().getProcessGroupClient().getProcessGroup(childGroup.getId());
+ final VersionControlInformationEntity childVci =
util.startVersionControl(childForVersioning, clientEntity, TEST_FLOWS_BUCKET,
"RecursiveVcChildFlow");
+ assertNotNull(childVci.getVersionControlInformation(), "Child process
group should be under version control before the recursive apply");
+
+ util.setParameterContextRecursively(parentGroup.getId(),
secondContext);
+
+ final ProcessGroupEntity parentAfterUpdate =
getNifiClient().getProcessGroupClient().getProcessGroup(parentGroup.getId());
+ assertNotNull(parentAfterUpdate.getComponent().getParameterContext());
+ assertEquals(secondContext.getId(),
parentAfterUpdate.getComponent().getParameterContext().getId());
+
+ final ProcessGroupEntity childAfterUpdate =
getNifiClient().getProcessGroupClient().getProcessGroup(childGroup.getId());
+ assertNotNull(childAfterUpdate.getComponent().getParameterContext());
+ assertEquals(secondContext.getId(),
childAfterUpdate.getComponent().getParameterContext().getId(),
+ "Versioned child Process Group should be rebound to the new
Parameter Context after a recursive apply");
+
assertNotNull(childAfterUpdate.getComponent().getVersionControlInformation(),
+ "Versioned child Process Group should remain under version
control after a recursive Parameter Context change");
+ }
}