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 kh...@apache.org.