This is an automated email from the ASF dual-hosted git repository.

rfellows 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 e6013c8cfe9 NIFI-16027: Added 
findRemoteProcessGroupIncludingConnectorManaged to FlowController, following 
the same pattern used by findConnectionIncludingConnectorManaged and 
findRemoteGroupPortIncludingConnectorManaged. Updated both ControllerFacade 
methods to use this instead of the root-group-only tree walk. (#11354)
e6013c8cfe9 is described below

commit e6013c8cfe9c5912ca198f296f2d5a2cb1a449dd
Author: Mark Payne <[email protected]>
AuthorDate: Thu Jun 18 15:38:42 2026 -0400

    NIFI-16027: Added findRemoteProcessGroupIncludingConnectorManaged to 
FlowController, following the same pattern used by 
findConnectionIncludingConnectorManaged and 
findRemoteGroupPortIncludingConnectorManaged. Updated both ControllerFacade 
methods to use this instead of the root-group-only tree walk. (#11354)
    
    This closes #11354
---
 .../org/apache/nifi/controller/FlowController.java | 26 +++++++++
 .../nifi/web/controller/ControllerFacade.java      | 10 +---
 .../nifi/web/controller/ControllerFacadeTest.java  | 61 ++++++++++++++++++++++
 3 files changed, 89 insertions(+), 8 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
index 804de6818a4..5c7cfe540d5 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
@@ -1142,6 +1142,32 @@ public class FlowController implements 
ReportingTaskProvider, FlowAnalysisRulePr
         return null;
     }
 
+    /**
+     * Finds a RemoteProcessGroup by ID, searching both the root process group 
hierarchy
+     * and all connector-managed process groups.
+     *
+     * @param remoteProcessGroupId the remote process group identifier
+     * @return the RemoteProcessGroup, or null if not found
+     */
+    public RemoteProcessGroup 
findRemoteProcessGroupIncludingConnectorManaged(final String 
remoteProcessGroupId) {
+        final RemoteProcessGroup remoteProcessGroup = 
flowManager.getRootGroup().findRemoteProcessGroup(remoteProcessGroupId);
+        if (remoteProcessGroup != null) {
+            return remoteProcessGroup;
+        }
+
+        for (final ConnectorNode connector : 
connectorRepository.getConnectors(ConnectorSyncMode.LOCAL_ONLY)) {
+            final FrameworkFlowContext flowContext = 
connector.getActiveFlowContext();
+            if (flowContext != null) {
+                final RemoteProcessGroup managedRemoteProcessGroup = 
flowContext.getManagedProcessGroup().findRemoteProcessGroup(remoteProcessGroupId);
+                if (managedRemoteProcessGroup != null) {
+                    return managedRemoteProcessGroup;
+                }
+            }
+        }
+
+        return null;
+    }
+
     private PythonBridge createPythonBridge(final NiFiProperties 
nifiProperties, final ControllerServiceProvider serviceProvider) {
         final String pythonCommand = 
nifiProperties.getProperty(NiFiProperties.PYTHON_COMMAND);
         if (pythonCommand == null) {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
index 3cd15e3219d..15d6d9f5043 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
@@ -414,10 +414,7 @@ public class ControllerFacade implements Authorizable {
      * @return status history
      */
     public StatusHistoryDTO getRemoteProcessGroupStatusHistory(final String 
remoteProcessGroupId) {
-        final ProcessGroup root = getRootGroup();
-        final RemoteProcessGroup remoteProcessGroup = 
root.findRemoteProcessGroup(remoteProcessGroupId);
-
-        // ensure the output port was found
+        final RemoteProcessGroup remoteProcessGroup = 
flowController.findRemoteProcessGroupIncludingConnectorManaged(remoteProcessGroupId);
         if (remoteProcessGroup == null) {
             throw new ResourceNotFoundException(String.format("Unable to 
locate remote process group with id '%s'.", remoteProcessGroupId));
         }
@@ -1017,10 +1014,7 @@ public class ControllerFacade implements Authorizable {
      * @return the status for the specified remote process group
      */
     public RemoteProcessGroupStatus getRemoteProcessGroupStatus(final String 
remoteProcessGroupId) {
-        final ProcessGroup root = getRootGroup();
-        final RemoteProcessGroup remoteProcessGroup = 
root.findRemoteProcessGroup(remoteProcessGroupId);
-
-        // ensure the output port was found
+        final RemoteProcessGroup remoteProcessGroup = 
flowController.findRemoteProcessGroupIncludingConnectorManaged(remoteProcessGroupId);
         if (remoteProcessGroup == null) {
             throw new ResourceNotFoundException(String.format("Unable to 
locate remote process group with id '%s'.", remoteProcessGroupId));
         }
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/controller/ControllerFacadeTest.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/controller/ControllerFacadeTest.java
index ebbdeae4ed6..bb8b7dd32bf 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/controller/ControllerFacadeTest.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/controller/ControllerFacadeTest.java
@@ -31,15 +31,20 @@ import org.apache.nifi.connectable.Connectable;
 import org.apache.nifi.connectable.Connection;
 import org.apache.nifi.controller.FlowController;
 import org.apache.nifi.controller.flow.FlowManager;
+import org.apache.nifi.controller.status.ProcessGroupStatus;
+import org.apache.nifi.controller.status.RemoteProcessGroupStatus;
 import org.apache.nifi.groups.ProcessGroup;
+import org.apache.nifi.groups.RemoteProcessGroup;
 import org.apache.nifi.manifest.RuntimeManifestService;
 import org.apache.nifi.provenance.ProvenanceAuthorizableFactory;
 import org.apache.nifi.provenance.ProvenanceEventRecord;
 import org.apache.nifi.provenance.ProvenanceEventType;
 import org.apache.nifi.provenance.ProvenanceRepository;
 import org.apache.nifi.remote.RemoteGroupPort;
+import org.apache.nifi.reporting.UserAwareEventAccess;
 import org.apache.nifi.web.api.dto.provenance.ProvenanceEventDTO;
 import org.apache.nifi.web.api.dto.search.SearchResultsDTO;
+import org.apache.nifi.web.api.dto.status.StatusHistoryDTO;
 import org.apache.nifi.web.search.query.SearchQuery;
 import org.apache.nifi.web.search.query.SearchQueryParser;
 import org.apache.nifi.web.security.token.NiFiAuthenticationToken;
@@ -59,6 +64,7 @@ import java.util.Optional;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
@@ -527,5 +533,60 @@ public class ControllerFacadeTest {
 
         return flowController;
     }
+
+    @Test
+    public void 
testGetRemoteProcessGroupStatusReturnsStatusForConnectorManagedRPG() {
+        final String rpgId = "connector-managed-rpg-id";
+        final String groupId = "connector-managed-group-id";
+
+        final ProcessGroup connectorManagedGroup = mock(ProcessGroup.class);
+        when(connectorManagedGroup.getIdentifier()).thenReturn(groupId);
+
+        final RemoteProcessGroup remoteProcessGroup = 
mock(RemoteProcessGroup.class);
+        
when(remoteProcessGroup.getProcessGroup()).thenReturn(connectorManagedGroup);
+
+        final RemoteProcessGroupStatus expectedStatus = new 
RemoteProcessGroupStatus();
+        expectedStatus.setId(rpgId);
+        final ProcessGroupStatus groupStatus = new ProcessGroupStatus();
+        groupStatus.setRemoteProcessGroupStatus(List.of(expectedStatus));
+
+        final UserAwareEventAccess eventAccess = 
mock(UserAwareEventAccess.class);
+        when(eventAccess.getGroupStatus(eq(groupId), any(NiFiUser.class), 
eq(1))).thenReturn(groupStatus);
+
+        final FlowController flowController = mock(FlowController.class);
+        
when(flowController.findRemoteProcessGroupIncludingConnectorManaged(rpgId)).thenReturn(remoteProcessGroup);
+        when(flowController.getEventAccess()).thenReturn(eventAccess);
+
+        final ControllerFacade facade = new ControllerFacade();
+        facade.setFlowController(flowController);
+        facade.setAuthorizer(mock(Authorizer.class));
+
+        final RemoteProcessGroupStatus result = 
facade.getRemoteProcessGroupStatus(rpgId);
+
+        assertNotNull(result);
+        assertEquals(rpgId, result.getId());
+    }
+
+    @Test
+    public void 
testGetRemoteProcessGroupStatusHistoryReturnsHistoryForConnectorManagedRPG() {
+        final String rpgId = "connector-managed-rpg-id";
+
+        final RemoteProcessGroup remoteProcessGroup = 
mock(RemoteProcessGroup.class);
+        when(remoteProcessGroup.isAuthorized(any(), any(), 
any())).thenReturn(true);
+
+        final StatusHistoryDTO expectedHistory = new StatusHistoryDTO();
+
+        final FlowController flowController = mock(FlowController.class);
+        
when(flowController.findRemoteProcessGroupIncludingConnectorManaged(rpgId)).thenReturn(remoteProcessGroup);
+        
when(flowController.getRemoteProcessGroupStatusHistory(rpgId)).thenReturn(expectedHistory);
+
+        final ControllerFacade facade = new ControllerFacade();
+        facade.setFlowController(flowController);
+        facade.setAuthorizer(mock(Authorizer.class));
+
+        final StatusHistoryDTO result = 
facade.getRemoteProcessGroupStatusHistory(rpgId);
+
+        assertSame(expectedHistory, result);
+    }
 }
 

Reply via email to