You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by sa...@apache.org on 2018/05/09 22:02:23 UTC

[geode] branch develop updated: GEODE-4858: refactor JndiBinding commands (#1935)

This is an automated email from the ASF dual-hosted git repository.

sai_boorlagadda pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 06079fc  GEODE-4858: refactor JndiBinding commands (#1935)
06079fc is described below

commit 06079fc531b141e8f8b728d6f3c181fb884b5da7
Author: Sai Boorlagadda <sa...@gmail.com>
AuthorDate: Wed May 9 15:02:18 2018 -0700

    GEODE-4858: refactor JndiBinding commands (#1935)
---
 .../cli/commands/CreateJndiBindingCommand.java     | 37 +++++----------
 .../cli/commands/DestroyJndiBindingCommand.java    | 53 ++++++++++------------
 .../cli/commands/ListJndiBindingCommand.java       | 28 +++++-------
 .../cli/functions/CreateJndiBindingFunction.java   | 10 ++--
 .../cli/functions/DestroyJndiBindingFunction.java  | 16 +++----
 .../cli/functions/ListJndiBindingFunction.java     | 12 ++---
 .../internal/cli/remote/CommandExecutor.java       |  2 +
 .../cli/commands/CreateJndiBindingCommandTest.java | 32 +++++++++----
 .../commands/DestroyJndiBindingCommandTest.java    | 41 ++++++++++++-----
 .../commands/ListJndiBindingCommandDUnitTest.java  |  4 +-
 10 files changed, 120 insertions(+), 115 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommand.java
index e542b14..cbb1c21 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommand.java
@@ -14,8 +14,6 @@
  */
 package org.apache.geode.management.internal.cli.commands;
 
-import static org.apache.geode.management.internal.cli.result.ResultBuilder.buildResult;
-
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
@@ -32,16 +30,16 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.cli.CliMetaData;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.cli.exceptions.EntityExistsException;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.CreateJndiBindingFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class CreateJndiBindingCommand extends InternalGfshCommand {
+public class CreateJndiBindingCommand extends SingleGfshCommand {
   private static final Logger logger = LogService.getLogger();
 
   static final String CREATE_JNDIBINDING = "create jndi-binding";
@@ -100,7 +98,7 @@ public class CreateJndiBindingCommand extends InternalGfshCommand {
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_REGION)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE)
-  public Result createJDNIBinding(
+  public ResultModel createJDNIBinding(
       @CliOption(key = BLOCKING_TIMEOUT_SECONDS,
           help = BLOCKING_TIMEOUT_SECONDS__HELP) Integer blockingTimeout,
       @CliOption(key = CONNECTION_POOLED_DATASOURCE_CLASS,
@@ -146,8 +144,6 @@ public class CreateJndiBindingCommand extends InternalGfshCommand {
     if (dsConfigProperties != null && dsConfigProperties.length > 0)
       configuration.getConfigProperty().addAll(Arrays.asList(dsConfigProperties));
 
-    Result result;
-    boolean persisted = false;
     InternalConfigurationPersistenceService service =
         (InternalConfigurationPersistenceService) getConfigurationPersistenceService();
 
@@ -162,32 +158,23 @@ public class CreateJndiBindingCommand extends InternalGfshCommand {
               ifNotExists);
         }
       }
-
-      service.updateCacheConfig("cluster", config -> {
-        config.getJndiBindings().add(configuration);
-        return config;
-      });
-      persisted = true;
     }
 
     Set<DistributedMember> targetMembers = findMembers(null, null);
     if (targetMembers.size() > 0) {
       List<CliFunctionResult> jndiCreationResult = executeAndGetFunctionResult(
           new CreateJndiBindingFunction(), configuration, targetMembers);
-      result = buildResult(jndiCreationResult);
+      ResultModel result = ResultModel.createMemberStatusResult(jndiCreationResult);
+      result.setConfigObject(configuration);
+      return result;
     } else {
-      if (persisted) {
-        result = ResultBuilder.createInfoResult(CliStrings.format(
-            "No members found. Cluster configuration is updated with jndi-binding \"{0}\".",
-            jndiName));
-      } else {
-        result = ResultBuilder.createInfoResult("No members found.");
-      }
+      return ResultModel.createInfo("No members found.");
     }
+  }
 
-    result.setCommandPersisted(persisted);
-
-    return result;
+  @Override
+  public void updateClusterConfig(String group, CacheConfig config, Object element) {
+    config.getJndiBindings().add((JndiBindingsType.JndiBinding) element);
   }
 
   public enum DATASOURCE_TYPE {
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommand.java
index f40328d..b2769d8 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommand.java
@@ -14,7 +14,6 @@
  */
 package org.apache.geode.management.internal.cli.commands;
 
-import static org.apache.geode.management.internal.cli.result.ResultBuilder.buildResult;
 
 import java.util.List;
 import java.util.Set;
@@ -22,21 +21,22 @@ import java.util.Set;
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
+import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.cache.configuration.JndiBindingsType;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.management.cli.CliMetaData;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.cli.exceptions.EntityNotFoundException;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.DestroyJndiBindingFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class DestroyJndiBindingCommand extends InternalGfshCommand {
+public class DestroyJndiBindingCommand extends SingleGfshCommand {
   static final String DESTROY_JNDIBINDING = "destroy jndi-binding";
   static final String DESTROY_JNDIBINDING__HELP =
       "Destroy a JNDI binding that holds the configuration for an XA datasource.";
@@ -51,45 +51,40 @@ public class DestroyJndiBindingCommand extends InternalGfshCommand {
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_REGION)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE)
-  public Result destroyJDNIBinding(
+  public ResultModel destroyJDNIBinding(
       @CliOption(key = JNDI_NAME, mandatory = true, help = JNDI_NAME__HELP) String jndiName,
       @CliOption(key = CliStrings.IFEXISTS, help = IFEXISTS_HELP, specifiedDefaultValue = "true",
           unspecifiedDefaultValue = "false") boolean ifExists) {
 
-    Result result;
-    boolean persisted = false;
     InternalConfigurationPersistenceService service =
         (InternalConfigurationPersistenceService) getConfigurationPersistenceService();
     if (service != null) {
-      service.updateCacheConfig("cluster", cc -> {
-        List<JndiBindingsType.JndiBinding> bindings = cc.getJndiBindings();
-        JndiBindingsType.JndiBinding binding = CacheElement.findElement(bindings, jndiName);
-        if (binding == null) {
-          throw new EntityNotFoundException(
-              CliStrings.format("Jndi binding with jndi-name \"{0}\" does not exist.", jndiName),
-              ifExists);
-        }
-        bindings.remove(binding);
-        return cc;
-      });
-      persisted = true;
+      List<JndiBindingsType.JndiBinding> bindings =
+          service.getCacheConfig("cluster").getJndiBindings();
+      JndiBindingsType.JndiBinding binding = CacheElement.findElement(bindings, jndiName);
+      // fail fast when CC is running and if required binding not found assuming that
+      // when CC is running then every configuration goes through CC
+      if (binding == null) {
+        throw new EntityNotFoundException(
+            CliStrings.format("Jndi binding with jndi-name \"{0}\" does not exist.", jndiName),
+            ifExists);
+      }
     }
 
     Set<DistributedMember> targetMembers = findMembers(null, null);
     if (targetMembers.size() > 0) {
       List<CliFunctionResult> jndiCreationResult =
           executeAndGetFunctionResult(new DestroyJndiBindingFunction(), jndiName, targetMembers);
-      return buildResult(jndiCreationResult);
+      ResultModel result = ResultModel.createMemberStatusResult(jndiCreationResult);
+      result.setConfigObject(jndiName);
+      return result;
     } else {
-      if (persisted) {
-        result = ResultBuilder.createInfoResult(CliStrings.format(
-            "No members found. Jndi-binding \"{0}\" is removed from cluster configuration.",
-            jndiName));
-      } else {
-        result = ResultBuilder.createInfoResult("No members found.");
-      }
+      return ResultModel.createInfo("No members found.");
     }
-    result.setCommandPersisted(persisted);
-    return result;
+  }
+
+  @Override
+  public void updateClusterConfig(String group, CacheConfig config, Object element) {
+    CacheElement.removeElement(config.getJndiBindings(), (String) element);
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommand.java
index 21f24af..e6a1a81 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommand.java
@@ -28,12 +28,10 @@ import org.apache.geode.cache.execute.Function;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.internal.logging.LogService;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.ListJndiBindingFunction;
-import org.apache.geode.management.internal.cli.result.CompositeResultData;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
@@ -48,16 +46,14 @@ public class ListJndiBindingCommand extends InternalGfshCommand {
   @CliCommand(value = LIST_JNDIBINDING, help = LIST_JNDIBINDING__HELP)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.READ)
-  public Result listJndiBinding() {
-    CompositeResultData resultData = ResultBuilder.createCompositeResultData();
-    CompositeResultData.SectionResultData resultSection = resultData.addSection();
-    TabularResultData configTable = null;
-    TabularResultData memberTable = null;
+  public ResultModel listJndiBinding() {
+    ResultModel resultModel = new ResultModel();
+    TabularResultModel configTable = null;
 
     InternalConfigurationPersistenceService ccService =
         (InternalConfigurationPersistenceService) getConfigurationPersistenceService();
     if (ccService != null) {
-      configTable = resultSection.addTable();
+      configTable = resultModel.addTable("clusterConfiguration");
       // we don't support creating jndi binding with random group name yet
       CacheConfig cacheConfig = ccService.getCacheConfig("cluster");
       List<JndiBindingsType.JndiBinding> jndiBindings = cacheConfig.getJndiBindings();
@@ -77,13 +73,13 @@ public class ListJndiBindingCommand extends InternalGfshCommand {
 
     if (members.size() == 0) {
       if (configTable == null) {
-        return ResultBuilder.createUserErrorResult("No members found");
+        return ResultModel.createError("No members found");
       }
       configTable.setFooter("No members found");
-      return ResultBuilder.buildResult(resultData);
+      return resultModel;
     }
 
-    memberTable = resultSection.addTable();
+    TabularResultModel memberTable = resultModel.addTable("memberConfiguration");
     List<CliFunctionResult> rc = executeAndGetFunctionResult(LIST_BINDING_FUNCTION, null, members);
 
     memberTable.setHeader("Active JNDI bindings found on each member: ");
@@ -91,10 +87,10 @@ public class ListJndiBindingCommand extends InternalGfshCommand {
       Serializable[] serializables = oneResult.getSerializables();
       for (int i = 0; i < serializables.length; i += 2) {
         memberTable.accumulate("Member", oneResult.getMemberIdOrName());
-        memberTable.accumulate("JNDI Name", serializables[i]);
-        memberTable.accumulate("JDBC Driver Class", serializables[i + 1]);
+        memberTable.accumulate("JNDI Name", (String) serializables[i]);
+        memberTable.accumulate("JDBC Driver Class", (String) serializables[i + 1]);
       }
     }
-    return ResultBuilder.buildResult(resultData);
+    return resultModel;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunction.java
index 2765713..e94d333 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateJndiBindingFunction.java
@@ -22,25 +22,25 @@ import java.util.stream.Collectors;
 import org.apache.geode.cache.configuration.JndiBindingsType;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.execute.ResultSender;
-import org.apache.geode.internal.cache.execute.InternalFunction;
 import org.apache.geode.internal.datasource.ConfigProperty;
 import org.apache.geode.internal.jndi.JNDIInvoker;
+import org.apache.geode.management.cli.CliFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 
-public class CreateJndiBindingFunction implements InternalFunction<JndiBindingsType.JndiBinding> {
+public class CreateJndiBindingFunction extends CliFunction<JndiBindingsType.JndiBinding> {
 
   static final String RESULT_MESSAGE =
       "Initiated jndi binding \"{0}\" on \"{1}\". See server logs to verify.";
 
   @Override
-  public void execute(FunctionContext<JndiBindingsType.JndiBinding> context) {
+  public CliFunctionResult executeFunction(FunctionContext<JndiBindingsType.JndiBinding> context) {
     ResultSender<Object> resultSender = context.getResultSender();
     JndiBindingsType.JndiBinding configuration = context.getArguments();
     JNDIInvoker.mapDatasource(getParamsAsMap(configuration),
         convert(configuration.getConfigProperty()));
 
-    resultSender.lastResult(new CliFunctionResult(context.getMemberName(), true,
-        CliStrings.format(RESULT_MESSAGE, configuration.getJndiName(), context.getMemberName())));
+    return new CliFunctionResult(context.getMemberName(), true,
+        CliStrings.format(RESULT_MESSAGE, configuration.getJndiName(), context.getMemberName()));
   }
 
   static Map getParamsAsMap(JndiBindingsType.JndiBinding binding) {
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunction.java
index aada3c7..51bb130 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyJndiBindingFunction.java
@@ -17,28 +17,26 @@ package org.apache.geode.management.internal.cli.functions;
 import javax.naming.NamingException;
 
 import org.apache.geode.cache.execute.FunctionContext;
-import org.apache.geode.cache.execute.ResultSender;
-import org.apache.geode.internal.cache.execute.InternalFunction;
 import org.apache.geode.internal.jndi.JNDIInvoker;
+import org.apache.geode.management.cli.CliFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 
-public class DestroyJndiBindingFunction implements InternalFunction {
+public class DestroyJndiBindingFunction extends CliFunction<String> {
 
   static final String RESULT_MESSAGE = "Jndi binding \"{0}\" destroyed on \"{1}\"";
   static final String EXCEPTION_RESULT_MESSAGE = "Jndi binding \"{0}\" not found on \"{1}\"";
 
   @Override
-  public void execute(FunctionContext context) {
-    ResultSender<Object> resultSender = context.getResultSender();
+  public CliFunctionResult executeFunction(FunctionContext context) {
     String jndiName = (String) context.getArguments();
 
     try {
       JNDIInvoker.unMapDatasource(jndiName);
-      resultSender.lastResult(new CliFunctionResult(context.getMemberName(), true,
-          CliStrings.format(RESULT_MESSAGE, jndiName, context.getMemberName())));
+      return new CliFunctionResult(context.getMemberName(), true,
+          CliStrings.format(RESULT_MESSAGE, jndiName, context.getMemberName()));
     } catch (NamingException e) {
-      resultSender.lastResult(new CliFunctionResult(context.getMemberName(), true,
-          CliStrings.format(EXCEPTION_RESULT_MESSAGE, jndiName, context.getMemberName())));
+      return new CliFunctionResult(context.getMemberName(), true,
+          CliStrings.format(EXCEPTION_RESULT_MESSAGE, jndiName, context.getMemberName()));
     }
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ListJndiBindingFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ListJndiBindingFunction.java
index b79edbe..079c984 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ListJndiBindingFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/ListJndiBindingFunction.java
@@ -24,18 +24,16 @@ import java.util.stream.Collectors;
 import javax.naming.Context;
 
 import org.apache.geode.cache.execute.FunctionContext;
-import org.apache.geode.cache.execute.ResultSender;
-import org.apache.geode.internal.cache.execute.InternalFunction;
 import org.apache.geode.internal.jndi.JNDIInvoker;
+import org.apache.geode.management.cli.CliFunction;
 
-public class ListJndiBindingFunction implements InternalFunction {
+public class ListJndiBindingFunction extends CliFunction<Void> {
 
   private static final long serialVersionUID = 5254506785395069200L;
 
   @Override
-  public void execute(FunctionContext context) {
+  public CliFunctionResult executeFunction(FunctionContext context) {
     CliFunctionResult result;
-
     try {
       Context ctx = JNDIInvoker.getJNDIContext();
       Map<String, String> bindings = JNDIInvoker.getBindingNamesRecursively(ctx);
@@ -48,8 +46,6 @@ public class ListJndiBindingFunction implements InternalFunction {
       result =
           new CliFunctionResult(context.getMemberName(), e, "Unable to retrieve JNDI bindings");
     }
-
-    ResultSender<Object> sender = context.getResultSender();
-    sender.lastResult(result);
+    return result;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/remote/CommandExecutor.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/remote/CommandExecutor.java
index 247286e..65642f0 100755
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/remote/CommandExecutor.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/remote/CommandExecutor.java
@@ -136,6 +136,8 @@ public class CommandExecutor {
       ccService.updateCacheConfig(group, cc -> {
         try {
           gfshCommand.updateClusterConfig(group, cc, resultModel.getConfigObject());
+          infoResultModel
+              .addLine("Changes to configuration for group '" + group + "' is persisted.");
         } catch (Exception e) {
           String message = "failed to update cluster config for " + group;
           logger.error(message, e);
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommandTest.java
index d827788..5248672 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommandTest.java
@@ -16,6 +16,8 @@ package org.apache.geode.management.internal.cli.commands;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
@@ -29,9 +31,9 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.UnaryOperator;
 
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
 
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -138,8 +140,7 @@ public class CreateJndiBindingCommandTest {
   }
 
   @Test
-  public void skipsIfBindingAlreadyExistsAndIfSpecifiedTrue()
-      throws ParserConfigurationException, SAXException, IOException {
+  public void skipsIfBindingAlreadyExistsAndIfSpecifiedTrue() {
     InternalConfigurationPersistenceService clusterConfigService =
         mock(InternalConfigurationPersistenceService.class);
     CacheConfig cacheConfig = mock(CacheConfig.class);
@@ -180,7 +181,8 @@ public class CreateJndiBindingCommandTest {
 
     gfsh.executeAndAssertThat(command,
         COMMAND + " --type=SIMPLE --name=name --jdbc-driver-class=driver --connection-url=url")
-        .statusIsSuccess().containsOutput("No members found").hasFailToPersistError();
+        .statusIsSuccess().containsOutput("No members found").containsOutput(
+            "Cluster configuration service is not running. Configuration change is not persisted.");
   }
 
   @Test
@@ -193,14 +195,19 @@ public class CreateJndiBindingCommandTest {
     doReturn(clusterConfigService).when(command).getConfigurationPersistenceService();
     doReturn(cacheConfig).when(clusterConfigService).getCacheConfig(any());
 
+    doAnswer(invocation -> {
+      UnaryOperator<CacheConfig> mutator = invocation.getArgument(1);
+      mutator.apply(cacheConfig);
+      return null;
+    }).when(clusterConfigService).updateCacheConfig(any(), any());
+
     gfsh.executeAndAssertThat(command,
         COMMAND + " --type=SIMPLE --name=name --jdbc-driver-class=driver --connection-url=url")
-        .statusIsSuccess()
-        .containsOutput(
-            "No members found. Cluster configuration is updated with jndi-binding \\\"name\\\".")
-        .hasNoFailToPersistError();
+        .statusIsSuccess().containsOutput("No members found.")
+        .containsOutput("Changes to configuration for group 'cluster' is persisted.");
 
     verify(clusterConfigService).updateCacheConfig(any(), any());
+    verify(command).updateClusterConfig(eq("cluster"), eq(cacheConfig), any());
   }
 
   @Test
@@ -240,8 +247,7 @@ public class CreateJndiBindingCommandTest {
   }
 
   @Test
-  public void whenMembersFoundAndClusterConfigRunningThenUpdateClusterConfigAndInvokeFunction()
-      throws IOException, ParserConfigurationException, SAXException, TransformerException {
+  public void whenMembersFoundAndClusterConfigRunningThenUpdateClusterConfigAndInvokeFunction() {
     Set<DistributedMember> members = new HashSet<>();
     members.add(mock(DistributedMember.class));
 
@@ -257,6 +263,11 @@ public class CreateJndiBindingCommandTest {
     doReturn(clusterConfigService).when(command).getConfigurationPersistenceService();
     doReturn(results).when(command).executeAndGetFunctionResult(any(), any(), any());
     doReturn(cacheConfig).when(clusterConfigService).getCacheConfig(any());
+    doAnswer(invocation -> {
+      UnaryOperator<CacheConfig> mutator = invocation.getArgument(1);
+      mutator.apply(cacheConfig);
+      return null;
+    }).when(clusterConfigService).updateCacheConfig(any(), any());
 
     gfsh.executeAndAssertThat(command,
         COMMAND
@@ -266,6 +277,7 @@ public class CreateJndiBindingCommandTest {
             "Tried creating jndi binding \"name\" on \"server1\"");
 
     verify(clusterConfigService).updateCacheConfig(any(), any());
+    verify(command).updateClusterConfig(eq("cluster"), eq(cacheConfig), any());
 
     ArgumentCaptor<CreateJndiBindingFunction> function =
         ArgumentCaptor.forClass(CreateJndiBindingFunction.class);
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommandTest.java
index b647cf8..3e003b5 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyJndiBindingCommandTest.java
@@ -16,8 +16,8 @@ package org.apache.geode.management.internal.cli.commands;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doCallRealMethod;
-import static org.mockito.Mockito.doNothing;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
@@ -30,6 +30,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.function.UnaryOperator;
 
 import org.junit.Before;
 import org.junit.ClassRule;
@@ -39,6 +40,7 @@ import org.mockito.ArgumentCaptor;
 
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.configuration.JndiBindingsType;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.internal.cache.InternalCache;
@@ -70,10 +72,15 @@ public class DestroyJndiBindingCommandTest {
     cacheConfig = mock(CacheConfig.class);
     ccService = mock(InternalConfigurationPersistenceService.class);
 
-
+    doReturn(Collections.emptySet()).when(command).findMembers(any(), any());
     doReturn(ccService).when(command).getConfigurationPersistenceService();
     when(ccService.getCacheConfig(any())).thenReturn(cacheConfig);
-    doCallRealMethod().when(ccService).updateCacheConfig(any(), any());
+    doAnswer(invocation -> {
+      UnaryOperator<CacheConfig> mutator = invocation.getArgument(1);
+      mutator.apply(cacheConfig);
+      return null;
+    }).when(ccService).updateCacheConfig(any(), any());
+
     when(ccService.getConfigurationRegion()).thenReturn(mock(Region.class));
     when(ccService.getConfiguration(any())).thenReturn(mock(Configuration.class));
   }
@@ -113,20 +120,24 @@ public class DestroyJndiBindingCommandTest {
     doReturn(null).when(command).getConfigurationPersistenceService();
 
     gfsh.executeAndAssertThat(command, COMMAND + " --name=name").statusIsSuccess()
-        .containsOutput("No members found").hasFailToPersistError();
+        .containsOutput("No members found").containsOutput(
+            "Cluster configuration service is not running. Configuration change is not persisted.");
   }
 
   @Test
   public void whenNoMembersFoundAndClusterConfigRunningThenUpdateClusterConfig() {
-    doNothing().when(ccService).updateCacheConfig(any(), any());
-    doReturn(Collections.emptySet()).when(command).findMembers(any(), any());
+    List<JndiBindingsType.JndiBinding> bindings = new ArrayList<>();
+    JndiBindingsType.JndiBinding jndiBinding = new JndiBindingsType.JndiBinding();
+    jndiBinding.setJndiName("name");
+    bindings.add(jndiBinding);
+    doReturn(bindings).when(cacheConfig).getJndiBindings();
 
     gfsh.executeAndAssertThat(command, COMMAND + " --name=name").statusIsSuccess()
-        .containsOutput(
-            "No members found. Jndi-binding \\\"name\\\" is removed from cluster configuration.")
-        .hasNoFailToPersistError();
+        .containsOutput("No members found.")
+        .containsOutput("Changes to configuration for group 'cluster' is persisted.");
 
     verify(ccService).updateCacheConfig(any(), any());
+    verify(command).updateClusterConfig(eq("cluster"), eq(cacheConfig), any());
   }
 
   @Test
@@ -164,6 +175,12 @@ public class DestroyJndiBindingCommandTest {
 
   @Test
   public void whenMembersFoundAndClusterConfigRunningThenUpdateClusterConfigAndInvokeFunction() {
+    List<JndiBindingsType.JndiBinding> bindings = new ArrayList<>();
+    JndiBindingsType.JndiBinding jndiBinding = new JndiBindingsType.JndiBinding();
+    jndiBinding.setJndiName("name");
+    bindings.add(jndiBinding);
+    doReturn(bindings).when(cacheConfig).getJndiBindings();
+
     Set<DistributedMember> members = new HashSet<>();
     members.add(mock(DistributedMember.class));
 
@@ -174,12 +191,14 @@ public class DestroyJndiBindingCommandTest {
 
     doReturn(members).when(command).findMembers(any(), any());
     doReturn(results).when(command).executeAndGetFunctionResult(any(), any(), any());
-    doNothing().when(ccService).updateCacheConfig(any(), any());
 
     gfsh.executeAndAssertThat(command, COMMAND + " --name=name").statusIsSuccess()
         .tableHasColumnOnlyWithValues("Member", "server1")
         .tableHasColumnOnlyWithValues("Status", "Jndi binding \"name\" destroyed on \"server1\"");
 
+    assertThat(cacheConfig.getJndiBindings().isEmpty()).isTrue();
+    verify(command).updateClusterConfig(eq("cluster"), eq(cacheConfig), any());
+
     ArgumentCaptor<CreateJndiBindingFunction> function =
         ArgumentCaptor.forClass(CreateJndiBindingFunction.class);
     ArgumentCaptor<String> jndiName = ArgumentCaptor.forClass(String.class);
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommandDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommandDUnitTest.java
index 7fa50ea..90cc096 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommandDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ListJndiBindingCommandDUnitTest.java
@@ -72,8 +72,8 @@ public class ListJndiBindingCommandDUnitTest {
         .tableHasRowCount("Group Name", 1);
 
     // member table
-    List<String> jndiNames =
-        commandResultAssert.getCommandResult().getColumnFromTableContent("JNDI Name", "0", "1");
+    List<String> jndiNames = commandResultAssert.getCommandResult()
+        .getColumnFromTableContent("JNDI Name", "memberConfiguration");
     assertThat(jndiNames.size()).isEqualTo(3);
     assertThat(jndiNames).containsExactlyInAnyOrder("java:jndi1", "java:UserTransaction",
         "java:TransactionManager");

-- 
To stop receiving notification emails like this one, please contact
sai_boorlagadda@apache.org.