Repository: nifi
Updated Branches:
  refs/heads/master 8da571d6d -> 82268afb0


NIFI-1554: - Updating cluster detection to support access through the flow 
resource. - Using the correct resource when authorizing a root group port 
during site to site.

This closes #579.

Signed-off-by: Bryan Bende <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/82268afb
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/82268afb
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/82268afb

Branch: refs/heads/master
Commit: 82268afb0d9b3fbd7949c430b2cd4be80bdba8c2
Parents: 8da571d
Author: Matt Gilman <[email protected]>
Authored: Fri Jun 24 16:29:00 2016 -0400
Committer: Bryan Bende <[email protected]>
Committed: Fri Jun 24 16:59:06 2016 -0400

----------------------------------------------------------------------
 .../nifi/web/api/dto/FlowConfigurationDTO.java  |  15 ++
 .../nifi/remote/StandardRootGroupPort.java      |  27 ++--
 .../apache/nifi/web/api/ControllerResource.java |  19 ---
 .../org/apache/nifi/web/api/FlowResource.java   |   4 +
 .../src/main/webapp/js/nf/canvas/nf-canvas.js   | 136 ++++++++-----------
 5 files changed, 90 insertions(+), 111 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/82268afb/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/FlowConfigurationDTO.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/FlowConfigurationDTO.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/FlowConfigurationDTO.java
index d5028d2..6680189 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/FlowConfigurationDTO.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/FlowConfigurationDTO.java
@@ -33,6 +33,7 @@ public class FlowConfigurationDTO {
 
     private Date currentTime;
     private Integer timeOffset;
+    private Boolean isClustered;
 
     /**
      * @return interval in seconds between the automatic NiFi refresh 
requests. This value is read only
@@ -77,4 +78,18 @@ public class FlowConfigurationDTO {
     public void setTimeOffset(Integer timeOffset) {
         this.timeOffset = timeOffset;
     }
+
+    /**
+     * @return whether this NiFi instance is clustered
+     */
+    @ApiModelProperty(
+            value = "Whether this NiFi instance is clustered."
+    )
+    public Boolean getClustered() {
+        return isClustered;
+    }
+
+    public void setClustered(Boolean clustered) {
+        isClustered = clustered;
+    }
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/82268afb/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-site-to-site/src/main/java/org/apache/nifi/remote/StandardRootGroupPort.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-site-to-site/src/main/java/org/apache/nifi/remote/StandardRootGroupPort.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-site-to-site/src/main/java/org/apache/nifi/remote/StandardRootGroupPort.java
index 9ad9987..b94d86f 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-site-to-site/src/main/java/org/apache/nifi/remote/StandardRootGroupPort.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-site-to-site/src/main/java/org/apache/nifi/remote/StandardRootGroupPort.java
@@ -16,14 +16,12 @@
  */
 package org.apache.nifi.remote;
 
+import org.apache.nifi.authorization.AuthorizationRequest;
 import org.apache.nifi.authorization.AuthorizationResult;
 import org.apache.nifi.authorization.AuthorizationResult.Result;
 import org.apache.nifi.authorization.Authorizer;
 import org.apache.nifi.authorization.RequestAction;
-import org.apache.nifi.authorization.Resource;
-import org.apache.nifi.authorization.resource.Authorizable;
 import org.apache.nifi.authorization.resource.ResourceFactory;
-import org.apache.nifi.authorization.user.NiFiUser;
 import org.apache.nifi.components.ValidationResult;
 import org.apache.nifi.connectable.ConnectableType;
 import org.apache.nifi.controller.AbstractPort;
@@ -345,16 +343,6 @@ public class StandardRootGroupPort extends AbstractPort 
implements RootGroupPort
     }
 
     @Override
