You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kh...@apache.org on 2018/05/17 20:06:16 UTC
[geode] branch develop updated: GEODE-4858: Refactor destroy
gateway-receiver command (#1968)
This is an automated email from the ASF dual-hosted git repository.
khowe 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 9203ccd GEODE-4858: Refactor destroy gateway-receiver command (#1968)
9203ccd is described below
commit 9203ccd1a8fe6006b7a6e9e0f8ebcd8145a2ca99
Author: Kenneth Howe <kh...@pivotal.io>
AuthorDate: Thu May 17 13:06:11 2018 -0700
GEODE-4858: Refactor destroy gateway-receiver command (#1968)
* GEODE-4858: Refactor destroy gateway-receiver command
Refactored to use SingleGfshCommand and ResultModel
Added tests for more complete unit test coverage of
DestroyGatewayReceiverFuntion
---
.../commands/DestroyGatewayReceiverCommand.java | 45 ++++++++--------------
.../functions/DestroyGatewayReceiverFunction.java | 44 +++++++++------------
.../DestroyGatewayReceiverCommandTest.java | 11 ++----
.../DestroyGatewayReceiverFunctionTest.java | 41 +++++++++++++++-----
.../DestroyGatewayReceiverCommandDUnitTest.java | 12 +++---
5 files changed, 76 insertions(+), 77 deletions(-)
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewayReceiverCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewayReceiverCommand.java
index e5e0de8..60ef451 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewayReceiverCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewayReceiverCommand.java
@@ -14,27 +14,25 @@
*/
package org.apache.geode.management.internal.cli.commands;
-import java.util.Arrays;
import java.util.List;
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.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
import org.apache.geode.management.cli.CliMetaData;
import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
import org.apache.geode.management.internal.cli.functions.DestroyGatewayReceiverFunction;
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.cli.result.model.ResultModel;
import org.apache.geode.management.internal.security.ResourceOperation;
import org.apache.geode.security.ResourcePermission;
-public class DestroyGatewayReceiverCommand extends InternalGfshCommand {
+public class DestroyGatewayReceiverCommand extends SingleGfshCommand {
public static final String DESTROY_GATEWAYRECEIVER = "destroy gateway-receiver";
public static final String DESTROY_GATEWAYRECEIVER__HELP =
"Destroy the Gateway Receiver on a member or members.";
@@ -47,7 +45,7 @@ public class DestroyGatewayReceiverCommand extends InternalGfshCommand {
@CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
@ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.GATEWAY)
- public Result destroyGatewayReceiver(
+ public ResultModel destroyGatewayReceiver(
@CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
optionContext = ConverterHint.MEMBERGROUP,
help = DESTROY_GATEWAYRECEIVER__GROUP__HELP) String[] onGroups,
@@ -61,32 +59,19 @@ public class DestroyGatewayReceiverCommand extends InternalGfshCommand {
Set<DistributedMember> members = getMembers(onGroups, onMember);
List<CliFunctionResult> functionResults =
- executeAndGetFunctionResult(DestroyGatewayReceiverFunction.INSTANCE, ifExists, members);
+ executeAndGetFunctionResult(DestroyGatewayReceiverFunction.INSTANCE, null, members);
- CommandResult result = ResultBuilder.buildResult(functionResults);
+ ResultModel result = ResultModel.createMemberStatusResult(functionResults, ifExists);
+ result.setConfigObject(new CacheConfig.GatewayReceiver());
- // Only update the cluster config if the command is not executed on specific members.
- InternalConfigurationPersistenceService service =
- (InternalConfigurationPersistenceService) getConfigurationPersistenceService();
- if (onMember != null || service == null) {
- persisted = false;
- } else if (result.getStatus().equals(Result.Status.OK) && service != null) {
- if (onGroups == null) {
- onGroups = new String[] {"cluster"};
- }
- Arrays.stream(onGroups).forEach(group -> service.updateCacheConfig(group, cc -> {
- if (cc == null || cc.getGatewayReceiver() == null) {
- if (!ifExists) {
- result.setStatus(Result.Status.ERROR);
- }
- } else {
- cc.setGatewayReceiver(null);
- }
- return cc;
- }));
- }
- result.setCommandPersisted(persisted);
return result;
}
+
+ @Override
+ public void updateClusterConfig(String group, CacheConfig config, Object element) {
+ if (config.getGatewayReceiver() != null) {
+ config.setGatewayReceiver(null);
+ }
+ }
}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunction.java
index 1e0793f..46cff54 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunction.java
@@ -14,6 +14,7 @@
*/
package org.apache.geode.management.internal.cli.functions;
+
import java.util.Set;
import org.apache.logging.log4j.Logger;
@@ -22,50 +23,43 @@ import org.apache.geode.cache.Cache;
import org.apache.geode.cache.execute.FunctionContext;
import org.apache.geode.cache.execute.ResultSender;
import org.apache.geode.cache.wan.GatewayReceiver;
-import org.apache.geode.internal.cache.execute.InternalFunction;
import org.apache.geode.internal.logging.LogService;
+import org.apache.geode.management.cli.CliFunction;
import org.apache.geode.management.internal.cli.CliUtil;
+import org.apache.geode.management.internal.cli.functions.CliFunctionResult.StatusState;
-public class DestroyGatewayReceiverFunction implements InternalFunction {
+public class DestroyGatewayReceiverFunction extends CliFunction {
private static final Logger logger = LogService.getLogger();
private static final long serialVersionUID = 1490927519860899562L;
private static final String ID = DestroyGatewayReceiverFunction.class.getName();
public static DestroyGatewayReceiverFunction INSTANCE = new DestroyGatewayReceiverFunction();
@Override
- public void execute(FunctionContext context) {
+ public CliFunctionResult executeFunction(FunctionContext context) {
ResultSender<Object> resultSender = context.getResultSender();
Cache cache = context.getCache();
String memberNameOrId =
CliUtil.getMemberNameOrId(cache.getDistributedSystem().getDistributedMember());
- boolean ifExists = (boolean) context.getArguments();
Set<GatewayReceiver> gatewayReceivers = cache.getGatewayReceivers();
- if (gatewayReceivers == null || gatewayReceivers.isEmpty()) {
- String message = "Gateway receiver not found.";
- if (ifExists) {
- resultSender
- .lastResult(new CliFunctionResult(memberNameOrId, true, "Skipping: " + message));
- } else {
- resultSender.lastResult(new CliFunctionResult(memberNameOrId, false, message));
- }
- return;
- }
- for (GatewayReceiver receiver : cache.getGatewayReceivers()) {
- try {
- if (receiver.isRunning()) {
- receiver.stop();
+ if (gatewayReceivers != null && !gatewayReceivers.isEmpty()) {
+ for (GatewayReceiver receiver : gatewayReceivers) {
+ try {
+ if (receiver.isRunning()) {
+ receiver.stop();
+ }
+ receiver.destroy();
+ return new CliFunctionResult(memberNameOrId, StatusState.OK,
+ String.format("GatewayReceiver destroyed on \"%s\"", memberNameOrId));
+ } catch (Exception e) {
+ logger.error(e.getMessage(), e);
+ return new CliFunctionResult(memberNameOrId, e, "");
}
- receiver.destroy();
- resultSender.sendResult(new CliFunctionResult(memberNameOrId, true,
- String.format("GatewayReceiver destroyed on \"%s\"", memberNameOrId)));
- } catch (Exception e) {
- logger.error(e.getMessage(), e);
- resultSender.sendResult(new CliFunctionResult(memberNameOrId, e, ""));
}
- resultSender.lastResult(-1);
}
+ return new CliFunctionResult(memberNameOrId, StatusState.IGNORED,
+ "Gateway receiver not found.");
}
@Override
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewayReceiverCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewayReceiverCommandTest.java
index 0ae21c6..9c72f22 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewayReceiverCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewayReceiverCommandTest.java
@@ -37,7 +37,6 @@ import org.apache.geode.internal.cache.InternalCache;
import org.apache.geode.management.internal.cli.exceptions.UserErrorException;
import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.configuration.domain.XmlEntity;
import org.apache.geode.test.junit.assertions.CommandResultAssert;
import org.apache.geode.test.junit.categories.UnitTest;
import org.apache.geode.test.junit.rules.GfshParserRule;
@@ -52,13 +51,11 @@ public class DestroyGatewayReceiverCommandTest {
private List<CliFunctionResult> functionResults;
private InternalConfigurationPersistenceService ccService;
private CliFunctionResult result1;
- private XmlEntity xmlEntity;
@Before
public void setUp() throws Exception {
command = spy(DestroyGatewayReceiverCommand.class);
ccService = mock(InternalConfigurationPersistenceService.class);
- xmlEntity = mock(XmlEntity.class);
cache = mock(InternalCache.class);
doReturn(cache).when(command).getCache();
doReturn(ccService).when(command).getConfigurationPersistenceService();
@@ -77,7 +74,7 @@ public class DestroyGatewayReceiverCommandTest {
@Test
public void memberNoGroup_isOK() {
- result1 = new CliFunctionResult("member1", xmlEntity, "result1");
+ result1 = new CliFunctionResult("member1", CliFunctionResult.StatusState.OK, "result1");
functionResults.add(result1);
Set<DistributedMember> membersSet = new HashSet<>();
membersSet.add(new InternalDistributedMember("member1", 0));
@@ -85,12 +82,12 @@ public class DestroyGatewayReceiverCommandTest {
CommandResultAssert resultAssert =
gfsh.executeAndAssertThat(command, "destroy gateway-receiver --member=\"member1\"");
- resultAssert.statusIsSuccess().tableHasColumnWithValuesContaining("Status", "result1");
+ resultAssert.statusIsSuccess().tableHasColumnWithValuesContaining("Message", "result1");
}
@Test
public void groupNoMember_isOK() {
- result1 = new CliFunctionResult("member1", xmlEntity, "result1");
+ result1 = new CliFunctionResult("member1", CliFunctionResult.StatusState.OK, "result1");
functionResults.add(result1);
Set<DistributedMember> membersSet = new HashSet<>();
membersSet.add(new InternalDistributedMember("member1", 0));
@@ -98,6 +95,6 @@ public class DestroyGatewayReceiverCommandTest {
CommandResultAssert resultAssert =
gfsh.executeAndAssertThat(command, "destroy gateway-receiver --group=\"group1\"");
- resultAssert.statusIsSuccess().tableHasColumnWithValuesContaining("Status", "result1");
+ resultAssert.statusIsSuccess().tableHasColumnWithValuesContaining("Message", "result1");
}
}
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunctionTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunctionTest.java
index b4b32fb..fb1ef51 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunctionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/functions/DestroyGatewayReceiverFunctionTest.java
@@ -16,11 +16,14 @@ package org.apache.geode.management.internal.cli.functions;
import static org.assertj.core.api.Assertions.assertThat;
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 static org.mockito.Mockito.when;
import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
import org.junit.Before;
import org.junit.Test;
@@ -29,6 +32,7 @@ import org.mockito.ArgumentCaptor;
import org.apache.geode.cache.execute.FunctionContext;
import org.apache.geode.cache.execute.ResultSender;
+import org.apache.geode.cache.wan.GatewayReceiver;
import org.apache.geode.distributed.DistributedSystem;
import org.apache.geode.internal.cache.InternalCache;
import org.apache.geode.test.junit.categories.UnitTest;
@@ -57,7 +61,6 @@ public class DestroyGatewayReceiverFunctionTest {
@Test
public void getGatewayReceiversNull_doesNotThrowException() {
when(cache.getGatewayReceivers()).thenReturn(null);
- when(context.getArguments()).thenReturn(false);
function.execute(context);
verify(resultSender).lastResult(resultCaptor.capture());
@@ -68,28 +71,46 @@ public class DestroyGatewayReceiverFunctionTest {
}
@Test
- public void getGatewayReceiversNotFound_ifExists_false() {
+ public void getGatewayReceiversNotFound_returnsStatusIgnored() {
when(cache.getGatewayReceivers()).thenReturn(Collections.emptySet());
- when(context.getArguments()).thenReturn(false);
function.execute(context);
verify(resultSender).lastResult(resultCaptor.capture());
CliFunctionResult result = resultCaptor.getValue();
- assertThat(result.isSuccessful()).isFalse();
+ assertThat(result.getStatus(true)).contains("IGNORED");
assertThat(result.getThrowable()).isNull();
assertThat(result.getMessage()).isEqualTo("Gateway receiver not found.");
}
@Test
- public void getGatewayReceiversNotFound_ifExists_true() {
- when(cache.getGatewayReceivers()).thenReturn(Collections.emptySet());
- when(context.getArguments()).thenReturn(true);
+ public void runningReceivers_stopCalledBeforeDestroying() {
+ GatewayReceiver receiver = mock(GatewayReceiver.class);
+ Set<GatewayReceiver> receivers = new HashSet<>();
+ receivers.add(receiver);
+
+ when(cache.getGatewayReceivers()).thenReturn(receivers);
+ when(receiver.isRunning()).thenReturn(true);
function.execute(context);
verify(resultSender).lastResult(resultCaptor.capture());
+ verify(receiver).stop();
CliFunctionResult result = resultCaptor.getValue();
- assertThat(result.isSuccessful()).isTrue();
- assertThat(result.getThrowable()).isNull();
- assertThat(result.getMessage()).isEqualTo("Skipping: Gateway receiver not found.");
+ assertThat(result.getStatus(true)).isEqualTo("OK");
+ }
+
+ @Test
+ public void stoppedReceivers_stopNotCalledBeforeDestroying() {
+ GatewayReceiver receiver = mock(GatewayReceiver.class);
+ Set<GatewayReceiver> receivers = new HashSet<>();
+ receivers.add(receiver);
+
+ when(cache.getGatewayReceivers()).thenReturn(receivers);
+ when(receiver.isRunning()).thenReturn(false);
+ function.execute(context);
+
+ verify(resultSender).lastResult(resultCaptor.capture());
+ verify(receiver, never()).stop();
+ CliFunctionResult result = resultCaptor.getValue();
+ assertThat(result.getStatus(true)).isEqualTo("OK");
}
}
diff --git a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/DestroyGatewayReceiverCommandDUnitTest.java b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/DestroyGatewayReceiverCommandDUnitTest.java
index f824060..2cf7857 100644
--- a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/DestroyGatewayReceiverCommandDUnitTest.java
+++ b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/DestroyGatewayReceiverCommandDUnitTest.java
@@ -354,7 +354,7 @@ public class DestroyGatewayReceiverCommandDUnitTest {
}
@Test
- public void destroyIfExistsWithoutGatewayReceivers_isSkipping() {
+ public void destroyIfExistsWithoutGatewayReceivers_isIgnored() {
Integer locator1Port = locatorSite1.getPort();
server3 = clusterStartupRule.startServerVM(3, locator1Port);
server4 = clusterStartupRule.startServerVM(4, locator1Port);
@@ -368,7 +368,7 @@ public class DestroyGatewayReceiverCommandDUnitTest {
.addOption(CliStrings.IFEXISTS, "true").addOption(CliStrings.MEMBER, server3.getName());
gfsh.executeAndAssertThat(csb.toString()).statusIsSuccess()
.tableHasColumnWithExactValuesInAnyOrder("Member", "server-3")
- .tableHasColumnWithValuesContaining("Status", "Skipping:");
+ .tableHasColumnWithValuesContaining("Status", "IGNORED");
}
@Test
@@ -503,7 +503,7 @@ public class DestroyGatewayReceiverCommandDUnitTest {
CommandStringBuilder csb =
new CommandStringBuilder(DestroyGatewayReceiverCommand.DESTROY_GATEWAYRECEIVER)
.addOption(CliStrings.GROUP, "Grp1,Grp2,Grp3");
- gfsh.executeAndAssertThat(csb.toString()).statusIsError()
+ gfsh.executeAndAssertThat(csb.toString()).statusIsSuccess()
.doesNotContainOutput("change is not persisted")
.tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5");
verifyConfigDoesNotHaveGatewayReceiver("Grp1");
@@ -513,7 +513,7 @@ public class DestroyGatewayReceiverCommandDUnitTest {
}
@Test
- public void destroyGatewayReceiverDoesNotExistInMultipleGroups_ifExistsSkipsGroupsWithoutReceviers() {
+ public void destroyGatewayReceiverDoesNotExistInMultipleGroups_ifExistsIgnoresGroupsWithoutReceviers() {
Integer locator1Port = locatorSite1.getPort();
server3 = startServerWithGroups(3, "Grp1", locator1Port);
server4 = startServerWithGroups(4, "Grp2", locator1Port);
@@ -538,7 +538,9 @@ public class DestroyGatewayReceiverCommandDUnitTest {
.addOption(CliStrings.IFEXISTS, "true").addOption(CliStrings.GROUP, "Grp1,Grp2,Grp3");
gfsh.executeAndAssertThat(csb.toString()).statusIsSuccess()
.doesNotContainOutput("change is not persisted")
- .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5");
+ .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+ .tableHasRowWithValues("Member", "Status", "server-3", "IGNORED")
+ .tableHasRowWithValues("Member", "Status", "server-5", "IGNORED");
verifyConfigDoesNotHaveGatewayReceiver("Grp1");
verifyConfigDoesNotHaveGatewayReceiver("cluster");
--
To stop receiving notification emails like this one, please contact
khowe@apache.org.