From 05a1d63090d97d06bf823821d1b0e9b5482c7cd2 Mon Sep 17 00:00:00 2001 From: Matt Gilman Date: Tue, 22 May 2018 10:32:56 -0400 Subject: [PATCH] NIFI-5208: - Fixing missing message when a node is disconnected from a cluster. - Updating endpoints to accept a flag to allow for changes to be made to a disconnected node. - Updating custom UIs to acknowledge disconnected nodes prior to performing modifications. --- .../NiFiWebConfigurationRequestContext.java | 10 ++ .../ActivateControllerServicesEntity.java | 12 ++ .../nifi/web/api/entity/ComponentEntity.java | 12 ++ .../entity/ControllerConfigurationEntity.java | 11 ++ .../api/entity/CopySnippetRequestEntity.java | 12 ++ .../api/entity/CreateActiveRequestEntity.java | 12 ++ .../entity/CreateTemplateRequestEntity.java | 12 ++ .../InstantiateTemplateRequestEntity.java | 12 ++ .../api/entity/ScheduleComponentsEntity.java | 12 ++ .../nifi/web/api/entity/SnippetEntity.java | 11 ++ .../StartVersionControlRequestEntity.java | 12 ++ ...ntrollerServiceReferenceRequestEntity.java | 12 ++ .../api/entity/VariableRegistryEntity.java | 13 ++- .../VersionControlComponentMappingEntity.java | 12 ++ .../VersionControlInformationEntity.java | 12 ++ .../entity/VersionedFlowSnapshotEntity.java | 12 ++ ...ttpServletConfigurationRequestContext.java | 6 + .../StandardNiFiWebConfigurationContext.java | 107 +++++++----------- .../nifi/web/api/AccessPolicyResource.java | 11 ++ .../nifi/web/api/ApplicationResource.java | 12 ++ .../nifi/web/api/ConnectionResource.java | 9 ++ .../nifi/web/api/ControllerResource.java | 17 +++ .../web/api/ControllerServiceResource.java | 11 ++ .../org/apache/nifi/web/api/FlowResource.java | 4 + .../apache/nifi/web/api/FunnelResource.java | 9 ++ .../nifi/web/api/InputPortResource.java | 9 ++ .../apache/nifi/web/api/LabelResource.java | 9 ++ .../nifi/web/api/OutputPortResource.java | 9 ++ .../nifi/web/api/ProcessGroupResource.java | 71 +++++++++++- .../nifi/web/api/ProcessorResource.java | 9 ++ .../web/api/RemoteProcessGroupResource.java | 13 +++ .../nifi/web/api/ReportingTaskResource.java | 9 ++ .../apache/nifi/web/api/SnippetResource.java | 51 +++++---- .../apache/nifi/web/api/TemplateResource.java | 9 ++ .../apache/nifi/web/api/TenantsResource.java | 22 ++++ .../apache/nifi/web/api/VersionsResource.java | 64 ++++++++++- .../WEB-INF/partials/canvas/flow-status.jsp | 3 +- .../propertytable/jquery.propertytable.js | 7 ++ .../nf-ng-canvas-flow-status-controller.js | 43 ++++--- .../nf-ng-canvas-operate-controller.js | 16 ++- .../components/nf-ng-funnel-component.js | 10 +- .../components/nf-ng-group-component.js | 10 +- .../components/nf-ng-input-port-component.js | 10 +- .../components/nf-ng-label-component.js | 10 +- .../components/nf-ng-output-port-component.js | 10 +- .../components/nf-ng-processor-component.js | 10 +- .../nf-ng-remote-process-group-component.js | 10 +- .../components/nf-ng-template-component.js | 12 +- .../main/webapp/js/nf/canvas/nf-actions.js | 22 ++-- .../js/nf/canvas/nf-canvas-bootstrap.js | 16 +-- .../src/main/webapp/js/nf/canvas/nf-canvas.js | 22 +++- .../js/nf/canvas/nf-component-version.js | 1 + .../nf/canvas/nf-connection-configuration.js | 11 +- .../main/webapp/js/nf/canvas/nf-connection.js | 2 + .../js/nf/canvas/nf-controller-service.js | 22 ++-- .../js/nf/canvas/nf-controller-services.js | 10 +- .../main/webapp/js/nf/canvas/nf-custom-ui.js | 12 +- .../main/webapp/js/nf/canvas/nf-draggable.js | 11 +- .../webapp/js/nf/canvas/nf-flow-version.js | 27 +++-- .../js/nf/canvas/nf-label-configuration.js | 10 +- .../src/main/webapp/js/nf/canvas/nf-label.js | 10 +- .../js/nf/canvas/nf-policy-management.js | 16 ++- .../js/nf/canvas/nf-port-configuration.js | 10 +- .../canvas/nf-process-group-configuration.js | 10 +- .../nf/canvas/nf-processor-configuration.js | 10 +- .../nf-remote-process-group-configuration.js | 10 +- .../canvas/nf-remote-process-group-ports.js | 11 +- .../webapp/js/nf/canvas/nf-reporting-task.js | 16 ++- .../main/webapp/js/nf/canvas/nf-settings.js | 18 ++- .../main/webapp/js/nf/canvas/nf-snippet.js | 18 ++- .../js/nf/canvas/nf-variable-registry.js | 14 ++- .../main/webapp/js/nf/nf-cluster-summary.js | 19 +++- .../src/main/webapp/js/nf/nf-dialog.js | 18 ++- .../src/main/webapp/js/nf/nf-storage.js | 14 +++ .../js/nf/templates/nf-templates-table.js | 13 ++- .../webapp/js/nf/templates/nf-templates.js | 43 ++++++- .../main/webapp/js/nf/users/nf-users-table.js | 18 ++- .../src/main/webapp/js/nf/users/nf-users.js | 43 ++++++- .../api/processor/ProcessorResource.java | 22 ++-- .../api/processor/ProcessorWebUtils.java | 35 +++--- .../components/processor/processor.service.js | 4 +- .../src/main/webapp/app/main/main.state.js | 2 +- .../transformjson/transformjson.controller.js | 6 +- .../app/transformjson/transformjson.state.js | 2 +- .../app/transformjson/transformjson.view.html | 3 +- .../api/processor/TestProcessorWebUtils.java | 17 ++- .../update/attributes/api/RuleResource.java | 20 +++- .../entity/EvaluationContextEntity.java | 11 +- .../update/attributes/entity/RuleEntity.java | 12 +- .../src/main/webapp/WEB-INF/jsp/worksheet.jsp | 1 + .../src/main/webapp/js/application.js | 13 +++ 91 files changed, 1103 insertions(+), 323 deletions(-) diff --git a/nifi-framework-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationRequestContext.java b/nifi-framework-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationRequestContext.java index c75d9dc731..540af1796a 100644 --- a/nifi-framework-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationRequestContext.java +++ b/nifi-framework-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationRequestContext.java @@ -29,4 +29,14 @@ public interface NiFiWebConfigurationRequestContext extends NiFiWebRequestContex */ Revision getRevision(); + /** + * Returns whether the node disconnection is acknowledged. By acknowledging disconnection, the + * user is able to modify the flow on a disconnected node. + * + * @return whether the disconnection is acknowledged + */ + default boolean isDisconnectionAcknowledged() { + return false; + } + } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ActivateControllerServicesEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ActivateControllerServicesEntity.java index d43ad233f7..aa1679da31 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ActivateControllerServicesEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ActivateControllerServicesEntity.java @@ -30,6 +30,7 @@ public class ActivateControllerServicesEntity extends Entity { private String id; private String state; private Map components; + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty("The id of the ProcessGroup") public String getId() { @@ -61,4 +62,15 @@ public class ActivateControllerServicesEntity extends Entity { public void setComponents(Map components) { this.components = components; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ComponentEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ComponentEntity.java index fca49ce98d..1fe3185632 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ComponentEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ComponentEntity.java @@ -37,6 +37,7 @@ public class ComponentEntity extends Entity { private PositionDTO position; private PermissionsDTO permissions; private List bulletins; + private Boolean disconnectedNodeAcknowledged; /** * @return revision for this request/response @@ -132,6 +133,17 @@ public class ComponentEntity extends Entity { this.bulletins = bulletins; } + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } + @Override public int hashCode() { return Objects.hash(id); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ControllerConfigurationEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ControllerConfigurationEntity.java index 3d5779273d..850747f8c1 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ControllerConfigurationEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ControllerConfigurationEntity.java @@ -32,6 +32,7 @@ public class ControllerConfigurationEntity extends Entity implements Permissible private ControllerConfigurationDTO controllerConfiguration; private RevisionDTO revision; private PermissionsDTO permissions; + private Boolean disconnectedNodeAcknowledged; /** * @return revision for this request/response @@ -83,4 +84,14 @@ public class ControllerConfigurationEntity extends Entity implements Permissible this.permissions = permissions; } + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CopySnippetRequestEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CopySnippetRequestEntity.java index 4917c8063a..07cebbfc0e 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CopySnippetRequestEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CopySnippetRequestEntity.java @@ -29,6 +29,7 @@ public class CopySnippetRequestEntity extends Entity { private String snippetId; private Double originX; private Double originY; + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty( value = "The identifier of the snippet." @@ -62,4 +63,15 @@ public class CopySnippetRequestEntity extends Entity { public void setOriginY(Double originY) { this.originY = originY; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CreateActiveRequestEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CreateActiveRequestEntity.java index 8074e00dec..2d6cbd3cb7 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CreateActiveRequestEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CreateActiveRequestEntity.java @@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "createActiveRequestEntity") public class CreateActiveRequestEntity extends Entity { private String processGroupId; + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty("The Process Group ID that this active request will update") public String getProcessGroupId() { @@ -33,4 +34,15 @@ public class CreateActiveRequestEntity extends Entity { public void setProcessGroupId(String processGroupId) { this.processGroupId = processGroupId; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CreateTemplateRequestEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CreateTemplateRequestEntity.java index f6836b9bda..98e69a27e3 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CreateTemplateRequestEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/CreateTemplateRequestEntity.java @@ -29,6 +29,7 @@ public class CreateTemplateRequestEntity extends Entity { private String name; private String description; private String snippetId; + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty( value = "The name of the template." @@ -62,4 +63,15 @@ public class CreateTemplateRequestEntity extends Entity { public void setSnippetId(String snippetId) { this.snippetId = snippetId; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/InstantiateTemplateRequestEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/InstantiateTemplateRequestEntity.java index d140105c15..9aeddac945 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/InstantiateTemplateRequestEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/InstantiateTemplateRequestEntity.java @@ -33,6 +33,7 @@ public class InstantiateTemplateRequestEntity extends Entity { private String templateId; private String encodingVersion; private FlowSnippetDTO snippet; + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty( value = "The identifier of the template." @@ -93,4 +94,15 @@ public class InstantiateTemplateRequestEntity extends Entity { public void setSnippet(FlowSnippetDTO snippet) { this.snippet = snippet; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ScheduleComponentsEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ScheduleComponentsEntity.java index dff1ea7b6a..cc1f571474 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ScheduleComponentsEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ScheduleComponentsEntity.java @@ -35,6 +35,7 @@ public class ScheduleComponentsEntity extends Entity { private String id; private String state; private Map components; + private Boolean disconnectedNodeAcknowledged; /** * @return The id of the ProcessGroup @@ -78,4 +79,15 @@ public class ScheduleComponentsEntity extends Entity { public void setComponents(Map components) { this.components = components; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/SnippetEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/SnippetEntity.java index 867ac61a1d..7e26340b15 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/SnippetEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/SnippetEntity.java @@ -28,6 +28,7 @@ import javax.xml.bind.annotation.XmlRootElement; public class SnippetEntity extends Entity { private SnippetDTO snippet; + private Boolean disconnectedNodeAcknowledged; /** * The SnippetDTO that is being serialized. @@ -43,4 +44,14 @@ public class SnippetEntity extends Entity { this.snippet = snippet; } + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/StartVersionControlRequestEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/StartVersionControlRequestEntity.java index b5b943de1e..ec346c3e9f 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/StartVersionControlRequestEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/StartVersionControlRequestEntity.java @@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlRootElement; public class StartVersionControlRequestEntity extends Entity { private VersionedFlowDTO versionedFlow; private RevisionDTO processGroupRevision; + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty("The versioned flow") public VersionedFlowDTO getVersionedFlow() { @@ -45,4 +46,15 @@ public class StartVersionControlRequestEntity extends Entity { public void setProcessGroupRevision(final RevisionDTO revision) { this.processGroupRevision = revision; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/UpdateControllerServiceReferenceRequestEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/UpdateControllerServiceReferenceRequestEntity.java index 2a431689c2..c5f87a1bf2 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/UpdateControllerServiceReferenceRequestEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/UpdateControllerServiceReferenceRequestEntity.java @@ -31,6 +31,7 @@ public class UpdateControllerServiceReferenceRequestEntity extends Entity { private String id; private String state; private Map referencingComponentRevisions; + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty( value = "The identifier of the Controller Service." @@ -65,4 +66,15 @@ public class UpdateControllerServiceReferenceRequestEntity extends Entity { public void setReferencingComponentRevisions(Map referencingComponentRevisions) { this.referencingComponentRevisions = referencingComponentRevisions; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VariableRegistryEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VariableRegistryEntity.java index 142ce2205b..6ffd405833 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VariableRegistryEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VariableRegistryEntity.java @@ -26,7 +26,7 @@ import javax.xml.bind.annotation.XmlRootElement; public class VariableRegistryEntity extends Entity { private RevisionDTO processGroupRevision; private VariableRegistryDTO variableRegistry; - + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty("The Variable Registry.") public VariableRegistryDTO getVariableRegistry() { @@ -45,4 +45,15 @@ public class VariableRegistryEntity extends Entity { public void setProcessGroupRevision(RevisionDTO processGroupRevision) { this.processGroupRevision = processGroupRevision; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionControlComponentMappingEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionControlComponentMappingEntity.java index e1bd6b5720..6c0fd2e02d 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionControlComponentMappingEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionControlComponentMappingEntity.java @@ -29,6 +29,7 @@ public class VersionControlComponentMappingEntity extends Entity { private VersionControlInformationDTO versionControlDto; private Map versionControlComponentMapping; private RevisionDTO processGroupRevision; + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty("The Version Control information") public VersionControlInformationDTO getVersionControlInformation() { @@ -56,4 +57,15 @@ public class VersionControlComponentMappingEntity extends Entity { public void setProcessGroupRevision(RevisionDTO processGroupRevision) { this.processGroupRevision = processGroupRevision; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionControlInformationEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionControlInformationEntity.java index 749a118645..a8e419d7b3 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionControlInformationEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionControlInformationEntity.java @@ -27,6 +27,7 @@ import javax.xml.bind.annotation.XmlRootElement; public class VersionControlInformationEntity extends Entity { private VersionControlInformationDTO versionControlInformation; private RevisionDTO processGroupRevision; + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty("The Version Control information") public VersionControlInformationDTO getVersionControlInformation() { @@ -45,4 +46,15 @@ public class VersionControlInformationEntity extends Entity { public void setProcessGroupRevision(RevisionDTO revision) { this.processGroupRevision = revision; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionedFlowSnapshotEntity.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionedFlowSnapshotEntity.java index 8929fa7a11..9e3e651dfe 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionedFlowSnapshotEntity.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/VersionedFlowSnapshotEntity.java @@ -29,6 +29,7 @@ public class VersionedFlowSnapshotEntity extends Entity { private RevisionDTO processGroupRevision; private String registryId; private Boolean updateDescendantVersionedFlows; + private Boolean disconnectedNodeAcknowledged; @ApiModelProperty("The versioned flow snapshot") public VersionedFlowSnapshot getVersionedFlowSnapshot() { @@ -66,4 +67,15 @@ public class VersionedFlowSnapshotEntity extends Entity { public void setUpdateDescendantVersionedFlows(Boolean update) { this.updateDescendantVersionedFlows = update; } + + @ApiModelProperty( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed." + ) + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-custom-ui-utilities/src/main/java/org/apache/nifi/web/HttpServletConfigurationRequestContext.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-custom-ui-utilities/src/main/java/org/apache/nifi/web/HttpServletConfigurationRequestContext.java index 7c4131ff78..2a878d5f20 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-custom-ui-utilities/src/main/java/org/apache/nifi/web/HttpServletConfigurationRequestContext.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-custom-ui-utilities/src/main/java/org/apache/nifi/web/HttpServletConfigurationRequestContext.java @@ -27,6 +27,7 @@ public class HttpServletConfigurationRequestContext extends HttpServletRequestCo private static final String ID_PARAM = "id"; private static final String CLIENT_ID_PARAM = "clientId"; private static final String REVISION_PARAM = "revision"; + private static final String DISCONNECTION_ACKNOWLEDGED_PARAM = "disconnectedNodeAcknowledged"; private final HttpServletRequest request; @@ -55,4 +56,9 @@ public class HttpServletConfigurationRequestContext extends HttpServletRequestCo return new Revision(revision, clientId, componentId); } + @Override + public boolean isDisconnectionAcknowledged() { + final String disconnectionAcknowledgedVal = request.getParameter(DISCONNECTION_ACKNOWLEDGED_PARAM); + return Boolean.valueOf(disconnectionAcknowledgedVal); + } } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java index d8789c20a1..5f450855f9 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiWebConfigurationContext.java @@ -262,6 +262,15 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration throw new IllegalArgumentException("UI extension type must support Processor, ControllerService, or ReportingTask configuration."); } + // if we're clustered, ensure this node is not disconnected + if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && !clusterCoordinator.isConnected()) { + // if we are disconnected, ensure the disconnection is acknowledged + if (!Boolean.TRUE.equals(requestContext.isDisconnectionAcknowledged())) { + throw new IllegalArgumentException("This node is disconnected from its configured cluster. The requested change " + + "will only be allowed if the flag to acknowledge the disconnected node is set."); + } + } + return componentFacade.updateComponent(requestContext, annotationData, properties); } @@ -379,7 +388,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration }); final ProcessorDTO processor; - if (StandardNiFiWebConfigurationContext.this.properties.isClustered()) { + if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { // create the request URL URI requestUrl; try { @@ -507,17 +516,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser()); }); - // if the lookup has the service that means we are either a node or - // the ncm and the service is available there only - if (controllerServiceProvider.getControllerService(id) != null) { - controllerService = serviceFacade.getControllerService(id).getComponent(); - } else { - // if this is a standalone instance the service should have been found above... there should - // no cluster to replicate the request to - if (!properties.isClustered()) { - throw new ResourceNotFoundException(String.format("Controller service[%s] could not be found on this NiFi.", id)); - } - + if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { // create the request URL URI requestUrl; try { @@ -547,6 +546,8 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration entity = nodeResponse.getClientResponse().readEntity(ControllerServiceEntity.class); } controllerService = entity.getComponent(); + } else { + controllerService = serviceFacade.getControllerService(id).getComponent(); } // return the controller service info @@ -570,28 +571,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration }); final ControllerServiceDTO controllerService; - if (controllerServiceProvider.getControllerService(id) != null) { - final ControllerServiceDTO controllerServiceDto = new ControllerServiceDTO(); - controllerServiceDto.setId(id); - controllerServiceDto.setAnnotationData(annotationData); - controllerServiceDto.setProperties(properties); - - // update controller service - final ControllerServiceEntity entity = serviceFacade.updateControllerService(revision, controllerServiceDto); - controllerService = entity.getComponent(); - } else { - // if this is a standalone instance the service should have been found above... there should - // no cluster to replicate the request to - if (!StandardNiFiWebConfigurationContext.this.properties.isClustered()) { - throw new ResourceNotFoundException(String.format("Controller service[%s] could not be found on this NiFi.", id)); - } - - // since this PUT request can be interpreted as a request to create a controller service - // we need to be sure that this service exists on the node before the request is replicated. - // this is done by attempting to get the details. if the service doesn't exist it will - // throw a ResourceNotFoundException - getComponentDetails(requestContext); - + if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { // create the request URL URI requestUrl; try { @@ -638,6 +618,15 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration entity = nodeResponse.getClientResponse().readEntity(ControllerServiceEntity.class); } controllerService = entity.getComponent(); + } else { + final ControllerServiceDTO controllerServiceDto = new ControllerServiceDTO(); + controllerServiceDto.setId(id); + controllerServiceDto.setAnnotationData(annotationData); + controllerServiceDto.setProperties(properties); + + // update controller service + final ControllerServiceEntity entity = serviceFacade.updateControllerService(revision, controllerServiceDto); + controllerService = entity.getComponent(); } // return the controller service info @@ -672,17 +661,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration authorizable.authorize(authorizer, RequestAction.READ, NiFiUserUtils.getNiFiUser()); }); - // if the provider has the service that means we are either a node or - // the ncm and the service is available there only - if (reportingTaskProvider.getReportingTaskNode(id) != null) { - reportingTask = serviceFacade.getReportingTask(id).getComponent(); - } else { - // if this is a standalone instance the task should have been found above... there should - // no cluster to replicate the request to - if (!properties.isClustered()) { - throw new ResourceNotFoundException(String.format("Reporting task[%s] could not be found on this NiFi.", id)); - } - + if (properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { // create the request URL URI requestUrl; try { @@ -712,6 +691,8 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration entity = nodeResponse.getClientResponse().readEntity(ReportingTaskEntity.class); } reportingTask = entity.getComponent(); + } else { + reportingTask = serviceFacade.getReportingTask(id).getComponent(); } // return the reporting task info @@ -735,29 +716,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration }); final ReportingTaskDTO reportingTask; - if (reportingTaskProvider.getReportingTaskNode(id) != null) { - final ReportingTaskDTO reportingTaskDto = new ReportingTaskDTO(); - reportingTaskDto.setId(id); - reportingTaskDto.setAnnotationData(annotationData); - reportingTaskDto.setProperties(properties); - - // obtain write lock - serviceFacade.verifyRevision(revision, user); - final ReportingTaskEntity entity = serviceFacade.updateReportingTask(revision, reportingTaskDto); - reportingTask = entity.getComponent(); - } else { - // if this is a standalone instance the task should have been found above... there should - // no cluster to replicate the request to - if (!StandardNiFiWebConfigurationContext.this.properties.isClustered()) { - throw new ResourceNotFoundException(String.format("Reporting task[%s] could not be found on this NiFi.", id)); - } - - // since this PUT request can be interpreted as a request to create a reporting task - // we need to be sure that this task exists on the node before the request is replicated. - // this is done by attempting to get the details. if the service doesn't exist it will - // throw a ResourceNotFoundException - getComponentDetails(requestContext); - + if (StandardNiFiWebConfigurationContext.this.properties.isClustered() && clusterCoordinator != null && clusterCoordinator.isConnected()) { // create the request URL URI requestUrl; try { @@ -804,6 +763,16 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration entity = nodeResponse.getClientResponse().readEntity(ReportingTaskEntity.class); } reportingTask = entity.getComponent(); + } else { + final ReportingTaskDTO reportingTaskDto = new ReportingTaskDTO(); + reportingTaskDto.setId(id); + reportingTaskDto.setAnnotationData(annotationData); + reportingTaskDto.setProperties(properties); + + // obtain write lock + serviceFacade.verifyRevision(revision, user); + final ReportingTaskEntity entity = serviceFacade.updateReportingTask(revision, reportingTaskDto); + reportingTask = entity.getComponent(); } // return the processor info @@ -840,7 +809,7 @@ public class StandardNiFiWebConfigurationContext implements NiFiWebConfiguration throw new ClusterRequestException(nodeResponse.getThrowable()); } else if (nodeResponse.getClientResponse().getStatus() == Response.Status.CONFLICT.getStatusCode()) { ClientResponseUtils.drainClientResponse(nodeResponse.getClientResponse()); - throw new InvalidRevisionException(String.format("Conflict: the flow may have been updated by another user.")); + throw new InvalidRevisionException(String.format("NiFi is unable to process the request at this time.")); } else if (nodeResponse.getClientResponse().getStatus() == Response.Status.NOT_FOUND.getStatusCode()) { ClientResponseUtils.drainClientResponse(nodeResponse.getClientResponse()); throw new ResourceNotFoundException("Unable to find component with id: " + id); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/AccessPolicyResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/AccessPolicyResource.java index 1f4a260808..ddf805c3c6 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/AccessPolicyResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/AccessPolicyResource.java @@ -229,6 +229,8 @@ public class AccessPolicyResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestAccessPolicyEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestAccessPolicyEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) @@ -377,6 +379,8 @@ public class AccessPolicyResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestAccessPolicyEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestAccessPolicyEntity.isDisconnectedNodeAcknowledged()); } // Extract the revision @@ -447,6 +451,11 @@ public class AccessPolicyResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The access policy id.", required = true @@ -460,6 +469,8 @@ public class AccessPolicyResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final AccessPolicyEntity requestAccessPolicyEntity = new AccessPolicyEntity(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ApplicationResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ApplicationResource.java index 85423c07a2..2e9e318528 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ApplicationResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ApplicationResource.java @@ -99,6 +99,7 @@ public abstract class ApplicationResource { public static final String VERSION = "version"; public static final String CLIENT_ID = "clientId"; + public static final String DISCONNECTED_NODE_ACKNOWLEDGED = "disconnectedNodeAcknowledged"; public static final String PROXY_SCHEME_HTTP_HEADER = "X-ProxyScheme"; public static final String PROXY_HOST_HTTP_HEADER = "X-ProxyHost"; @@ -1058,6 +1059,17 @@ public abstract class ApplicationResource { return clusterCoordinator != null; } + boolean isDisconnectedFromCluster() { + return isClustered() && !clusterCoordinator.isConnected(); + } + + void verifyDisconnectedNodeModification(final Boolean disconnectionAcknowledged) { + if (!Boolean.TRUE.equals(disconnectionAcknowledged)) { + throw new IllegalArgumentException("This node is disconnected from its configured cluster. The requested change " + + "will only be allowed if the flag to acknowledge the disconnected node is set."); + } + } + public void setRequestReplicator(final RequestReplicator requestReplicator) { this.requestReplicator = requestReplicator; } diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectionResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectionResource.java index 773d8a6d4a..802b226107 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectionResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectionResource.java @@ -227,6 +227,8 @@ public class ConnectionResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestConnectionEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestConnectionEntity.isDisconnectedNodeAcknowledged()); } final Revision requestRevision = getRevision(requestConnectionEntity, id); @@ -320,6 +322,11 @@ public class ConnectionResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The connection id.", required = true @@ -328,6 +335,8 @@ public class ConnectionResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } // determine the specified version diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerResource.java index 004b5d20aa..2331a00199 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerResource.java @@ -188,6 +188,8 @@ public class ControllerResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestConfigEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestConfigEntity.isDisconnectedNodeAcknowledged()); } final Revision requestRevision = getRevision(requestConfigEntity.getRevision(), FlowController.class.getSimpleName()); @@ -264,6 +266,8 @@ public class ControllerResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestReportingTaskEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestReportingTaskEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -397,6 +401,8 @@ public class ControllerResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestRegistryClientEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestRegistryClientEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -527,6 +533,8 @@ public class ControllerResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestRegistryEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestRegistryEntity.isDisconnectedNodeAcknowledged()); } if (requestRegistryClient.getName() != null && StringUtils.isBlank(requestRegistryClient.getName())) { @@ -603,6 +611,11 @@ public class ControllerResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The registry id.", required = true @@ -611,6 +624,8 @@ public class ControllerResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final RegistryClientEntity requestRegistryClientEntity = new RegistryClientEntity(); @@ -762,6 +777,8 @@ public class ControllerResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestControllerServiceEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestControllerServiceEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java index dd41521d24..2d2f5b950d 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java @@ -503,6 +503,8 @@ public class ControllerServiceResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestUpdateReferenceRequest); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestUpdateReferenceRequest.isDisconnectedNodeAcknowledged()); } // convert the referencing revisions @@ -614,6 +616,8 @@ public class ControllerServiceResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestControllerServiceEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestControllerServiceEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) @@ -690,6 +694,11 @@ public class ControllerServiceResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The controller service id.", required = true @@ -698,6 +707,8 @@ public class ControllerServiceResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final ControllerServiceEntity requestControllerServiceEntity = new ControllerServiceEntity(); 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 3446aa39b5..80a78b04bf 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 @@ -665,6 +665,8 @@ public class FlowResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestScheduleComponentsEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestScheduleComponentsEntity.isDisconnectedNodeAcknowledged()); } final Map requestComponentsToSchedule = requestScheduleComponentsEntity.getComponents(); @@ -805,6 +807,8 @@ public class FlowResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestEntity.isDisconnectedNodeAcknowledged()); } final Map requestComponentsToSchedule = requestEntity.getComponents(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FunnelResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FunnelResource.java index 787d23e851..154d5d9add 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FunnelResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FunnelResource.java @@ -202,6 +202,8 @@ public class FunnelResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestFunnelEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestFunnelEntity.isDisconnectedNodeAcknowledged()); } // Extract the revision @@ -270,6 +272,11 @@ public class FunnelResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The funnel id.", required = true @@ -278,6 +285,8 @@ public class FunnelResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final FunnelEntity requestFunnelEntity = new FunnelEntity(); 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 a9961b7a37..133da91e15 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 @@ -202,6 +202,8 @@ public class InputPortResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestPortEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestPortEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) @@ -269,6 +271,11 @@ public class InputPortResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The input port id.", required = true @@ -277,6 +284,8 @@ public class InputPortResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final PortEntity requestPortEntity = new PortEntity(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/LabelResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/LabelResource.java index d34eb74704..8a09e6a8f8 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/LabelResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/LabelResource.java @@ -202,6 +202,8 @@ public class LabelResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestLabelEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestLabelEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) @@ -269,6 +271,11 @@ public class LabelResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The label id.", required = true @@ -277,6 +284,8 @@ public class LabelResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final LabelEntity requestLabelEntity = new LabelEntity(); 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 bccca5702e..d3ff063e4c 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 @@ -202,6 +202,8 @@ public class OutputPortResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestPortEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestPortEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) @@ -269,6 +271,11 @@ public class OutputPortResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The output port id.", required = true @@ -277,6 +284,8 @@ public class OutputPortResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final PortEntity requestPortEntity = new PortEntity(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java index e16d69a931..91935c08f6 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java @@ -456,6 +456,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestProcessGroupEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestProcessGroupEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) @@ -552,13 +554,29 @@ public class ProcessGroupResource extends ApplicationResource { @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 deleteVariableRegistryUpdateRequest( - @ApiParam(value = "The process group id.", required = true) @PathParam("groupId") final String groupId, - @ApiParam(value = "The ID of the Variable Registry Update Request", required = true) @PathParam("updateId") final String updateId) { + @ApiParam( + value = "The process group id.", + required = true + ) + @PathParam("groupId") final String groupId, + @ApiParam( + value = "The ID of the Variable Registry Update Request", + required = true) + @PathParam("updateId") final String updateId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged) { if (groupId == null || updateId == null) { throw new IllegalArgumentException("Group ID and Update ID must both be specified."); } + if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); + } + final NiFiUser user = NiFiUserUtils.getNiFiUser(); // authorize access @@ -627,6 +645,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestVariableRegistryEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestVariableRegistryEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) @@ -688,6 +708,10 @@ public class ProcessGroupResource extends ApplicationResource { throw new IllegalArgumentException("Process Group Revision must be specified."); } + if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestVariableRegistryEntity.isDisconnectedNodeAcknowledged()); + } + // In order to update variables in a variable registry, we have to perform the following steps: // 1. Determine Affected Components (this includes any Processors and Controller Services and any components that reference an affected Controller Service). // 1a. Determine ID's of components @@ -1528,6 +1552,11 @@ public class ProcessGroupResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The process group id.", required = true @@ -1537,6 +1566,8 @@ public class ProcessGroupResource extends ApplicationResource { // replicate if cluster manager if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final ProcessGroupEntity requestProcessGroupEntity = new ProcessGroupEntity(); @@ -1683,6 +1714,8 @@ public class ProcessGroupResource extends ApplicationResource { // Step 6: Replicate the request or call serviceFacade.updateProcessGroup if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestProcessGroupEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestProcessGroupEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -1885,6 +1918,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestProcessorEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestProcessorEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -2059,6 +2094,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestPortEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestPortEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -2207,6 +2244,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestPortEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestPortEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -2356,6 +2395,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestFunnelEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestFunnelEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -2505,6 +2546,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestLabelEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestLabelEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -2661,6 +2704,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestRemoteProcessGroupEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestRemoteProcessGroupEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -2864,6 +2909,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestConnectionEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestConnectionEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -3035,6 +3082,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestCopySnippetEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestCopySnippetEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -3200,6 +3249,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestInstantiateTemplateRequestEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestInstantiateTemplateRequestEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -3312,6 +3363,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestCreateTemplateRequestEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestCreateTemplateRequestEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -3382,6 +3435,11 @@ public class ProcessGroupResource extends ApplicationResource { required = true ) @PathParam("id") final String groupId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @FormDataParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @FormDataParam("template") final InputStream in) throws InterruptedException { // unmarshal the template @@ -3407,9 +3465,14 @@ public class ProcessGroupResource extends ApplicationResource { return Response.status(Response.Status.OK).entity(responseXml).type("application/xml").build(); } + if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); + } + // build the response entity TemplateEntity entity = new TemplateEntity(); entity.setTemplate(template); + entity.setDisconnectedNodeAcknowledged(disconnectedNodeAcknowledged); if (isReplicateRequest()) { // convert request accordingly @@ -3476,6 +3539,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestTemplateEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestTemplateEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -3582,6 +3647,8 @@ public class ProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestControllerServiceEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestControllerServiceEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( 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 c56be1b60e..5229f6969b 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 @@ -542,6 +542,8 @@ public class ProcessorResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestProcessorEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestProcessorEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) @@ -618,6 +620,11 @@ public class ProcessorResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The processor id.", required = true @@ -626,6 +633,8 @@ public class ProcessorResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final ProcessorEntity requestProcessorEntity = new ProcessorEntity(); 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 391e469177..79c5aafcf9 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 @@ -184,6 +184,11 @@ public class RemoteProcessGroupResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The remote process group id.", required = true @@ -192,6 +197,8 @@ public class RemoteProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final RemoteProcessGroupEntity requestRemoteProcessGroupEntity = new RemoteProcessGroupEntity(); @@ -290,6 +297,8 @@ public class RemoteProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestRemoteProcessGroupPortEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestRemoteProcessGroupPortEntity.isDisconnectedNodeAcknowledged()); } final Revision requestRevision = getRevision(requestRemoteProcessGroupPortEntity, id); @@ -391,6 +400,8 @@ public class RemoteProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestRemoteProcessGroupPortEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestRemoteProcessGroupPortEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) @@ -487,6 +498,8 @@ public class RemoteProcessGroupResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestRemoteProcessGroupEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestRemoteProcessGroupEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) 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 38fd3ff69a..278c3722b3 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 @@ -418,6 +418,8 @@ public class ReportingTaskResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestReportingTaskEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestReportingTaskEntity.isDisconnectedNodeAcknowledged()); } // handle expects request (usually from the cluster manager) @@ -493,6 +495,11 @@ public class ReportingTaskResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The reporting task id.", required = true @@ -501,6 +508,8 @@ public class ReportingTaskResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final ReportingTaskEntity requestReportingTaskEntity = new ReportingTaskEntity(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/SnippetResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/SnippetResource.java index 15c75d157f..c00c8b3f32 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/SnippetResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/SnippetResource.java @@ -16,19 +16,12 @@ */ package org.apache.nifi.web.api; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.HttpMethod; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.Authorization; import org.apache.nifi.authorization.AccessDeniedException; import org.apache.nifi.authorization.AuthorizableLookup; import org.apache.nifi.authorization.Authorizer; @@ -42,18 +35,25 @@ import org.apache.nifi.web.api.dto.SnippetDTO; import org.apache.nifi.web.api.entity.ComponentEntity; import org.apache.nifi.web.api.entity.SnippetEntity; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.HttpMethod; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; import java.net.URI; import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import io.swagger.annotations.Authorization; - /** * RESTful endpoint for querying dataflow snippets. */ @@ -170,6 +170,8 @@ public class SnippetResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestSnippetEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestSnippetEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -259,6 +261,8 @@ public class SnippetResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestSnippetEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestSnippetEntity.isDisconnectedNodeAcknowledged()); } // get the revision from this snippet @@ -317,6 +321,11 @@ public class SnippetResource extends ApplicationResource { ) public Response deleteSnippet( @Context final HttpServletRequest httpServletRequest, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The snippet id.", required = true @@ -325,6 +334,8 @@ public class SnippetResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final ComponentEntity requestEntity = new ComponentEntity(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/TemplateResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/TemplateResource.java index c31daa1caf..4a3de4f041 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/TemplateResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/TemplateResource.java @@ -35,11 +35,13 @@ import org.apache.nifi.web.api.entity.TemplateEntity; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.HttpMethod; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -180,6 +182,11 @@ public class TemplateResource extends ApplicationResource { ) public Response removeTemplate( @Context final HttpServletRequest httpServletRequest, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The template id.", required = true @@ -188,6 +195,8 @@ public class TemplateResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final TemplateEntity requestTemplateEntity = new TemplateEntity(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/TenantsResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/TenantsResource.java index f339e31f38..c8e5be6877 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/TenantsResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/TenantsResource.java @@ -171,6 +171,8 @@ public class TenantsResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestUserEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestUserEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -373,6 +375,8 @@ public class TenantsResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestUserEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestUserEntity.isDisconnectedNodeAcknowledged()); } // Extract the revision @@ -441,6 +445,11 @@ public class TenantsResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The user id.", required = true @@ -454,6 +463,8 @@ public class TenantsResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final UserEntity requestUserEntity = new UserEntity(); @@ -560,6 +571,8 @@ public class TenantsResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestUserGroupEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestUserGroupEntity.isDisconnectedNodeAcknowledged()); } return withWriteLock( @@ -761,6 +774,8 @@ public class TenantsResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestUserGroupEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestUserGroupEntity.isDisconnectedNodeAcknowledged()); } // Extract the revision @@ -829,6 +844,11 @@ public class TenantsResource extends ApplicationResource { required = false ) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam( value = "The user group id.", required = true @@ -842,6 +862,8 @@ public class TenantsResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final UserGroupEntity requestUserGroupEntity = new UserGroupEntity(); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/VersionsResource.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/VersionsResource.java index b80b4d3356..394048c4ba 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/VersionsResource.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/VersionsResource.java @@ -200,6 +200,8 @@ public class VersionsResource extends ApplicationResource { if (isReplicateRequest()) { return replicate(HttpMethod.POST, requestEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestEntity.isDisconnectedNodeAcknowledged()); } final NiFiUser user = NiFiUserUtils.getNiFiUser(); @@ -288,6 +290,8 @@ public class VersionsResource extends ApplicationResource { // Replicate if necessary if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestEntity.isDisconnectedNodeAcknowledged()); } // Perform the update @@ -363,9 +367,18 @@ public class VersionsResource extends ApplicationResource { @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 deleteVersionControlRequest(@ApiParam("The request ID.") @PathParam("id") final String requestId) { + public Response deleteVersionControlRequest( + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, + @ApiParam("The request ID.") @PathParam("id") final String requestId) { + if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } synchronized (activeRequestMonitor) { @@ -457,6 +470,10 @@ public class VersionsResource extends ApplicationResource { throw new IllegalArgumentException("Comments cannot exceed 65,535 characters"); } + if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestEntity.isDisconnectedNodeAcknowledged()); + } + // ensure we're not attempting to version the root group final ProcessGroupEntity root = serviceFacade.getProcessGroup(FlowController.ROOT_GROUP_ID_ALIAS); if (root.getId().equals(groupId)) { @@ -671,10 +688,17 @@ public class VersionsResource extends ApplicationResource { value = "If the client id is not specified, a new one will be generated. This value (whether specified or generated) is included in the response.", required = false) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) final ClientIdParameter clientId, + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, @ApiParam("The process group id.") @PathParam("id") final String groupId) { if (isReplicateRequest()) { return replicate(HttpMethod.DELETE); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); } final Revision requestRevision = new Revision(version == null ? null : version.getLong(), clientId.getClientId(), groupId); @@ -752,6 +776,8 @@ public class VersionsResource extends ApplicationResource { // Perform the request if (isReplicateRequest()) { return replicate(HttpMethod.PUT, requestEntity); + } else if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestEntity.isDisconnectedNodeAcknowledged()); } final Revision requestRevision = getRevision(requestEntity.getProcessGroupRevision(), groupId); @@ -912,8 +938,15 @@ public class VersionsResource extends ApplicationResource { @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 deleteUpdateRequest(@ApiParam("The ID of the Update Request") @PathParam("id") final String updateRequestId) { - return deleteRequest("update-requests", updateRequestId); + public Response deleteUpdateRequest( + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, + @ApiParam("The ID of the Update Request") @PathParam("id") final String updateRequestId) { + + return deleteRequest("update-requests", updateRequestId, disconnectedNodeAcknowledged.booleanValue()); } @DELETE @@ -937,16 +970,27 @@ public class VersionsResource extends ApplicationResource { @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 deleteRevertRequest(@ApiParam("The ID of the Revert Request") @PathParam("id") final String revertRequestId) { - return deleteRequest("revert-requests", revertRequestId); + public Response deleteRevertRequest( + @ApiParam( + value = "Acknowledges that this node is disconnected to allow for mutable requests to proceed.", + required = false + ) + @QueryParam(DISCONNECTED_NODE_ACKNOWLEDGED) @DefaultValue("false") final Boolean disconnectedNodeAcknowledged, + @ApiParam("The ID of the Revert Request") @PathParam("id") final String revertRequestId) { + + return deleteRequest("revert-requests", revertRequestId, disconnectedNodeAcknowledged.booleanValue()); } - private Response deleteRequest(final String requestType, final String requestId) { + private Response deleteRequest(final String requestType, final String requestId, final boolean disconnectedNodeAcknowledged) { if (requestId == null) { throw new IllegalArgumentException("Request ID must be specified."); } + if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(disconnectedNodeAcknowledged); + } + final NiFiUser user = NiFiUserUtils.getNiFiUser(); // request manager will ensure that the current is the user that submitted this request @@ -1046,6 +1090,10 @@ public class VersionsResource extends ApplicationResource { throw new IllegalArgumentException("The Version of the flow must be supplied."); } + if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestEntity.isDisconnectedNodeAcknowledged()); + } + // We will perform the updating of the Versioned Flow in a background thread because it can be a long-running process. // In order to do this, we will need some parameters that are only available as Thread-Local variables to the current // thread, so we will gather the values for these parameters up front. @@ -1236,6 +1284,10 @@ public class VersionsResource extends ApplicationResource { throw new IllegalArgumentException("The Version of the flow must be supplied."); } + if (isDisconnectedFromCluster()) { + verifyDisconnectedNodeModification(requestEntity.isDisconnectedNodeAcknowledged()); + } + // We will perform the updating of the Versioned Flow in a background thread because it can be a long-running process. // In order to do this, we will need some parameters that are only available as Thread-Local variables to the current // thread, so we will gather the values for these parameters up front. diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/flow-status.jsp b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/flow-status.jsp index 1db3396f0f..fbf33a9715 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/flow-status.jsp +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/flow-status.jsp @@ -17,7 +17,8 @@ <%@ page contentType="text/html" pageEncoding="UTF-8" session="false" %>
-
+
{{appCtrl.serviceProvider.headerCtrl.flowStatusCtrl.connectedNodesCount}}
properties){ + @QueryParam("clientId") final String clientId, @QueryParam("disconnectedNodeAcknowledged") final Boolean isDisconnectionAcknowledged, + Map properties){ + final NiFiWebConfigurationContext nifiWebContext = getWebConfigurationContext(); - final NiFiWebConfigurationRequestContext niFiRequestContext = ProcessorWebUtils.getRequestContext(processorId,revisionId,clientId,request); + final NiFiWebConfigurationRequestContext niFiRequestContext = ProcessorWebUtils.getRequestContext(processorId,revisionId,clientId,isDisconnectionAcknowledged,request); final ComponentDetails componentDetails = nifiWebContext.updateComponent(niFiRequestContext,null,properties); final Response.ResponseBuilder response = ProcessorWebUtils.applyCacheControl(Response.ok(componentDetails)); return response.build(); diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/processor/ProcessorWebUtils.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/processor/ProcessorWebUtils.java index bf81df3ec9..03e287f07d 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/processor/ProcessorWebUtils.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/processor/ProcessorWebUtils.java @@ -17,10 +17,6 @@ package org.apache.nifi.web.standard.api.processor; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.CacheControl; -import javax.ws.rs.core.Response; - import org.apache.nifi.web.ComponentDetails; import org.apache.nifi.web.HttpServletConfigurationRequestContext; import org.apache.nifi.web.HttpServletRequestContext; @@ -30,26 +26,16 @@ import org.apache.nifi.web.NiFiWebRequestContext; import org.apache.nifi.web.Revision; import org.apache.nifi.web.UiExtensionType; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.CacheControl; +import javax.ws.rs.core.Response; + class ProcessorWebUtils { - static ComponentDetails getComponentDetails(final NiFiWebConfigurationContext configurationContext,final String processorId, - final Long revision, final String clientId, HttpServletRequest request){ - - final NiFiWebRequestContext requestContext; - - if(processorId != null && revision != null && clientId != null){ - requestContext = getRequestContext(processorId, revision, clientId, request) ; - } else{ - requestContext = getRequestContext(processorId,request); - } - - return configurationContext.getComponentDetails(requestContext); - - } - static ComponentDetails getComponentDetails(final NiFiWebConfigurationContext configurationContext,final String processorId, HttpServletRequest request){ - return getComponentDetails(configurationContext,processorId,null,null,request); + final NiFiWebRequestContext requestContext = getRequestContext(processorId,request); + return configurationContext.getComponentDetails(requestContext); } static Response.ResponseBuilder applyCacheControl(Response.ResponseBuilder response) { @@ -60,7 +46,9 @@ class ProcessorWebUtils { return response.cacheControl(cacheControl); } - static NiFiWebConfigurationRequestContext getRequestContext(final String processorId, final Long revision, final String clientId, HttpServletRequest request) { + static NiFiWebConfigurationRequestContext getRequestContext(final String processorId, final Long revision, final String clientId, + final Boolean isDisconnectionAcknowledged, HttpServletRequest request) { + return new HttpServletConfigurationRequestContext(UiExtensionType.ProcessorConfiguration, request) { @Override public String getId() { @@ -71,6 +59,11 @@ class ProcessorWebUtils { public Revision getRevision() { return new Revision(revision, clientId, processorId); } + + @Override + public boolean isDisconnectionAcknowledged() { + return Boolean.TRUE.equals(isDisconnectionAcknowledged); + } }; } diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/components/processor/processor.service.js b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/components/processor/processor.service.js index ef1b6f2252..70c6e2a91b 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/components/processor/processor.service.js +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/components/processor/processor.service.js @@ -25,8 +25,8 @@ var ProcessorService = function ProcessorService($http) { 'getDetails' : getDetails }; - function setProperties(processorId,revisionId,clientId,properties){ - var urlParams = 'processorId='+processorId+'&revisionId='+revisionId+'&clientId='+clientId; + function setProperties(processorId,revisionId,clientId,disconnectedNodeAcknowledged,properties){ + var urlParams = 'processorId='+processorId+'&revisionId='+revisionId+'&clientId='+clientId+'&disconnectedNodeAcknowledged='+disconnectedNodeAcknowledged; return $http({url: 'api/standard/processor/properties?'+urlParams,method:'PUT',data:properties}); } diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/main/main.state.js b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/main/main.state.js index e664ee8cb0..6434525406 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/main/main.state.js +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/main/main.state.js @@ -21,7 +21,7 @@ var MainState = function($stateProvider) { $stateProvider .state('main', { - url: "/main?id&revision&clientId&editable", + url: "/main?id&revision&clientId&editable&disconnectedNodeAcknowledged", controller: 'MainController' }) }; diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.controller.js b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.controller.js index fb23abecaf..13aa25d48a 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.controller.js +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.controller.js @@ -22,6 +22,7 @@ var TransformJsonController = function ($scope, $state, $q, $mdDialog, $timeout, $scope.clientId = ''; $scope.revisionId = ''; $scope.editable = false; + $scope.disconnectedNodeAcknowledged = false; $scope.specEditor = {}; $scope.inputEditor = {}; $scope.jsonInput = ''; @@ -345,13 +346,13 @@ var TransformJsonController = function ($scope, $state, $q, $mdDialog, $timeout, } }; - $scope.saveSpec = function(jsonInput,jsonSpec,transform,processorId,clientId,revisionId){ + $scope.saveSpec = function(jsonInput,jsonSpec,transform,processorId,clientId,disconnectedNodeAcknowledged,revisionId){ $scope.clearError(); var properties = $scope.getProperties(transform,jsonSpec); - ProcessorService.setProperties(processorId,revisionId,clientId,properties) + ProcessorService.setProperties(processorId,revisionId,clientId,disconnectedNodeAcknowledged,properties) .then(function(response) { var details = response.data; $scope.populateScopeWithDetails(details); @@ -406,6 +407,7 @@ var TransformJsonController = function ($scope, $state, $q, $mdDialog, $timeout, $scope.processorId = params.id; $scope.clientId = params.clientId; $scope.revisionId = params.revision; + $scope.disconnectedNodeAcknowledged = eval(params.disconnectedNodeAcknowledged); $scope.editable = eval(params.editable); var jsonSpec = $scope.getSpec($scope.transform,$scope.jsonSpec); diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.state.js b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.state.js index 7e580a63b0..9195e1ca36 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.state.js +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.state.js @@ -20,7 +20,7 @@ var TransformJsonState = function($stateProvider) { $stateProvider .state('jolttransformjson', { - url: "/transformjson?id&revision&clientId&editable", + url: "/transformjson?id&revision&clientId&editable&disconnectedNodeAcknowledged", templateUrl: "app/transformjson/transformjson.view.html", controller: 'TransformJsonController', resolve: { diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.view.html b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.view.html index e236449008..60849ba651 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.view.html +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/webapp/app/transformjson/transformjson.view.html @@ -68,7 +68,8 @@ - diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/processor/TestProcessorWebUtils.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/processor/TestProcessorWebUtils.java index 87a058ff4d..4ae5eb3fad 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/processor/TestProcessorWebUtils.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/processor/TestProcessorWebUtils.java @@ -17,21 +17,20 @@ package org.apache.nifi.web.standard.api.processor; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.core.CacheControl; -import javax.ws.rs.core.Response; - import org.apache.nifi.web.ComponentDetails; import org.apache.nifi.web.HttpServletConfigurationRequestContext; import org.apache.nifi.web.HttpServletRequestContext; import org.apache.nifi.web.NiFiWebConfigurationContext; import org.apache.nifi.web.NiFiWebRequestContext; -import org.apache.nifi.web.standard.api.processor.ProcessorWebUtils; import org.junit.Test; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.CacheControl; +import javax.ws.rs.core.Response; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; @@ -56,7 +55,7 @@ public class TestProcessorWebUtils { public void testGetComponentDetailsForProcessorWithSpecificClientRevision(){ NiFiWebConfigurationContext configurationContext = mock(NiFiWebConfigurationContext.class); when(configurationContext.getComponentDetails(any(HttpServletConfigurationRequestContext.class))).thenReturn(new ComponentDetails.Builder().build()); - ComponentDetails componentDetails = ProcessorWebUtils.getComponentDetails(configurationContext,"1",1L, "client1",mock(HttpServletRequest.class)); + ComponentDetails componentDetails = ProcessorWebUtils.getComponentDetails(configurationContext,"1",mock(HttpServletRequest.class)); assertNotNull(componentDetails); } diff --git a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/api/RuleResource.java b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/api/RuleResource.java index fd6979e37e..e948efd0f8 100644 --- a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/api/RuleResource.java +++ b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/api/RuleResource.java @@ -135,7 +135,7 @@ public class RuleResource { // build the web context config final NiFiWebConfigurationRequestContext requestContext = getConfigurationRequestContext( - requestEntity.getProcessorId(), requestEntity.getRevision(), requestEntity.getClientId()); + requestEntity.getProcessorId(), requestEntity.getRevision(), requestEntity.getClientId(), requestEntity.isDisconnectedNodeAcknowledged()); // load the criteria final Criteria criteria = getCriteria(configurationContext, requestContext); @@ -212,7 +212,7 @@ public class RuleResource { // build the request context final NiFiWebConfigurationRequestContext requestContext = getConfigurationRequestContext( - requestEntity.getProcessorId(), requestEntity.getRevision(), requestEntity.getClientId()); + requestEntity.getProcessorId(), requestEntity.getRevision(), requestEntity.getClientId(), requestEntity.isDisconnectedNodeAcknowledged()); // load the criteria final Criteria criteria = getCriteria(configurationContext, requestContext); @@ -489,7 +489,7 @@ public class RuleResource { // build the web context config final NiFiWebConfigurationRequestContext requestContext = getConfigurationRequestContext( - requestEntity.getProcessorId(), requestEntity.getRevision(), requestEntity.getClientId()); + requestEntity.getProcessorId(), requestEntity.getRevision(), requestEntity.getClientId(), requestEntity.isDisconnectedNodeAcknowledged()); // load the criteria final UpdateAttributeModelFactory factory = new UpdateAttributeModelFactory(); @@ -553,13 +553,14 @@ public class RuleResource { @PathParam("id") final String ruleId, @QueryParam("processorId") final String processorId, @QueryParam("clientId") final String clientId, - @QueryParam("revision") final Long revision) { + @QueryParam("revision") final Long revision, + @QueryParam("disconnectedNodeAcknowledged") final Boolean isDisconnectionAcknowledged) { // get the web context final NiFiWebConfigurationContext configurationContext = (NiFiWebConfigurationContext) servletContext.getAttribute("nifi-web-configuration-context"); // build the web context config - final NiFiWebConfigurationRequestContext requestContext = getConfigurationRequestContext(processorId, revision, clientId); + final NiFiWebConfigurationRequestContext requestContext = getConfigurationRequestContext(processorId, revision, clientId, isDisconnectionAcknowledged); // load the criteria and get the rule final Criteria criteria = getCriteria(configurationContext, requestContext); @@ -630,6 +631,8 @@ public class RuleResource { configurationContext.updateComponent(requestContext, annotationData, null); } catch (final InvalidRevisionException ire) { throw new WebApplicationException(ire, invalidRevision(ire.getMessage())); + } catch (final IllegalArgumentException iae) { + throw new WebApplicationException(iae, badRequest(iae.getMessage())); } catch (final Exception e) { final String message = String.format("Unable to save UpdateAttribute[id=%s] criteria: %s", requestContext.getId(), e); logger.error(message, e); @@ -646,7 +649,7 @@ public class RuleResource { }; } - private NiFiWebConfigurationRequestContext getConfigurationRequestContext(final String processorId, final Long revision, final String clientId) { + private NiFiWebConfigurationRequestContext getConfigurationRequestContext(final String processorId, final Long revision, final String clientId, final Boolean isDisconnectionAcknowledged) { return new HttpServletConfigurationRequestContext(UiExtensionType.ProcessorConfiguration, request) { @Override public String getId() { @@ -657,6 +660,11 @@ public class RuleResource { public Revision getRevision() { return new Revision(revision, clientId, processorId); } + + @Override + public boolean isDisconnectionAcknowledged() { + return Boolean.TRUE.equals(isDisconnectionAcknowledged); + } }; } diff --git a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/entity/EvaluationContextEntity.java b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/entity/EvaluationContextEntity.java index af4d9c5db3..b2b8430e11 100644 --- a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/entity/EvaluationContextEntity.java +++ b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/entity/EvaluationContextEntity.java @@ -16,8 +16,8 @@ */ package org.apache.nifi.update.attributes.entity; -import java.util.List; import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; /** * @@ -27,6 +27,7 @@ public class EvaluationContextEntity { private String clientId; private Long revision; + private Boolean disconnectedNodeAcknowledged; private String processorId; private List ruleOrder; private String flowFilePolicy; @@ -47,6 +48,14 @@ public class EvaluationContextEntity { this.revision = revision; } + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } + public String getProcessorId() { return processorId; } diff --git a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/entity/RuleEntity.java b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/entity/RuleEntity.java index 53a873f8dc..d166100fba 100644 --- a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/entity/RuleEntity.java +++ b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/java/org/apache/nifi/update/attributes/entity/RuleEntity.java @@ -16,9 +16,10 @@ */ package org.apache.nifi.update.attributes.entity; -import javax.xml.bind.annotation.XmlRootElement; import org.apache.nifi.update.attributes.dto.RuleDTO; +import javax.xml.bind.annotation.XmlRootElement; + /** * */ @@ -28,6 +29,7 @@ public class RuleEntity { private String clientId; private Long revision; private String processorId; + private Boolean disconnectedNodeAcknowledged; private RuleDTO rule; public String getClientId() { @@ -54,6 +56,14 @@ public class RuleEntity { this.processorId = processorId; } + public Boolean isDisconnectedNodeAcknowledged() { + return disconnectedNodeAcknowledged; + } + + public void setDisconnectedNodeAcknowledged(Boolean disconnectedNodeAcknowledged) { + this.disconnectedNodeAcknowledged = disconnectedNodeAcknowledged; + } + public RuleDTO getRule() { return rule; } diff --git a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/webapp/WEB-INF/jsp/worksheet.jsp b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/webapp/WEB-INF/jsp/worksheet.jsp index a8696c84b8..913c2e5c56 100644 --- a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/webapp/WEB-INF/jsp/worksheet.jsp +++ b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/webapp/WEB-INF/jsp/worksheet.jsp @@ -69,6 +69,7 @@ +
diff --git a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/webapp/js/application.js b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/webapp/js/application.js index a7984d7733..502c0331d8 100644 --- a/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/webapp/js/application.js +++ b/nifi-nar-bundles/nifi-update-attribute-bundle/nifi-update-attribute-ui/src/main/webapp/js/application.js @@ -224,6 +224,7 @@ var ua = { processorId: ua.getProcessorId(), revision: ua.getRevision(), clientId: ua.getClientId(), + disconnectedNodeAcknowledged: ua.getDisconnectionAcknowledged(), flowFilePolicy: selectedOption.value }; @@ -1028,6 +1029,7 @@ var ua = { processorId: ua.getProcessorId(), revision: ua.getRevision(), clientId: ua.getClientId(), + disconnectedNodeAcknowledged: ua.getDisconnectionAcknowledged(), ruleOrder: existingRuleOrder }; @@ -1234,6 +1236,7 @@ var ua = { processorId: ua.getProcessorId(), revision: ua.getRevision(), clientId: ua.getClientId(), + disconnectedNodeAcknowledged: ua.getDisconnectionAcknowledged(), verbose: true }) }).then(function () { @@ -1311,6 +1314,7 @@ var ua = { processorId: ua.getProcessorId(), clientId: ua.getClientId(), revision: ua.getRevision(), + disconnectedNodeAcknowledged: ua.getDisconnectionAcknowledged(), rule: rule }; @@ -1987,6 +1991,15 @@ var ua = { getRevision: function () { return $('#attribute-updater-revision').text(); }, + + /** + * Gets whether the disconnected node is acknowledged. + * + * @returns + */ + getDisconnectionAcknowledged: function () { + return $('#attribute-updater-disconnected-node-acknowledged').text(); + }, /** * Gets the processor id.