This is an automated email from the ASF dual-hosted git repository.
rfellows pushed a commit to branch NIFI-15258
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/NIFI-15258 by this push:
new c9dde94147 NIFI-15429: Adding an optional query parameter for
specifying which p… (#10732)
c9dde94147 is described below
commit c9dde941477df42ae95da32627bb0fa9eb507cea
Author: Matt Gilman <[email protected]>
AuthorDate: Wed Jan 7 11:22:25 2026 -0500
NIFI-15429: Adding an optional query parameter for specifying which p…
(#10732)
* NIFI-15429: Adding an optional query parameter for specifying which
process group should be returned within the Connectors flow.
* NIFI-15429: Including managed process group id in the ConnectorDTO.
* NIFI-15429: Addressing review feedback.
* NIFI-15429: Updating path for fetching a Connector flow to require the
desired Process Group ID.
* NIFI-15429: Fixing failing unit test.
---
.../org/apache/nifi/web/api/dto/ConnectorDTO.java | 10 ++++++
.../org/apache/nifi/web/NiFiServiceFacade.java | 2 +-
.../apache/nifi/web/StandardNiFiServiceFacade.java | 10 ++++--
.../org/apache/nifi/web/api/ConnectorResource.java | 32 +++++++++++-------
.../org/apache/nifi/web/api/dto/DtoFactory.java | 5 ++-
.../apache/nifi/web/api/TestConnectorResource.java | 39 ++++++++++++++++++++++
.../nifi/web/controller/ControllerFacadeTest.java | 3 ++
7 files changed, 84 insertions(+), 17 deletions(-)
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ConnectorDTO.java
b/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ConnectorDTO.java
index 9aed99c62b..96849a58a0 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ConnectorDTO.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ConnectorDTO.java
@@ -30,6 +30,7 @@ public class ConnectorDTO extends ComponentDTO {
private String type;
private BundleDTO bundle;
private String state; // RUNNING, STOPPED, DISABLED
+ private String managedProcessGroupId;
private ConnectorConfigurationDTO activeConfiguration;
private ConnectorConfigurationDTO workingConfiguration;
@@ -76,6 +77,15 @@ public class ConnectorDTO extends ComponentDTO {
this.state = state;
}
+ @Schema(description = "The identifier of the root Process Group managed by
this Connector.")
+ public String getManagedProcessGroupId() {
+ return managedProcessGroupId;
+ }
+
+ public void setManagedProcessGroupId(final String managedProcessGroupId) {
+ this.managedProcessGroupId = managedProcessGroupId;
+ }
+
@Schema(description = "The active configuration of the Connector.")
public ConnectorConfigurationDTO getActiveConfiguration() {
return activeConfiguration;
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
index 1928b17397..09761a5076 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java
@@ -220,7 +220,7 @@ public interface NiFiServiceFacade {
ConnectorEntity discardConnectorUpdate(Revision revision, String
connectorId);
- ProcessGroupFlowEntity getConnectorFlow(String id, boolean uiOnly);
+ ProcessGroupFlowEntity getConnectorFlow(String connectorId, String
processGroupId, boolean uiOnly);
ProcessGroupStatusEntity getConnectorProcessGroupStatus(String id, Boolean
recursive);
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
index e0744f01bc..273b1a43aa 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
@@ -3689,10 +3689,14 @@ public class StandardNiFiServiceFacade implements
NiFiServiceFacade {
}
@Override
- public ProcessGroupFlowEntity getConnectorFlow(final String id, final
boolean uiOnly) {
- final ConnectorNode connectorNode = connectorDAO.getConnector(id);
+ public ProcessGroupFlowEntity getConnectorFlow(final String connectorId,
final String processGroupId, final boolean uiOnly) {
+ final ConnectorNode connectorNode =
connectorDAO.getConnector(connectorId);
final ProcessGroup managedProcessGroup =
connectorNode.getActiveFlowContext().getManagedProcessGroup();
- return createProcessGroupFlowEntity(managedProcessGroup, uiOnly);
+ final ProcessGroup targetProcessGroup =
managedProcessGroup.findProcessGroup(processGroupId);
+ if (targetProcessGroup == null) {
+ throw new ResourceNotFoundException("Process Group with ID " +
processGroupId + " was not found within Connector " + connectorId);
+ }
+ return createProcessGroupFlowEntity(targetProcessGroup, uiOnly);
}
@Override
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectorResource.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectorResource.java
index 0112d7e61c..c2f7b4cddf 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectorResource.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectorResource.java
@@ -1348,18 +1348,19 @@ public class ConnectorResource extends
ApplicationResource {
}
/**
- * Retrieves the flow for the process group managed by the specified
connector.
+ * Retrieves the flow for a process group within the specified connector.
*
- * @param id The id of the connector
+ * @param connectorId The id of the connector
+ * @param processGroupId The process group id within the connector's
hierarchy
* @param uiOnly Whether to return only UI-specific fields
* @return A processGroupFlowEntity
*/
@GET
@Consumes(MediaType.WILDCARD)
@Produces(MediaType.APPLICATION_JSON)
- @Path("/{id}/flow")
+ @Path("/{connectorId}/flow/process-groups/{processGroupId}")
@Operation(
- summary = "Gets the flow for the process group managed by a
connector",
+ summary = "Gets the flow for a process group within a connector",
responses = {
@ApiResponse(responseCode = "200", content =
@Content(schema = @Schema(implementation = ProcessGroupFlowEntity.class))),
@ApiResponse(responseCode = "400", description = "NiFi was
unable to complete the request because it was invalid. The request should not
be retried without modification."),
@@ -1371,17 +1372,24 @@ public class ConnectorResource extends
ApplicationResource {
security = {
@SecurityRequirement(name = "Read - /connectors/{uuid}")
},
- description = "Returns the flow for the process group managed by
the specified connector. If the uiOnly query parameter is " +
- "provided with a value of true, the returned entity may
only contain fields that are necessary for rendering the NiFi User " +
- "Interface. As such, the selected fields may change at any
time, even during incremental releases, without warning. " +
- "As a result, this parameter should not be provided by any
client other than the UI."
+ description = "Returns the flow for the specified process group
within the connector's hierarchy. The processGroupId can be " +
+ "obtained from the managedProcessGroupId field of the
ConnectorDTO for the root process group, or from child process " +
+ "groups within the flow. If the uiOnly query parameter is
provided with a value of true, the returned entity may only " +
+ "contain fields that are necessary for rendering the NiFi
User Interface. As such, the selected fields may change at " +
+ "any time, even during incremental releases, without
warning. As a result, this parameter should not be provided by " +
+ "any client other than the UI."
)
public Response getFlow(
@Parameter(
description = "The connector id.",
required = true
)
- @PathParam("id") final String id,
+ @PathParam("connectorId") final String connectorId,
+ @Parameter(
+ description = "The process group id.",
+ required = true
+ )
+ @PathParam("processGroupId") final String processGroupId,
@Parameter(
description = "Whether to return only UI-specific fields"
)
@@ -1393,12 +1401,12 @@ public class ConnectorResource extends
ApplicationResource {
// authorize access to the connector
serviceFacade.authorizeAccess(lookup -> {
- final Authorizable connector = lookup.getConnector(id);
+ final Authorizable connector = lookup.getConnector(connectorId);
connector.authorize(authorizer, RequestAction.READ,
NiFiUserUtils.getNiFiUser());
});
- // get the flow for the connector's managed process group
- final ProcessGroupFlowEntity entity =
serviceFacade.getConnectorFlow(id, uiOnly);
+ // get the flow for the specified process group within the connector's
hierarchy
+ final ProcessGroupFlowEntity entity =
serviceFacade.getConnectorFlow(connectorId, processGroupId, uiOnly);
flowResource.populateRemainingFlowContent(entity.getProcessGroupFlow());
return generateOkResponse(entity).build();
}
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
index fdfce9b68a..9ecb1e78d2 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
@@ -5262,7 +5262,10 @@ public final class DtoFactory {
dto.setBundle(createBundleDto(connector.getBundleCoordinate()));
dto.setState(connector.getCurrentState().name());
-
dto.setActiveConfiguration(createConnectorConfigurationDtoFromFlowContext(connector,
connector.getActiveFlowContext()));
+
+ final FrameworkFlowContext activeFlowContext =
connector.getActiveFlowContext();
+
dto.setManagedProcessGroupId(activeFlowContext.getManagedProcessGroup().getIdentifier());
+
dto.setActiveConfiguration(createConnectorConfigurationDtoFromFlowContext(connector,
activeFlowContext));
dto.setWorkingConfiguration(createConnectorConfigurationDtoFromFlowContext(connector,
connector.getWorkingFlowContext()));
return dto;
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestConnectorResource.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestConnectorResource.java
index df21a6935e..5c22f82fd1 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestConnectorResource.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/api/TestConnectorResource.java
@@ -32,9 +32,11 @@ import org.apache.nifi.web.api.dto.AllowableValueDTO;
import org.apache.nifi.web.api.dto.ConnectorDTO;
import org.apache.nifi.web.api.dto.RevisionDTO;
import org.apache.nifi.web.api.entity.AllowableValueEntity;
+import org.apache.nifi.web.api.dto.flow.ProcessGroupFlowDTO;
import org.apache.nifi.web.api.entity.ConnectorEntity;
import org.apache.nifi.web.api.entity.ConnectorPropertyAllowableValuesEntity;
import org.apache.nifi.web.api.entity.ConnectorRunStatusEntity;
+import org.apache.nifi.web.api.entity.ProcessGroupFlowEntity;
import org.apache.nifi.web.api.entity.SecretsEntity;
import org.apache.nifi.web.api.request.ClientIdParameter;
import org.apache.nifi.web.api.request.LongParameter;
@@ -86,12 +88,16 @@ public class TestConnectorResource {
@Mock
private UriBuilder uriBuilder;
+ @Mock
+ private FlowResource flowResource;
+
private static final String CONNECTOR_ID = "test-connector-id";
private static final String CONNECTOR_NAME = "Test Connector";
private static final String CONNECTOR_TYPE = "TestConnectorType";
private static final String CONFIGURATION_STEP_NAME = "test-step";
private static final String PROPERTY_GROUP_NAME = "test-group";
private static final String PROPERTY_NAME = "test-property";
+ private static final String PROCESS_GROUP_ID = "test-process-group-id";
@BeforeEach
public void setUp() throws Exception {
@@ -109,6 +115,7 @@ public class TestConnectorResource {
lenient().when(uriBuilder.build()).thenReturn(new
URI("http://localhost:8080/nifi-api/connectors/" + CONNECTOR_ID));
connectorResource.setServiceFacade(serviceFacade);
+ connectorResource.setFlowResource(flowResource);
connectorResource.httpServletRequest = httpServletRequest;
connectorResource.properties = properties;
connectorResource.uriInfo = uriInfo;
@@ -353,6 +360,30 @@ public class TestConnectorResource {
verify(serviceFacade, never()).getSecrets();
}
+ @Test
+ public void testGetFlow() {
+ final ProcessGroupFlowEntity responseEntity =
createProcessGroupFlowEntity();
+ when(serviceFacade.getConnectorFlow(CONNECTOR_ID, PROCESS_GROUP_ID,
false)).thenReturn(responseEntity);
+
+ try (Response response = connectorResource.getFlow(CONNECTOR_ID,
PROCESS_GROUP_ID, false)) {
+ assertEquals(200, response.getStatus());
+ assertEquals(responseEntity, response.getEntity());
+ }
+
+ verify(serviceFacade).authorizeAccess(any(AuthorizeAccess.class));
+ verify(serviceFacade).getConnectorFlow(CONNECTOR_ID, PROCESS_GROUP_ID,
false);
+ }
+
+ @Test
+ public void testGetFlowNotAuthorized() {
+
doThrow(AccessDeniedException.class).when(serviceFacade).authorizeAccess(any(AuthorizeAccess.class));
+
+ assertThrows(AccessDeniedException.class, () ->
connectorResource.getFlow(CONNECTOR_ID, PROCESS_GROUP_ID, false));
+
+ verify(serviceFacade).authorizeAccess(any(AuthorizeAccess.class));
+ verify(serviceFacade, never()).getConnectorFlow(anyString(),
anyString(), eq(false));
+ }
+
private ConnectorEntity createConnectorEntity() {
final ConnectorEntity entity = new ConnectorEntity();
@@ -411,4 +442,12 @@ public class TestConnectorResource {
return entity;
}
+
+ private ProcessGroupFlowEntity createProcessGroupFlowEntity() {
+ final ProcessGroupFlowEntity entity = new ProcessGroupFlowEntity();
+ final ProcessGroupFlowDTO flowDTO = new ProcessGroupFlowDTO();
+ flowDTO.setId("root-process-group-id");
+ entity.setProcessGroupFlow(flowDTO);
+ return entity;
+ }
}
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 6374029cac..5dad329baf 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
@@ -132,6 +132,9 @@ public class ControllerFacadeTest {
@Test
public void testGetConnectorDefinitionReturnsDefinitionWhenFound() {
final ConnectorDefinition expectedDefinition = new
ConnectorDefinition();
+ expectedDefinition.setGroup(TEST_GROUP);
+ expectedDefinition.setArtifact(TEST_ARTIFACT);
+ expectedDefinition.setVersion(TEST_VERSION);
expectedDefinition.setType(TEST_CONNECTOR_TYPE);
when(runtimeManifestService.getManifestForBundle(TEST_GROUP,
TEST_ARTIFACT, TEST_VERSION)).thenReturn(runtimeManifest);