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