-    public Authorizable getParentAuthorizable() {
-        return null;
-    }
-
-    @Override
-    public Resource getResource() {
-        return ResourceFactory.getSiteToSiteResource(getIdentifier(), 
getName());
-    }
-
-    @Override
     public PortAuthorizationResult checkUserAuthorization(final String dn) {
         if (!secure) {
             return new StandardPortAuthorizationResult(true, "Site-to-Site is 
not Secure");
@@ -367,8 +355,17 @@ public class StandardRootGroupPort extends AbstractPort 
implements RootGroupPort
             return new StandardPortAuthorizationResult(false, "User DN is not 
known");
         }
 
-        // attempt to authorize the specified user
-        final AuthorizationResult result = checkAuthorization(authorizer, 
RequestAction.WRITE, new NiFiUser(dn));
+        // build the request
+        final AuthorizationRequest request = new AuthorizationRequest.Builder()
+                .identity(dn)
+                .anonymous(false)
+                .accessAttempt(true)
+                .action(RequestAction.WRITE)
+                
.resource(ResourceFactory.getSiteToSiteResource(getIdentifier(), getName()))
+                .build();
+
+        // perform the authorization
+        final AuthorizationResult result = authorizer.authorize(request);
         if (!Result.Approved.equals(result.getResult())) {
             final String message = String.format("%s authorization failed for 
user %s because %s", this, dn, result.getExplanation());
             logger.warn(message);

http://git-wip-us.apache.org/repos/asf/nifi/blob/82268afb/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerResource.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/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 bb07751..30cff5f 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
@@ -58,7 +58,6 @@ import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
-import javax.ws.rs.HEAD;
 import javax.ws.rs.HttpMethod;
 import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
@@ -442,24 +441,6 @@ public class ControllerResource extends 
ApplicationResource {
     // -------
 
     /**
-     * Returns a 200 OK response to indicate this is a valid cluster endpoint.
-     *
-     * @return An OK response with an empty entity body.
-     */
-    @HEAD
-    @Consumes(MediaType.WILDCARD)
-    @Produces(MediaType.WILDCARD)
-    @Path("cluster")
-    public Response getClusterHead() {
-        // TODO - remove once cluster detection is part of /flow
-        if (isConnectedToCluster()) {
-            return Response.ok().build();
-        } else {
-            return Response.status(Response.Status.NOT_FOUND).entity("NiFi 
instance is not clustered").build();
-        }
-    }
-
-    /**
      * Gets the contents of this NiFi cluster. This includes all nodes and 
their status.
      *
      * @return A clusterEntity

http://git-wip-us.apache.org/repos/asf/nifi/blob/82268afb/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowResource.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowResource.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowResource.java
index e04ed44..765933c 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
@@ -282,6 +282,10 @@ public class FlowResource extends ApplicationResource {
         }
 
         final FlowConfigurationEntity entity = 
serviceFacade.getFlowConfiguration();
+
+        // include details about cluster state
+        entity.getFlowConfiguration().setClustered(isConnectedToCluster());
+
         return clusterContext(generateOkResponse(entity)).build();
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/82268afb/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas.js
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas.js
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas.js
index d8331cf..0724668 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas.js
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas.js
@@ -815,24 +815,6 @@ nf.Canvas = (function () {
                     dataType: 'json'
                 });
 
-                // create the deferred cluster request
-                var isClusteredRequest = $.Deferred(function (deferred) {
-                    $.ajax({
-                        type: 'HEAD',
-                        url: config.urls.cluster
-                    }).done(function (response, status, xhr) {
-                        clustered = true;
-                        deferred.resolve(response, status, xhr);
-                    }).fail(function (xhr, status, error) {
-                        if (xhr.status === 404) {
-                            clustered = false;
-                            deferred.resolve('', 'success', xhr);
-                        } else {
-                            deferred.reject(xhr, status, error);
-                        }
-                    });
-                }).promise();
-
                 // ensure the config requests are loaded
                 $.when(configXhr, userXhr, clientXhr).done(function 
(configResult, loginResult, aboutResult) {
                     var configResponse = configResult[0];
@@ -844,65 +826,65 @@ nf.Canvas = (function () {
                     // get the config details
                     var configDetails = configResponse.flowConfiguration;
 
-                    // when both request complete, load the application
-                    isClusteredRequest.done(function () {
-                        // get the auto refresh interval
-                        var autoRefreshIntervalSeconds = 
parseInt(configDetails.autoRefreshIntervalSeconds, 10);
-
-                        // init storage
-                        nf.Storage.init();
-
-                        // initialize the application
-                        initCanvas();
-                        nf.Canvas.View.init();
-                        nf.ContextMenu.init();
-                        nf.ng.Bridge.injector.get('headerCtrl').init();
-                        nf.Settings.init();
-                        nf.Actions.init();
-                        nf.QueueListing.init();
-                        nf.ComponentState.init();
-
-                        // initialize the component behaviors
-                        nf.Draggable.init();
-                        nf.Selectable.init();
-                        nf.Connectable.init();
-
-                        // initialize the chart
-                        nf.StatusHistory.init(configDetails.timeOffset);
-
-                        // initialize the birdseye
-                        nf.Birdseye.init();
-
-                        // initialize components
-                        nf.ConnectionConfiguration.init();
-                        nf.ControllerService.init();
-                        nf.ReportingTask.init();
-                        nf.ProcessorConfiguration.init();
-                        nf.ProcessGroupConfiguration.init();
-                        nf.RemoteProcessGroupConfiguration.init();
-                        nf.RemoteProcessGroupPorts.init();
-                        nf.PortConfiguration.init();
-                        nf.LabelConfiguration.init();
-                        nf.ProcessorDetails.init();
-                        nf.ProcessGroupDetails.init();
-                        nf.PortDetails.init();
-                        nf.ConnectionDetails.init();
-                        nf.RemoteProcessGroupDetails.init();
-                        nf.GoTo.init();
-                        nf.Graph.init().done(function () {
-                            
nf.ng.Bridge.injector.get('graphControlsCtrl').init();
-
-                            // determine the split between the polling
-                            var pollingSplit = autoRefreshIntervalSeconds / 2;
-
-                            // register the polling
-                            setTimeout(function () {
-                                startPolling(autoRefreshIntervalSeconds);
-                            }, pollingSplit * 1000);
-
-                            // hide the splash screen
-                            nf.Canvas.hideSplash();
-                        }).fail(nf.Common.handleAjaxError);
+                    // update the clustered flag
+                    clustered = configDetails.clustered;
+
+                    // get the auto refresh interval
+                    var autoRefreshIntervalSeconds = 
parseInt(configDetails.autoRefreshIntervalSeconds, 10);
+
+                    // init storage
+                    nf.Storage.init();
+
+                    // initialize the application
+                    initCanvas();
+                    nf.Canvas.View.init();
+                    nf.ContextMenu.init();
+                    nf.ng.Bridge.injector.get('headerCtrl').init();
+                    nf.Settings.init();
+                    nf.Actions.init();
+                    nf.QueueListing.init();
+                    nf.ComponentState.init();
+
+                    // initialize the component behaviors
+                    nf.Draggable.init();
+                    nf.Selectable.init();
+                    nf.Connectable.init();
+
+                    // initialize the chart
+                    nf.StatusHistory.init(configDetails.timeOffset);
+
+                    // initialize the birdseye
+                    nf.Birdseye.init();
+
+                    // initialize components
+                    nf.ConnectionConfiguration.init();
+                    nf.ControllerService.init();
+                    nf.ReportingTask.init();
+                    nf.ProcessorConfiguration.init();
+                    nf.ProcessGroupConfiguration.init();
+                    nf.RemoteProcessGroupConfiguration.init();
+                    nf.RemoteProcessGroupPorts.init();
+                    nf.PortConfiguration.init();
+                    nf.LabelConfiguration.init();
+                    nf.ProcessorDetails.init();
+                    nf.ProcessGroupDetails.init();
+                    nf.PortDetails.init();
+                    nf.ConnectionDetails.init();
+                    nf.RemoteProcessGroupDetails.init();
+                    nf.GoTo.init();
+                    nf.Graph.init().done(function () {
+                        nf.ng.Bridge.injector.get('graphControlsCtrl').init();
+
+                        // determine the split between the polling
+                        var pollingSplit = autoRefreshIntervalSeconds / 2;
+
+                        // register the polling
+                        setTimeout(function () {
+                            startPolling(autoRefreshIntervalSeconds);
+                        }, pollingSplit * 1000);
+
+                        // hide the splash screen
+                        nf.Canvas.hideSplash();
                     }).fail(nf.Common.handleAjaxError);
                 }).fail(nf.Common.handleAjaxError);
             }).fail(nf.Common.handleAjaxError);

Reply via email to