You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mc...@apache.org on 2018/09/19 19:30:07 UTC
[2/4] nifi git commit: NIFI-375: Added operation policy
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowResource.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowResource.java
index 80a78b0..aaa2027 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowResource.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowResource.java
@@ -26,6 +26,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.nifi.authorization.Authorizer;
import org.apache.nifi.authorization.RequestAction;
import org.apache.nifi.authorization.resource.Authorizable;
+import org.apache.nifi.authorization.resource.OperationAuthorizable;
import org.apache.nifi.authorization.user.NiFiUser;
import org.apache.nifi.authorization.user.NiFiUserUtils;
import org.apache.nifi.bundle.Bundle;
@@ -378,7 +379,7 @@ public class FlowResource extends ApplicationResource {
// -------------------
/**
- * Retrieves all the of controller services in this NiFi.
+ * Retrieves controller services for reporting tasks in this NiFi.
*
* @return A controllerServicesEntity.
*/
@@ -387,7 +388,7 @@ public class FlowResource extends ApplicationResource {
@Produces(MediaType.APPLICATION_JSON)
@Path("controller/controller-services")
@ApiOperation(
- value = "Gets all controller services",
+ value = "Gets controller services for reporting tasks",
response = ControllerServicesEntity.class,
authorizations = {
@Authorization(value = "Read - /flow")
@@ -537,7 +538,7 @@ public class FlowResource extends ApplicationResource {
response = ScheduleComponentsEntity.class,
authorizations = {
@Authorization(value = "Read - /flow"),
- @Authorization(value = "Write - /{component-type}/{uuid} - For every component being scheduled/unscheduled")
+ @Authorization(value = "Write - /{component-type}/{uuid} or /operation/{component-type}/{uuid} - For every component being scheduled/unscheduled")
}
)
@ApiResponses(
@@ -626,7 +627,7 @@ public class FlowResource extends ApplicationResource {
// ensure authorized for each processor we will attempt to schedule
group.findAllProcessors().stream()
.filter(getProcessorFilter.get())
- .filter(processor -> processor.isAuthorized(authorizer, RequestAction.WRITE, NiFiUserUtils.getNiFiUser()))
+ .filter(processor -> OperationAuthorizable.isOperationAuthorized(processor, authorizer, NiFiUserUtils.getNiFiUser()))
.forEach(processor -> {
componentIds.add(processor.getIdentifier());
});
@@ -634,7 +635,7 @@ public class FlowResource extends ApplicationResource {
// ensure authorized for each input port we will attempt to schedule
group.findAllInputPorts().stream()
.filter(getPortFilter.get())
- .filter(inputPort -> inputPort.isAuthorized(authorizer, RequestAction.WRITE, NiFiUserUtils.getNiFiUser()))
+ .filter(inputPort -> OperationAuthorizable.isOperationAuthorized(inputPort, authorizer, NiFiUserUtils.getNiFiUser()))
.forEach(inputPort -> {
componentIds.add(inputPort.getIdentifier());
});
@@ -642,7 +643,7 @@ public class FlowResource extends ApplicationResource {
// ensure authorized for each output port we will attempt to schedule
group.findAllOutputPorts().stream()
.filter(getPortFilter.get())
- .filter(outputPort -> outputPort.isAuthorized(authorizer, RequestAction.WRITE, NiFiUserUtils.getNiFiUser()))
+ .filter(outputPort -> OperationAuthorizable.isOperationAuthorized(outputPort, authorizer, NiFiUserUtils.getNiFiUser()))
.forEach(outputPort -> {
componentIds.add(outputPort.getIdentifier());
});
@@ -685,7 +686,7 @@ public class FlowResource extends ApplicationResource {
// ensure access to every component being scheduled
requestComponentsToSchedule.keySet().forEach(componentId -> {
final Authorizable connectable = lookup.getLocalConnectable(componentId);
- connectable.authorize(authorizer, RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
+ OperationAuthorizable.authorizeOperation(connectable, authorizer, NiFiUserUtils.getNiFiUser());
});
},
() -> {
@@ -730,7 +731,7 @@ public class FlowResource extends ApplicationResource {
response = ActivateControllerServicesEntity.class,
authorizations = {
@Authorization(value = "Read - /flow"),
- @Authorization(value = "Write - /{component-type}/{uuid} - For every service being enabled/disabled")
+ @Authorization(value = "Write - /{component-type}/{uuid} or /operation/{component-type}/{uuid} - For every service being enabled/disabled")
})
@ApiResponses(
value = {
@@ -787,7 +788,7 @@ public class FlowResource extends ApplicationResource {
group.findAllControllerServices().stream()
.filter(filter)
- .filter(service -> service.isAuthorized(authorizer, RequestAction.WRITE, NiFiUserUtils.getNiFiUser()))
+ .filter(service -> OperationAuthorizable.isOperationAuthorized(service, authorizer, NiFiUserUtils.getNiFiUser()))
.forEach(service -> componentIds.add(service.getIdentifier()));
return componentIds;
});
@@ -827,7 +828,7 @@ public class FlowResource extends ApplicationResource {
// ensure access to every component being scheduled
requestComponentsToSchedule.keySet().forEach(componentId -> {
final Authorizable authorizable = lookup.getControllerService(componentId).getAuthorizable();
- authorizable.authorize(authorizer, RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
+ OperationAuthorizable.authorizeOperation(authorizable, authorizer, NiFiUserUtils.getNiFiUser());
});
},
() -> serviceFacade.verifyActivateControllerServices(id, desiredState, requestComponentRevisions.keySet()),
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/InputPortResource.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/InputPortResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/InputPortResource.java
index 133da91..d63080a 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/InputPortResource.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/InputPortResource.java
@@ -26,12 +26,16 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.nifi.authorization.Authorizer;
import org.apache.nifi.authorization.RequestAction;
import org.apache.nifi.authorization.resource.Authorizable;
+import org.apache.nifi.authorization.resource.OperationAuthorizable;
+import org.apache.nifi.authorization.user.NiFiUser;
import org.apache.nifi.authorization.user.NiFiUserUtils;
import org.apache.nifi.web.NiFiServiceFacade;
import org.apache.nifi.web.Revision;
import org.apache.nifi.web.api.dto.PortDTO;
import org.apache.nifi.web.api.dto.PositionDTO;
import org.apache.nifi.web.api.entity.PortEntity;
+import org.apache.nifi.web.api.entity.PortRunStatusEntity;
+import org.apache.nifi.web.api.entity.ProcessorEntity;
import org.apache.nifi.web.api.request.ClientIdParameter;
import org.apache.nifi.web.api.request.LongParameter;
@@ -315,6 +319,92 @@ public class InputPortResource extends ApplicationResource {
);
}
+ /**
+ * Updates the operational status for the specified input port with the specified values.
+ *
+ * @param httpServletRequest request
+ * @param id The id of the port to update.
+ * @param requestRunStatus A portRunStatusEntity.
+ * @return A portEntity.
+ */
+ @PUT
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("/{id}/run-status")
+ @ApiOperation(
+ value = "Updates run status of an input-port",
+ response = ProcessorEntity.class,
+ authorizations = {
+ @Authorization(value = "Write - /input-ports/{uuid} or /operation/input-ports/{uuid}")
+ }
+ )
+ @ApiResponses(
+ value = {
+ @ApiResponse(code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."),
+ @ApiResponse(code = 401, message = "Client could not be authenticated."),
+ @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
+ @ApiResponse(code = 404, message = "The specified resource could not be found."),
+ @ApiResponse(code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.")
+ }
+ )
+ public Response updateRunStatus(
+ @Context final HttpServletRequest httpServletRequest,
+ @ApiParam(
+ value = "The port id.",
+ required = true
+ )
+ @PathParam("id") final String id,
+ @ApiParam(
+ value = "The port run status.",
+ required = true
+ ) final PortRunStatusEntity requestRunStatus) {
+
+ if (requestRunStatus == null) {
+ throw new IllegalArgumentException("Port run status must be specified.");
+ }
+
+ if (requestRunStatus.getRevision() == null) {
+ throw new IllegalArgumentException("Revision must be specified.");
+ }
+
+ requestRunStatus.validateState();
+
+ if (isReplicateRequest()) {
+ return replicate(HttpMethod.PUT, requestRunStatus);
+ } else if (isDisconnectedFromCluster()) {
+ verifyDisconnectedNodeModification(requestRunStatus.isDisconnectedNodeAcknowledged());
+ }
+
+ // handle expects request (usually from the cluster manager)
+ final Revision requestRevision = getRevision(requestRunStatus.getRevision(), id);
+ return withWriteLock(
+ serviceFacade,
+ requestRunStatus,
+ requestRevision,
+ lookup -> {
+ final NiFiUser user = NiFiUserUtils.getNiFiUser();
+
+ final Authorizable authorizable = lookup.getInputPort(id);
+ OperationAuthorizable.authorizeOperation(authorizable, authorizer, user);
+ },
+ () -> serviceFacade.verifyUpdateInputPort(createDTOWithDesiredRunStatus(id, requestRunStatus.getState())),
+ (revision, runStatusEntity) -> {
+ // update the input port
+ final PortEntity entity = serviceFacade.updateInputPort(revision, createDTOWithDesiredRunStatus(id, runStatusEntity.getState()));
+ populateRemainingInputPortEntityContent(entity);
+
+ return generateOkResponse(entity).build();
+ }
+ );
+ }
+
+ private PortDTO createDTOWithDesiredRunStatus(final String id, final String runStatus) {
+ final PortDTO dto = new PortDTO();
+ dto.setId(id);
+ dto.setState(runStatus);
+ return dto;
+ }
+
// setters
public void setServiceFacade(NiFiServiceFacade serviceFacade) {
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/OutputPortResource.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/OutputPortResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/OutputPortResource.java
index d3ff063..955d9db 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/OutputPortResource.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/OutputPortResource.java
@@ -26,12 +26,16 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.nifi.authorization.Authorizer;
import org.apache.nifi.authorization.RequestAction;
import org.apache.nifi.authorization.resource.Authorizable;
+import org.apache.nifi.authorization.resource.OperationAuthorizable;
+import org.apache.nifi.authorization.user.NiFiUser;
import org.apache.nifi.authorization.user.NiFiUserUtils;
import org.apache.nifi.web.NiFiServiceFacade;
import org.apache.nifi.web.Revision;
import org.apache.nifi.web.api.dto.PortDTO;
import org.apache.nifi.web.api.dto.PositionDTO;
import org.apache.nifi.web.api.entity.PortEntity;
+import org.apache.nifi.web.api.entity.PortRunStatusEntity;
+import org.apache.nifi.web.api.entity.ProcessorEntity;
import org.apache.nifi.web.api.request.ClientIdParameter;
import org.apache.nifi.web.api.request.LongParameter;
@@ -315,6 +319,93 @@ public class OutputPortResource extends ApplicationResource {
);
}
+
+ /**
+ * Updates the operational status for the specified input port with the specified values.
+ *
+ * @param httpServletRequest request
+ * @param id The id of the port to update.
+ * @param requestRunStatus A portRunStatusEntity.
+ * @return A portEntity.
+ */
+ @PUT
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("/{id}/run-status")
+ @ApiOperation(
+ value = "Updates run status of an output-port",
+ response = ProcessorEntity.class,
+ authorizations = {
+ @Authorization(value = "Write - /output-ports/{uuid} or /operation/output-ports/{uuid}")
+ }
+ )
+ @ApiResponses(
+ value = {
+ @ApiResponse(code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."),
+ @ApiResponse(code = 401, message = "Client could not be authenticated."),
+ @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
+ @ApiResponse(code = 404, message = "The specified resource could not be found."),
+ @ApiResponse(code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.")
+ }
+ )
+ public Response updateRunStatus(
+ @Context final HttpServletRequest httpServletRequest,
+ @ApiParam(
+ value = "The port id.",
+ required = true
+ )
+ @PathParam("id") final String id,
+ @ApiParam(
+ value = "The port run status.",
+ required = true
+ ) final PortRunStatusEntity requestRunStatus) {
+
+ if (requestRunStatus == null) {
+ throw new IllegalArgumentException("Port run status must be specified.");
+ }
+
+ if (requestRunStatus.getRevision() == null) {
+ throw new IllegalArgumentException("Revision must be specified.");
+ }
+
+ requestRunStatus.validateState();
+
+ if (isReplicateRequest()) {
+ return replicate(HttpMethod.PUT, requestRunStatus);
+ } else if (isDisconnectedFromCluster()) {
+ verifyDisconnectedNodeModification(requestRunStatus.isDisconnectedNodeAcknowledged());
+ }
+
+ // handle expects request (usually from the cluster manager)
+ final Revision requestRevision = getRevision(requestRunStatus.getRevision(), id);
+ return withWriteLock(
+ serviceFacade,
+ requestRunStatus,
+ requestRevision,
+ lookup -> {
+ final NiFiUser user = NiFiUserUtils.getNiFiUser();
+
+ final Authorizable authorizable = lookup.getOutputPort(id);
+ OperationAuthorizable.authorizeOperation(authorizable, authorizer, user);
+ },
+ () -> serviceFacade.verifyUpdateOutputPort(createDTOWithDesiredRunStatus(id, requestRunStatus.getState())),
+ (revision, runStatusEntity) -> {
+ // update the input port
+ final PortEntity entity = serviceFacade.updateOutputPort(revision, createDTOWithDesiredRunStatus(id, runStatusEntity.getState()));
+ populateRemainingOutputPortEntityContent(entity);
+
+ return generateOkResponse(entity).build();
+ }
+ );
+ }
+
+ private PortDTO createDTOWithDesiredRunStatus(final String id, final String runStatus) {
+ final PortDTO dto = new PortDTO();
+ dto.setId(id);
+ dto.setState(runStatus);
+ return dto;
+ }
+
// setters
public void setServiceFacade(NiFiServiceFacade serviceFacade) {
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
index 5229f69..0d29d60 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
@@ -28,6 +28,7 @@ import org.apache.nifi.authorization.Authorizer;
import org.apache.nifi.authorization.ComponentAuthorizable;
import org.apache.nifi.authorization.RequestAction;
import org.apache.nifi.authorization.resource.Authorizable;
+import org.apache.nifi.authorization.resource.OperationAuthorizable;
import org.apache.nifi.authorization.user.NiFiUser;
import org.apache.nifi.authorization.user.NiFiUserUtils;
import org.apache.nifi.ui.extension.UiExtension;
@@ -44,6 +45,7 @@ import org.apache.nifi.web.api.dto.PropertyDescriptorDTO;
import org.apache.nifi.web.api.entity.ComponentStateEntity;
import org.apache.nifi.web.api.entity.ProcessorDiagnosticsEntity;
import org.apache.nifi.web.api.entity.ProcessorEntity;
+import org.apache.nifi.web.api.entity.ProcessorRunStatusEntity;
import org.apache.nifi.web.api.entity.PropertyDescriptorEntity;
import org.apache.nifi.web.api.request.ClientIdParameter;
import org.apache.nifi.web.api.request.LongParameter;
@@ -214,7 +216,7 @@ public class ProcessorResource extends ApplicationResource {
@Produces(MediaType.APPLICATION_JSON)
@Path("/{id}/threads")
@ApiOperation(value = "Terminates a processor, essentially \"deleting\" its threads and any active tasks", response = ProcessorEntity.class, authorizations = {
- @Authorization(value = "Write - /processors/{uuid}")
+ @Authorization(value = "Write - /processors/{uuid} or /operation/processors/{uuid}")
})
@ApiResponses(value = {
@ApiResponse(code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."),
@@ -238,7 +240,7 @@ public class ProcessorResource extends ApplicationResource {
requestProcessorEntity,
lookup -> {
final Authorizable authorizable = lookup.getProcessor(id).getAuthorizable();
- authorizable.authorize(authorizer, RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
+ OperationAuthorizable.authorizeOperation(authorizable, authorizer, NiFiUserUtils.getNiFiUser());
},
() -> serviceFacade.verifyTerminateProcessor(id),
processorEntity -> {
@@ -668,6 +670,93 @@ public class ProcessorResource extends ApplicationResource {
);
}
+ /**
+ * Updates the operational status for the specified processor with the specified values.
+ *
+ * @param httpServletRequest request
+ * @param id The id of the processor to update.
+ * @param requestRunStatus A processorEntity.
+ * @return A processorEntity.
+ * @throws InterruptedException if interrupted
+ */
+ @PUT
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("/{id}/run-status")
+ @ApiOperation(
+ value = "Updates run status of a processor",
+ response = ProcessorEntity.class,
+ authorizations = {
+ @Authorization(value = "Write - /processors/{uuid} or /operation/processors/{uuid}")
+ }
+ )
+ @ApiResponses(
+ value = {
+ @ApiResponse(code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."),
+ @ApiResponse(code = 401, message = "Client could not be authenticated."),
+ @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
+ @ApiResponse(code = 404, message = "The specified resource could not be found."),
+ @ApiResponse(code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.")
+ }
+ )
+ public Response updateRunStatus(
+ @Context final HttpServletRequest httpServletRequest,
+ @ApiParam(
+ value = "The processor id.",
+ required = true
+ )
+ @PathParam("id") final String id,
+ @ApiParam(
+ value = "The processor run status.",
+ required = true
+ ) final ProcessorRunStatusEntity requestRunStatus) {
+
+ if (requestRunStatus == null) {
+ throw new IllegalArgumentException("Processor run status must be specified.");
+ }
+
+ if (requestRunStatus.getRevision() == null) {
+ throw new IllegalArgumentException("Revision must be specified.");
+ }
+
+ requestRunStatus.validateState();
+
+ if (isReplicateRequest()) {
+ return replicate(HttpMethod.PUT, requestRunStatus);
+ } else if (isDisconnectedFromCluster()) {
+ verifyDisconnectedNodeModification(requestRunStatus.isDisconnectedNodeAcknowledged());
+ }
+
+ // handle expects request (usually from the cluster manager)
+ final Revision requestRevision = getRevision(requestRunStatus.getRevision(), id);
+ return withWriteLock(
+ serviceFacade,
+ requestRunStatus,
+ requestRevision,
+ lookup -> {
+ final NiFiUser user = NiFiUserUtils.getNiFiUser();
+
+ final Authorizable authorizable = lookup.getProcessor(id).getAuthorizable();
+ OperationAuthorizable.authorizeOperation(authorizable, authorizer, user);
+ },
+ () -> serviceFacade.verifyUpdateProcessor(createDTOWithDesiredRunStatus(id, requestRunStatus.getState())),
+ (revision, runStatusEntity) -> {
+ // update the processor
+ final ProcessorEntity entity = serviceFacade.updateProcessor(revision, createDTOWithDesiredRunStatus(id, runStatusEntity.getState()));
+ populateRemainingProcessorEntityContent(entity);
+
+ return generateOkResponse(entity).build();
+ }
+ );
+ }
+
+ private ProcessorDTO createDTOWithDesiredRunStatus(final String id, final String runStatus) {
+ final ProcessorDTO dto = new ProcessorDTO();
+ dto.setId(id);
+ dto.setState(runStatus);
+ return dto;
+ }
+
// setters
public void setServiceFacade(NiFiServiceFacade serviceFacade) {
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/RemoteProcessGroupResource.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/RemoteProcessGroupResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/RemoteProcessGroupResource.java
index 79c5aaf..f034082 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/RemoteProcessGroupResource.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/RemoteProcessGroupResource.java
@@ -26,6 +26,7 @@ import org.apache.commons.lang3.StringUtils;
import org.apache.nifi.authorization.Authorizer;
import org.apache.nifi.authorization.RequestAction;
import org.apache.nifi.authorization.resource.Authorizable;
+import org.apache.nifi.authorization.resource.OperationAuthorizable;
import org.apache.nifi.authorization.user.NiFiUserUtils;
import org.apache.nifi.web.NiFiServiceFacade;
import org.apache.nifi.web.Revision;
@@ -33,6 +34,7 @@ import org.apache.nifi.web.api.dto.PositionDTO;
import org.apache.nifi.web.api.dto.RemoteProcessGroupDTO;
import org.apache.nifi.web.api.dto.RemoteProcessGroupPortDTO;
import org.apache.nifi.web.api.dto.RevisionDTO;
+import org.apache.nifi.web.api.entity.RemotePortRunStatusEntity;
import org.apache.nifi.web.api.entity.RemoteProcessGroupEntity;
import org.apache.nifi.web.api.entity.RemoteProcessGroupPortEntity;
import org.apache.nifi.web.api.request.ClientIdParameter;
@@ -435,6 +437,197 @@ public class RemoteProcessGroupResource extends ApplicationResource {
}
/**
+ * Updates the specified remote process group input port run status.
+ *
+ * @param httpServletRequest request
+ * @param id The id of the remote process group to update.
+ * @param portId The id of the input port to update.
+ * @param requestRemotePortRunStatusEntity The remoteProcessGroupPortRunStatusEntity
+ * @return A remoteProcessGroupPortEntity
+ */
+ @PUT
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("{id}/input-ports/{port-id}/run-status")
+ @ApiOperation(
+ value = "Updates run status of a remote port",
+ notes = NON_GUARANTEED_ENDPOINT,
+ response = RemoteProcessGroupPortEntity.class,
+ authorizations = {
+ @Authorization(value = "Write - /remote-process-groups/{uuid} or /operation/remote-process-groups/{uuid}")
+ }
+ )
+ @ApiResponses(
+ value = {
+ @ApiResponse(code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."),
+ @ApiResponse(code = 401, message = "Client could not be authenticated."),
+ @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
+ @ApiResponse(code = 404, message = "The specified resource could not be found."),
+ @ApiResponse(code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.")
+ }
+ )
+ public Response updateRemoteProcessGroupInputPortRunStatus(
+ @Context final HttpServletRequest httpServletRequest,
+ @ApiParam(
+ value = "The remote process group id.",
+ required = true
+ )
+ @PathParam("id") final String id,
+ @ApiParam(
+ value = "The remote process group port id.",
+ required = true
+ )
+ @PathParam("port-id") final String portId,
+ @ApiParam(
+ value = "The remote process group port.",
+ required = true
+ ) final RemotePortRunStatusEntity requestRemotePortRunStatusEntity) {
+
+ if (requestRemotePortRunStatusEntity == null) {
+ throw new IllegalArgumentException("Remote process group port run status must be specified.");
+ }
+
+ if (requestRemotePortRunStatusEntity.getRevision() == null) {
+ throw new IllegalArgumentException("Revision must be specified.");
+ }
+
+ requestRemotePortRunStatusEntity.validateState();
+
+ if (isReplicateRequest()) {
+ return replicate(HttpMethod.PUT, requestRemotePortRunStatusEntity);
+ } else if (isDisconnectedFromCluster()) {
+ verifyDisconnectedNodeModification(requestRemotePortRunStatusEntity.isDisconnectedNodeAcknowledged());
+ }
+
+ final Revision requestRevision = getRevision(requestRemotePortRunStatusEntity.getRevision(), id);
+ return withWriteLock(
+ serviceFacade,
+ requestRemotePortRunStatusEntity,
+ requestRevision,
+ lookup -> {
+ final Authorizable remoteProcessGroup = lookup.getRemoteProcessGroup(id);
+ OperationAuthorizable.authorizeOperation(remoteProcessGroup, authorizer, NiFiUserUtils.getNiFiUser());
+ },
+ () -> serviceFacade.verifyUpdateRemoteProcessGroupInputPort(id, createPortDTOWithDesiredRunStatus(portId, id, requestRemotePortRunStatusEntity)),
+ (revision, remotePortRunStatusEntity) -> {
+ // update the specified remote process group
+ final RemoteProcessGroupPortEntity controllerResponse = serviceFacade.updateRemoteProcessGroupInputPort(revision, id,
+ createPortDTOWithDesiredRunStatus(portId, id, remotePortRunStatusEntity));
+
+ // get the updated revision
+ final RevisionDTO updatedRevision = controllerResponse.getRevision();
+
+ // build the response entity
+ final RemoteProcessGroupPortEntity entity = new RemoteProcessGroupPortEntity();
+ entity.setRevision(updatedRevision);
+ entity.setRemoteProcessGroupPort(controllerResponse.getRemoteProcessGroupPort());
+
+ return generateOkResponse(entity).build();
+ }
+ );
+ }
+
+ private RemoteProcessGroupPortDTO createPortDTOWithDesiredRunStatus(final String portId, final String groupId, final RemotePortRunStatusEntity entity) {
+ final RemoteProcessGroupPortDTO dto = new RemoteProcessGroupPortDTO();
+ dto.setId(portId);
+ dto.setGroupId(groupId);
+ dto.setTransmitting(shouldTransmit(entity));
+ return dto;
+ }
+
+ /**
+ * Updates the specified remote process group output port run status.
+ *
+ * @param httpServletRequest request
+ * @param id The id of the remote process group to update.
+ * @param portId The id of the output port to update.
+ * @param requestRemotePortRunStatusEntity The remoteProcessGroupPortEntity
+ * @return A remoteProcessGroupPortEntity
+ */
+ @PUT
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("{id}/output-ports/{port-id}/run-status")
+ @ApiOperation(
+ value = "Updates run status of a remote port",
+ notes = NON_GUARANTEED_ENDPOINT,
+ response = RemoteProcessGroupPortEntity.class,
+ authorizations = {
+ @Authorization(value = "Write - /remote-process-groups/{uuid} or /operation/remote-process-groups/{uuid}")
+ }
+ )
+ @ApiResponses(
+ value = {
+ @ApiResponse(code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."),
+ @ApiResponse(code = 401, message = "Client could not be authenticated."),
+ @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
+ @ApiResponse(code = 404, message = "The specified resource could not be found."),
+ @ApiResponse(code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.")
+ }
+ )
+ public Response updateRemoteProcessGroupOutputPortRunStatus(
+ @Context HttpServletRequest httpServletRequest,
+ @ApiParam(
+ value = "The remote process group id.",
+ required = true
+ )
+ @PathParam("id") String id,
+ @ApiParam(
+ value = "The remote process group port id.",
+ required = true
+ )
+ @PathParam("port-id") String portId,
+ @ApiParam(
+ value = "The remote process group port.",
+ required = true
+ ) RemotePortRunStatusEntity requestRemotePortRunStatusEntity) {
+
+ if (requestRemotePortRunStatusEntity == null) {
+ throw new IllegalArgumentException("Remote process group port run status must be specified.");
+ }
+
+ if (requestRemotePortRunStatusEntity.getRevision() == null) {
+ throw new IllegalArgumentException("Revision must be specified.");
+ }
+
+ requestRemotePortRunStatusEntity.validateState();
+
+ if (isReplicateRequest()) {
+ return replicate(HttpMethod.PUT, requestRemotePortRunStatusEntity);
+ } else if (isDisconnectedFromCluster()) {
+ verifyDisconnectedNodeModification(requestRemotePortRunStatusEntity.isDisconnectedNodeAcknowledged());
+ }
+
+ // handle expects request (usually from the cluster manager)
+ final Revision requestRevision = getRevision(requestRemotePortRunStatusEntity.getRevision(), id);
+ return withWriteLock(
+ serviceFacade,
+ requestRemotePortRunStatusEntity,
+ requestRevision,
+ lookup -> {
+ final Authorizable remoteProcessGroup = lookup.getRemoteProcessGroup(id);
+ OperationAuthorizable.authorizeOperation(remoteProcessGroup, authorizer, NiFiUserUtils.getNiFiUser());
+ },
+ () -> serviceFacade.verifyUpdateRemoteProcessGroupOutputPort(id, createPortDTOWithDesiredRunStatus(portId, id, requestRemotePortRunStatusEntity)),
+ (revision, remotePortRunStatusEntity) -> {
+ // update the specified remote process group
+ final RemoteProcessGroupPortEntity controllerResponse = serviceFacade.updateRemoteProcessGroupOutputPort(revision, id,
+ createPortDTOWithDesiredRunStatus(portId, id, remotePortRunStatusEntity));
+
+ // get the updated revision
+ final RevisionDTO updatedRevision = controllerResponse.getRevision();
+
+ // build the response entity
+ RemoteProcessGroupPortEntity entity = new RemoteProcessGroupPortEntity();
+ entity.setRevision(updatedRevision);
+ entity.setRemoteProcessGroupPort(controllerResponse.getRemoteProcessGroupPort());
+
+ return generateOkResponse(entity).build();
+ }
+ );
+ }
+
+ /**
* Updates the specified remote process group.
*
* @param httpServletRequest request
@@ -557,6 +750,95 @@ public class RemoteProcessGroupResource extends ApplicationResource {
);
}
+ /**
+ * Updates the operational status for the specified remote process group with the specified value.
+ *
+ * @param httpServletRequest request
+ * @param id The id of the remote process group to update.
+ * @param requestRemotePortRunStatusEntity A remotePortRunStatusEntity.
+ * @return A remoteProcessGroupEntity.
+ */
+ @PUT
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("{id}/run-status")
+ @ApiOperation(
+ value = "Updates run status of a remote process group",
+ response = RemoteProcessGroupEntity.class,
+ authorizations = {
+ @Authorization(value = "Write - /remote-process-groups/{uuid} or /operation/remote-process-groups/{uuid}")
+ }
+ )
+ @ApiResponses(
+ value = {
+ @ApiResponse(code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."),
+ @ApiResponse(code = 401, message = "Client could not be authenticated."),
+ @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
+ @ApiResponse(code = 404, message = "The specified resource could not be found."),
+ @ApiResponse(code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.")
+ }
+ )
+ public Response updateRemoteProcessGroupRunStatus(
+ @Context HttpServletRequest httpServletRequest,
+ @ApiParam(
+ value = "The remote process group id.",
+ required = true
+ )
+ @PathParam("id") String id,
+ @ApiParam(
+ value = "The remote process group run status.",
+ required = true
+ ) final RemotePortRunStatusEntity requestRemotePortRunStatusEntity) {
+
+ if (requestRemotePortRunStatusEntity == null) {
+ throw new IllegalArgumentException("Remote process group run status must be specified.");
+ }
+
+ if (requestRemotePortRunStatusEntity.getRevision() == null) {
+ throw new IllegalArgumentException("Revision must be specified.");
+ }
+
+ requestRemotePortRunStatusEntity.validateState();
+
+ if (isReplicateRequest()) {
+ return replicate(HttpMethod.PUT, requestRemotePortRunStatusEntity);
+ } else if (isDisconnectedFromCluster()) {
+ verifyDisconnectedNodeModification(requestRemotePortRunStatusEntity.isDisconnectedNodeAcknowledged());
+ }
+
+ // handle expects request (usually from the cluster manager)
+ final Revision requestRevision = getRevision(requestRemotePortRunStatusEntity.getRevision(), id);
+ return withWriteLock(
+ serviceFacade,
+ requestRemotePortRunStatusEntity,
+ requestRevision,
+ lookup -> {
+ Authorizable authorizable = lookup.getRemoteProcessGroup(id);
+ OperationAuthorizable.authorizeOperation(authorizable, authorizer, NiFiUserUtils.getNiFiUser());
+ },
+ () -> serviceFacade.verifyUpdateRemoteProcessGroup(createDTOWithDesiredRunStatus(id, requestRemotePortRunStatusEntity)),
+ (revision, remotePortRunStatusEntity) -> {
+ // update the specified remote process group
+ final RemoteProcessGroupEntity entity = serviceFacade.updateRemoteProcessGroup(revision, createDTOWithDesiredRunStatus(id, remotePortRunStatusEntity));
+ populateRemainingRemoteProcessGroupEntityContent(entity);
+
+ return generateOkResponse(entity).build();
+ }
+ );
+ }
+
+ private RemoteProcessGroupDTO createDTOWithDesiredRunStatus(final String id, final RemotePortRunStatusEntity entity) {
+ final RemoteProcessGroupDTO dto = new RemoteProcessGroupDTO();
+ dto.setId(id);
+ dto.setTransmitting(shouldTransmit(entity));
+ return dto;
+ }
+
+
+ private boolean shouldTransmit(RemotePortRunStatusEntity requestRemotePortRunStatusEntity) {
+ return "TRANSMITTING".equals(requestRemotePortRunStatusEntity.getState());
+ }
+
// setters
public void setServiceFacade(NiFiServiceFacade serviceFacade) {
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
index 278c372..2c516c4 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
@@ -28,6 +28,7 @@ import org.apache.nifi.authorization.Authorizer;
import org.apache.nifi.authorization.ComponentAuthorizable;
import org.apache.nifi.authorization.RequestAction;
import org.apache.nifi.authorization.resource.Authorizable;
+import org.apache.nifi.authorization.resource.OperationAuthorizable;
import org.apache.nifi.authorization.user.NiFiUserUtils;
import org.apache.nifi.ui.extension.UiExtension;
import org.apache.nifi.ui.extension.UiExtensionMapping;
@@ -41,6 +42,7 @@ import org.apache.nifi.web.api.dto.ReportingTaskDTO;
import org.apache.nifi.web.api.entity.ComponentStateEntity;
import org.apache.nifi.web.api.entity.PropertyDescriptorEntity;
import org.apache.nifi.web.api.entity.ReportingTaskEntity;
+import org.apache.nifi.web.api.entity.ReportingTaskRunStatusEntity;
import org.apache.nifi.web.api.request.ClientIdParameter;
import org.apache.nifi.web.api.request.LongParameter;
@@ -113,6 +115,9 @@ public class ReportingTaskResource extends ApplicationResource {
*/
public ReportingTaskDTO populateRemainingReportingTaskContent(final ReportingTaskDTO reportingTask) {
final BundleDTO bundle = reportingTask.getBundle();
+ if (bundle == null) {
+ return reportingTask;
+ }
// see if this processor has any ui extensions
final UiExtensionMapping uiExtensionMapping = (UiExtensionMapping) servletContext.getAttribute("nifi-ui-extensions");
@@ -542,6 +547,91 @@ public class ReportingTaskResource extends ApplicationResource {
);
}
+ /**
+ * Updates the operational status for the specified ReportingTask with the specified values.
+ *
+ * @param httpServletRequest request
+ * @param id The id of the reporting task to update.
+ * @param requestRunStatus A runStatusEntity.
+ * @return A reportingTaskEntity.
+ */
+ @PUT
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Path("{id}/run-status")
+ @ApiOperation(
+ value = "Updates run status of a reporting task",
+ response = ReportingTaskEntity.class,
+ authorizations = {
+ @Authorization(value = "Write - /reporting-tasks/{uuid} or or /operation/reporting-tasks/{uuid}")
+ }
+ )
+ @ApiResponses(
+ value = {
+ @ApiResponse(code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."),
+ @ApiResponse(code = 401, message = "Client could not be authenticated."),
+ @ApiResponse(code = 403, message = "Client is not authorized to make this request."),
+ @ApiResponse(code = 404, message = "The specified resource could not be found."),
+ @ApiResponse(code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.")
+ }
+ )
+ public Response updateRunStatus(
+ @Context final HttpServletRequest httpServletRequest,
+ @ApiParam(
+ value = "The reporting task id.",
+ required = true
+ )
+ @PathParam("id") final String id,
+ @ApiParam(
+ value = "The reporting task run status.",
+ required = true
+ ) final ReportingTaskRunStatusEntity requestRunStatus) {
+
+ if (requestRunStatus == null) {
+ throw new IllegalArgumentException("Reporting task run status must be specified.");
+ }
+
+ if (requestRunStatus.getRevision() == null) {
+ throw new IllegalArgumentException("Revision must be specified.");
+ }
+
+ requestRunStatus.validateState();
+
+ if (isReplicateRequest()) {
+ return replicate(HttpMethod.PUT, requestRunStatus);
+ } else if (isDisconnectedFromCluster()) {
+ verifyDisconnectedNodeModification(requestRunStatus.isDisconnectedNodeAcknowledged());
+ }
+
+ // handle expects request (usually from the cluster manager)
+ final Revision requestRevision = getRevision(requestRunStatus.getRevision(), id);
+ return withWriteLock(
+ serviceFacade,
+ requestRunStatus,
+ requestRevision,
+ lookup -> {
+ // authorize reporting task
+ final Authorizable authorizable = lookup.getReportingTask(id).getAuthorizable();
+ OperationAuthorizable.authorizeOperation(authorizable, authorizer, NiFiUserUtils.getNiFiUser());
+ },
+ () -> serviceFacade.verifyUpdateReportingTask(createDTOWithDesiredRunStatus(id, requestRunStatus.getState())),
+ (revision, reportingTaskRunStatusEntity) -> {
+ // update the reporting task
+ final ReportingTaskEntity entity = serviceFacade.updateReportingTask(revision, createDTOWithDesiredRunStatus(id, reportingTaskRunStatusEntity.getState()));
+ populateRemainingReportingTaskEntityContent(entity);
+
+ return generateOkResponse(entity).build();
+ }
+ );
+ }
+
+ private ReportingTaskDTO createDTOWithDesiredRunStatus(final String id, final String runStatus) {
+ final ReportingTaskDTO dto = new ReportingTaskDTO();
+ dto.setId(id);
+ dto.setState(runStatus);
+ return dto;
+ }
+
// setters
public void setServiceFacade(NiFiServiceFacade serviceFacade) {
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
index 4016d66..6c2c3bc 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
@@ -49,6 +49,7 @@ import org.apache.nifi.authorization.Resource;
import org.apache.nifi.authorization.User;
import org.apache.nifi.authorization.resource.Authorizable;
import org.apache.nifi.authorization.resource.ComponentAuthorizable;
+import org.apache.nifi.authorization.resource.OperationAuthorizable;
import org.apache.nifi.authorization.user.NiFiUser;
import org.apache.nifi.authorization.user.NiFiUserUtils;
import org.apache.nifi.bundle.Bundle;
@@ -945,7 +946,7 @@ public final class DtoFactory {
}
- public RemoteProcessGroupStatusDTO createRemoteProcessGroupStatusDto(final RemoteProcessGroupStatus remoteProcessGroupStatus) {
+ public RemoteProcessGroupStatusDTO createRemoteProcessGroupStatusDto(final RemoteProcessGroup remoteProcessGroup, final RemoteProcessGroupStatus remoteProcessGroupStatus) {
final RemoteProcessGroupStatusDTO dto = new RemoteProcessGroupStatusDTO();
dto.setId(remoteProcessGroupStatus.getId());
dto.setGroupId(remoteProcessGroupStatus.getGroupId());
@@ -953,6 +954,7 @@ public final class DtoFactory {
dto.setName(remoteProcessGroupStatus.getName());
dto.setTransmissionStatus(remoteProcessGroupStatus.getTransmissionStatus().toString());
dto.setStatsLastRefreshed(new Date());
+ dto.setValidationStatus(getRemoteProcessGroupValidationStatus(remoteProcessGroup).name());
final RemoteProcessGroupStatusSnapshotDTO snapshot = new RemoteProcessGroupStatusSnapshotDTO();
dto.setAggregateSnapshot(snapshot);
@@ -973,6 +975,13 @@ public final class DtoFactory {
return dto;
}
+ private ValidationStatus getRemoteProcessGroupValidationStatus(RemoteProcessGroup remoteProcessGroup) {
+ final boolean hasAuthIssue = remoteProcessGroup.getAuthorizationIssue() != null && !remoteProcessGroup.getAuthorizationIssue().isEmpty();
+ final Collection<ValidationResult> validationResults = remoteProcessGroup.validate();
+ final boolean hasValidationIssue = validationResults != null && !validationResults.isEmpty();
+ return hasAuthIssue || hasValidationIssue ? ValidationStatus.INVALID : ValidationStatus.VALID;
+ }
+
public ProcessGroupStatusDTO createConciseProcessGroupStatusDto(final ProcessGroupStatus processGroupStatus) {
final ProcessGroupStatusDTO processGroupStatusDto = new ProcessGroupStatusDTO();
processGroupStatusDto.setId(processGroupStatus.getId());
@@ -1060,8 +1069,8 @@ public final class DtoFactory {
final Collection<RemoteProcessGroupStatus> childRemoteProcessGroupStatusCollection = processGroupStatus.getRemoteProcessGroupStatus();
if (childRemoteProcessGroupStatusCollection != null) {
for (final RemoteProcessGroupStatus childRemoteProcessGroupStatus : childRemoteProcessGroupStatusCollection) {
- final RemoteProcessGroupStatusDTO childRemoteProcessGroupStatusDto = createRemoteProcessGroupStatusDto(childRemoteProcessGroupStatus);
- final RemoteProcessGroup remoteProcessGroup = processGroup.findRemoteProcessGroup(childRemoteProcessGroupStatusDto.getId());
+ final RemoteProcessGroup remoteProcessGroup = processGroup.findRemoteProcessGroup(childRemoteProcessGroupStatus.getId());
+ final RemoteProcessGroupStatusDTO childRemoteProcessGroupStatusDto = createRemoteProcessGroupStatusDto(remoteProcessGroup, childRemoteProcessGroupStatus);
final PermissionsDTO remoteProcessGroupPermissions = createPermissionsDto(remoteProcessGroup);
childRemoteProcessGroupStatusDtoCollection.add(entityFactory.createRemoteProcessGroupStatusSnapshotEntity(childRemoteProcessGroupStatusDto.getAggregateSnapshot(),
remoteProcessGroupPermissions));
@@ -2015,13 +2024,14 @@ public final class DtoFactory {
final PortDTO dto = createPortDto(inputPort);
final RevisionDTO revision = createRevisionDTO(revisionManager.getRevision(inputPort.getIdentifier()));
final PermissionsDTO permissions = createPermissionsDto(inputPort);
+ final PermissionsDTO operatePermissions = createPermissionsDto(new OperationAuthorizable(inputPort));
final PortStatusDTO status = getComponentStatus(
() -> groupStatus.getInputPortStatus().stream().filter(inputPortStatus -> inputPort.getIdentifier().equals(inputPortStatus.getId())).findFirst().orElse(null),
inputPortStatus -> createPortStatusDto(inputPortStatus)
);
final List<BulletinDTO> bulletins = createBulletinDtos(bulletinRepository.findBulletinsForSource(inputPort.getIdentifier()));
final List<BulletinEntity> bulletinEntities = bulletins.stream().map(bulletin -> entityFactory.createBulletinEntity(bulletin, permissions.getCanRead())).collect(Collectors.toList());
- flow.getInputPorts().add(entityFactory.createPortEntity(dto, revision, permissions, status, bulletinEntities));
+ flow.getInputPorts().add(entityFactory.createPortEntity(dto, revision, permissions, operatePermissions, status, bulletinEntities));
}
for (final PortDTO snippetOutputPort : snippet.getOutputPorts()) {
@@ -2031,13 +2041,14 @@ public final class DtoFactory {
final PortDTO dto = createPortDto(outputPort);
final RevisionDTO revision = createRevisionDTO(revisionManager.getRevision(outputPort.getIdentifier()));
final PermissionsDTO permissions = createPermissionsDto(outputPort);
+ final PermissionsDTO operatePermissions = createPermissionsDto(new OperationAuthorizable(outputPort));
final PortStatusDTO status = getComponentStatus(
() -> groupStatus.getOutputPortStatus().stream().filter(outputPortStatus -> outputPort.getIdentifier().equals(outputPortStatus.getId())).findFirst().orElse(null),
outputPortStatus -> createPortStatusDto(outputPortStatus)
);
final List<BulletinDTO> bulletins = createBulletinDtos(bulletinRepository.findBulletinsForSource(outputPort.getIdentifier()));
final List<BulletinEntity> bulletinEntities = bulletins.stream().map(bulletin -> entityFactory.createBulletinEntity(bulletin, permissions.getCanRead())).collect(Collectors.toList());
- flow.getOutputPorts().add(entityFactory.createPortEntity(dto, revision, permissions, status, bulletinEntities));
+ flow.getOutputPorts().add(entityFactory.createPortEntity(dto, revision, permissions, operatePermissions, status, bulletinEntities));
}
for (final LabelDTO snippetLabel : snippet.getLabels()) {
@@ -2072,13 +2083,14 @@ public final class DtoFactory {
final ProcessorDTO dto = createProcessorDto(processor);
final RevisionDTO revision = createRevisionDTO(revisionManager.getRevision(processor.getIdentifier()));
final PermissionsDTO permissions = createPermissionsDto(processor);
+ final PermissionsDTO operatePermissions = createPermissionsDto(new OperationAuthorizable(processor));
final ProcessorStatusDTO status = getComponentStatus(
() -> groupStatus.getProcessorStatus().stream().filter(processorStatus -> processor.getIdentifier().equals(processorStatus.getId())).findFirst().orElse(null),
processorStatus -> createProcessorStatusDto(processorStatus)
);
final List<BulletinDTO> bulletins = createBulletinDtos(bulletinRepository.findBulletinsForSource(processor.getIdentifier()));
final List<BulletinEntity> bulletinEntities = bulletins.stream().map(bulletin -> entityFactory.createBulletinEntity(bulletin, permissions.getCanRead())).collect(Collectors.toList());
- flow.getProcessors().add(entityFactory.createProcessorEntity(dto, revision, permissions, status, bulletinEntities));
+ flow.getProcessors().add(entityFactory.createProcessorEntity(dto, revision, permissions, operatePermissions, status, bulletinEntities));
}
for (final RemoteProcessGroupDTO snippetRemoteProcessGroup : snippet.getRemoteProcessGroups()) {
@@ -2088,13 +2100,14 @@ public final class DtoFactory {
final RemoteProcessGroupDTO dto = createRemoteProcessGroupDto(remoteProcessGroup);
final RevisionDTO revision = createRevisionDTO(revisionManager.getRevision(remoteProcessGroup.getIdentifier()));
final PermissionsDTO permissions = createPermissionsDto(remoteProcessGroup);
+ final PermissionsDTO operatePermissions = createPermissionsDto(new OperationAuthorizable(remoteProcessGroup));
final RemoteProcessGroupStatusDTO status = getComponentStatus(
() -> groupStatus.getRemoteProcessGroupStatus().stream().filter(rpgStatus -> remoteProcessGroup.getIdentifier().equals(rpgStatus.getId())).findFirst().orElse(null),
- remoteProcessGroupStatus -> createRemoteProcessGroupStatusDto(remoteProcessGroupStatus)
+ remoteProcessGroupStatus -> createRemoteProcessGroupStatusDto(remoteProcessGroup, remoteProcessGroupStatus)
);
final List<BulletinDTO> bulletins = createBulletinDtos(bulletinRepository.findBulletinsForSource(remoteProcessGroup.getIdentifier()));
final List<BulletinEntity> bulletinEntities = bulletins.stream().map(bulletin -> entityFactory.createBulletinEntity(bulletin, permissions.getCanRead())).collect(Collectors.toList());
- flow.getRemoteProcessGroups().add(entityFactory.createRemoteProcessGroupEntity(dto, revision, permissions, status, bulletinEntities));
+ flow.getRemoteProcessGroups().add(entityFactory.createRemoteProcessGroupEntity(dto, revision, permissions, operatePermissions, status, bulletinEntities));
}
return flow;
@@ -2118,13 +2131,14 @@ public final class DtoFactory {
for (final ProcessorNode procNode : group.getProcessors()) {
final RevisionDTO revision = createRevisionDTO(revisionManager.getRevision(procNode.getIdentifier()));
final PermissionsDTO permissions = createPermissionsDto(procNode);
+ final PermissionsDTO operatePermissions = createPermissionsDto(new OperationAuthorizable(procNode));
final ProcessorStatusDTO status = getComponentStatus(
() -> groupStatus.getProcessorStatus().stream().filter(processorStatus -> procNode.getIdentifier().equals(processorStatus.getId())).findFirst().orElse(null),
processorStatus -> createProcessorStatusDto(processorStatus)
);
final List<BulletinDTO> bulletins = createBulletinDtos(bulletinRepository.findBulletinsForSource(procNode.getIdentifier()));
final List<BulletinEntity> bulletinEntities = bulletins.stream().map(bulletin -> entityFactory.createBulletinEntity(bulletin, permissions.getCanRead())).collect(Collectors.toList());
- dto.getProcessors().add(entityFactory.createProcessorEntity(createProcessorDto(procNode), revision, permissions, status, bulletinEntities));
+ dto.getProcessors().add(entityFactory.createProcessorEntity(createProcessorDto(procNode), revision, permissions, operatePermissions, status, bulletinEntities));
}
for (final Connection connNode : group.getConnections()) {
@@ -2163,37 +2177,40 @@ public final class DtoFactory {
for (final RemoteProcessGroup rpg : group.getRemoteProcessGroups()) {
final RevisionDTO revision = createRevisionDTO(revisionManager.getRevision(rpg.getIdentifier()));
final PermissionsDTO permissions = createPermissionsDto(rpg);
+ final PermissionsDTO operatePermissions = createPermissionsDto(new OperationAuthorizable(rpg));
final RemoteProcessGroupStatusDTO status = getComponentStatus(
() -> groupStatus.getRemoteProcessGroupStatus().stream().filter(remoteProcessGroupStatus -> rpg.getIdentifier().equals(remoteProcessGroupStatus.getId())).findFirst().orElse(null),
- remoteProcessGroupStatus -> createRemoteProcessGroupStatusDto(remoteProcessGroupStatus)
+ remoteProcessGroupStatus -> createRemoteProcessGroupStatusDto(rpg, remoteProcessGroupStatus)
);
final List<BulletinDTO> bulletins = createBulletinDtos(bulletinRepository.findBulletinsForSource(rpg.getIdentifier()));
final List<BulletinEntity> bulletinEntities = bulletins.stream().map(bulletin -> entityFactory.createBulletinEntity(bulletin, permissions.getCanRead())).collect(Collectors.toList());
- dto.getRemoteProcessGroups().add(entityFactory.createRemoteProcessGroupEntity(createRemoteProcessGroupDto(rpg), revision, permissions, status, bulletinEntities));
+ dto.getRemoteProcessGroups().add(entityFactory.createRemoteProcessGroupEntity(createRemoteProcessGroupDto(rpg), revision, permissions, operatePermissions, status, bulletinEntities));
}
for (final Port inputPort : group.getInputPorts()) {
final RevisionDTO revision = createRevisionDTO(revisionManager.getRevision(inputPort.getIdentifier()));
final PermissionsDTO permissions = createPermissionsDto(inputPort);
+ final PermissionsDTO operatePermissions = createPermissionsDto(new OperationAuthorizable(inputPort));
final PortStatusDTO status = getComponentStatus(
() -> groupStatus.getInputPortStatus().stream().filter(inputPortStatus -> inputPort.getIdentifier().equals(inputPortStatus.getId())).findFirst().orElse(null),
inputPortStatus -> createPortStatusDto(inputPortStatus)
);
final List<BulletinDTO> bulletins = createBulletinDtos(bulletinRepository.findBulletinsForSource(inputPort.getIdentifier()));
final List<BulletinEntity> bulletinEntities = bulletins.stream().map(bulletin -> entityFactory.createBulletinEntity(bulletin, permissions.getCanRead())).collect(Collectors.toList());
- dto.getInputPorts().add(entityFactory.createPortEntity(createPortDto(inputPort), revision, permissions, status, bulletinEntities));
+ dto.getInputPorts().add(entityFactory.createPortEntity(createPortDto(inputPort), revision, permissions, operatePermissions, status, bulletinEntities));
}
for (final Port outputPort : group.getOutputPorts()) {
final RevisionDTO revision = createRevisionDTO(revisionManager.getRevision(outputPort.getIdentifier()));
final PermissionsDTO permissions = createPermissionsDto(outputPort);
+ final PermissionsDTO operatePermissions = createPermissionsDto(new OperationAuthorizable(outputPort));
final PortStatusDTO status = getComponentStatus(
() -> groupStatus.getOutputPortStatus().stream().filter(outputPortStatus -> outputPort.getIdentifier().equals(outputPortStatus.getId())).findFirst().orElse(null),
outputPortStatus -> createPortStatusDto(outputPortStatus)
);
final List<BulletinDTO> bulletins = createBulletinDtos(bulletinRepository.findBulletinsForSource(outputPort.getIdentifier()));
final List<BulletinEntity> bulletinEntities = bulletins.stream().map(bulletin -> entityFactory.createBulletinEntity(bulletin, permissions.getCanRead())).collect(Collectors.toList());
- dto.getOutputPorts().add(entityFactory.createPortEntity(createPortDto(outputPort), revision, permissions, status, bulletinEntities));
+ dto.getOutputPorts().add(entityFactory.createPortEntity(createPortDto(outputPort), revision, permissions, operatePermissions, status, bulletinEntities));
}
return dto;
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/EntityFactory.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/EntityFactory.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/EntityFactory.java
index 014616d..1bf0c0a 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/EntityFactory.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/EntityFactory.java
@@ -22,6 +22,7 @@ import org.apache.nifi.web.api.dto.flow.FlowBreadcrumbDTO;
import org.apache.nifi.web.api.dto.flow.ProcessGroupFlowDTO;
import org.apache.nifi.web.api.dto.status.ConnectionStatusDTO;
import org.apache.nifi.web.api.dto.status.ConnectionStatusSnapshotDTO;
+import org.apache.nifi.web.api.dto.status.ControllerServiceStatusDTO;
import org.apache.nifi.web.api.dto.status.PortStatusDTO;
import org.apache.nifi.web.api.dto.status.PortStatusSnapshotDTO;
import org.apache.nifi.web.api.dto.status.ProcessGroupStatusDTO;
@@ -30,6 +31,7 @@ import org.apache.nifi.web.api.dto.status.ProcessorStatusDTO;
import org.apache.nifi.web.api.dto.status.ProcessorStatusSnapshotDTO;
import org.apache.nifi.web.api.dto.status.RemoteProcessGroupStatusDTO;
import org.apache.nifi.web.api.dto.status.RemoteProcessGroupStatusSnapshotDTO;
+import org.apache.nifi.web.api.dto.status.ReportingTaskStatusDTO;
import org.apache.nifi.web.api.dto.status.StatusHistoryDTO;
import org.apache.nifi.web.api.entity.AccessPolicyEntity;
import org.apache.nifi.web.api.entity.AccessPolicySummaryEntity;
@@ -197,13 +199,14 @@ public final class EntityFactory {
return entity;
}
- public ProcessorEntity createProcessorEntity(final ProcessorDTO dto, final RevisionDTO revision, final PermissionsDTO permissions,
+ public ProcessorEntity createProcessorEntity(final ProcessorDTO dto, final RevisionDTO revision, final PermissionsDTO permissions, final PermissionsDTO operatePermissions,
final ProcessorStatusDTO status, final List<BulletinEntity> bulletins) {
final ProcessorEntity entity = new ProcessorEntity();
entity.setRevision(revision);
if (dto != null) {
entity.setPermissions(permissions);
+ entity.setOperatePermissions(operatePermissions);
entity.setStatus(status);
entity.setId(dto.getId());
entity.setInputRequirement(dto.getInputRequirement());
@@ -216,11 +219,13 @@ public final class EntityFactory {
return entity;
}
- public PortEntity createPortEntity(final PortDTO dto, final RevisionDTO revision, final PermissionsDTO permissions, final PortStatusDTO status, final List<BulletinEntity> bulletins) {
+ public PortEntity createPortEntity(final PortDTO dto, final RevisionDTO revision, final PermissionsDTO permissions, final PermissionsDTO operatePermissions,
+ final PortStatusDTO status, final List<BulletinEntity> bulletins) {
final PortEntity entity = new PortEntity();
entity.setRevision(revision);
if (dto != null) {
entity.setPermissions(permissions);
+ entity.setOperatePermissions(operatePermissions);
entity.setStatus(status);
entity.setId(dto.getId());
entity.setPosition(dto.getPosition());
@@ -429,12 +434,14 @@ public final class EntityFactory {
return entity;
}
- public RemoteProcessGroupEntity createRemoteProcessGroupEntity(final RemoteProcessGroupDTO dto, final RevisionDTO revision, final PermissionsDTO permissions,
+ public RemoteProcessGroupEntity createRemoteProcessGroupEntity(final RemoteProcessGroupDTO dto, final RevisionDTO revision,
+ final PermissionsDTO permissions, final PermissionsDTO operatePermissions,
final RemoteProcessGroupStatusDTO status, final List<BulletinEntity> bulletins) {
final RemoteProcessGroupEntity entity = new RemoteProcessGroupEntity();
entity.setRevision(revision);
if (dto != null) {
entity.setPermissions(permissions);
+ entity.setOperatePermissions(operatePermissions);
entity.setStatus(status);
entity.setId(dto.getId());
entity.setPosition(dto.getPosition());
@@ -448,11 +455,13 @@ public final class EntityFactory {
return entity;
}
- public RemoteProcessGroupPortEntity createRemoteProcessGroupPortEntity(final RemoteProcessGroupPortDTO dto, final RevisionDTO revision, final PermissionsDTO permissions) {
+ public RemoteProcessGroupPortEntity createRemoteProcessGroupPortEntity(final RemoteProcessGroupPortDTO dto, final RevisionDTO revision,
+ final PermissionsDTO permissions, final PermissionsDTO operatePermissions) {
final RemoteProcessGroupPortEntity entity = new RemoteProcessGroupPortEntity();
entity.setRevision(revision);
if (dto != null) {
entity.setPermissions(permissions);
+ entity.setOperatePermissions(operatePermissions);
entity.setId(dto.getId());
if (permissions != null && permissions.getCanRead()) {
entity.setRemoteProcessGroupPort(dto);
@@ -468,12 +477,21 @@ public final class EntityFactory {
return entity;
}
- public ReportingTaskEntity createReportingTaskEntity(final ReportingTaskDTO dto, final RevisionDTO revision, final PermissionsDTO permissions, final List<BulletinEntity> bulletins) {
+ public ReportingTaskEntity createReportingTaskEntity(final ReportingTaskDTO dto, final RevisionDTO revision,
+ final PermissionsDTO permissions, final PermissionsDTO operatePermissions, final List<BulletinEntity> bulletins) {
final ReportingTaskEntity entity = new ReportingTaskEntity();
entity.setRevision(revision);
if (dto != null) {
entity.setPermissions(permissions);
+ entity.setOperatePermissions(operatePermissions);
entity.setId(dto.getId());
+
+ final ReportingTaskStatusDTO status = new ReportingTaskStatusDTO();
+ status.setRunStatus(dto.getState());
+ status.setValidationStatus(dto.getValidationStatus());
+ status.setActiveThreadCount(dto.getActiveThreadCount());
+ entity.setStatus(status);
+
if (permissions != null && permissions.getCanRead()) {
entity.setComponent(dto);
entity.setBulletins(bulletins);
@@ -495,13 +513,22 @@ public final class EntityFactory {
return entity;
}
- public ControllerServiceEntity createControllerServiceEntity(final ControllerServiceDTO dto, final RevisionDTO revision, final PermissionsDTO permissions, final List<BulletinEntity> bulletins) {
+ public ControllerServiceEntity createControllerServiceEntity(final ControllerServiceDTO dto, final RevisionDTO revision,
+ final PermissionsDTO permissions, final PermissionsDTO operatePermissions, final List<BulletinEntity> bulletins) {
final ControllerServiceEntity entity = new ControllerServiceEntity();
entity.setRevision(revision);
if (dto != null) {
entity.setPermissions(permissions);
+ entity.setOperatePermissions(operatePermissions);
entity.setId(dto.getId());
+ entity.setParentGroupId(dto.getParentGroupId());
entity.setPosition(dto.getPosition());
+
+ final ControllerServiceStatusDTO status = new ControllerServiceStatusDTO();
+ status.setRunStatus(dto.getState());
+ status.setValidationStatus(dto.getValidationStatus());
+ entity.setStatus(status);
+
if (permissions != null && permissions.getCanRead()) {
entity.setComponent(dto);
entity.setBulletins(bulletins);
@@ -510,12 +537,13 @@ public final class EntityFactory {
return entity;
}
- public ControllerServiceReferencingComponentEntity createControllerServiceReferencingComponentEntity(
- final ControllerServiceReferencingComponentDTO dto, final RevisionDTO revision, final PermissionsDTO permissions) {
+ public ControllerServiceReferencingComponentEntity createControllerServiceReferencingComponentEntity(final String id,
+ final ControllerServiceReferencingComponentDTO dto, final RevisionDTO revision, final PermissionsDTO permissions, final PermissionsDTO operatePermissions) {
final ControllerServiceReferencingComponentEntity entity = new ControllerServiceReferencingComponentEntity();
entity.setRevision(revision);
if (dto != null) {
entity.setPermissions(permissions);
+ entity.setOperatePermissions(operatePermissions);
entity.setId(dto.getId());
if (permissions != null && permissions.getCanRead()) {
entity.setComponent(dto);
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
index 1d08081..18a47d2 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
@@ -859,6 +859,7 @@ public class ControllerFacade implements Authorizable {
resources.add(ResourceFactory.getDataResource(processorResource));
resources.add(ResourceFactory.getProvenanceDataResource(processorResource));
resources.add(ResourceFactory.getPolicyResource(processorResource));
+ resources.add(ResourceFactory.getOperationResource(processorResource));
}
// add each label
@@ -875,6 +876,7 @@ public class ControllerFacade implements Authorizable {
resources.add(ResourceFactory.getDataResource(processGroupResource));
resources.add(ResourceFactory.getProvenanceDataResource(processGroupResource));
resources.add(ResourceFactory.getPolicyResource(processGroupResource));
+ resources.add(ResourceFactory.getOperationResource(processGroupResource));
}
// add each remote process group
@@ -884,6 +886,7 @@ public class ControllerFacade implements Authorizable {
resources.add(ResourceFactory.getDataResource(remoteProcessGroupResource));
resources.add(ResourceFactory.getProvenanceDataResource(remoteProcessGroupResource));
resources.add(ResourceFactory.getPolicyResource(remoteProcessGroupResource));
+ resources.add(ResourceFactory.getOperationResource(remoteProcessGroupResource));
}
// add each input port
@@ -893,6 +896,7 @@ public class ControllerFacade implements Authorizable {
resources.add(ResourceFactory.getDataResource(inputPortResource));
resources.add(ResourceFactory.getProvenanceDataResource(inputPortResource));
resources.add(ResourceFactory.getPolicyResource(inputPortResource));
+ resources.add(ResourceFactory.getOperationResource(inputPortResource));
if (inputPort instanceof RootGroupPort) {
resources.add(ResourceFactory.getDataTransferResource(inputPortResource));
}
@@ -905,6 +909,7 @@ public class ControllerFacade implements Authorizable {
resources.add(ResourceFactory.getDataResource(outputPortResource));
resources.add(ResourceFactory.getProvenanceDataResource(outputPortResource));
resources.add(ResourceFactory.getPolicyResource(outputPortResource));
+ resources.add(ResourceFactory.getOperationResource(outputPortResource));
if (outputPort instanceof RootGroupPort) {
resources.add(ResourceFactory.getDataTransferResource(outputPortResource));
}
@@ -915,6 +920,7 @@ public class ControllerFacade implements Authorizable {
final Resource controllerServiceResource = controllerService.getResource();
resources.add(controllerServiceResource);
resources.add(ResourceFactory.getPolicyResource(controllerServiceResource));
+ resources.add(ResourceFactory.getOperationResource(controllerServiceResource));
};
flowController.getAllControllerServices().forEach(csConsumer);
@@ -926,6 +932,7 @@ public class ControllerFacade implements Authorizable {
final Resource reportingTaskResource = reportingTask.getResource();
resources.add(reportingTaskResource);
resources.add(ResourceFactory.getPolicyResource(reportingTaskResource));
+ resources.add(ResourceFactory.getOperationResource(reportingTaskResource));
}
// add each template
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/StandardAuthorizableLookupTest.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/StandardAuthorizableLookupTest.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/StandardAuthorizableLookupTest.java
new file mode 100644
index 0000000..5935aa2
--- /dev/null
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/StandardAuthorizableLookupTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.authorization;
+
+import org.apache.nifi.authorization.resource.AccessPolicyAuthorizable;
+import org.apache.nifi.authorization.resource.Authorizable;
+import org.apache.nifi.authorization.resource.DataAuthorizable;
+import org.apache.nifi.authorization.resource.DataTransferAuthorizable;
+import org.apache.nifi.authorization.resource.OperationAuthorizable;
+import org.apache.nifi.authorization.resource.ProvenanceDataAuthorizable;
+import org.apache.nifi.controller.ProcessorNode;
+import org.apache.nifi.web.dao.ProcessorDAO;
+import org.junit.Test;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class StandardAuthorizableLookupTest {
+
+ @Test
+ public void testGetAuthorizableFromResource() {
+ final ProcessorDAO processorDAO = mock(ProcessorDAO.class);
+ final ProcessorNode processorNode = mock(ProcessorNode.class);
+
+ when(processorDAO.getProcessor(eq("id"))).thenReturn(processorNode);
+
+ final StandardAuthorizableLookup lookup = new StandardAuthorizableLookup();
+ lookup.setProcessorDAO(processorDAO);
+
+ Authorizable authorizable = lookup.getAuthorizableFromResource("/processors/id");
+ assertTrue(authorizable instanceof ProcessorNode);
+
+ authorizable = lookup.getAuthorizableFromResource("/policies/processors/id");
+ assertTrue(authorizable instanceof AccessPolicyAuthorizable);
+ assertTrue(((AccessPolicyAuthorizable) authorizable).getBaseAuthorizable() instanceof ProcessorNode);
+
+ authorizable = lookup.getAuthorizableFromResource("/data/processors/id");
+ assertTrue(authorizable instanceof DataAuthorizable);
+ assertTrue(((DataAuthorizable) authorizable).getBaseAuthorizable() instanceof ProcessorNode);
+
+ authorizable = lookup.getAuthorizableFromResource("/data-transfer/processors/id");
+ assertTrue(authorizable instanceof DataTransferAuthorizable);
+ assertTrue(((DataTransferAuthorizable) authorizable).getBaseAuthorizable() instanceof ProcessorNode);
+
+ authorizable = lookup.getAuthorizableFromResource("/provenance-data/processors/id");
+ assertTrue(authorizable instanceof ProvenanceDataAuthorizable);
+ assertTrue(((ProvenanceDataAuthorizable) authorizable).getBaseAuthorizable() instanceof ProcessorNode);
+
+ authorizable = lookup.getAuthorizableFromResource("/operation/processors/id");
+ assertTrue(authorizable instanceof OperationAuthorizable);
+ assertTrue(((OperationAuthorizable) authorizable).getBaseAuthorizable() instanceof ProcessorNode);
+ }
+}
http://git-wip-us.apache.org/repos/asf/nifi/blob/f570cb98/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-actions.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-actions.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-actions.js
index 33d108f..bf32d5b 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-actions.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-actions.js
@@ -534,13 +534,10 @@
'state': 'ENABLED'
}
} else {
- uri = d.uri;
+ uri = d.uri + '/run-status';
entity = {
'revision': nfClient.getRevision(d),
- 'component': {
- 'id': d.id,
- 'state': 'STOPPED'
- }
+ 'state': 'STOPPED'
};
}
@@ -596,13 +593,10 @@
'state': 'DISABLED'
}
} else {
- uri = d.uri;
+ uri = d.uri + "/run-status";
entity = {
'revision': nfClient.getRevision(d),
- 'component': {
- 'id': d.id,
- 'state': 'DISABLED'
- }
+ 'state': 'DISABLED'
};
}
@@ -677,13 +671,10 @@
'state': 'RUNNING'
}
} else {
- uri = d.uri;
+ uri = d.uri + '/run-status';
entity = {
'revision': nfClient.getRevision(d),
- 'component': {
- 'id': d.id,
- 'state': 'RUNNING'
- }
+ 'state': 'RUNNING'
};
}
@@ -742,13 +733,10 @@
'state': 'STOPPED'
};
} else {
- uri = d.uri;
+ uri = d.uri + '/run-status';
entity = {
'revision': nfClient.getRevision(d),
- 'component': {
- 'id': d.id,
- 'state': 'STOPPED'
- }
+ 'state': 'STOPPED'
};
}
@@ -805,14 +793,11 @@
// build the entity
var entity = {
'revision': nfClient.getRevision(d),
- 'component': {
- 'id': d.id,
- 'transmitting': true
- }
+ 'state': 'TRANSMITTING'
};
// start transmitting
- updateResource(d.uri, entity).done(function (response) {
+ updateResource(d.uri + '/run-status', entity).done(function (response) {
nfRemoteProcessGroup.set(response);
});
});
@@ -833,13 +818,10 @@
// build the entity
var entity = {
'revision': nfClient.getRevision(d),
- 'component': {
- 'id': d.id,
- 'transmitting': false
- }
+ 'state': 'STOPPED'
};
- updateResource(d.uri, entity).done(function (response) {
+ updateResource(d.uri + '/run-status', entity).done(function (response) {
nfRemoteProcessGroup.set(response);
});
});