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");
+    }
 }

Reply via email to