You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mc...@apache.org on 2017/05/02 17:08:18 UTC

nifi git commit: NIFI-3765 - added status operation to NodeManager - updated help text - add multiple url support with the -u flag - This closes #1726

Repository: nifi
Updated Branches:
  refs/heads/master eb12b932a -> fae2e3aa2


NIFI-3765
- added status operation to NodeManager
- updated help text
- add multiple url support with the -u flag
- This closes #1726


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

Branch: refs/heads/master
Commit: fae2e3aa21201d3aa826c96129661cb68f7a2453
Parents: eb12b93
Author: Yolanda M. Davis <yo...@gmail.com>
Authored: Mon May 1 19:33:42 2017 -0400
Committer: Matt Gilman <ma...@gmail.com>
Committed: Tue May 2 13:07:18 2017 -0400

----------------------------------------------------------------------
 .../admin/nodemanager/NodeManagerTool.groovy    | 88 ++++++++++++++------
 .../nodemanager/NodeManagerToolSpec.groovy      | 65 +++++++++++++++
 2 files changed, 129 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/fae2e3aa/nifi-toolkit/nifi-toolkit-admin/src/main/groovy/org/apache/nifi/toolkit/admin/nodemanager/NodeManagerTool.groovy
----------------------------------------------------------------------
diff --git a/nifi-toolkit/nifi-toolkit-admin/src/main/groovy/org/apache/nifi/toolkit/admin/nodemanager/NodeManagerTool.groovy b/nifi-toolkit/nifi-toolkit-admin/src/main/groovy/org/apache/nifi/toolkit/admin/nodemanager/NodeManagerTool.groovy
index b39c93c..e78adec 100644
--- a/nifi-toolkit/nifi-toolkit-admin/src/main/groovy/org/apache/nifi/toolkit/admin/nodemanager/NodeManagerTool.groovy
+++ b/nifi-toolkit/nifi-toolkit-admin/src/main/groovy/org/apache/nifi/toolkit/admin/nodemanager/NodeManagerTool.groovy
@@ -53,8 +53,10 @@ public class NodeManagerTool extends AbstractAdminTool {
     private static final String REMOVE = "remove"
     private static final String DISCONNECT = "disconnect"
     private static final String CONNECT = "connect"
+    private static final String NODE_STATUS = "status"
     private static final String OPERATION = "operation"
     private final static String NODE_ENDPOINT = "/nifi-api/controller/cluster/nodes"
+    private final static String NIFI_ENDPOINT = "/nifi"
     private final static String SUPPORTED_MINIMUM_VERSION = "1.0.0"
     static enum STATUS {DISCONNECTING,CONNECTING,CONNECTED}
 
@@ -80,7 +82,7 @@ public class NodeManagerTool extends AbstractAdminTool {
         options.addOption(Option.builder("p").longOpt(PROXY_DN).hasArg().desc("User or Proxy DN that has permission to send a notification. User must have view and modify privileges to 'access the controller' in NiFi").build())
         options.addOption(Option.builder("b").longOpt(BOOTSTRAP_CONF).hasArg().desc("Existing Bootstrap Configuration file").build())
         options.addOption(Option.builder("d").longOpt(NIFI_INSTALL_DIR).hasArg().desc("NiFi Installation Directory").build())
-        options.addOption(Option.builder("o").longOpt(OPERATION).hasArg().desc("Operation to connect, disconnect or remove node from cluster").build())
+        options.addOption(Option.builder("o").longOpt(OPERATION).hasArg().desc("Operations supported: status, connect (cluster), disconnect(cluster), remove (cluster)").build())
         options.addOption(Option.builder("u").longOpt(CLUSTER_URLS).hasArg().desc("List of active urls for the cluster").build())
         options
     }
@@ -135,6 +137,34 @@ public class NodeManagerTool extends AbstractAdminTool {
         }
     }
 
