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

mcgilman 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 eefa952eddd NIFI-16404 Added connector-scoped Process Group GET. 
(#11731)
eefa952eddd is described below

commit eefa952edddc320c511fa975fe8744c7d452b8fe
Author: Rob Fellows <[email protected]>
AuthorDate: Tue Sep 29 10:09:04 2026 -0400

    NIFI-16404 Added connector-scoped Process Group GET. (#11731)
---
 .../org/apache/nifi/web/NiFiServiceFacade.java     | 10 ++++
 .../apache/nifi/web/StandardNiFiServiceFacade.java | 17 ++++++
 .../org/apache/nifi/web/api/ConnectorResource.java | 62 ++++++++++++++++++++++
 .../nifi/web/StandardNiFiServiceFacadeTest.java    | 20 +++++++
 .../apache/nifi/web/api/TestConnectorResource.java | 42 +++++++++++++++
 .../tests/system/connectors/ConnectorCrudIT.java   | 14 +++++
 .../connectors/ConnectorTroubleshootingIT.java     |  5 ++
 .../nifi/toolkit/client/ConnectorClient.java       | 13 +++++
 .../toolkit/client/impl/JerseyConnectorClient.java | 20 +++++++
 9 files changed, 203 insertions(+)

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 2f9b8538d25..e2c9aed520b 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
@@ -2361,6 +2361,16 @@ public interface NiFiServiceFacade {
      */
     ControllerServiceEntity getConnectorControllerService(String connectorId, 
String controllerServiceId, boolean includeReferencingComponents);
 
+    /**
+     * Gets a process group within a connector's managed process group. 
Available regardless of whether
+     * the Connector is in Troubleshooting mode.
+     *
+     * @param connectorId    the connector id
+     * @param processGroupId the process group id
+     * @return the process group entity
+     */
+    ProcessGroupEntity getConnectorProcessGroup(String connectorId, String 
processGroupId);
+
     /**
      * Gets the state for a controller service within a connector's managed 
process group.
      *
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 ad76675bf18..8d8c9766afe 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
@@ -2255,6 +2255,12 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
         return createControllerServiceEntity(controllerService, 
includeReferencingComponents);
     }
 
+    @Override
+    public ProcessGroupEntity getConnectorProcessGroup(final String 
connectorId, final String processGroupId) {
+        final ProcessGroup processGroup = 
locateConnectorProcessGroup(connectorId, processGroupId);
+        return createProcessGroupEntity(processGroup);
+    }
+
     @Override
     public ComponentStateDTO getConnectorControllerServiceState(final String 
connectorId, final String controllerServiceId) {
         final ControllerServiceNode controllerService = 
locateConnectorControllerService(connectorId, controllerServiceId);
@@ -2286,6 +2292,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
         return processor;
     }
 
+    private ProcessGroup locateConnectorProcessGroup(final String connectorId, 
final String processGroupId) {
+        final ConnectorNode connectorNode = 
connectorDAO.getConnector(connectorId, ConnectorSyncMode.LOCAL_ONLY);
+        final ProcessGroup managedGroup = 
connectorNode.getActiveFlowContext().getManagedProcessGroup();
+        final ProcessGroup processGroup = 
managedGroup.findProcessGroup(processGroupId);
+        if (processGroup == null) {
+            throw new ResourceNotFoundException("Unable to find process group 
with id '%s' within connector '%s'.".formatted(processGroupId, connectorId));
+        }
+
+        return processGroup;
+    }
+
     private ControllerServiceNode locateConnectorControllerService(final 
String connectorId, final String controllerServiceId) {
         final ConnectorNode connectorNode = 
connectorDAO.getConnector(connectorId, ConnectorSyncMode.LOCAL_ONLY);
         final ProcessGroup managedGroup = 
connectorNode.getActiveFlowContext().getManagedProcessGroup();
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 1da36de45f4..5aa2d966fb7 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
@@ -111,6 +111,7 @@ import org.apache.nifi.web.api.entity.DropRequestEntity;
 import org.apache.nifi.web.api.entity.MigrationPayloadEntity;
 import org.apache.nifi.web.api.entity.MigrationRequestEntity;
 import org.apache.nifi.web.api.entity.ParameterContextEntity;
+import org.apache.nifi.web.api.entity.ProcessGroupEntity;
 import org.apache.nifi.web.api.entity.ProcessGroupFlowEntity;
 import org.apache.nifi.web.api.entity.ProcessGroupStatusEntity;
 import org.apache.nifi.web.api.entity.SearchResultsEntity;
@@ -172,6 +173,7 @@ public class ConnectorResource extends ApplicationResource {
     private Authorizer authorizer;
     private FlowResource flowResource;
     private ControllerServiceResource controllerServiceResource;
+    private ProcessGroupResource processGroupResource;
     private UploadRequestReplicator uploadRequestReplicator;
 
     private final RequestManager<VerifyConnectorConfigStepRequestEntity, 
List<ConfigVerificationResultDTO>> configVerificationRequestManager =
@@ -2323,6 +2325,61 @@ public class ConnectorResource extends 
ApplicationResource {
         return generateOkResponse(entity).build();
     }
 
+    /**
+     * Gets a process group within a connector. Available regardless of 
whether the Connector is in Troubleshooting mode.
+     *
+     * @param connectorId    the connector id
+     * @param processGroupId the process group id within the connector's 
managed flow
+     * @return a ProcessGroupEntity
+     */
+    @GET
+    @Consumes(MediaType.WILDCARD)
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("{id}/process-groups/{processGroupId}")
+    @Operation(
+            summary = "Gets a process group within a connector",
+            responses = {
+                    @ApiResponse(responseCode = "200", content = 
@Content(schema = @Schema(implementation = ProcessGroupEntity.class))),
+                    @ApiResponse(responseCode = "400", description = "NiFi was 
unable to complete the request because it was invalid. The request should not 
be retried without modification."),
+                    @ApiResponse(responseCode = "401", description = "Client 
could not be authenticated."),
+                    @ApiResponse(responseCode = "403", description = "Client 
is not authorized to make this request."),
+                    @ApiResponse(responseCode = "404", description = "The 
specified resource could not be found."),
+                    @ApiResponse(responseCode = "409", description = "The 
request was valid but NiFi was not in the appropriate state to process it.")
+            },
+            security = {
+                    @SecurityRequirement(name = "Read - /connectors/{uuid}")
+            },
+            description = "Returns the Process Group entity for the specified 
group within the connector's managed flow. " +
+                    "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. Available regardless of whether the Connector " +
+                    "is in Troubleshooting mode."
+    )
+    public Response getConnectorProcessGroup(
+            @Parameter(description = "The connector id.", required = true)
+            @PathParam("id") final String connectorId,
+            @Parameter(description = "The process group id.", required = true)
+            @PathParam("processGroupId") final String processGroupId) {
+
+        if (isReplicateRequest()) {
+            return replicate(HttpMethod.GET);
+        }
+
+        serviceFacade.authorizeAccess(lookup -> {
+            final Authorizable connector = lookup.getConnector(connectorId);
+            connector.authorize(authorizer, RequestAction.READ, 
NiFiUserUtils.getNiFiUser());
+        });
+
+        // Resolve the process group from the managed Process Group tree so 
the Troubleshooting access gate does not apply.
+        final ProcessGroupEntity entity = 
serviceFacade.getConnectorProcessGroup(connectorId, processGroupId);
+        
processGroupResource.populateRemainingProcessGroupEntityContent(entity);
+
+        if (entity.getComponent() != null) {
+            entity.getComponent().setContents(null);
+        }
+
+        return generateOkResponse(entity).build();
+    }
+
     /**
      * Gets the status history for a Process Group inside the Connector's 
managed flow. The status history is available
      * regardless of whether the Connector is in Troubleshooting mode.
@@ -3548,6 +3605,11 @@ public class ConnectorResource extends 
ApplicationResource {
         this.controllerServiceResource = controllerServiceResource;
     }
 
+    @Autowired
+    public void setProcessGroupResource(final ProcessGroupResource 
processGroupResource) {
+        this.processGroupResource = processGroupResource;
+    }
+
     @Autowired(required = false)
     public void setUploadRequestReplicator(final UploadRequestReplicator 
uploadRequestReplicator) {
         this.uploadRequestReplicator = uploadRequestReplicator;
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/StandardNiFiServiceFacadeTest.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/StandardNiFiServiceFacadeTest.java
index 47f729e1763..5d7d0f0e531 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/StandardNiFiServiceFacadeTest.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/StandardNiFiServiceFacadeTest.java
@@ -2252,6 +2252,26 @@ public class StandardNiFiServiceFacadeTest {
         assertThrows(ResourceNotFoundException.class, () -> 
serviceFacade.getConnectorControllerService(connectorId, controllerServiceId, 
false));
     }
 
+    @Test
+    public void testGetConnectorProcessGroupNotFound() {
+        final String connectorId = "connector-id";
+        final String processGroupId = "non-existent-process-group-id";
+
+        final ConnectorDAO connectorDAO = mock(ConnectorDAO.class);
+        serviceFacade.setConnectorDAO(connectorDAO);
+
+        final ConnectorNode connectorNode = mock(ConnectorNode.class);
+        final FrameworkFlowContext flowContext = 
mock(FrameworkFlowContext.class);
+        final ProcessGroup managedProcessGroup = mock(ProcessGroup.class);
+
+        when(connectorDAO.getConnector(connectorId, 
ConnectorSyncMode.LOCAL_ONLY)).thenReturn(connectorNode);
+        when(connectorNode.getActiveFlowContext()).thenReturn(flowContext);
+        
when(flowContext.getManagedProcessGroup()).thenReturn(managedProcessGroup);
+        
when(managedProcessGroup.findProcessGroup(processGroupId)).thenReturn(null);
+
+        assertThrows(ResourceNotFoundException.class, () -> 
serviceFacade.getConnectorProcessGroup(connectorId, processGroupId));
+    }
+
     @Test
     public void testGetConnectorControllerServiceState() {
         final String connectorId = "connector-id";
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 13eca09c528..c5aeb7fcd90 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
@@ -43,10 +43,12 @@ import org.apache.nifi.web.api.dto.ComponentStateDTO;
 import org.apache.nifi.web.api.dto.ConfigurationStepConfigurationDTO;
 import org.apache.nifi.web.api.dto.ConnectorDTO;
 import org.apache.nifi.web.api.dto.ConnectorValueReferenceDTO;
+import org.apache.nifi.web.api.dto.FlowSnippetDTO;
 import org.apache.nifi.web.api.dto.MigrationRequestDTO;
 import org.apache.nifi.web.api.dto.MigrationRequestLocalSourceDTO;
 import org.apache.nifi.web.api.dto.ParameterContextDTO;
 import org.apache.nifi.web.api.dto.ParameterDTO;
+import org.apache.nifi.web.api.dto.ProcessGroupDTO;
 import org.apache.nifi.web.api.dto.PropertyGroupConfigurationDTO;
 import org.apache.nifi.web.api.dto.RevisionDTO;
 import org.apache.nifi.web.api.dto.VerifyConnectorConfigStepRequestDTO;
@@ -65,6 +67,7 @@ import org.apache.nifi.web.api.entity.MigrationPayloadEntity;
 import org.apache.nifi.web.api.entity.MigrationRequestEntity;
 import org.apache.nifi.web.api.entity.ParameterContextEntity;
 import org.apache.nifi.web.api.entity.ParameterEntity;
+import org.apache.nifi.web.api.entity.ProcessGroupEntity;
 import org.apache.nifi.web.api.entity.ProcessGroupFlowEntity;
 import org.apache.nifi.web.api.entity.SecretsEntity;
 import org.apache.nifi.web.api.entity.VerifyConnectorConfigStepRequestEntity;
@@ -99,6 +102,7 @@ import java.util.concurrent.TimeUnit;
 
 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.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -148,6 +152,9 @@ public class TestConnectorResource {
     @Mock
     private ControllerServiceResource controllerServiceResource;
 
+    @Mock
+    private ProcessGroupResource processGroupResource;
+
     private static final String CONNECTOR_ID = "test-connector-id";
     private static final String CONNECTOR_NAME = "Test Connector";
     private static final String CONNECTOR_TYPE = "TestConnectorType";
@@ -177,6 +184,7 @@ public class TestConnectorResource {
         connectorResource.setServiceFacade(serviceFacade);
         connectorResource.setFlowResource(flowResource);
         
connectorResource.setControllerServiceResource(controllerServiceResource);
+        connectorResource.setProcessGroupResource(processGroupResource);
         connectorResource.httpServletRequest = httpServletRequest;
         connectorResource.properties = properties;
         connectorResource.uriInfo = uriInfo;
@@ -1140,6 +1148,40 @@ public class TestConnectorResource {
         verify(serviceFacade, 
never()).getConnectorControllerService(anyString(), anyString(), eq(true));
     }
 
+    @Test
+    public void testGetConnectorProcessGroup() {
+        final ProcessGroupDTO processGroupDto = new ProcessGroupDTO();
+        processGroupDto.setId(PROCESS_GROUP_ID);
+        processGroupDto.setContents(new FlowSnippetDTO());
+
+        final ProcessGroupEntity processGroupEntity = new ProcessGroupEntity();
+        processGroupEntity.setId(PROCESS_GROUP_ID);
+        processGroupEntity.setComponent(processGroupDto);
+        when(serviceFacade.getConnectorProcessGroup(CONNECTOR_ID, 
PROCESS_GROUP_ID)).thenReturn(processGroupEntity);
+        
when(processGroupResource.populateRemainingProcessGroupEntityContent(processGroupEntity)).thenReturn(processGroupEntity);
+
+        try (Response response = 
connectorResource.getConnectorProcessGroup(CONNECTOR_ID, PROCESS_GROUP_ID)) {
+            assertEquals(200, response.getStatus());
+            assertEquals(processGroupEntity, response.getEntity());
+            assertNull(processGroupDto.getContents());
+        }
+
+        verify(serviceFacade).authorizeAccess(any(AuthorizeAccess.class));
+        verify(serviceFacade).getConnectorProcessGroup(CONNECTOR_ID, 
PROCESS_GROUP_ID);
+        
verify(processGroupResource).populateRemainingProcessGroupEntityContent(processGroupEntity);
+    }
+
+    @Test
+    public void testGetConnectorProcessGroupNotAuthorized() {
+        
doThrow(AccessDeniedException.class).when(serviceFacade).authorizeAccess(any(AuthorizeAccess.class));
+
+        assertThrows(AccessDeniedException.class, () ->
+            connectorResource.getConnectorProcessGroup(CONNECTOR_ID, 
PROCESS_GROUP_ID));
+
+        verify(serviceFacade).authorizeAccess(any(AuthorizeAccess.class));
+        verify(serviceFacade, never()).getConnectorProcessGroup(anyString(), 
anyString());
+    }
+
     @Test
     public void testGetConnectorControllerServiceState() {
         final ComponentStateDTO stateDTO = new ComponentStateDTO();
diff --git 
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/connectors/ConnectorCrudIT.java
 
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/connectors/ConnectorCrudIT.java
index 44ca9511e93..36b05e070be 100644
--- 
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/connectors/ConnectorCrudIT.java
+++ 
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/connectors/ConnectorCrudIT.java
@@ -266,6 +266,13 @@ public class ConnectorCrudIT extends NiFiSystemIT {
         assertConnectorManagedAccessRejected(() -> 
getNifiClient().getFlowClient().getProcessGroup(managedProcessGroupId),
             "Was able to retrieve connector-managed process group via 
FlowClient");
 
+        final ProcessGroupEntity managedProcessGroup = 
getNifiClient().getConnectorClient().getProcessGroup(connector.getId(), 
managedProcessGroupId);
+        assertNotNull(managedProcessGroup);
+        assertEquals(managedProcessGroupId, managedProcessGroup.getId());
+        assertNotNull(managedProcessGroup.getComponent());
+        assertNotNull(managedProcessGroup.getComponent().getName());
+        assertNull(managedProcessGroup.getComponent().getContents());
+
         final Set<ProcessGroupEntity> childGroups = 
connectorFlow.getFlow().getProcessGroups();
         assertEquals(1, childGroups.size(), "Expected exactly one child 
process group");
 
@@ -279,6 +286,13 @@ public class ConnectorCrudIT extends NiFiSystemIT {
 
         assertConnectorManagedAccessRejected(() -> 
getNifiClient().getFlowClient().getProcessGroup(childGroupId),
             "Was able to retrieve child process group of connector-managed 
flow via FlowClient");
+
+        final ProcessGroupEntity connectorChildGroup = 
getNifiClient().getConnectorClient().getProcessGroup(connector.getId(), 
childGroupId);
+        assertNotNull(connectorChildGroup);
+        assertEquals(childGroupId, connectorChildGroup.getId());
+        assertNotNull(connectorChildGroup.getComponent());
+        assertNotNull(connectorChildGroup.getComponent().getName());
+        assertNull(connectorChildGroup.getComponent().getContents());
     }
 
     private void assertConnectorManagedAccessRejected(final Callable<?> call, 
final String failureMessage) throws IOException {
diff --git 
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/connectors/ConnectorTroubleshootingIT.java
 
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/connectors/ConnectorTroubleshootingIT.java
index 0bc80db4391..5d60a51feb2 100644
--- 
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/connectors/ConnectorTroubleshootingIT.java
+++ 
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/connectors/ConnectorTroubleshootingIT.java
@@ -486,6 +486,11 @@ public class ConnectorTroubleshootingIT extends 
NiFiSystemIT {
         getClientUtil().endTroubleshooting(connectorId);
         assertConnectorState(connectorId, ConnectorState.STOPPED);
 
+        final ProcessGroupEntity connectorScopedChild = 
getNifiClient().getConnectorClient().getProcessGroup(connectorId, childGroupId);
+        assertEquals(childGroupId, connectorScopedChild.getId());
+        assertNotNull(connectorScopedChild.getComponent());
+        assertNotNull(connectorScopedChild.getComponent().getName());
+
         assertConflictExpected("GET processor", () -> 
getNifiClient().getProcessorClient().getProcessor(processorId));
         assertConflictExpected("GET connection", () -> 
getNifiClient().getConnectionClient().getConnection(connectionId));
         assertConflictExpected("GET input port", () -> 
getNifiClient().getInputPortClient().getInputPort(inputPortId));
diff --git 
a/nifi-toolkit/nifi-toolkit-client/src/main/java/org/apache/nifi/toolkit/client/ConnectorClient.java
 
b/nifi-toolkit/nifi-toolkit-client/src/main/java/org/apache/nifi/toolkit/client/ConnectorClient.java
index e1327ca484c..bcf3019d4ee 100644
--- 
a/nifi-toolkit/nifi-toolkit-client/src/main/java/org/apache/nifi/toolkit/client/ConnectorClient.java
+++ 
b/nifi-toolkit/nifi-toolkit-client/src/main/java/org/apache/nifi/toolkit/client/ConnectorClient.java
@@ -28,6 +28,7 @@ import org.apache.nifi.web.api.entity.ControllerServiceEntity;
 import org.apache.nifi.web.api.entity.DropRequestEntity;
 import org.apache.nifi.web.api.entity.MigrationPayloadEntity;
 import org.apache.nifi.web.api.entity.MigrationRequestEntity;
+import org.apache.nifi.web.api.entity.ProcessGroupEntity;
 import org.apache.nifi.web.api.entity.ProcessGroupFlowEntity;
 import org.apache.nifi.web.api.entity.ProcessGroupStatusEntity;
 import org.apache.nifi.web.api.entity.StatusHistoryEntity;
@@ -328,6 +329,18 @@ public interface ConnectorClient {
      */
     ProcessGroupFlowEntity getFlow(String connectorId, String processGroupId) 
throws NiFiClientException, IOException;
 
+    /**
+     * Gets a process group within a connector's managed flow. Available 
regardless of whether
+     * the Connector is in Troubleshooting mode.
+     *
+     * @param connectorId the connector ID
+     * @param processGroupId the process group ID within the connector's 
managed flow
+     * @return the process group entity
+     * @throws NiFiClientException if an error occurs during the request
+     * @throws IOException if an I/O error occurs
+     */
+    ProcessGroupEntity getProcessGroup(String connectorId, String 
processGroupId) throws NiFiClientException, IOException;
+
     /**
      * Gets the status for the process group managed by a connector.
      *
diff --git 
a/nifi-toolkit/nifi-toolkit-client/src/main/java/org/apache/nifi/toolkit/client/impl/JerseyConnectorClient.java
 
b/nifi-toolkit/nifi-toolkit-client/src/main/java/org/apache/nifi/toolkit/client/impl/JerseyConnectorClient.java
index 036aa1096d3..db57054154e 100644
--- 
a/nifi-toolkit/nifi-toolkit-client/src/main/java/org/apache/nifi/toolkit/client/impl/JerseyConnectorClient.java
+++ 
b/nifi-toolkit/nifi-toolkit-client/src/main/java/org/apache/nifi/toolkit/client/impl/JerseyConnectorClient.java
@@ -38,6 +38,7 @@ import org.apache.nifi.web.api.entity.ControllerServiceEntity;
 import org.apache.nifi.web.api.entity.DropRequestEntity;
 import org.apache.nifi.web.api.entity.MigrationPayloadEntity;
 import org.apache.nifi.web.api.entity.MigrationRequestEntity;
+import org.apache.nifi.web.api.entity.ProcessGroupEntity;
 import org.apache.nifi.web.api.entity.ProcessGroupFlowEntity;
 import org.apache.nifi.web.api.entity.ProcessGroupStatusEntity;
 import org.apache.nifi.web.api.entity.StatusHistoryEntity;
@@ -588,6 +589,25 @@ public class JerseyConnectorClient extends 
AbstractJerseyClient implements Conne
         });
     }
 
+    @Override
+    public ProcessGroupEntity getProcessGroup(final String connectorId, final 
String processGroupId) throws NiFiClientException, IOException {
+        if (StringUtils.isBlank(connectorId)) {
+            throw new IllegalArgumentException("Connector id cannot be null or 
blank");
+        }
+        if (StringUtils.isBlank(processGroupId)) {
+            throw new IllegalArgumentException("Process group id cannot be 
null or blank");
+        }
+
+        return executeAction("Error retrieving process group for Connector " + 
connectorId, () -> {
+            final WebTarget target = connectorTarget
+                .path("/process-groups/{processGroupId}")
+                .resolveTemplate("id", connectorId)
+                .resolveTemplate("processGroupId", processGroupId);
+
+            return getRequestBuilder(target).get(ProcessGroupEntity.class);
+        });
+    }
+
     @Override
     public ProcessGroupStatusEntity getStatus(final String connectorId, final 
boolean recursive) throws NiFiClientException, IOException {
         Objects.requireNonNull(connectorId, "Connector ID required");

Reply via email to