You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2017/12/12 23:21:31 UTC

[geode] branch develop updated: GEODE-4081: update cluster config after destroy gateway sender (#1140)

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

jinmeiliao 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 db30e3f  GEODE-4081: update cluster config after destroy gateway sender (#1140)
db30e3f is described below

commit db30e3f4fa6721163720c25ce8e82c2162da7847
Author: jinmeiliao <ji...@pivotal.io>
AuthorDate: Tue Dec 12 15:21:29 2017 -0800

    GEODE-4081: update cluster config after destroy gateway sender (#1140)
    
    * make sure we don't update cc when gateway commands are executed on a particular member
---
 .../cli/commands/CreateGatewayReceiverCommand.java | 16 ++++--
 .../cli/commands/CreateGatewaySenderCommand.java   | 22 +++++---
 .../cli/commands/DestroyGatewaySenderCommand.java  | 15 ++++++
 .../functions/GatewaySenderDestroyFunction.java    |  5 +-
 .../management/internal/cli/i18n/CliStrings.java   |  2 +-
 .../CreateAsyncEventQueueCommandDUnitTest.java     |  2 +-
 .../commands/CreateAsyncEventQueueCommandTest.java |  9 ++--
 .../commands/CreateGatewayReceiverCommandTest.java | 62 ++++++++++++++++++++++
 .../commands/CreateGatewaySenderCommandTest.java   | 61 +++++++++++++++++++++
 .../commands/DestroyGatewaySenderCommandTest.java  | 58 ++++++++++++++++----
 .../test/junit/assertions/CommandResultAssert.java |  4 +-
 ...CreateDestroyGatewaySenderCommandDUnitTest.java |  7 +++
 12 files changed, 232 insertions(+), 31 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewayReceiverCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewayReceiverCommand.java
index f314b33..360858f 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewayReceiverCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewayReceiverCommand.java
@@ -89,12 +89,20 @@ public class CreateGatewayReceiverCommand implements GfshCommand {
             gatewayReceiverFunctionArgs, membersToCreateGatewayReceiverOn);
 
     CommandResult result = ResultBuilder.buildResult(gatewayReceiverCreateResults);
-
     XmlEntity xmlEntity = findXmlEntity(gatewayReceiverCreateResults);
-    if (xmlEntity != null) {
-      persistClusterConfiguration(result,
-          () -> getSharedConfiguration().addXmlEntity(xmlEntity, onGroups));
+    // no xml needs to be updated, simply return
+    if (xmlEntity == null) {
+      return result;
+    }
+
+    // has xml but unable to persist to cluster config, need to print warning message and return
+    if (onMember != null || getSharedConfiguration() == null) {
+      result.setCommandPersisted(false);
+      return result;
     }
+
+    // update cluster config
+    getSharedConfiguration().addXmlEntity(xmlEntity, onGroups);
     return result;
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommand.java
index 3be626d..7ccc070 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommand.java
@@ -114,11 +114,7 @@ public class CreateGatewaySenderCommand implements GfshCommand {
             alertThreshold, dispatcherThreads, orderPolicy == null ? null : orderPolicy.name(),
             gatewayEventFilters, gatewayTransportFilter);
 
-    Set<DistributedMember> membersToCreateGatewaySenderOn = findMembers(onGroups, onMember);
-
-    if (membersToCreateGatewaySenderOn.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
-    }
+    Set<DistributedMember> membersToCreateGatewaySenderOn = getMembers(onGroups, onMember);
 
     List<CliFunctionResult> gatewaySenderCreateResults =
         executeAndGetFunctionResult(GatewaySenderCreateFunction.INSTANCE, gatewaySenderFunctionArgs,
@@ -126,10 +122,20 @@ public class CreateGatewaySenderCommand implements GfshCommand {
 
     CommandResult result = ResultBuilder.buildResult(gatewaySenderCreateResults);
     XmlEntity xmlEntity = findXmlEntity(gatewaySenderCreateResults);
-    if (xmlEntity != null) {
-      persistClusterConfiguration(result,
-          () -> getSharedConfiguration().addXmlEntity(xmlEntity, onGroups));
+
+    // no xml needs to be updated, simply return
+    if (xmlEntity == null) {
+      return result;
     }
+
+    // has xml but unable to persist to cluster config, need to print warning message and return
+    if (onMember != null || getSharedConfiguration() == null) {
+      result.setCommandPersisted(false);
+      return result;
+    }
+
+    // update cluster config
+    getSharedConfiguration().addXmlEntity(xmlEntity, onGroups);
     return result;
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommand.java
index 33680e6..ad1fd3d 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommand.java
@@ -33,6 +33,7 @@ import org.apache.geode.management.internal.cli.functions.GatewaySenderDestroyFu
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.CommandResult;
 import org.apache.geode.management.internal.cli.result.ResultBuilder;
+import org.apache.geode.management.internal.configuration.domain.XmlEntity;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
@@ -66,7 +67,21 @@ public class DestroyGatewaySenderCommand implements GfshCommand {
         GatewaySenderDestroyFunction.INSTANCE, gatewaySenderDestroyFunctionArgs, members);
 
     CommandResult result = ResultBuilder.buildResult(functionResults);
+    XmlEntity xmlEntity = findXmlEntity(functionResults);
 
+    // no xml needs to be updated, simply return
+    if (xmlEntity == null) {
+      return result;
+    }
+
+    // has xml but unable to persist to cluster config, need to print warning message and return
+    if (onMember != null || getSharedConfiguration() == null) {
+      result.setCommandPersisted(false);
+      return result;
+    }
+
+    // update cluster config
+    getSharedConfiguration().deleteXmlEntity(xmlEntity, onGroups);
     return result;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderDestroyFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderDestroyFunction.java
index f99592e..edba972 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderDestroyFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderDestroyFunction.java
@@ -20,7 +20,9 @@ import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.execute.ResultSender;
 import org.apache.geode.cache.wan.GatewaySender;
 import org.apache.geode.internal.InternalEntity;
+import org.apache.geode.internal.cache.xmlcache.CacheXml;
 import org.apache.geode.management.internal.cli.CliUtil;
+import org.apache.geode.management.internal.configuration.domain.XmlEntity;
 
 public class GatewaySenderDestroyFunction implements Function, InternalEntity {
   private static final long serialVersionUID = 1L;
@@ -55,7 +57,8 @@ public class GatewaySenderDestroyFunction implements Function, InternalEntity {
     try {
       gatewaySender.stop();
       gatewaySender.destroy();
-      resultSender.lastResult(new CliFunctionResult(memberNameOrId, true,
+      XmlEntity xmlEntity = new XmlEntity(CacheXml.GATEWAY_SENDER, "id", senderId);
+      resultSender.lastResult(new CliFunctionResult(memberNameOrId, xmlEntity,
           String.format("GatewaySender \"%s\" destroyed on \"%s\"", senderId, memberNameOrId)));
     } catch (Exception e) {
       resultSender.lastResult(new CliFunctionResult(memberNameOrId, e, ""));
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
index cf99d0f..bbc823c 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
@@ -213,7 +213,7 @@ public class CliStrings {
   public static final String SHARED_CONFIGURATION_NO_LOCATORS_WITH_SHARED_CONFIGURATION =
       "No locators with cluster configuration enabled.";
   public static final String SHARED_CONFIGURATION_FAILED_TO_PERSIST_COMMAND_CHANGES =
-      "Failed to persist the configuration changes due to this command, Revert the command to maintain consistency.\nPlease use \"status cluster-config-service\" to determine whether Cluster configuration service is RUNNING.";
+      "This change is not persisted in the cluster configuration, either because the cluster configuration service is not running or the command is operating on targeted members.";
   /* Other Constants */
   public static final String GFSH__MSG__NO_LONGER_CONNECTED_TO_0 = "No longer connected to {0}.";
   public static final String GFSHPARSER__MSG__REQUIRED_ARGUMENT_0 = "Required Argument: \"{0}\"";
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommandDUnitTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommandDUnitTest.java
index 652ce0b..6b9c34f 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommandDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommandDUnitTest.java
@@ -62,7 +62,7 @@ public class CreateAsyncEventQueueCommandDUnitTest {
     server = lsRule.startServerAsJmxManager(0);
     gfsh.connectAndVerify(server.getJmxPort(), GfshCommandRule.PortType.jmxManager);
     gfsh.executeAndAssertThat(VALID_COMMAND + " --id=queue").statusIsSuccess()
-        .containsOutput("Failed to persist the configuration")
+        .containsOutput("This change is not persisted in the cluster configuration")
         .tableHasColumnWithExactValuesInAnyOrder("Status", "Success").tableHasRowCount("Member", 1);
   }
 
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommandTest.java
index c001f16..2b585d4 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommandTest.java
@@ -131,7 +131,7 @@ public class CreateAsyncEventQueueCommandTest {
     doReturn(functionResults).when(command).executeAndGetFunctionResult(isA(Function.class),
         isA(Object.class), isA(Set.class));
 
-    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess().persisted()
+    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess().hasNoFailToPersistError()
         .tableHasRowCount("Member", 2)
         .tableHasRowWithValues("Member", "Status", "member1", "SUCCESS")
         .tableHasRowWithValues("Member", "Status", "member2", "SUCCESS");
@@ -154,8 +154,7 @@ public class CreateAsyncEventQueueCommandTest {
     doReturn(functionResults).when(command).executeAndGetFunctionResult(isA(Function.class),
         isA(Object.class), isA(Set.class));
 
-    // need to make sure failToPersist flag is not set so that we won't print out the warning
-    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsError().persisted()
+    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsError().hasNoFailToPersistError()
         .tableHasRowCount("Member", 2)
         .tableHasRowWithValues("Member", "Status", "member1", "ERROR: failed")
         .tableHasRowWithValues("Member", "Status", "member2",
@@ -178,7 +177,7 @@ public class CreateAsyncEventQueueCommandTest {
     doReturn(functionResults).when(command).executeAndGetFunctionResult(isA(Function.class),
         isA(Object.class), isA(Set.class));
 
-    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess().persisted()
+    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess().hasNoFailToPersistError()
         .tableHasRowCount("Member", 2)
         .tableHasRowWithValues("Member", "Status", "member1", "SUCCESS").tableHasRowWithValues(
             "Member", "Status", "member2", "ERROR: java.lang.RuntimeException: exception happened");
@@ -198,7 +197,7 @@ public class CreateAsyncEventQueueCommandTest {
     doReturn(functionResults).when(command).executeAndGetFunctionResult(isA(Function.class),
         isA(Object.class), isA(Set.class));
 
-    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess().failToPersist();
+    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess().hasFailToPersistError();
 
     // addXmlEntity should not be called
     verify(service, times(0)).addXmlEntity(xmlEntity, null);
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewayReceiverCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewayReceiverCommandTest.java
index 6bc5c20..161c6ef 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewayReceiverCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewayReceiverCommandTest.java
@@ -16,14 +16,27 @@
 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.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
 
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
+import org.apache.geode.distributed.internal.ClusterConfigurationService;
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.internal.cli.GfshParseResult;
+import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
+import org.apache.geode.management.internal.configuration.domain.XmlEntity;
 import org.apache.geode.test.junit.categories.UnitTest;
 import org.apache.geode.test.junit.rules.GfshParserRule;
 
@@ -35,10 +48,23 @@ public class CreateGatewayReceiverCommandTest {
   public static GfshParserRule gfsh = new GfshParserRule();
 
   private CreateGatewayReceiverCommand command;
+  private InternalCache cache;
+  private List<CliFunctionResult> functionResults;
+  private ClusterConfigurationService ccService;
+  private CliFunctionResult result1;
+  private XmlEntity xmlEntity;
 
   @Before
   public void before() {
     command = spy(CreateGatewayReceiverCommand.class);
+    ccService = mock(ClusterConfigurationService.class);
+    xmlEntity = mock(XmlEntity.class);
+    cache = mock(InternalCache.class);
+    doReturn(cache).when(command).getCache();
+    doReturn(ccService).when(command).getSharedConfiguration();
+    functionResults = new ArrayList<>();
+    doReturn(functionResults).when(command).executeAndGetFunctionResult(any(), any(),
+        any(Set.class));
   }
 
   @Test
@@ -62,4 +88,40 @@ public class CreateGatewayReceiverCommandTest {
     gfsh.executeAndAssertThat(command, "create gateway-receiver --end-port=1 --start-port=2")
         .statusIsError().containsOutput("start-port must be smaller than end-port");
   }
+
+  @Test
+  public void whenNoCCService() {
+    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
+    doReturn(null).when(command).getSharedConfiguration();
+    result1 = new CliFunctionResult("member", xmlEntity, "result1");
+    functionResults.add(result1);
+    gfsh.executeAndAssertThat(command, "create gateway-receiver").statusIsSuccess()
+        .hasFailToPersistError();
+    verify(ccService, never()).deleteXmlEntity(any(), any());
+  }
+
+  @Test
+  public void whenCommandOnMember() {
+    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
+    doReturn(ccService).when(command).getSharedConfiguration();
+    result1 = new CliFunctionResult("member", xmlEntity, "result1");
+    functionResults.add(result1);
+    gfsh.executeAndAssertThat(command, "create gateway-receiver --member=xyz").statusIsSuccess()
+        .hasFailToPersistError();
+    verify(ccService, never()).deleteXmlEntity(any(), any());
+  }
+
+  @Test
+  public void whenNoXml() {
+    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
+    doReturn(ccService).when(command).getSharedConfiguration();
+    result1 = new CliFunctionResult("member", false, "result1");
+    functionResults.add(result1);
+
+    // does not delete because command failed, so hasNoFailToPersistError should still be true
+    gfsh.executeAndAssertThat(command, "create gateway-receiver").statusIsError()
+        .hasNoFailToPersistError();
+    verify(ccService, never()).deleteXmlEntity(any(), any());
+  }
+
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommandTest.java
index 48ef8b2..f8a0ae3 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommandTest.java
@@ -18,15 +18,25 @@ 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.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
+import java.util.Set;
 
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
+import org.apache.geode.distributed.internal.ClusterConfigurationService;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
+import org.apache.geode.management.internal.configuration.domain.XmlEntity;
 import org.apache.geode.test.junit.categories.UnitTest;
 import org.apache.geode.test.junit.rules.GfshParserRule;
 
@@ -37,10 +47,23 @@ public class CreateGatewaySenderCommandTest {
   public static GfshParserRule gfsh = new GfshParserRule();
 
   private CreateGatewaySenderCommand command;
+  private InternalCache cache;
+  private List<CliFunctionResult> functionResults;
+  private ClusterConfigurationService ccService;
+  private CliFunctionResult result1, result2;
+  private XmlEntity xmlEntity;
 
   @Before
   public void before() {
     command = spy(CreateGatewaySenderCommand.class);
+    ccService = mock(ClusterConfigurationService.class);
+    xmlEntity = mock(XmlEntity.class);
+    cache = mock(InternalCache.class);
+    doReturn(cache).when(command).getCache();
+    doReturn(ccService).when(command).getSharedConfiguration();
+    functionResults = new ArrayList<>();
+    doReturn(functionResults).when(command).executeAndGetFunctionResult(any(), any(),
+        any(Set.class));
   }
 
   @Test
@@ -87,4 +110,42 @@ public class CreateGatewaySenderCommandTest {
     assertThat(candidate.getCandidates()).hasSize(3);
     assertThat(candidate.getFirstCandidate()).isEqualTo(command + "=KEY");
   }
+
+  @Test
+  public void whenNoCCService() {
+    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
+    doReturn(null).when(command).getSharedConfiguration();
+    result1 = new CliFunctionResult("member", xmlEntity, "result1");
+    functionResults.add(result1);
+    gfsh.executeAndAssertThat(command,
+        "create gateway-sender --id=1  --remote-distributed-system-id=1").statusIsSuccess()
+        .hasFailToPersistError();
+    verify(ccService, never()).deleteXmlEntity(any(), any());
+  }
+
+  @Test
+  public void whenCommandOnMember() {
+    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
+    doReturn(ccService).when(command).getSharedConfiguration();
+    result1 = new CliFunctionResult("member", xmlEntity, "result1");
+    functionResults.add(result1);
+    gfsh.executeAndAssertThat(command,
+        "create gateway-sender --member=xyz --id=1 --remote-distributed-system-id=1")
+        .statusIsSuccess().hasFailToPersistError();
+    verify(ccService, never()).deleteXmlEntity(any(), any());
+  }
+
+  @Test
+  public void whenNoXml() {
+    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
+    doReturn(ccService).when(command).getSharedConfiguration();
+    result1 = new CliFunctionResult("member", false, "result1");
+    functionResults.add(result1);
+
+    // does not delete because command failed, so hasNoFailToPersistError should still be true
+    gfsh.executeAndAssertThat(command,
+        "create gateway-sender --id=1 --remote-distributed-system-id=1").statusIsError()
+        .hasNoFailToPersistError();
+    verify(ccService, never()).deleteXmlEntity(any(), any());
+  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommandTest.java
index 207c853..8aa971e 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommandTest.java
@@ -19,7 +19,9 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -30,10 +32,10 @@ import org.junit.ClassRule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
-import org.apache.geode.cache.execute.ResultCollector;
+import org.apache.geode.distributed.internal.ClusterConfigurationService;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
-import org.apache.geode.management.internal.cli.result.CommandResult;
+import org.apache.geode.management.internal.configuration.domain.XmlEntity;
 import org.apache.geode.test.junit.categories.UnitTest;
 import org.apache.geode.test.junit.rules.GfshParserRule;
 
@@ -45,21 +47,23 @@ public class DestroyGatewaySenderCommandTest {
   public static GfshParserRule parser = new GfshParserRule();
 
   private DestroyGatewaySenderCommand command;
-  private ResultCollector collector;
   private InternalCache cache;
   private List<CliFunctionResult> functionResults;
+  private ClusterConfigurationService ccService;
   private CliFunctionResult result1, result2;
-  private CommandResult result;
+  private XmlEntity xmlEntity;
 
   @Before
   public void before() throws Exception {
     command = spy(DestroyGatewaySenderCommand.class);
+    ccService = mock(ClusterConfigurationService.class);
+    xmlEntity = mock(XmlEntity.class);
     cache = mock(InternalCache.class);
     doReturn(cache).when(command).getCache();
-    collector = mock(ResultCollector.class);
-    doReturn(collector).when(command).executeFunction(any(), any(), any(Set.class));
+    doReturn(ccService).when(command).getSharedConfiguration();
     functionResults = new ArrayList<>();
-    doReturn(functionResults).when(collector).getResult();
+    doReturn(functionResults).when(command).executeAndGetFunctionResult(any(), any(),
+        any(Set.class));
   }
 
   @Test
@@ -69,8 +73,8 @@ public class DestroyGatewaySenderCommandTest {
 
   @Test
   public void allFunctionReturnsOK() throws Exception {
-    result1 = new CliFunctionResult("member", true, "result1");
-    result2 = new CliFunctionResult("member", true, "result2");
+    result1 = new CliFunctionResult("member", xmlEntity, "result1");
+    result2 = new CliFunctionResult("member", xmlEntity, "result2");
     functionResults.add(result1);
     functionResults.add(result2);
 
@@ -78,6 +82,7 @@ public class DestroyGatewaySenderCommandTest {
     parser.executeAndAssertThat(command, "destroy gateway-sender --id=1").statusIsSuccess()
         .tableHasColumnWithValuesContaining("Status", "result1", "result2");
 
+    verify(ccService).deleteXmlEntity(any(), any());
   }
 
   @Test
@@ -106,4 +111,39 @@ public class DestroyGatewaySenderCommandTest {
             "ERROR: java.lang.Exception: something happened");
 
   }
+
+  @Test
+  public void whenNoCCService() {
+    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
+    doReturn(null).when(command).getSharedConfiguration();
+    result1 = new CliFunctionResult("member", xmlEntity, "result1");
+    functionResults.add(result1);
+    parser.executeAndAssertThat(command, "destroy gateway-sender --id=1").statusIsSuccess()
+        .hasFailToPersistError();
+    verify(ccService, never()).deleteXmlEntity(any(), any());
+  }
+
+  @Test
+  public void whenCommandOnMember() {
+    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
+    doReturn(ccService).when(command).getSharedConfiguration();
+    result1 = new CliFunctionResult("member", xmlEntity, "result1");
+    functionResults.add(result1);
+    parser.executeAndAssertThat(command, "destroy gateway-sender --member=xyz --id=1")
+        .statusIsSuccess().hasFailToPersistError();
+    verify(ccService, never()).deleteXmlEntity(any(), any());
+  }
+
+  @Test
+  public void whenNoXml() {
+    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
+    doReturn(ccService).when(command).getSharedConfiguration();
+    result1 = new CliFunctionResult("member", false, "result1");
+    functionResults.add(result1);
+
+    // does not delete because command failed, so hasNoFailToPersistError should still be true
+    parser.executeAndAssertThat(command, "destroy gateway-sender --id=1").statusIsError()
+        .hasNoFailToPersistError();
+    verify(ccService, never()).deleteXmlEntity(any(), any());
+  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/test/junit/assertions/CommandResultAssert.java b/geode-core/src/test/java/org/apache/geode/test/junit/assertions/CommandResultAssert.java
index 40d1469..fc10639 100644
--- a/geode-core/src/test/java/org/apache/geode/test/junit/assertions/CommandResultAssert.java
+++ b/geode-core/src/test/java/org/apache/geode/test/junit/assertions/CommandResultAssert.java
@@ -105,12 +105,12 @@ public class CommandResultAssert
     return this;
   }
 
-  public CommandResultAssert failToPersist() {
+  public CommandResultAssert hasFailToPersistError() {
     Assertions.assertThat(actual.getCommandResult().failedToPersist()).isTrue();
     return this;
   }
 
-  public CommandResultAssert persisted() {
+  public CommandResultAssert hasNoFailToPersistError() {
     Assertions.assertThat(actual.getCommandResult().failedToPersist()).isFalse();
     return this;
   }
diff --git a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/CreateDestroyGatewaySenderCommandDUnitTest.java b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/CreateDestroyGatewaySenderCommandDUnitTest.java
index fd810bb..5fa4e23 100644
--- a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/CreateDestroyGatewaySenderCommandDUnitTest.java
+++ b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/CreateDestroyGatewaySenderCommandDUnitTest.java
@@ -110,6 +110,13 @@ public class CreateDestroyGatewaySenderCommandDUnitTest {
 
     MemberVM.invokeInEveryMember(() -> verifySenderDoesNotExist("ln", false), server1, server2,
         server3);
+
+    locatorSite1.invoke(() -> {
+      String xml = LocatorServerStartupRule.getLocator().getSharedConfiguration()
+          .getConfiguration("cluster").getCacheXmlContent();
+      assertThat(xml).doesNotContain("gateway-sender id=\"ln\"");
+    });
+
   }
 
   /**

-- 
To stop receiving notification emails like this one, please contact
['"commits@geode.apache.org" <co...@geode.apache.org>'].