You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@slider.apache.org by sm...@apache.org on 2014/10/15 03:07:44 UTC

[06/23] git commit: SLIDER-511 slider diagnostic command to list env variables and client configuration

SLIDER-511 slider diagnostic command to list env variables and client configuration


Project: http://git-wip-us.apache.org/repos/asf/incubator-slider/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-slider/commit/5456a58d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-slider/tree/5456a58d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-slider/diff/5456a58d

Branch: refs/heads/feature/SLIDER-481_allow_dedicated_handling_of_exports
Commit: 5456a58dff351141a96da633465361a0028f1395
Parents: 6c43743
Author: Steve Loughran <st...@apache.org>
Authored: Mon Oct 13 19:05:03 2014 -0700
Committer: Steve Loughran <st...@apache.org>
Committed: Mon Oct 13 19:05:03 2014 -0700

----------------------------------------------------------------------
 .../org/apache/slider/client/SliderClient.java  | 47 +++++++++++----
 .../common/params/ActionDiagnosticArgs.java     |  7 ++-
 .../slider/common/params/ActionResolveArgs.java |  1 -
 .../apache/slider/common/params/Arguments.java  | 22 +++----
 .../slider/common/tools/ConfigHelper.java       |  2 +-
 .../core/registry/SliderRegistryUtils.java      | 62 ++++++++++++++++++++
 .../TestStandaloneYarnRegistryAM.groovy         |  9 +++
 .../apache/slider/client/TestDiagnostics.groovy | 58 ++++++++++++++++++
 .../slider/registry/TestRegistryPaths.groovy    | 17 +++++-
 .../commands/DiagnosticsCommandIT.groovy        | 36 ++++++++++++
 10 files changed, 235 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5456a58d/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
index 750bfaa..e44db3b 100644
--- a/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
+++ b/slider-core/src/main/java/org/apache/slider/client/SliderClient.java
@@ -109,6 +109,7 @@ import org.apache.slider.core.launch.RunningApplication;
 import org.apache.slider.core.main.RunService;
 import org.apache.slider.core.persist.ConfPersister;
 import org.apache.slider.core.persist.LockAcquireFailedException;
+import org.apache.slider.core.registry.SliderRegistryUtils;
 import org.apache.slider.core.registry.YarnAppListClient;
 import org.apache.slider.core.registry.docstore.ConfigFormat;
 import org.apache.slider.core.registry.docstore.PublishedConfigSet;
@@ -124,7 +125,6 @@ import org.apache.slider.providers.agent.AgentKeys;
 import org.apache.slider.providers.slideram.SliderAMClientProvider;
 import org.apache.slider.server.appmaster.SliderAppMaster;
 import org.apache.slider.server.appmaster.rpc.RpcBinder;
-import org.apache.slider.server.appmaster.security.SecurityConfiguration;
 import org.apache.slider.server.services.utility.AbstractSliderLaunchedService;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
@@ -439,6 +439,7 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
    * Create the zookeeper node associated with the calling user and the cluster
    */
   @VisibleForTesting
+  @Deprecated
   public String createZookeeperNode(String clusterName, Boolean nameOnly) throws YarnException, IOException {
     String user = getUsername();
     String zkPath = ZKIntegration.mkClusterPath(user, clusterName);
@@ -511,8 +512,15 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
       log.warn("Filesystem returned false from delete() operation");
     }
 