+    void getStatus(final Client client,NiFiProperties niFiProperties,List<String> activeUrls){
+        if(activeUrls == null || activeUrls.empty) {
+            final String nodeUrl = NiFiClientUtil.getUrl(niFiProperties, null)
+            activeUrls = [nodeUrl]
+        }
+
+        for(String activeUrl: activeUrls) {
+            final String url = activeUrl + NIFI_ENDPOINT
+            final WebResource webResource = client.resource(url)
+
+            if (isVerbose) {
+                logger.info("Checking if node is available")
+            }
+
+            try {
+                final ClientResponse response = webResource.get(ClientResponse.class)
+                if (response.status == 200) {
+                    System.out.println("NiFi Node is running and available at "+url)
+                } else {
+                    System.out.println("Attempt to contact NiFi Node at "+url+" returned Response Code: " + response.status + " with reason: " + response.getEntity(String.class))
+                }
+            } catch (Exception ex) {
+                System.out.println("Attempt to contact NiFi Node "+url+" did not complete due to exception: " + ex.localizedMessage)
+            }
+        }
+
+    }
+
     void disconnectNode(final Client client, NiFiProperties niFiProperties, List<String> activeUrls, final String proxyDN){
         final ClusterEntity clusterEntity = NiFiClientUtil.getCluster(client, niFiProperties, activeUrls,proxyDN)
         NodeDTO currentNode = getCurrentNode(clusterEntity,niFiProperties)
@@ -232,50 +262,60 @@ public class NodeManagerTool extends AbstractAdminTool {
                 String nifiPropertiesFileName = nifiConfDir + File.separator +"nifi.properties"
                 final String key = NiFiPropertiesLoader.extractKeyFromBootstrapFile(bootstrapConfFileName)
                 final NiFiProperties niFiProperties = NiFiPropertiesLoader.withKey(key).load(nifiPropertiesFileName)
+                final String operation = commandLine.getOptionValue(OPERATION)
 
-                if(!StringUtils.isEmpty(niFiProperties.getProperty(NiFiProperties.WEB_HTTPS_PORT)) && StringUtils.isEmpty(proxyDN)) {
+                if(!StringUtils.isEmpty(niFiProperties.getProperty(NiFiProperties.WEB_HTTPS_PORT)) && StringUtils.isEmpty(proxyDN) && !operation.equalsIgnoreCase(NODE_STATUS)) {
                     throw new UnsupportedOperationException("Proxy DN is required for sending a notification to this node or cluster")
                 }
 
                 final String nifiInstallDir = commandLine.getOptionValue(NIFI_INSTALL_DIR)
 
-                if(supportedNiFiMinimumVersion(nifiConfDir,nifiLibDir,SUPPORTED_MINIMUM_VERSION) && NiFiClientUtil.isCluster(niFiProperties)){
+                if(supportedNiFiMinimumVersion(nifiConfDir,nifiLibDir,SUPPORTED_MINIMUM_VERSION)){
 
                     final Client client = clientFactory.getClient(niFiProperties,nifiInstallDir)
-                    final String operation = commandLine.getOptionValue(OPERATION)
 
                     if(isVerbose){
                         logger.info("Starting {} request",operation)
                     }
 
-                    List<String> activeUrls
-
-                    if(commandLine.hasOption(CLUSTER_URLS)){
+                    List<String> activeUrls = null
+                    if (commandLine.hasOption(CLUSTER_URLS)) {
                         final String urlList = commandLine.getOptionValue(CLUSTER_URLS)
                         activeUrls = urlList.tokenize(',')
-                    }else{
-                        activeUrls = NiFiClientUtil.getActiveClusterUrls(client,niFiProperties,proxyDN)
                     }
 
-                    if(isVerbose){
-                        logger.info("Using active urls {} for communication.",activeUrls)
-                    }
+                    if(operation.equalsIgnoreCase(NODE_STATUS)){
+                        getStatus(client,niFiProperties,activeUrls)
+                    }else{
+
+                        if(NiFiClientUtil.isCluster(niFiProperties)) {
+
+                            if (activeUrls == null) {
+                                activeUrls = NiFiClientUtil.getActiveClusterUrls(client, niFiProperties, proxyDN)
+                            }
+
+                            if (isVerbose) {
+                                logger.info("Using active urls {} for communication.", activeUrls)
+                            }
+
+                            if (operation.toLowerCase().equals(REMOVE)) {
+                                removeNode(client, niFiProperties, activeUrls, proxyDN)
+                            } else if (operation.toLowerCase().equals(DISCONNECT)) {
+                                disconnectNode(client, niFiProperties, activeUrls, proxyDN)
+                            } else if (operation.toLowerCase().equals(CONNECT)) {
+                                connectNode(client, niFiProperties, activeUrls, proxyDN)
+                            } else {
+                                throw new ParseException("Invalid operation provided: " + operation)
+                            }
+                        }else{
+                            throw new UnsupportedOperationException("The provided operation ("+operation+") is only supported with instances of NiFi running within a cluster.")
+                        }
 
-                    if(operation.toLowerCase().equals(REMOVE)){
-                        removeNode(client,niFiProperties,activeUrls,proxyDN)
-                    }
-                    else if(operation.toLowerCase().equals(DISCONNECT)){
-                        disconnectNode(client,niFiProperties,activeUrls,proxyDN)
-                    }
-                    else if(operation.toLowerCase().equals(CONNECT)){
-                        connectNode(client,niFiProperties,activeUrls,proxyDN)
-                    }
-                    else{
-                        throw new ParseException("Invalid operation provided: " + operation)
                     }
 
+
                 }else{
-                    throw new UnsupportedOperationException("Node Manager Tool only supports clustered instance of NiFi running versions 1.0.0 or higher.")
+                    throw new UnsupportedOperationException("Node Manager Tool only supports instances of NiFi running versions 1.0.0 or higher.")
                 }
 
             }else if(!commandLine.hasOption(BOOTSTRAP_CONF)){

http://git-wip-us.apache.org/repos/asf/nifi/blob/fae2e3aa/nifi-toolkit/nifi-toolkit-admin/src/test/groovy/org/apache/nifi/toolkit/admin/nodemanager/NodeManagerToolSpec.groovy
----------------------------------------------------------------------
diff --git a/nifi-toolkit/nifi-toolkit-admin/src/test/groovy/org/apache/nifi/toolkit/admin/nodemanager/NodeManagerToolSpec.groovy b/nifi-toolkit/nifi-toolkit-admin/src/test/groovy/org/apache/nifi/toolkit/admin/nodemanager/NodeManagerToolSpec.groovy
index 5fd7d3d..d5f3705 100644
--- a/nifi-toolkit/nifi-toolkit-admin/src/test/groovy/org/apache/nifi/toolkit/admin/nodemanager/NodeManagerToolSpec.groovy
+++ b/nifi-toolkit/nifi-toolkit-admin/src/test/groovy/org/apache/nifi/toolkit/admin/nodemanager/NodeManagerToolSpec.groovy
@@ -141,6 +141,7 @@ class NodeManagerToolSpec extends Specification{
         e.message == "Invalid operation provided: fake"
     }
 
+
     def "get node info successfully"(){
 
         given:
@@ -164,6 +165,7 @@ class NodeManagerToolSpec extends Specification{
 
     }
 
+
     def "delete node successfully"(){
 
         given:
@@ -312,6 +314,69 @@ class NodeManagerToolSpec extends Specification{
 
     }
 
+    def "get node status successfully"(){
+
+        given:
+        def NiFiProperties niFiProperties = Mock NiFiProperties
+        def Client client = Mock Client
+        def WebResource resource = Mock WebResource
+        def ClientResponse response = Mock ClientResponse
+        def config = new NodeManagerTool()
+
+        when:
+        config.getStatus(client,niFiProperties,null)
+
+        then:
+        niFiProperties.getProperty(NiFiProperties.WEB_HTTPS_PORT) >> "8080"
+        niFiProperties.getProperty(NiFiProperties.WEB_HTTPS_HOST) >> "localhost"
+        1 * client.resource(_ as String) >> resource
+        1 * resource.get(ClientResponse.class) >> response
+        1 * response.getStatus() >> 200
+    }
+
+    def "get node status when unavailable"(){
+
+        given:
+        def NiFiProperties niFiProperties = Mock NiFiProperties
+        def Client client = Mock Client
+        def WebResource resource = Mock WebResource
+        def ClientResponse response = Mock ClientResponse
+        def config = new NodeManagerTool()
+
+        when:
+        config.getStatus(client,niFiProperties,null)
+
+        then:
+        niFiProperties.getProperty(NiFiProperties.WEB_HTTPS_PORT) >> "8080"
+        niFiProperties.getProperty(NiFiProperties.WEB_HTTPS_HOST) >> "localhost"
+        1 * client.resource(_ as String) >> resource
+        1 * resource.get(ClientResponse.class) >> response
+        2 * response.getStatus() >> 403
+        1 * response.getEntity(String.class) >> "Unauthorized User"
+    }
+
+    def "get multiple node status successfully"(){
+
+        given:
+        def NiFiProperties niFiProperties = Mock NiFiProperties
+        def Client client = Mock Client
+        def WebResource resource = Mock WebResource
+        def ClientResponse response = Mock ClientResponse
+        def config = new NodeManagerTool()
+        def activeUrls = ["https://localhost:8080","https://localhost1:8080"]
+
+        when:
+        config.getStatus(client,niFiProperties,activeUrls)
+
+        then:
+        niFiProperties.getProperty(NiFiProperties.WEB_HTTPS_PORT) >> "8080"
+        niFiProperties.getProperty(NiFiProperties.WEB_HTTPS_HOST) >> "localhost"
+        2 * client.resource(_ as String) >> resource
+        2 * resource.get(ClientResponse.class) >> response
+        2 * response.getStatus() >> 200
+    }
+
+
     def "disconnect node successfully"(){
 
         setup: