sijie closed pull request #1724: [table service][cli] improve table service 
related cli commands
URL: https://github.com/apache/bookkeeper/pull/1724
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git 
a/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/net/ServiceURI.java
 
b/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/net/ServiceURI.java
index 289c3f3726..4e2b158df4 100644
--- 
a/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/net/ServiceURI.java
+++ 
b/bookkeeper-common/src/main/java/org/apache/bookkeeper/common/net/ServiceURI.java
@@ -123,6 +123,12 @@
      */
     public static final String SERVICE_BK = "bk";
 
+    /**
+     * The default local bk service uri.
+     */
+    public static final ServiceURI DEFAULT_LOCAL_STREAM_STORAGE_SERVICE_URI =
+        ServiceURI.create("bk://localhost:4181");
+
     private static final String SERVICE_SEP = "+";
     private static final String SERVICE_DLOG_SEP = "-";
 
diff --git a/conf/log4j.cli.properties b/conf/log4j.cli.properties
index ceb77cc934..f90d9551aa 100644
--- a/conf/log4j.cli.properties
+++ b/conf/log4j.cli.properties
@@ -54,7 +54,4 @@ 
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} - %-5p - [%t:%C{
 
 log4j.logger.verbose=INFO,VERBOSECONSOLE
 log4j.logger.org.apache.zookeeper=ERROR
-log4j.logger.org.apache.bookkeeper=ERROR
-log4j.logger.org.apache.bookkeeper.tools=INFO
-log4j.logger.org.apache.bookkeeper.bookie.BookieShell=INFO
-log4j.logger.org.apache.bookkeeper.client.BookKeeperAdmin=INFO
+log4j.logger.org.apache.bookkeeper=INFO
diff --git 
a/stream/server/src/main/java/org/apache/bookkeeper/stream/cluster/StreamCluster.java
 
b/stream/server/src/main/java/org/apache/bookkeeper/stream/cluster/StreamCluster.java
index 407b27fbe2..5490dee472 100644
--- 
a/stream/server/src/main/java/org/apache/bookkeeper/stream/cluster/StreamCluster.java
+++ 
b/stream/server/src/main/java/org/apache/bookkeeper/stream/cluster/StreamCluster.java
@@ -245,10 +245,11 @@ private void createDefaultNamespaces() throws Exception {
             boolean created = false;
             while (!created) {
                 try {
-                    result(admin.getNamespace(namespaceName));
+                    NamespaceProperties nsProps = 
result(admin.getNamespace(namespaceName));
+                    log.info("Namespace '{}':\n{}", namespaceName, nsProps);
                     created = true;
                 } catch (NamespaceNotFoundException nnfe) {
-                    log.info("Namespace '{}' is not found.");
+                    log.info("Namespace '{}' is not found.", namespaceName);
                     log.info("Creating namespace '{}' ...", namespaceName);
                     try {
                         NamespaceProperties nsProps = result(
diff --git 
a/tests/integration/cluster/src/test/java/org/apache/bookkeeper/tests/integration/stream/BkCtlTest.java
 
b/tests/integration/cluster/src/test/java/org/apache/bookkeeper/tests/integration/stream/BkCtlTest.java
index 0bb11a1365..6067776492 100644
--- 
a/tests/integration/cluster/src/test/java/org/apache/bookkeeper/tests/integration/stream/BkCtlTest.java
+++ 
b/tests/integration/cluster/src/test/java/org/apache/bookkeeper/tests/integration/stream/BkCtlTest.java
@@ -118,7 +118,7 @@ public void createTable() throws Exception {
             tableName
         );
         assertTrue(
-            result.getStdout().contains("Successfully created stream '" + 
tableName + "'"));
+            result.getStdout().contains("Successfully created table '" + 
tableName + "'"));
     }
 
     //
diff --git 
a/tests/integration/standalone/src/test/java/org/apache/bookkeeper/tests/integration/standalone/StandaloneTest.java
 
b/tests/integration/standalone/src/test/java/org/apache/bookkeeper/tests/integration/standalone/StandaloneTest.java
index f7b7077810..29c30c369b 100644
--- 
a/tests/integration/standalone/src/test/java/org/apache/bookkeeper/tests/integration/standalone/StandaloneTest.java
+++ 
b/tests/integration/standalone/src/test/java/org/apache/bookkeeper/tests/integration/standalone/StandaloneTest.java
@@ -80,17 +80,20 @@ public void createNamespace() throws Exception {
 
     @Test
     public void createTable() throws Exception {
+        createNamespace();
         String tableName = testName.getMethodName();
         ExecResult result = bkContainer.execCmd(
             "/opt/bookkeeper/bin/bkctl",
             "-u bk://localhost:4181",
+            "--namespace",
+            testName.getMethodName(),
             "tables",
             "create",
             tableName
         );
         assertTrue(
             result.getStdout(),
-            result.getStdout().contains("Successfully created stream '" + 
tableName + "'"));
+            result.getStdout().contains("Successfully created table '" + 
tableName + "'"));
     }
 
 }
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/Commands.java 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/Commands.java
new file mode 100644
index 0000000000..2c88c003df
--- /dev/null
+++ b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/Commands.java
@@ -0,0 +1,38 @@
+/*
+ * 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.bookkeeper.stream.cli;
+
+/**
+ * Utils for commands.
+ */
+public final class Commands {
+
+    private Commands() {}
+
+    public static final String OP_INIT = "init";
+    public static final String OP_CREATE = "create";
+    public static final String OP_DELETE = "delete";
+    public static final String OP_LIST = "list";
+    public static final String OP_GET = "get";
+    public static final String OP_DEL = "del";
+    public static final String OP_PUT = "put";
+    public static final String OP_INC = "inc";
+
+}
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/NamespaceCommandGroup.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/NamespaceCommandGroup.java
index be9e06295b..1300bf2515 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/NamespaceCommandGroup.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/NamespaceCommandGroup.java
@@ -18,6 +18,8 @@
 package org.apache.bookkeeper.stream.cli;
 
 import 
org.apache.bookkeeper.stream.cli.commands.namespace.CreateNamespaceCommand;
+import 
org.apache.bookkeeper.stream.cli.commands.namespace.DeleteNamespaceCommand;
+import org.apache.bookkeeper.stream.cli.commands.namespace.GetNamespaceCommand;
 import org.apache.bookkeeper.tools.common.BKFlags;
 import org.apache.bookkeeper.tools.framework.CliCommandGroup;
 import org.apache.bookkeeper.tools.framework.CliSpec;
@@ -35,6 +37,8 @@
         .withDescription(DESC)
         .withParent("bkctl")
         .addCommand(new CreateNamespaceCommand())
+        .addCommand(new GetNamespaceCommand())
+        .addCommand(new DeleteNamespaceCommand())
         .build();
 
     public NamespaceCommandGroup() {
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/TableAdminCommandGroup.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/TableAdminCommandGroup.java
index 60b98928e2..bce4fc5871 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/TableAdminCommandGroup.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/TableAdminCommandGroup.java
@@ -18,6 +18,8 @@
 package org.apache.bookkeeper.stream.cli;
 
 import org.apache.bookkeeper.stream.cli.commands.table.CreateTableCommand;
+import org.apache.bookkeeper.stream.cli.commands.table.DeleteTableCommand;
+import org.apache.bookkeeper.stream.cli.commands.table.GetTableCommand;
 import org.apache.bookkeeper.tools.common.BKFlags;
 import org.apache.bookkeeper.tools.framework.CliCommandGroup;
 import org.apache.bookkeeper.tools.framework.CliSpec;
@@ -35,6 +37,8 @@
         .withDescription(DESC)
         .withParent("bkctl")
         .addCommand(new CreateTableCommand())
+        .addCommand(new GetTableCommand())
+        .addCommand(new DeleteTableCommand())
         .build();
 
     public TableAdminCommandGroup() {
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/TableCommandGroup.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/TableCommandGroup.java
index 09d3be61bf..f7d96b7ab5 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/TableCommandGroup.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/TableCommandGroup.java
@@ -17,6 +17,7 @@
  */
 package org.apache.bookkeeper.stream.cli;
 
+import org.apache.bookkeeper.stream.cli.commands.table.DelCommand;
 import org.apache.bookkeeper.stream.cli.commands.table.GetCommand;
 import org.apache.bookkeeper.stream.cli.commands.table.IncrementCommand;
 import org.apache.bookkeeper.stream.cli.commands.table.PutCommand;
@@ -39,6 +40,7 @@
         .addCommand(new PutCommand())
         .addCommand(new GetCommand())
         .addCommand(new IncrementCommand())
+        .addCommand(new DelCommand())
         .build();
 
     public TableCommandGroup() {
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/AbstractStreamCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/AbstractStreamCommand.java
new file mode 100644
index 0000000000..583dcff3df
--- /dev/null
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/AbstractStreamCommand.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.bookkeeper.stream.cli.commands;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.bookkeeper.common.net.ServiceURI;
+import org.apache.bookkeeper.tools.common.BKCommand;
+import org.apache.bookkeeper.tools.common.BKFlags;
+import org.apache.bookkeeper.tools.framework.CliFlags;
+import org.apache.bookkeeper.tools.framework.CliSpec;
+import org.apache.commons.configuration.CompositeConfiguration;
+
+
+/**
+ * Abstract stream storage related commands.
+ */
+@Slf4j
+abstract class AbstractStreamCommand<CommandFlagsT extends CliFlags> extends 
BKCommand<CommandFlagsT> {
+
+    protected AbstractStreamCommand(CliSpec<CommandFlagsT> spec) {
+        super(spec);
+    }
+
+    @Override
+    protected boolean acceptServiceUri(ServiceURI serviceURI) {
+        return ServiceURI.SERVICE_BK.equals(serviceURI.getServiceName());
+    }
+
+    @Override
+    protected boolean apply(ServiceURI serviceURI,
+                            CompositeConfiguration conf,
+                            BKFlags globalFlags,
+                            CommandFlagsT cmdFlags) {
+        if (serviceURI == null) {
+            serviceURI = ServiceURI.DEFAULT_LOCAL_STREAM_STORAGE_SERVICE_URI;
+            log.info("Service Uri is not specified. Using default service uri 
: {}", serviceURI);
+        }
+        return doApply(serviceURI, conf, globalFlags, cmdFlags);
+    }
+
+    protected abstract boolean doApply(ServiceURI serviceURI,
+                                       CompositeConfiguration conf,
+                                       BKFlags globalFlags,
+                                       CommandFlagsT cmdFlags);
+}
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/AdminCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/AdminCommand.java
index eb319aae8a..bbe47b71dd 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/AdminCommand.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/AdminCommand.java
@@ -17,14 +17,11 @@
  */
 package org.apache.bookkeeper.stream.cli.commands;
 
-import static com.google.common.base.Preconditions.checkArgument;
-
 import lombok.extern.slf4j.Slf4j;
 import org.apache.bookkeeper.clients.StorageClientBuilder;
 import org.apache.bookkeeper.clients.admin.StorageAdminClient;
 import org.apache.bookkeeper.clients.config.StorageClientSettings;
 import org.apache.bookkeeper.common.net.ServiceURI;
-import org.apache.bookkeeper.tools.common.BKCommand;
 import org.apache.bookkeeper.tools.common.BKFlags;
 import org.apache.bookkeeper.tools.framework.CliFlags;
 import org.apache.bookkeeper.tools.framework.CliSpec;
@@ -34,26 +31,17 @@
  * An admin command interface provides a run method to execute admin commands.
  */
 @Slf4j
-public abstract class AdminCommand<ClientFlagsT extends CliFlags> extends 
BKCommand<ClientFlagsT> {
+public abstract class AdminCommand<ClientFlagsT extends CliFlags> extends 
AbstractStreamCommand<ClientFlagsT> {
 
     protected AdminCommand(CliSpec<ClientFlagsT> spec) {
         super(spec);
     }
 
     @Override
-    protected boolean acceptServiceUri(ServiceURI serviceURI) {
-        return ServiceURI.SERVICE_BK.equals(serviceURI.getServiceName());
-    }
-
-    @Override
-    protected boolean apply(ServiceURI serviceURI,
-                            CompositeConfiguration conf,
-                            BKFlags bkFlags,
-                            ClientFlagsT cmdFlags) {
-        checkArgument(
-            null != serviceURI,
-            "No service URI is provided");
-
+    protected boolean doApply(ServiceURI serviceURI,
+                              CompositeConfiguration conf,
+                              BKFlags bkFlags,
+                              ClientFlagsT cmdFlags) {
         StorageClientSettings settings = StorageClientSettings.newBuilder()
             .clientName("bkctl")
             .serviceUri(serviceURI.getUri().toString())
@@ -66,6 +54,8 @@ protected boolean apply(ServiceURI serviceURI,
             return true;
         } catch (Exception e) {
             log.error("Failed to process stream admin command", e);
+            spec.console().println("Failed to process stream admin command");
+            e.printStackTrace(spec.console());
             return false;
         }
     }
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/ClientCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/ClientCommand.java
index 03232a3b4c..14ad838cdd 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/ClientCommand.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/ClientCommand.java
@@ -17,14 +17,11 @@
  */
 package org.apache.bookkeeper.stream.cli.commands;
 
-import static com.google.common.base.Preconditions.checkArgument;
-
 import lombok.extern.slf4j.Slf4j;
 import org.apache.bookkeeper.api.StorageClient;
 import org.apache.bookkeeper.clients.StorageClientBuilder;
 import org.apache.bookkeeper.clients.config.StorageClientSettings;
 import org.apache.bookkeeper.common.net.ServiceURI;
-import org.apache.bookkeeper.tools.common.BKCommand;
 import org.apache.bookkeeper.tools.common.BKFlags;
 import org.apache.bookkeeper.tools.framework.CliFlags;
 import org.apache.bookkeeper.tools.framework.CliSpec;
@@ -34,21 +31,17 @@
  * An admin command interface provides a run method to execute admin commands.
  */
 @Slf4j
-public abstract class ClientCommand<ClientFlagsT extends CliFlags> extends 
BKCommand<ClientFlagsT> {
+public abstract class ClientCommand<ClientFlagsT extends CliFlags> extends 
AbstractStreamCommand<ClientFlagsT> {
 
     protected ClientCommand(CliSpec<ClientFlagsT> spec) {
         super(spec);
     }
 
     @Override
-    protected boolean apply(ServiceURI serviceURI,
-                            CompositeConfiguration conf,
-                            BKFlags globalFlags,
-                            ClientFlagsT cmdFlags) {
-        checkArgument(
-            null != serviceURI,
-            "No service uri is provided");
-
+    protected boolean doApply(ServiceURI serviceURI,
+                              CompositeConfiguration conf,
+                              BKFlags globalFlags,
+                              ClientFlagsT cmdFlags) {
         StorageClientSettings settings = StorageClientSettings.newBuilder()
             .clientName("bkctl")
             .serviceUri(serviceURI.getUri().toString())
@@ -63,6 +56,8 @@ protected boolean apply(ServiceURI serviceURI,
         } catch (Exception e) {
             log.error("Failed to process commands under namespace '{}'",
                 globalFlags.namespace, e);
+            spec.console().println("Failed to process stream admin command");
+            e.printStackTrace(spec.console());
             return false;
         }
     }
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/cluster/InitClusterCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/cluster/InitClusterCommand.java
index 2337f000d7..4ee3d399d4 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/cluster/InitClusterCommand.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/cluster/InitClusterCommand.java
@@ -19,6 +19,7 @@
 package org.apache.bookkeeper.stream.cli.commands.cluster;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_INIT;
 
 import com.beust.jcommander.Parameter;
 import com.google.common.base.Strings;
@@ -52,7 +53,7 @@
 @Slf4j
 public class InitClusterCommand extends BKCommand<Flags> {
 
-    private static final String NAME = "init";
+    private static final String NAME = OP_INIT;
     private static final String DESC = "Init a cluster";
 
     /**
@@ -95,6 +96,7 @@ public InitClusterCommand() {
             .withName(NAME)
             .withDescription(DESC)
             .withFlags(new Flags())
+            .withUsage("bkctl cluster init [flags] <service-uri>")
             .build());
     }
 
@@ -105,14 +107,16 @@ protected boolean acceptServiceUri(ServiceURI serviceURI) 
{
     }
 
     @Override
-    protected boolean apply(ServiceURI serviceURI,
+    protected boolean apply(ServiceURI ignored,
                             CompositeConfiguration conf,
                             BKFlags globalFlags,
                             Flags cmdFlags) {
         checkArgument(
-            null != serviceURI,
+            !cmdFlags.arguments.isEmpty(),
             "No service URI is provided");
 
+        ServiceURI serviceURI = ServiceURI.create(cmdFlags.arguments.get(0));
+
         if (null != cmdFlags.clusterName) {
             checkArgument(
                 !cmdFlags.clusterName.contains("/"),
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/namespace/CreateNamespaceCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/namespace/CreateNamespaceCommand.java
index 6f5e43537f..2c572092b2 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/namespace/CreateNamespaceCommand.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/namespace/CreateNamespaceCommand.java
@@ -19,9 +19,11 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.apache.bookkeeper.common.concurrent.FutureUtils.result;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_CREATE;
 import static 
org.apache.bookkeeper.stream.protocol.ProtocolConstants.DEFAULT_STREAM_CONF;
 
 import org.apache.bookkeeper.clients.admin.StorageAdminClient;
+import org.apache.bookkeeper.clients.exceptions.NamespaceExistsException;
 import org.apache.bookkeeper.stream.cli.commands.AdminCommand;
 import 
org.apache.bookkeeper.stream.cli.commands.namespace.CreateNamespaceCommand.Flags;
 import org.apache.bookkeeper.stream.proto.NamespaceConfiguration;
@@ -35,7 +37,7 @@
  */
 public class CreateNamespaceCommand extends AdminCommand<Flags> {
 
-    private static final String NAME = "create";
+    private static final String NAME = OP_CREATE;
     private static final String DESC = "Create a namespace";
 
     /**
@@ -62,15 +64,18 @@ protected void run(StorageAdminClient admin,
 
         String namespaceName = flags.arguments.get(0);
 
-        spec.console().println("Creating namespace '" + namespaceName + "' 
...");
-        NamespaceProperties nsProps = result(
-            admin.createNamespace(
-                namespaceName,
-                NamespaceConfiguration.newBuilder()
-                    .setDefaultStreamConf(DEFAULT_STREAM_CONF)
-                    .build()));
-        spec.console().println("Successfully created namespace '" + 
namespaceName + "':");
-        spec.console().println(nsProps);
+        try {
+            NamespaceProperties nsProps = result(
+                admin.createNamespace(
+                    namespaceName,
+                    NamespaceConfiguration.newBuilder()
+                        .setDefaultStreamConf(DEFAULT_STREAM_CONF)
+                        .build()));
+            spec.console().println("Successfully created namespace '" + 
namespaceName + "':");
+            spec.console().println(nsProps);
+        } catch (NamespaceExistsException nee) {
+            spec.console().println("Namespace '" + namespaceName + "' already 
exists");
+        }
     }
 
 }
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/namespace/DeleteNamespaceCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/namespace/DeleteNamespaceCommand.java
new file mode 100644
index 0000000000..cc10655950
--- /dev/null
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/namespace/DeleteNamespaceCommand.java
@@ -0,0 +1,74 @@
+/*
+ * 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.bookkeeper.stream.cli.commands.namespace;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.apache.bookkeeper.common.concurrent.FutureUtils.result;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_DELETE;
+
+import org.apache.bookkeeper.clients.admin.StorageAdminClient;
+import org.apache.bookkeeper.clients.exceptions.NamespaceNotFoundException;
+import org.apache.bookkeeper.stream.cli.commands.AdminCommand;
+import 
org.apache.bookkeeper.stream.cli.commands.namespace.DeleteNamespaceCommand.Flags;
+import org.apache.bookkeeper.tools.common.BKFlags;
+import org.apache.bookkeeper.tools.framework.CliFlags;
+import org.apache.bookkeeper.tools.framework.CliSpec;
+
+/**
+ * Command to get a namespace.
+ */
+public class DeleteNamespaceCommand extends AdminCommand<Flags> {
+
+    private static final String NAME = OP_DELETE;
+    private static final String DESC = "Delete a namespace";
+
+    /**
+     * Flags for the get namespace command.
+     */
+    public static class Flags extends CliFlags {
+    }
+
+    public DeleteNamespaceCommand() {
+        super(CliSpec.<Flags>newBuilder()
+            .withName(NAME)
+            .withDescription(DESC)
+            .withFlags(new Flags())
+            .withArgumentsUsage("<namespace-name>")
+            .build());
+    }
+
+    @Override
+    protected void run(StorageAdminClient admin,
+                       BKFlags globalFlags,
+                       Flags cmdFlags) throws Exception {
+        checkArgument(!cmdFlags.arguments.isEmpty(),
+            "Namespace name is not provided");
+
+        String namespaceName = cmdFlags.arguments.get(0);
+        try {
+            result(
+                admin.deleteNamespace(namespaceName));
+            spec.console().println("Successfully deleted namespace '" + 
namespaceName + "'");
+        } catch (NamespaceNotFoundException nfe) {
+            spec.console().println("Namespace '" + namespaceName + "' does not 
exist");
+        }
+    }
+
+}
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/namespace/GetNamespaceCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/namespace/GetNamespaceCommand.java
new file mode 100644
index 0000000000..b8342f5b1c
--- /dev/null
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/namespace/GetNamespaceCommand.java
@@ -0,0 +1,76 @@
+/*
+ * 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.bookkeeper.stream.cli.commands.namespace;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.apache.bookkeeper.common.concurrent.FutureUtils.result;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_GET;
+
+import org.apache.bookkeeper.clients.admin.StorageAdminClient;
+import org.apache.bookkeeper.clients.exceptions.NamespaceNotFoundException;
+import org.apache.bookkeeper.stream.cli.commands.AdminCommand;
+import 
org.apache.bookkeeper.stream.cli.commands.namespace.GetNamespaceCommand.Flags;
+import org.apache.bookkeeper.stream.proto.NamespaceProperties;
+import org.apache.bookkeeper.tools.common.BKFlags;
+import org.apache.bookkeeper.tools.framework.CliFlags;
+import org.apache.bookkeeper.tools.framework.CliSpec;
+
+/**
+ * Command to get a namespace.
+ */
+public class GetNamespaceCommand extends AdminCommand<Flags> {
+
+    private static final String NAME = OP_GET;
+    private static final String DESC = "Get the details of a namespace";
+
+    /**
+     * Flags for the get namespace command.
+     */
+    public static class Flags extends CliFlags {
+    }
+
+    public GetNamespaceCommand() {
+        super(CliSpec.<Flags>newBuilder()
+            .withName(NAME)
+            .withDescription(DESC)
+            .withFlags(new Flags())
+            .withArgumentsUsage("<namespace-name>")
+            .build());
+    }
+
+    @Override
+    protected void run(StorageAdminClient admin,
+                       BKFlags globalFlags,
+                       Flags cmdFlags) throws Exception {
+        checkArgument(!cmdFlags.arguments.isEmpty(),
+            "Namespace name is not provided");
+
+        String namespaceName = cmdFlags.arguments.get(0);
+        try {
+            NamespaceProperties ns = result(
+                admin.getNamespace(namespaceName));
+            spec.console().println("Namespace '" + namespaceName + "' :");
+            spec.console().println(ns);
+        } catch (NamespaceNotFoundException nfe) {
+            spec.console().println("Namespace '" + namespaceName + "' does not 
exist");
+        }
+    }
+
+}
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/CreateTableCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/CreateTableCommand.java
index 5b50d1fa73..2979b35e56 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/CreateTableCommand.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/CreateTableCommand.java
@@ -19,9 +19,13 @@
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.apache.bookkeeper.common.concurrent.FutureUtils.result;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_CREATE;
 import static 
org.apache.bookkeeper.stream.protocol.ProtocolConstants.DEFAULT_STREAM_CONF;
 
+import com.beust.jcommander.Parameter;
 import org.apache.bookkeeper.clients.admin.StorageAdminClient;
+import org.apache.bookkeeper.clients.exceptions.NamespaceNotFoundException;
+import org.apache.bookkeeper.clients.exceptions.StreamExistsException;
 import org.apache.bookkeeper.stream.cli.commands.AdminCommand;
 import 
org.apache.bookkeeper.stream.cli.commands.table.CreateTableCommand.Flags;
 import org.apache.bookkeeper.stream.proto.StorageType;
@@ -36,13 +40,22 @@
  */
 public class CreateTableCommand extends AdminCommand<Flags> {
 
-    private static final String NAME = "create";
-    private static final String DESC = "Create a stream";
+    private static final String NAME = OP_CREATE;
+    private static final String DESC = "Create a table";
 
     /**
      * Flags for the create table command.
      */
     public static class Flags extends CliFlags {
+
+        @Parameter(
+            names = {
+                "-r", "--num-ranges"
+            },
+            description = "num of ranges for the table"
+        )
+        private int numRanges = 3;
+
     }
 
     public CreateTableCommand() {
@@ -50,7 +63,7 @@ public CreateTableCommand() {
             .withName(NAME)
             .withDescription(DESC)
             .withFlags(new Flags())
-            .withArgumentsUsage("<stream-name>")
+            .withArgumentsUsage("<table-name>")
             .build());
     }
 
@@ -59,20 +72,31 @@ protected void run(StorageAdminClient admin,
                        BKFlags globalFlags,
                        Flags flags) throws Exception {
         checkArgument(!flags.arguments.isEmpty(),
-            "Stream name is not provided");
+            "Table name is not provided");
+        checkArgument(flags.numRanges >= 1,
+            "Invalid number of ranges specified for creating table : " + 
flags.numRanges);
 
         String streamName = flags.arguments.get(0);
 
-        spec.console().println("Creating stream '" + streamName + "' ...");
-        StreamProperties nsProps = result(
-            admin.createStream(
-                globalFlags.namespace,
-                streamName,
-                StreamConfiguration.newBuilder(DEFAULT_STREAM_CONF)
-                    .setStorageType(StorageType.TABLE)
-                    .build()));
-        spec.console().println("Successfully created stream '" + streamName + 
"':");
-        spec.console().println(nsProps);
+        try {
+            StreamConfiguration conf = 
StreamConfiguration.newBuilder(DEFAULT_STREAM_CONF)
+                .setMinNumRanges(flags.numRanges)
+                .setInitialNumRanges(flags.numRanges)
+                .build();
+            StreamProperties nsProps = result(
+                admin.createStream(
+                    globalFlags.namespace,
+                    streamName,
+                    StreamConfiguration.newBuilder(conf)
+                        .setStorageType(StorageType.TABLE)
+                        .build()));
+            spec.console().println("Successfully created table '" + streamName 
+ "':");
+            spec.console().println(nsProps);
+        } catch (NamespaceNotFoundException nfe) {
+            spec.console().println("Namespace '" + globalFlags.namespace + "' 
does not exist");
+        } catch (StreamExistsException see) {
+            spec.console().println("Table '" + globalFlags.namespace + "' 
already exists");
+        }
     }
 
 }
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/DelCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/DelCommand.java
new file mode 100644
index 0000000000..44d17d4de0
--- /dev/null
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/DelCommand.java
@@ -0,0 +1,78 @@
+/*
+ * 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.bookkeeper.stream.cli.commands.table;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.bookkeeper.common.concurrent.FutureUtils.result;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_DEL;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.apache.bookkeeper.api.StorageClient;
+import org.apache.bookkeeper.api.kv.Table;
+import org.apache.bookkeeper.stream.cli.commands.ClientCommand;
+import org.apache.bookkeeper.stream.cli.commands.table.DelCommand.Flags;
+import org.apache.bookkeeper.tools.framework.CliFlags;
+import org.apache.bookkeeper.tools.framework.CliSpec;
+
+/**
+ * Commands to put kvs.
+ */
+public class DelCommand extends ClientCommand<Flags> {
+
+    private static final String NAME = OP_DEL;
+    private static final String DESC = "Put key/value pair to a table";
+
+    /**
+     * Flags of the put command.
+     */
+    public static class Flags extends CliFlags {
+    }
+
+    public DelCommand() {
+        super(CliSpec.<Flags>newBuilder()
+            .withName(NAME)
+            .withDescription(DESC)
+            .withFlags(new Flags())
+            .withArgumentsUsage("<table> <key> <value>")
+            .build());
+    }
+
+    @Override
+    protected void run(StorageClient client, Flags flags) throws Exception {
+        checkArgument(flags.arguments.size() >= 2,
+            "table and key/value are not provided");
+
+        String tableName = flags.arguments.get(0);
+        String key = flags.arguments.get(1);
+
+        try (Table<ByteBuf, ByteBuf> table = 
result(client.openTable(tableName))) {
+            ByteBuf value = result(table.delete(
+                Unpooled.wrappedBuffer(key.getBytes(UTF_8))));
+            if (null != value) {
+                value.release();
+                spec.console().println("Successfully deleted key: ('" + key + 
"').");
+            } else {
+                spec.console().println("key '" + key + "' doesn't exist.");
+            }
+        }
+    }
+
+}
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/DeleteTableCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/DeleteTableCommand.java
new file mode 100644
index 0000000000..3022ca20bb
--- /dev/null
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/DeleteTableCommand.java
@@ -0,0 +1,80 @@
+/*
+ * 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.bookkeeper.stream.cli.commands.table;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.apache.bookkeeper.common.concurrent.FutureUtils.result;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_DELETE;
+
+import org.apache.bookkeeper.clients.admin.StorageAdminClient;
+import org.apache.bookkeeper.clients.exceptions.NamespaceNotFoundException;
+import org.apache.bookkeeper.clients.exceptions.StreamNotFoundException;
+import org.apache.bookkeeper.stream.cli.commands.AdminCommand;
+import 
org.apache.bookkeeper.stream.cli.commands.table.DeleteTableCommand.Flags;
+import org.apache.bookkeeper.tools.common.BKFlags;
+import org.apache.bookkeeper.tools.framework.CliFlags;
+import org.apache.bookkeeper.tools.framework.CliSpec;
+
+/**
+ * Command to create a namespace.
+ */
+public class DeleteTableCommand extends AdminCommand<Flags> {
+
+    private static final String NAME = OP_DELETE;
+    private static final String DESC = "Delete a table";
+
+    /**
+     * Flags for the create table command.
+     */
+    public static class Flags extends CliFlags {
+    }
+
+    public DeleteTableCommand() {
+        super(CliSpec.<Flags>newBuilder()
+            .withName(NAME)
+            .withDescription(DESC)
+            .withFlags(new Flags())
+            .withArgumentsUsage("<table-name>")
+            .build());
+    }
+
+    @Override
+    protected void run(StorageAdminClient admin,
+                       BKFlags globalFlags,
+                       Flags flags) throws Exception {
+        checkArgument(!flags.arguments.isEmpty(),
+            "Table name is not provided");
+
+        String streamName = flags.arguments.get(0);
+
+        try {
+            result(
+                admin.deleteStream(
+                    globalFlags.namespace,
+                    streamName));
+            spec.console().println("Successfully deleted table '" + streamName
+                + "' from namespace '" + globalFlags.namespace + "'");
+        } catch (NamespaceNotFoundException nfe) {
+            spec.console().println("Namespace '" + globalFlags.namespace + "' 
does not exist");
+        } catch (StreamNotFoundException snfe) {
+            spec.console().println("Table '" + streamName + "' does not 
exist");
+        }
+    }
+
+}
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/GetCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/GetCommand.java
index b7090fcaa4..093b669f24 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/GetCommand.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/GetCommand.java
@@ -20,6 +20,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.bookkeeper.common.concurrent.FutureUtils.result;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_GET;
 
 import com.beust.jcommander.Parameter;
 import io.netty.buffer.ByteBuf;
@@ -38,7 +39,7 @@
  */
 public class GetCommand extends ClientCommand<Flags> {
 
-    private static final String NAME = "get";
+    private static final String NAME = OP_GET;
     private static final String DESC = "Get key/value pair from a table";
 
     /**
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/GetTableCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/GetTableCommand.java
new file mode 100644
index 0000000000..bc4b461fc0
--- /dev/null
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/GetTableCommand.java
@@ -0,0 +1,87 @@
+/*
+ * 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.bookkeeper.stream.cli.commands.table;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.apache.bookkeeper.common.concurrent.FutureUtils.result;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_GET;
+
+import org.apache.bookkeeper.clients.admin.StorageAdminClient;
+import org.apache.bookkeeper.clients.exceptions.NamespaceNotFoundException;
+import org.apache.bookkeeper.clients.exceptions.StreamNotFoundException;
+import org.apache.bookkeeper.stream.cli.commands.AdminCommand;
+import org.apache.bookkeeper.stream.cli.commands.table.GetTableCommand.Flags;
+import org.apache.bookkeeper.stream.proto.StorageType;
+import org.apache.bookkeeper.stream.proto.StreamProperties;
+import org.apache.bookkeeper.tools.common.BKFlags;
+import org.apache.bookkeeper.tools.framework.CliFlags;
+import org.apache.bookkeeper.tools.framework.CliSpec;
+
+/**
+ * Command to create a namespace.
+ */
+public class GetTableCommand extends AdminCommand<Flags> {
+
+    private static final String NAME = OP_GET;
+    private static final String DESC = "Get the details of a table";
+
+    /**
+     * Flags for the create table command.
+     */
+    public static class Flags extends CliFlags {
+    }
+
+    public GetTableCommand() {
+        super(CliSpec.<Flags>newBuilder()
+            .withName(NAME)
+            .withDescription(DESC)
+            .withFlags(new Flags())
+            .withArgumentsUsage("<table-name>")
+            .build());
+    }
+
+    @Override
+    protected void run(StorageAdminClient admin,
+                       BKFlags globalFlags,
+                       Flags flags) throws Exception {
+        checkArgument(!flags.arguments.isEmpty(),
+            "Table name is not provided");
+
+        String streamName = flags.arguments.get(0);
+
+        try {
+            StreamProperties streamProps = result(
+                admin.getStream(
+                    globalFlags.namespace,
+                    streamName));
+            if (streamProps.getStreamConf().getStorageType() != 
StorageType.TABLE) {
+                spec.console().println("'" + streamName + "' is not a table 
storage entity, its storage type is "
+                    + streamProps.getStreamConf().getStorageType());
+            } else {
+                spec.console().println("Table '" + streamName + "' :");
+            }
+            spec.console().println(streamProps);
+        } catch (NamespaceNotFoundException nfe) {
+            spec.console().println("Namespace '" + globalFlags.namespace + "' 
does not exist");
+        } catch (StreamNotFoundException snfe) {
+            spec.console().println("Table '" + streamName + "' does not 
exist");
+        }
+    }
+
+}
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/IncrementCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/IncrementCommand.java
index 0e8f2e536e..25a2fb50b8 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/IncrementCommand.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/IncrementCommand.java
@@ -20,6 +20,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.bookkeeper.common.concurrent.FutureUtils.result;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_INC;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
@@ -35,7 +36,7 @@
  */
 public class IncrementCommand extends ClientCommand<Flags> {
 
-    private static final String NAME = "inc";
+    private static final String NAME = OP_INC;
     private static final String DESC = "Increment the amount of a key in a 
table";
 
     /**
diff --git 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/PutCommand.java
 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/PutCommand.java
index 5c89c664a8..b43f91efbe 100644
--- 
a/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/PutCommand.java
+++ 
b/tools/stream/src/main/java/org/apache/bookkeeper/stream/cli/commands/table/PutCommand.java
@@ -20,6 +20,7 @@
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.bookkeeper.common.concurrent.FutureUtils.result;
+import static org.apache.bookkeeper.stream.cli.Commands.OP_PUT;
 
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
@@ -35,7 +36,7 @@
  */
 public class PutCommand extends ClientCommand<Flags> {
 
-    private static final String NAME = "put";
+    private static final String NAME = OP_PUT;
     private static final String DESC = "Put key/value pair to a table";
 
     /**


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to