-    if(!deleteZookeeperNode(clustername)) {
-      log.warn("Unable to perform node cleanup in Zookeeper.");
+    // rm the registry entry —do not let this block the destroy operations
+    String registryPath = SliderRegistryUtils.registryPathForInstance(
+        clustername);
+    try {
+      getRegistryOperations().delete(registryPath, true);
+    } catch (IOException e) {
+      log.warn("Error deleting {}: {} ", registryPath, e, e);
+    } catch (SliderException e) {
+      log.warn("Error binding to registry {} ", e, e);
     }
 
     List<ApplicationReport> instances = findAllLiveInstances(clustername);
@@ -531,9 +539,7 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
   
   @Override
   public int actionAmSuicide(String clustername,
-      ActionAMSuicideArgs args) throws
-                                                              YarnException,
-                                                              IOException {
+      ActionAMSuicideArgs args) throws YarnException, IOException {
     SliderClusterOperations clusterOperations =
       createClusterOperations(clustername);
     clusterOperations.amSuicide(args.message, args.exitcode, args.waittime);
@@ -2210,7 +2216,7 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
     // the arguments
     args.validate();
     RegistryOperations operations = getRegistryOperations();
-    String path = args.path;
+    String path = SliderRegistryUtils.resolvePath(args.path);
     ServiceRecordMarshal serviceRecordMarshal = new ServiceRecordMarshal();
     try {
       if (args.list) {
@@ -2351,7 +2357,7 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
   public int actionDiagnostic(ActionDiagnosticArgs diagnosticArgs) {
 		try {
 			if (diagnosticArgs.client) {
-				actionDiagnosticClient();
+				actionDiagnosticClient(diagnosticArgs);
 			} else if (SliderUtils.isSet(diagnosticArgs.application)) {
 				actionDiagnosticApplication(diagnosticArgs);
 			} else if (SliderUtils.isSet(diagnosticArgs.slider)) {
@@ -2442,7 +2448,7 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
 		//assign application name from param to each sub diagnostic function
 		diagnosticArgs.application = diagnosticArgs.all;
 		diagnosticArgs.slider = diagnosticArgs.all;
-		actionDiagnosticClient();
+		actionDiagnosticClient(diagnosticArgs);
 		actionDiagnosticApplication(diagnosticArgs);
 		actionDiagnosticSlider(diagnosticArgs);
 		actionDiagnosticYarn(diagnosticArgs);
@@ -2579,7 +2585,8 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
 		}
 	}
 
-	private void actionDiagnosticClient() throws SliderException, IOException {
+	private void actionDiagnosticClient(ActionDiagnosticArgs diagnosticArgs)
+      throws SliderException, IOException {
 		String currentCommandPath = SliderUtils.getCurrentCommandPath();
 		SliderVersionInfo.loadAndPrintVersionInfo(log);
 		String clientConfigPath = SliderUtils.getClientConfigPath();
@@ -2589,6 +2596,25 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
 				+ clientConfigPath);
 		log.info(jdkInfo);
 
+    // verbose?
+    if (diagnosticArgs.verbose) {
+      // do the environment
+      Map<String, String> env = System.getenv();
+      Set<String> envList = ConfigHelper.sortedConfigKeys(env.entrySet());
+      StringBuilder builder = new StringBuilder("Environment variables:\n");
+      for (String key : envList) {
+        builder.append(key)
+               .append("=")
+               .append(env.get(key))
+               .append("\n");
+      }
+      log.info(builder.toString());
+      
+      // then the config
+      log.info("Slider client configuration:\n" +
+               ConfigHelper.dumpConfigToString(getConfig()));
+    }
+    
 		try {
 			SliderUtils.validateSliderClientEnvironment(log);
 		} catch (SliderException e) {
@@ -2598,6 +2624,7 @@ public class SliderClient extends AbstractSliderLaunchedService implements RunSe
 			log.error(e.toString());
 			throw e;
 		}
+    
 	}
 
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5456a58d/slider-core/src/main/java/org/apache/slider/common/params/ActionDiagnosticArgs.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/common/params/ActionDiagnosticArgs.java b/slider-core/src/main/java/org/apache/slider/common/params/ActionDiagnosticArgs.java
index b2fde07..33abb30 100644
--- a/slider-core/src/main/java/org/apache/slider/common/params/ActionDiagnosticArgs.java
+++ b/slider-core/src/main/java/org/apache/slider/common/params/ActionDiagnosticArgs.java
@@ -9,11 +9,12 @@ public class ActionDiagnosticArgs extends AbstractActionArgs
 {
 	  public static final String USAGE =
 	      "Usage: " + SliderActions.ACTION_DIAGNOSTIC
-	      + Arguments.ARG_CLIENT + "| "
+        + " "
+	      + Arguments.ARG_CLIENT + " | "
 	      + Arguments.ARG_SLIDER + " <appname> " + "| "
 	      + Arguments.ARG_APPLICATION + " <appname> " + "| "
-	      + Arguments.ARG_YARN + "| "
-	      + Arguments.ARG_CREDENTIALS + "| "
+	      + Arguments.ARG_YARN + " | "
+	      + Arguments.ARG_CREDENTIALS + " | "
 	      + Arguments.ARG_ALL + " <appname> " + "| "
 	      + Arguments.ARG_LEVEL + " <appname> "
 	      + " [" + Arguments.ARG_VERBOSE + "] ";

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5456a58d/slider-core/src/main/java/org/apache/slider/common/params/ActionResolveArgs.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/common/params/ActionResolveArgs.java b/slider-core/src/main/java/org/apache/slider/common/params/ActionResolveArgs.java
index 4759bcb..2ee075a 100644
--- a/slider-core/src/main/java/org/apache/slider/common/params/ActionResolveArgs.java
+++ b/slider-core/src/main/java/org/apache/slider/common/params/ActionResolveArgs.java
@@ -26,7 +26,6 @@ import org.apache.slider.core.exceptions.UsageException;
 
 import java.io.File;
 
-import static org.apache.slider.common.params.SliderActions.ACTION_REGISTRY;
 import static org.apache.slider.common.params.SliderActions.ACTION_RESOLVE;
 import static org.apache.slider.common.params.SliderActions.DESCRIBE_ACTION_REGISTRY;
 

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5456a58d/slider-core/src/main/java/org/apache/slider/common/params/Arguments.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/common/params/Arguments.java b/slider-core/src/main/java/org/apache/slider/common/params/Arguments.java
index 4deebd7..59c7095 100644
--- a/slider-core/src/main/java/org/apache/slider/common/params/Arguments.java
+++ b/slider-core/src/main/java/org/apache/slider/common/params/Arguments.java
@@ -21,16 +21,22 @@ package org.apache.slider.common.params;
 /**
  * Here are all the arguments that may be parsed by the client or server
  * command lines. 
+ * 
+ * Important: Please keep the main list in alphabetical order
+ * so it is easier to see what arguments are there
  */
 public interface Arguments {
-
+  String ARG_ALL = "--all";
+  String ARG_APPLICATION = "--application";
   String ARG_APP_HOME = "--apphome";
+  String ARG_CLIENT = "--client";
   String ARG_CONFDIR = "--appconf";
   String ARG_COMPONENT = "--component";
   String ARG_COMPONENT_SHORT = "--comp";
   String ARG_COMP_OPT= "--compopt";
   String ARG_COMP_OPT_SHORT = "--co";
-  
+  String ARG_CREDENTIALS = "--credentials";
+
   String ARG_DEBUG = "--debug";
   String ARG_DEFINE = "-D";
   String ARG_DEST = "--dest";
@@ -51,6 +57,7 @@ public interface Arguments {
   String ARG_ID = "--id";
   String ARG_IMAGE = "--image";
   String ARG_INTERNAL = "--internal";
+  String ARG_LEVEL = "--level";
   String ARG_LIST = "--list";
   String ARG_LISTFILES = "--listfiles";
   String ARG_LISTCONF = "--listconf";
@@ -58,14 +65,15 @@ public interface Arguments {
   String ARG_MANAGER = "--manager";
   String ARG_MANAGER_SHORT = "--m";
   String ARG_MESSAGE = "--message";
+  String ARG_NAME = "--name";
   String ARG_OPTION = "--option";
   String ARG_OPTION_SHORT = "-O";
-  String ARG_NAME = "--name";
   String ARG_OUTPUT = "--out";
   String ARG_OUTPUT_SHORT = "-o";
   String ARG_PACKAGE = "--package";
   String ARG_PATH = "--path";
   String ARG_PROVIDER = "--provider";
+  String ARG_QUEUE = "--queue";
   String ARG_RESOURCES = "--resources";
   String ARG_RES_COMP_OPT = "--rescompopt";
   String ARG_RES_COMP_OPT_SHORT = "--rco";
@@ -73,6 +81,7 @@ public interface Arguments {
   String ARG_RESOURCE_OPT = "--resopt";
   String ARG_RESOURCE_OPT_SHORT = "-ro";
   String ARG_SERVICETYPE = "--servicetype";
+  String ARG_SLIDER = "--slider";
   String ARG_SYSPROP = "-S";
   String ARG_TEMPLATE = "--template";
   String ARG_VERBOSE = "--verbose";
@@ -81,14 +90,7 @@ public interface Arguments {
   String ARG_ZKPORT = "--zkport";
   String ARG_ZKHOSTS = "--zkhosts";
   String ARG_REPLACE_PKG = "--replacepkg";
-  String ARG_CLIENT = "--client";
-  String ARG_SLIDER = "--slider";
-  String ARG_APPLICATION = "--application";
   String ARG_YARN = "--yarn";
-  String ARG_CREDENTIALS = "--credentials";
-  String ARG_ALL = "--all";
-  String ARG_LEVEL = "--level";
-  String ARG_QUEUE = "--queue";
 
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5456a58d/slider-core/src/main/java/org/apache/slider/common/tools/ConfigHelper.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/common/tools/ConfigHelper.java b/slider-core/src/main/java/org/apache/slider/common/tools/ConfigHelper.java
index 31acb94..b710224 100644
--- a/slider-core/src/main/java/org/apache/slider/common/tools/ConfigHelper.java
+++ b/slider-core/src/main/java/org/apache/slider/common/tools/ConfigHelper.java
@@ -416,7 +416,7 @@ public class ConfigHelper {
    * @return listing in key=value style
    */
   public static String dumpConfigToString(Configuration conf) {
-    TreeSet<String> sorted = sortedConfigKeys(conf);
+    Set<String> sorted = sortedConfigKeys(conf);
 
     StringBuilder builder = new StringBuilder();
     for (String key : sorted) {

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5456a58d/slider-core/src/main/java/org/apache/slider/core/registry/SliderRegistryUtils.java
----------------------------------------------------------------------
diff --git a/slider-core/src/main/java/org/apache/slider/core/registry/SliderRegistryUtils.java b/slider-core/src/main/java/org/apache/slider/core/registry/SliderRegistryUtils.java
new file mode 100644
index 0000000..37b36ea
--- /dev/null
+++ b/slider-core/src/main/java/org/apache/slider/core/registry/SliderRegistryUtils.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.core.registry;
+
+import com.google.common.base.Preconditions;
+import org.apache.hadoop.registry.client.binding.RegistryUtils;
+import org.apache.slider.common.SliderKeys;
+
+/**
+ * Miscellaneous methods to assist slider registry work
+ * 
+ */
+public class SliderRegistryUtils {
+
+
+  /**
+   * Get the registry path for an instance under the user's home node
+   * @param instanceName application instance
+   * @return a path to the registry location for this application instance.
+   */
+  public static String registryPathForInstance(String instanceName) {
+    return RegistryUtils.servicePath(
+        RegistryUtils.currentUser(), SliderKeys.APP_TYPE, instanceName
+    );
+  }
+
+  /**
+   * Process a path expanding it if needed.
+   * Validation is delegated to later as the core registry will need
+   * to do that anyway
+   * @param path path
+   * @return a path maybe with some expansion
+   */
+  public static String resolvePath(String path) {
+    Preconditions.checkArgument(path!=null, "null path");
+    Preconditions.checkArgument(!path.isEmpty(), "empty path");
+    String newpath = path;
+    if (path.startsWith("~/")) {
+      // add user expansion
+      newpath = RegistryUtils.homePathForCurrentUser() + path.substring(1);
+    } else if (path.equals("~")) {
+      newpath = RegistryUtils.homePathForCurrentUser();
+    }
+    return newpath;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5456a58d/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneYarnRegistryAM.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneYarnRegistryAM.groovy b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneYarnRegistryAM.groovy
index e75cc57..a849be3 100644
--- a/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneYarnRegistryAM.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/agent/standalone/TestStandaloneYarnRegistryAM.groovy
@@ -257,6 +257,15 @@ class TestStandaloneYarnRegistryAM extends AgentMiniClusterTestBase {
     assert recordFromFile[YarnRegistryAttributes.YARN_PERSISTENCE] ==
            serviceRecord[YarnRegistryAttributes.YARN_PERSISTENCE]
 
+    //resolve to the home directory
+    assert 0 == client.actionResolve(new ActionResolveArgs(
+        path: "~", list:true))
+
+    //resolve to the instance
+    assert 0 == client.actionResolve(new ActionResolveArgs(
+        path: "~/services/org-apache-slider/$clustername",
+        list: true))
+
     // hit the registry web page
     def registryEndpoint = serviceRecord.getExternalEndpoint(
         CustomRegistryConstants.REGISTRY_REST_API)

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5456a58d/slider-core/src/test/groovy/org/apache/slider/client/TestDiagnostics.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/client/TestDiagnostics.groovy b/slider-core/src/test/groovy/org/apache/slider/client/TestDiagnostics.groovy
new file mode 100644
index 0000000..57126f8
--- /dev/null
+++ b/slider-core/src/test/groovy/org/apache/slider/client/TestDiagnostics.groovy
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.client
+
+import groovy.transform.CompileStatic
+import groovy.util.logging.Slf4j
+import org.apache.hadoop.yarn.conf.YarnConfiguration
+import org.apache.slider.common.params.ActionDiagnosticArgs
+import org.apache.slider.common.params.Arguments
+import org.apache.slider.common.params.SliderActions
+import org.apache.slider.core.main.ServiceLauncher
+import org.apache.slider.test.SliderTestBase
+import org.apache.slider.test.YarnMiniClusterTestBase
+import org.apache.slider.test.YarnZKMiniClusterTestBase
+import org.junit.Test
+
+@CompileStatic
+@Slf4j
+class TestDiagnostics extends YarnZKMiniClusterTestBase {
+
+  @Test
+  public void testClientDiags() throws Throwable {
+    //launch fake master
+    String clustername = createMiniCluster("", configuration, 1, true)
+    ServiceLauncher<SliderClient> launcher = launchClientAgainstMiniMR(
+        //config includes RM binding info
+        new YarnConfiguration(miniCluster.config),
+        //varargs list of command line params
+        [SliderActions.ACTION_DIAGNOSTIC,
+         Arguments.ARG_CLIENT]
+    )
+    def client = launcher.service
+    def diagnostics = new ActionDiagnosticArgs()
+    diagnostics.client = true
+    diagnostics.verbose = true
+    describe("Verbose diagnostics")
+    
+    
+    client.actionDiagnostic(diagnostics)
+
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5456a58d/slider-core/src/test/groovy/org/apache/slider/registry/TestRegistryPaths.groovy
----------------------------------------------------------------------
diff --git a/slider-core/src/test/groovy/org/apache/slider/registry/TestRegistryPaths.groovy b/slider-core/src/test/groovy/org/apache/slider/registry/TestRegistryPaths.groovy
index be5ce78..5f95e0b 100644
--- a/slider-core/src/test/groovy/org/apache/slider/registry/TestRegistryPaths.groovy
+++ b/slider-core/src/test/groovy/org/apache/slider/registry/TestRegistryPaths.groovy
@@ -19,6 +19,7 @@
 package org.apache.slider.registry
 
 import org.apache.hadoop.registry.client.binding.RegistryUtils
+import org.apache.slider.core.registry.SliderRegistryUtils
 import org.apache.slider.test.SliderTestUtils
 import org.junit.Assert
 import org.junit.Test
@@ -44,6 +45,20 @@ class TestRegistryPaths {
       SliderTestUtils.skip("homedir filtering not yet in hadoop registry module")
     }
   }
-  
+
+  @Test
+  public void testRegistryPathForInstance() throws Throwable {
+    def path = SliderRegistryUtils.registryPathForInstance("instance")
+    assert path.endsWith("/instance")
+  }
+
+  @Test
+  public void testPathResolution() throws Throwable {
+    def home = RegistryUtils.homePathForCurrentUser()
+    assert home == SliderRegistryUtils.resolvePath("~")
+    assert (home +"/") == SliderRegistryUtils.resolvePath("~/")
+    assert (home +"/something") == SliderRegistryUtils.resolvePath("~/something")
+    assert ("~unresolved") == SliderRegistryUtils.resolvePath("~unresolved")
+  }
   
 }

http://git-wip-us.apache.org/repos/asf/incubator-slider/blob/5456a58d/slider-funtest/src/test/groovy/org/apache/slider/funtest/commands/DiagnosticsCommandIT.groovy
----------------------------------------------------------------------
diff --git a/slider-funtest/src/test/groovy/org/apache/slider/funtest/commands/DiagnosticsCommandIT.groovy b/slider-funtest/src/test/groovy/org/apache/slider/funtest/commands/DiagnosticsCommandIT.groovy
new file mode 100644
index 0000000..b210f4b
--- /dev/null
+++ b/slider-funtest/src/test/groovy/org/apache/slider/funtest/commands/DiagnosticsCommandIT.groovy
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.slider.funtest.commands
+
+import groovy.transform.CompileStatic
+import groovy.util.logging.Slf4j
+import org.apache.slider.funtest.framework.CommandTestBase
+import org.junit.BeforeClass
+import org.junit.Test
+
+@CompileStatic
+@Slf4j
+public class DiagnosticsCommandIT extends CommandTestBase {
+
+  @Test
+  public void testListAll() throws Throwable {
+    assertSuccess(list(null))
+  }
+
+}