You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by pr...@apache.org on 2018/05/21 18:59:33 UTC

[geode] branch develop updated: GEODE-4858: CreateAsyncEventQueue and tests refactor. (#1969)

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

prhomberg 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 ec7a162  GEODE-4858: CreateAsyncEventQueue and tests refactor. (#1969)
ec7a162 is described below

commit ec7a162b09faa87ac7d7f119fbf46827602e166c
Author: Patrick Rhomberg <pr...@pivotal.io>
AuthorDate: Mon May 21 11:59:27 2018 -0700

    GEODE-4858: CreateAsyncEventQueue and tests refactor. (#1969)
    
    * Unsupported ModelCommandResult methods failedToPersist, setCommandPersisted, and setFileToDownload now throw exceptions to avoid accidental use in testing.
    * Extracted cluster configuration messages in CommandExecutor to public class fields, for test consumption.
    * Extracted several message strings in ModelCommandResult to public class fields, for test consumption
    * Serialized necessary AsyncEventQueue configuration classes and updated sanctioned-geode-core-serializables
---
 .../geode/cache/configuration/CacheConfig.java     |  3 +-
 .../geode/cache/configuration/ClassNameType.java   |  3 +-
 .../geode/cache/configuration/ObjectType.java      |  3 +-
 .../cli/commands/CreateAsyncEventQueueCommand.java | 61 ++++++++++--------
 .../functions/CreateAsyncEventQueueFunction.java   | 75 ++++++++++++----------
 .../internal/cli/remote/CommandExecutor.java       | 11 ++--
 .../internal/cli/result/ModelCommandResult.java    | 20 ++++--
 .../sanctioned-geode-core-serializables.txt        |  7 ++
 .../ConfigurePDXCommandIntegrationTest.java        | 10 +--
 .../cli/commands/ConfigurePDXCommandTest.java      | 29 +++++----
 .../CreateAsyncEventQueueCommandDUnitTest.java     | 33 ++++++----
 .../commands/CreateAsyncEventQueueCommandTest.java | 74 ++++++++++-----------
 12 files changed, 191 insertions(+), 138 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java b/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java
index eccc894..a96904b 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java
@@ -20,6 +20,7 @@ package org.apache.geode.cache.configuration;
 
 import static org.apache.geode.cache.configuration.CacheElement.findElement;
 
+import java.io.Serializable;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
@@ -1107,7 +1108,7 @@ public class CacheConfig {
   @XmlAccessorType(XmlAccessType.FIELD)
   @XmlType(name = "",
       propOrder = {"gatewayEventFilter", "gatewayEventSubstitutionFilter", "asyncEventListener"})
-  public static class AsyncEventQueue {
+  public static class AsyncEventQueue implements Serializable {
 
     @XmlElement(name = "gateway-event-filter", namespace = "http://geode.apache.org/schema/cache")
     protected List<DeclarableType> gatewayEventFilter;
diff --git a/geode-core/src/main/java/org/apache/geode/cache/configuration/ClassNameType.java b/geode-core/src/main/java/org/apache/geode/cache/configuration/ClassNameType.java
index 77a8ff6..9cb3ea3 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/configuration/ClassNameType.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/configuration/ClassNameType.java
@@ -17,6 +17,7 @@
 
 package org.apache.geode.cache.configuration;
 
+import java.io.Serializable;
 import java.util.Objects;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -47,7 +48,7 @@ import javax.xml.bind.annotation.XmlType;
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "", propOrder = {"className"})
-public class ClassNameType {
+public class ClassNameType implements Serializable {
 
   @XmlElement(name = "class-name", namespace = "http://geode.apache.org/schema/cache",
       required = true)
diff --git a/geode-core/src/main/java/org/apache/geode/cache/configuration/ObjectType.java b/geode-core/src/main/java/org/apache/geode/cache/configuration/ObjectType.java
index 0a78f0d..2767815 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/configuration/ObjectType.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/configuration/ObjectType.java
@@ -17,6 +17,7 @@
 
 package org.apache.geode.cache.configuration;
 
+import java.io.Serializable;
 import java.util.Objects;
 
 import javax.xml.bind.annotation.XmlAccessType;
@@ -48,7 +49,7 @@ import javax.xml.bind.annotation.XmlType;
  */
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "", propOrder = {"string", "declarable"})
-public class ObjectType {
+public class ObjectType implements Serializable {
   @XmlElement(name = "string", namespace = "http://geode.apache.org/schema/cache")
   protected String string;
   @XmlElement(name = "declarable", namespace = "http://geode.apache.org/schema/cache")
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommand.java
index 0f9b70d..7673b33 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateAsyncEventQueueCommand.java
@@ -15,34 +15,34 @@
 
 package org.apache.geode.management.internal.cli.commands;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Properties;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
 import org.apache.geode.cache.asyncqueue.internal.AsyncEventQueueFactoryImpl;
+import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.configuration.DeclarableType;
 import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
-import org.apache.geode.management.internal.cli.functions.AsyncEventQueueFunctionArgs;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.CreateAsyncEventQueueFunction;
 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.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class CreateAsyncEventQueueCommand extends InternalGfshCommand {
+public class CreateAsyncEventQueueCommand extends SingleGfshCommand {
   @CliCommand(value = CliStrings.CREATE_ASYNC_EVENT_QUEUE,
       help = CliStrings.CREATE_ASYNC_EVENT_QUEUE__HELP)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.DEPLOY)
-  public Result createAsyncEventQueue(
+  public ResultModel createAsyncEventQueue(
       @CliOption(key = CliStrings.CREATE_ASYNC_EVENT_QUEUE__ID, mandatory = true,
           help = CliStrings.CREATE_ASYNC_EVENT_QUEUE__ID__HELP) String id,
       @CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
@@ -108,27 +108,38 @@ public class CreateAsyncEventQueueCommand extends InternalGfshCommand {
     }
 
     Set<DistributedMember> targetMembers = getMembers(groups, null);
-
-    AsyncEventQueueFunctionArgs aeqArgs = new AsyncEventQueueFunctionArgs(id, parallel,
-        enableBatchConflation, batchSize, batchTimeInterval, persistent, diskStore, diskSynchronous,
-        maxQueueMemory, dispatcherThreads, orderPolicy, gatewayEventFilters,
-        gatewaySubstitutionListener, listener, listenerProperties, forwardExpirationDestroy);
+    CacheConfig.AsyncEventQueue config = new CacheConfig.AsyncEventQueue();
+    config.setAsyncEventListener(new DeclarableType(listener, listenerProperties));
+    config.setBatchSize(String.valueOf(batchSize));
+    config.setBatchTimeInterval(String.valueOf(batchTimeInterval));
+    config.setDiskStoreName(diskStore);
+    config.setDiskSynchronous(diskSynchronous);
+    config.setDispatcherThreads(String.valueOf(dispatcherThreads));
+    config.setEnableBatchConflation(enableBatchConflation);
+    config.setForwardExpirationDestroy(forwardExpirationDestroy);
+    if (gatewayEventFilters != null) {
+      config.getGatewayEventFilter().addAll(Arrays.stream(gatewayEventFilters)
+          .map(classname -> new DeclarableType((classname))).collect(Collectors.toList()));
+    }
+    if (gatewaySubstitutionListener != null) {
+      config.setGatewayEventSubstitutionFilter(new DeclarableType(gatewaySubstitutionListener));
+    }
+    config.setId(id);
+    config.setMaximumQueueMemory(String.valueOf(maxQueueMemory));
+    config.setOrderPolicy(orderPolicy);
+    config.setParallel(parallel);
+    config.setPersistent(persistent);
 
     CreateAsyncEventQueueFunction function = new CreateAsyncEventQueueFunction();
-    List<CliFunctionResult> results = executeAndGetFunctionResult(function, aeqArgs, targetMembers);
+    List<CliFunctionResult> results = executeAndGetFunctionResult(function, config, targetMembers);
 
-    if (results.size() == 0) {
-      throw new RuntimeException("No results received.");
-    }
-
-    CommandResult commandResult = ResultBuilder.buildResult(results);
-    XmlEntity xmlEntity = findXmlEntity(results);
-    if (xmlEntity != null) {
-      persistClusterConfiguration(commandResult,
-          () -> ((InternalConfigurationPersistenceService) getConfigurationPersistenceService())
-              .addXmlEntity(xmlEntity, groups));
-    }
+    ResultModel commandResult = ResultModel.createMemberStatusResult(results);
+    commandResult.setConfigObject(config);
     return commandResult;
   }
 
+  @Override
+  public void updateClusterConfig(String group, CacheConfig config, Object configObject) {
+    config.getAsyncEventQueue().add((CacheConfig.AsyncEventQueue) configObject);
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateAsyncEventQueueFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateAsyncEventQueueFunction.java
index dac4564..4fc0f9b 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateAsyncEventQueueFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CreateAsyncEventQueueFunction.java
@@ -15,6 +15,7 @@
 package org.apache.geode.management.internal.cli.functions;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
@@ -25,6 +26,10 @@ import org.apache.geode.cache.CacheClosedException;
 import org.apache.geode.cache.Declarable;
 import org.apache.geode.cache.asyncqueue.AsyncEventListener;
 import org.apache.geode.cache.asyncqueue.AsyncEventQueueFactory;
+import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.configuration.ClassNameType;
+import org.apache.geode.cache.configuration.DeclarableType;
+import org.apache.geode.cache.configuration.ParameterType;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.wan.GatewayEventFilter;
 import org.apache.geode.cache.wan.GatewayEventSubstitutionFilter;
@@ -33,10 +38,9 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.internal.ClassPathLoader;
 import org.apache.geode.internal.InternalDataSerializer;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.cache.execute.InternalFunction;
-import org.apache.geode.internal.cache.xmlcache.CacheXml;
 import org.apache.geode.internal.logging.LogService;
-import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.cli.CliFunction;
+import org.apache.geode.management.internal.cli.functions.CliFunctionResult.StatusState;
 
 /**
  * Function used by the 'create async-event-queue' gfsh command to create an asynchronous event
@@ -44,19 +48,18 @@ import org.apache.geode.management.internal.configuration.domain.XmlEntity;
  *
  * @since GemFire 8.0
  */
-public class CreateAsyncEventQueueFunction implements InternalFunction {
+public class CreateAsyncEventQueueFunction extends CliFunction {
   private static final Logger logger = LogService.getLogger();
 
   private static final long serialVersionUID = 1L;
 
-  @SuppressWarnings("deprecation")
   @Override
-  public void execute(FunctionContext context) {
+  public CliFunctionResult executeFunction(FunctionContext context) {
     // Declared here so that it's available when returning a Throwable
     String memberId = "";
 
     try {
-      AsyncEventQueueFunctionArgs aeqArgs = (AsyncEventQueueFunctionArgs) context.getArguments();
+      CacheConfig.AsyncEventQueue config = (CacheConfig.AsyncEventQueue) context.getArguments();
 
       InternalCache cache = (InternalCache) context.getCache();
 
@@ -68,18 +71,21 @@ public class CreateAsyncEventQueueFunction implements InternalFunction {
         memberId = member.getName();
       }
 
-      AsyncEventQueueFactory asyncEventQueueFactory = cache.createAsyncEventQueueFactory()
-          .setParallel(aeqArgs.isParallel())
-          .setBatchConflationEnabled(aeqArgs.isEnableBatchConflation())
-          .setBatchSize(aeqArgs.getBatchSize()).setBatchTimeInterval(aeqArgs.getBatchTimeInterval())
-          .setPersistent(aeqArgs.isPersistent()).setDiskStoreName(aeqArgs.getDiskStoreName())
-          .setDiskSynchronous(aeqArgs.isDiskSynchronous())
-          .setForwardExpirationDestroy(aeqArgs.isForwardExpirationDestroy())
-          .setMaximumQueueMemory(aeqArgs.getMaxQueueMemory())
-          .setDispatcherThreads(aeqArgs.getDispatcherThreads())
-          .setOrderPolicy(OrderPolicy.valueOf(aeqArgs.getOrderPolicy()));
-
-      String[] gatewayEventFilters = aeqArgs.getGatewayEventFilters();
+      AsyncEventQueueFactory asyncEventQueueFactory =
+          cache.createAsyncEventQueueFactory().setParallel(config.isParallel())
+              .setBatchConflationEnabled(config.isEnableBatchConflation())
+              .setBatchSize(Integer.parseInt(config.getBatchSize()))
+              .setBatchTimeInterval(Integer.parseInt(config.getBatchTimeInterval()))
+              .setPersistent(config.isPersistent()).setDiskStoreName(config.getDiskStoreName())
+              .setDiskSynchronous(config.isDiskSynchronous())
+              .setForwardExpirationDestroy(config.isForwardExpirationDestroy())
+              .setMaximumQueueMemory(Integer.parseInt(config.getMaximumQueueMemory()))
+              .setDispatcherThreads(Integer.parseInt(config.getDispatcherThreads()))
+              .setOrderPolicy(OrderPolicy.valueOf(config.getOrderPolicy()));
+
+      String[] gatewayEventFilters = config.getGatewayEventFilter().stream()
+          .map(ClassNameType::getClassName).toArray(String[]::new);
+
       if (gatewayEventFilters != null) {
         for (String gatewayEventFilter : gatewayEventFilters) {
           asyncEventQueueFactory
@@ -87,19 +93,26 @@ public class CreateAsyncEventQueueFunction implements InternalFunction {
         }
       }
 
-      String gatewaySubstitutionFilter = aeqArgs.getGatewaySubstitutionFilter();
-      if (gatewaySubstitutionFilter != null) {
+      DeclarableType gatewayEventSubstitutionFilter = config.getGatewayEventSubstitutionFilter();
+
+      if (gatewayEventSubstitutionFilter != null) {
+        String gatewaySubstitutionFilter = gatewayEventSubstitutionFilter.getClassName();
         asyncEventQueueFactory.setGatewayEventSubstitutionListener(
             (GatewayEventSubstitutionFilter<?, ?>) newInstance(gatewaySubstitutionFilter));
       }
 
-      String listenerClassName = aeqArgs.getListenerClassName();
+      String listenerClassName = config.getAsyncEventListener().getClassName();
       Object listenerInstance;
       Class<?> listenerClass = InternalDataSerializer.getCachedClass(listenerClassName);
       listenerInstance = listenerClass.newInstance();
 
-      Properties listenerProperties = aeqArgs.getListenerProperties();
-      if (listenerProperties != null && !listenerProperties.isEmpty()) {
+      List<ParameterType> parameters = config.getAsyncEventListener().getParameter();
+      Properties listenerProperties = new Properties();
+      for (ParameterType p : parameters) {
+        listenerProperties.put(p.getName(), p.getString());
+      }
+
+      if (!listenerProperties.isEmpty()) {
         if (!(listenerInstance instanceof Declarable)) {
           throw new IllegalArgumentException(
               "Listener properties were provided, but the listener specified does not implement Declarable.");
@@ -108,23 +121,19 @@ public class CreateAsyncEventQueueFunction implements InternalFunction {
         ((Declarable) listenerInstance).initialize(cache, listenerProperties);
         ((Declarable) listenerInstance).init(listenerProperties); // for backwards compatibility
 
-        Map<Declarable, Properties> declarablesMap = new HashMap<Declarable, Properties>();
+        Map<Declarable, Properties> declarablesMap = new HashMap<>();
         declarablesMap.put((Declarable) listenerInstance, listenerProperties);
         cache.addDeclarableProperties(declarablesMap);
       }
 
-      asyncEventQueueFactory.create(aeqArgs.getAsyncEventQueueId(),
-          (AsyncEventListener) listenerInstance);
-
-      XmlEntity xmlEntity =
-          new XmlEntity(CacheXml.ASYNC_EVENT_QUEUE, "id", aeqArgs.getAsyncEventQueueId());
-      context.getResultSender().lastResult(new CliFunctionResult(memberId, xmlEntity, "Success"));
+      asyncEventQueueFactory.create(config.getId(), (AsyncEventListener) listenerInstance);
 
+      return new CliFunctionResult(memberId, StatusState.OK, "Success");
     } catch (CacheClosedException cce) {
-      context.getResultSender().lastResult(new CliFunctionResult(memberId, false, null));
+      return new CliFunctionResult(memberId, StatusState.ERROR, null);
     } catch (Exception e) {
       logger.error("Could not create async event queue: {}", e.getMessage(), e);
-      context.getResultSender().lastResult(new CliFunctionResult(memberId, e, null));
+      return new CliFunctionResult(memberId, e, null);
     }
   }
 
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 e4e2f5e..9b3208b 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
@@ -36,6 +36,11 @@ import org.apache.geode.security.NotAuthorizedException;
  * For AuthorizationExceptions, it logs it and then rethrow it.
  */
 public class CommandExecutor {
+  public static final String RUN_ON_MEMBER_CHANGE_NOT_PERSISTED =
+      "Configuration change is not persisted because the command is executed on specific member.";
+  public static final String SERVICE_NOT_RUNNING_CHANGE_NOT_PERSISTED =
+      "Cluster configuration service is not running. Configuration change is not persisted.";
+
   private Logger logger = LogService.getLogger();
 
   // used by the product
@@ -116,14 +121,12 @@ public class CommandExecutor {
     InfoResultModel infoResultModel = resultModel.addInfo(ResultModel.INFO_SECTION);
     ConfigurationPersistenceService ccService = gfshCommand.getConfigurationPersistenceService();
     if (ccService == null) {
-      infoResultModel.addLine(
-          "Cluster configuration service is not running. Configuration change is not persisted.");
+      infoResultModel.addLine(SERVICE_NOT_RUNNING_CHANGE_NOT_PERSISTED);
       return resultModel;
     }
 
     if (parseResult.getParamValue("member") != null) {
-      infoResultModel.addLine(
-          "Configuration change is not persisted because the command is executed on specific member.");
+      infoResultModel.addLine(RUN_ON_MEMBER_CHANGE_NOT_PERSISTED);
       return resultModel;
     }
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/ModelCommandResult.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/ModelCommandResult.java
index 0824910..36387ac 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/ModelCommandResult.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/ModelCommandResult.java
@@ -23,6 +23,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+import org.apache.commons.lang.NotImplementedException;
+
 import org.apache.geode.management.internal.cli.GfshParser;
 import org.apache.geode.management.internal.cli.json.GfJsonObject;
 import org.apache.geode.management.internal.cli.result.model.AbstractResultModel;
@@ -33,6 +35,14 @@ import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 
 public class ModelCommandResult implements CommandResult {
+  private static final String DO_NOT_USE_PERSISTED_FLAG =
+      "The persisted flag is an artifact of the legacy model and should not be used ModelCommandResult.";
+  private static final String FILE_LOGIC_NOT_YET_IMPLEMENTED =
+      "File transfer logic has not yet been implemented in ModelCommandResult";
+  private static final String CANNOT_PASS_GF_JSON_OBJECT_TO_MODEL_COMMAND_RESULT =
+      "Cannot pass GfJsonObject to ModelCommandResult";
+  private static final String CANNOT_USE_GF_JSON_OBJECT_FROM_MODEL_COMMAND_RESULT =
+      "Cannot use GfJsonObject from ModelCommandResult";
 
   private ResultModel result;
   private List<String> commandOutput;
@@ -121,12 +131,12 @@ public class ModelCommandResult implements CommandResult {
 
   @Override
   public String getHeader(GfJsonObject gfJsonObject) {
-    throw new IllegalArgumentException("Cannot pass GfJsonObject to ModelCommandResult");
+    throw new IllegalArgumentException(CANNOT_PASS_GF_JSON_OBJECT_TO_MODEL_COMMAND_RESULT);
   }
 
   @Override
   public GfJsonObject getContent() {
-    throw new IllegalArgumentException("Cannot use GfJsonObject from ModelCommandResult");
+    throw new IllegalArgumentException(CANNOT_USE_GF_JSON_OBJECT_FROM_MODEL_COMMAND_RESULT);
   }
 
   @Override
@@ -187,17 +197,17 @@ public class ModelCommandResult implements CommandResult {
 
   @Override
   public boolean failedToPersist() {
-    return false;
+    throw new IllegalArgumentException(DO_NOT_USE_PERSISTED_FLAG);
   }
 
   @Override
   public void setCommandPersisted(boolean commandPersisted) {
-
+    throw new IllegalArgumentException(DO_NOT_USE_PERSISTED_FLAG);
   }
 
   @Override
   public void setFileToDownload(Path fileToDownload) {
-
+    throw new NotImplementedException(FILE_LOGIC_NOT_YET_IMPLEMENTED);
   }
 
   // Convenience implementation using the first table found
diff --git a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
index 1f09c4c..afd758e 100644
--- a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
+++ b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
@@ -120,14 +120,21 @@ org/apache/geode/cache/client/SubscriptionNotEnabledException,true,-821244673777
 org/apache/geode/cache/client/internal/ContainsKeyOp$MODE,false
 org/apache/geode/cache/client/internal/TXSynchronizationOp$CompletionType,false
 org/apache/geode/cache/client/internal/pooling/ConnectionDestroyedException,true,-6918516787578041316
+org/apache/geode/cache/configuration/CacheConfig$AsyncEventQueue,false,asyncEventListener:org/apache/geode/cache/configuration/DeclarableType,batchSize:java/lang/String,batchTimeInterval:java/lang/String,diskStoreName:java/lang/String,diskSynchronous:java/lang/Boolean,dispatcherThreads:java/lang/String,enableBatchConflation:java/lang/Boolean,forwardExpirationDestroy:java/lang/Boolean,gatewayEventFilter:java/util/List,gatewayEventSubstitutionFilter:org/apache/geode/cache/configuration/Dec [...]
+org/apache/geode/cache/configuration/ClassNameType,false,className:java/lang/String
+org/apache/geode/cache/configuration/DeclarableType,false,parameter:java/util/List
 org/apache/geode/cache/configuration/EnumActionDestroyOverflow,false,value:java/lang/String
 org/apache/geode/cache/configuration/EnumReadableWritable,false,value:java/lang/String
 org/apache/geode/cache/configuration/JndiBindingsType$JndiBinding,false,blockingTimeoutSeconds:java/lang/String,configProperty:java/util/List,connPooledDatasourceClass:java/lang/String,connectionUrl:java/lang/String,idleTimeoutSeconds:java/lang/String,initPoolSize:java/lang/String,jdbcDriverClass:java/lang/String,jndiName:java/lang/String,loginTimeoutSeconds:java/lang/String,managedConnFactoryClass:java/lang/String,maxPoolSize:java/lang/String,password:java/lang/String,transactionType:ja [...]
 org/apache/geode/cache/configuration/JndiBindingsType$JndiBinding$ConfigProperty,false,configPropertyName:java/lang/String,configPropertyType:java/lang/String,configPropertyValue:java/lang/String
+org/apache/geode/cache/configuration/ObjectType,false,declarable:org/apache/geode/cache/configuration/DeclarableType,string:java/lang/String
+org/apache/geode/cache/configuration/ParameterType,false,name:java/lang/String
 org/apache/geode/cache/configuration/RegionAttributesDataPolicy,false,value:java/lang/String
 org/apache/geode/cache/configuration/RegionAttributesIndexUpdateType,false,value:java/lang/String
 org/apache/geode/cache/configuration/RegionAttributesMirrorType,false,value:java/lang/String
 org/apache/geode/cache/configuration/RegionAttributesScope,false,value:java/lang/String
+org/apache/geode/cache/configuration/RegionAttributesType$EvictionAttributes$LruHeapPercentage,false,action:org/apache/geode/cache/configuration/EnumActionDestroyOverflow
+org/apache/geode/cache/configuration/RegionAttributesType$EvictionAttributes$LruMemorySize,false,maximum:java/lang/String
 org/apache/geode/cache/configuration/RegionConfig,false,entry:java/util/List,index:java/util/List,name:java/lang/String,refid:java/lang/String,region:java/util/List,regionAttributes:java/util/List,regionElements:java/util/List
 org/apache/geode/cache/configuration/RegionConfig$Index,false,expression:java/lang/String,fromClause:java/lang/String,imports:java/lang/String,keyIndex:java/lang/Boolean,name:java/lang/String,type:java/lang/String
 org/apache/geode/cache/execute/EmptyRegionFunctionException,true,1
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ConfigurePDXCommandIntegrationTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ConfigurePDXCommandIntegrationTest.java
index cc8ca74..bd4226d 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ConfigurePDXCommandIntegrationTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ConfigurePDXCommandIntegrationTest.java
@@ -51,7 +51,7 @@ public class ConfigurePDXCommandIntegrationTest {
 
   @Test
   public void commandShouldSucceedWhenUsingDefaults() {
-    gfsh.executeAndAssertThat(BASE_COMMAND_STRING).statusIsSuccess().hasNoFailToPersistError();
+    gfsh.executeAndAssertThat(BASE_COMMAND_STRING).statusIsSuccess();
 
     String sharedConfigXml = locator.getLocator().getConfigurationPersistenceService()
         .getConfiguration("cluster").getCacheXmlContent();
@@ -63,7 +63,7 @@ public class ConfigurePDXCommandIntegrationTest {
   public void commandShouldSucceedWhenConfiguringAutoSerializableClassesWithPersistence() {
     gfsh.executeAndAssertThat(BASE_COMMAND_STRING
         + "--read-serialized=true --disk-store=myDiskStore --ignore-unread-fields=true --auto-serializable-classes=com.company.DomainObject.*#identity=id")
-        .statusIsSuccess().hasNoFailToPersistError();
+        .statusIsSuccess();
 
     String sharedConfigXml = locator.getLocator().getConfigurationPersistenceService()
         .getConfiguration("cluster").getCacheXmlContent();
@@ -81,7 +81,7 @@ public class ConfigurePDXCommandIntegrationTest {
   public void commandShouldSucceedWhenConfiguringAutoSerializableClassesWithoutPersistence() {
     gfsh.executeAndAssertThat(BASE_COMMAND_STRING
         + "--read-serialized=false --ignore-unread-fields=false --auto-serializable-classes=com.company.DomainObject.*#identity=id")
-        .statusIsSuccess().hasNoFailToPersistError();
+        .statusIsSuccess();
 
     String sharedConfigXml = locator.getLocator().getConfigurationPersistenceService()
         .getConfiguration("cluster").getCacheXmlContent();
@@ -99,7 +99,7 @@ public class ConfigurePDXCommandIntegrationTest {
   public void commandShouldSucceedWhenConfiguringPortableAutoSerializableClassesWithPersistence() {
     gfsh.executeAndAssertThat(BASE_COMMAND_STRING
         + "--read-serialized=true --disk-store=myDiskStore --ignore-unread-fields=true --portable-auto-serializable-classes=com.company.DomainObject.*#identity=id")
-        .statusIsSuccess().hasNoFailToPersistError();
+        .statusIsSuccess();
 
     String sharedConfigXml = locator.getLocator().getConfigurationPersistenceService()
         .getConfiguration("cluster").getCacheXmlContent();
@@ -119,7 +119,7 @@ public class ConfigurePDXCommandIntegrationTest {
   public void commandShouldSucceedWhenConfiguringPortableAutoSerializableClassesWithoutPersistence() {
     gfsh.executeAndAssertThat(BASE_COMMAND_STRING
         + "--read-serialized=false --ignore-unread-fields=false --portable-auto-serializable-classes=com.company.DomainObject.*#identity=id")
-        .statusIsSuccess().hasNoFailToPersistError();
+        .statusIsSuccess();
 
     String sharedConfigXml = locator.getLocator().getConfigurationPersistenceService()
         .getConfiguration("cluster").getCacheXmlContent();
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ConfigurePDXCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ConfigurePDXCommandTest.java
index ace35f7..ce9e83d 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ConfigurePDXCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ConfigurePDXCommandTest.java
@@ -131,18 +131,19 @@ public class ConfigurePDXCommandTest {
   @Test
   public void executionShouldWorkCorrectlyWhenDefaultsAreUsed() {
     gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING).statusIsSuccess()
-        .hasNoFailToPersistError().containsOutput("persistent = false")
-        .containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = false");
+        .containsOutput("persistent = false").containsOutput("read-serialized = false")
+        .containsOutput("ignore-unread-fields = false");
   }
 
   @Test
   public void executionShouldCorrectlyConfigurePersistenceWhenDefaultDiskStoreIsUsed() {
     // Default Disk Store
     gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING + "--disk-store")
-        .statusIsSuccess().hasNoFailToPersistError().containsOutput("persistent = true")
+        .statusIsSuccess().containsOutput("persistent = true")
         .containsOutput("disk-store = DEFAULT").containsOutput("read-serialized = false")
         .containsOutput("ignore-unread-fields = false");
 
+    verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
     verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
   }
 
@@ -150,10 +151,11 @@ public class ConfigurePDXCommandTest {
   public void executionShouldCorrectlyConfigurePersistenceWhenCustomDiskStoreIsUsed() {
     // Custom Disk Store
     gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING + "--disk-store=myDiskStore")
-        .statusIsSuccess().hasNoFailToPersistError().containsOutput("persistent = true")
+        .statusIsSuccess().containsOutput("persistent = true")
         .containsOutput("disk-store = myDiskStore").containsOutput("read-serialized = false")
         .containsOutput("ignore-unread-fields = false");
 
+    verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
     verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
   }
 
@@ -161,9 +163,10 @@ public class ConfigurePDXCommandTest {
   public void executionShouldCorrectlyConfigureReadSerializedWhenFlagIsSetAsTrue() {
     // Custom Configuration as True
     gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING + "--read-serialized=true")
-        .statusIsSuccess().hasNoFailToPersistError().containsOutput("persistent = false")
+        .statusIsSuccess().containsOutput("persistent = false")
         .containsOutput("read-serialized = true").containsOutput("ignore-unread-fields = false");
 
+    verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
     verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
   }
 
@@ -171,9 +174,10 @@ public class ConfigurePDXCommandTest {
   public void executionShouldCorrectlyConfigureReadSerializedWhenFlagIsSetAsFalse() {
     // Custom Configuration as False
     gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING + "--read-serialized=false")
-        .statusIsSuccess().hasNoFailToPersistError().containsOutput("persistent = false")
+        .statusIsSuccess().containsOutput("persistent = false")
         .containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = false");
 
+    verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
     verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
   }
 
@@ -182,9 +186,10 @@ public class ConfigurePDXCommandTest {
     // Custom Configuration as True
     gfshParserRule
         .executeAndAssertThat(command, BASE_COMMAND_STRING + "--ignore-unread-fields=true")
-        .statusIsSuccess().hasNoFailToPersistError().containsOutput("persistent = false")
+        .statusIsSuccess().containsOutput("persistent = false")
         .containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = true");
 
+    verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
     verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
   }
 
@@ -193,9 +198,9 @@ public class ConfigurePDXCommandTest {
     // Custom Configuration as False
     gfshParserRule
         .executeAndAssertThat(command, BASE_COMMAND_STRING + "--ignore-unread-fields=false")
-        .statusIsSuccess().hasNoFailToPersistError().containsOutput("persistent = false")
+        .statusIsSuccess().containsOutput("persistent = false")
         .containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = false");
-
+    verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
     verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
   }
 
@@ -207,11 +212,12 @@ public class ConfigurePDXCommandTest {
     gfshParserRule
         .executeAndAssertThat(command,
             BASE_COMMAND_STRING + "--portable-auto-serializable-classes=" + patterns[0])
-        .statusIsSuccess().hasNoFailToPersistError().containsOutput("persistent = false")
+        .statusIsSuccess().containsOutput("persistent = false")
         .containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = false")
         .containsOutput("Portable Classes = [com.company.DomainObject.*#identity=id]")
         .containsOutput("PDX Serializer = org.apache.geode.pdx.ReflectionBasedAutoSerializer");
 
+    verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
     verify(command, times(1)).createReflectionBasedAutoSerializer(true, patterns);
   }
 
@@ -223,11 +229,12 @@ public class ConfigurePDXCommandTest {
     gfshParserRule
         .executeAndAssertThat(command,
             BASE_COMMAND_STRING + "--auto-serializable-classes=" + patterns[0])
-        .statusIsSuccess().hasNoFailToPersistError().containsOutput("persistent = false")
+        .statusIsSuccess().containsOutput("persistent = false")
         .containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = false")
         .containsOutput("Non Portable Classes = [com.company.DomainObject.*#identity=id]")
         .containsOutput("PDX Serializer = org.apache.geode.pdx.ReflectionBasedAutoSerializer");
 
+    verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
     verify(command, times(1)).createReflectionBasedAutoSerializer(false, patterns);
   }
 }
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 683012c..dd642df 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
@@ -23,6 +23,7 @@ import org.junit.experimental.categories.Category;
 
 import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.internal.cache.wan.MyAsyncEventListener;
+import org.apache.geode.management.internal.cli.remote.CommandExecutor;
 import org.apache.geode.management.internal.configuration.domain.Configuration;
 import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
@@ -30,6 +31,7 @@ import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.categories.AEQTest;
 import org.apache.geode.test.junit.categories.DistributedTest;
 import org.apache.geode.test.junit.rules.GfshCommandRule;
+import org.apache.geode.test.junit.rules.MemberStarterRule;
 
 
 @Category({DistributedTest.class, AEQTest.class})
@@ -50,21 +52,22 @@ public class CreateAsyncEventQueueCommandDUnitTest {
 
   @Test
   public void createQueueWithInvalidClass() throws Exception {
-    server = lsRule.startServerVM(0, x -> x.withJMXManager());
+    server = lsRule.startServerVM(0, MemberStarterRule::withJMXManager);
     gfsh.connectAndVerify(server.getJmxPort(), GfshCommandRule.PortType.jmxManager);
-    IgnoredException.addIgnoredException("java.lang.ClassNotFoundException: xyz");
-    gfsh.executeAndAssertThat(COMMAND + " --id=queue --listener=xyz").statusIsError()
-        .tableHasRowCount("Member", 1).tableHasRowWithValues("Member", "Status", "server-0",
-            "ERROR: java.lang.ClassNotFoundException: xyz");
+    IgnoredException
+        .addIgnoredException("java.lang.ClassNotFoundException: class.that.does.not.Exist");
+    gfsh.executeAndAssertThat(COMMAND + " --id=queue --listener=class.that.does.not.Exist")
+        .statusIsError().tableHasRowWithValues("Member", "Status", "Message", "server-0", "ERROR",
+            " java.lang.ClassNotFoundException: class.that.does.not.Exist");
   }
 
   @Test
   public void createQueueWithoutCC() throws Exception {
-    server = lsRule.startServerVM(0, x -> x.withJMXManager());
+    server = lsRule.startServerVM(0, MemberStarterRule::withJMXManager);
     gfsh.connectAndVerify(server.getJmxPort(), GfshCommandRule.PortType.jmxManager);
     gfsh.executeAndAssertThat(VALID_COMMAND + " --id=queue").statusIsSuccess()
-        .containsOutput("This change is not persisted in the cluster configuration")
-        .tableHasColumnWithExactValuesInAnyOrder("Status", "Success").tableHasRowCount("Member", 1);
+        .containsOutput(CommandExecutor.SERVICE_NOT_RUNNING_CHANGE_NOT_PERSISTED)
+        .tableHasColumnWithExactValuesInAnyOrder("Status", "OK").tableHasRowCount("Member", 1);
   }
 
   @Test
@@ -76,16 +79,19 @@ public class CreateAsyncEventQueueCommandDUnitTest {
     // verify a simple create aeq command
     gfsh.executeAndAssertThat(VALID_COMMAND + " --id=queue").statusIsSuccess()
         .tableHasRowCount("Member", 2)
-        .tableHasColumnWithExactValuesInAnyOrder("Status", "Success", "Success");
+        .tableHasRowWithValues("Member", "Status", "Message", "server-1", "OK", "Success")
+        .tableHasRowWithValues("Member", "Status", "Message", "server-2", "OK", "Success");
 
     IgnoredException
         .addIgnoredException("java.lang.IllegalStateException: A GatewaySender with id  "
             + "AsyncEventQueue_queue  is already defined in this cache.");
     // create a queue with the same id would result in failure
     gfsh.executeAndAssertThat(VALID_COMMAND + " --id=queue").statusIsError()
-        .tableHasRowCount("Member", 2).tableHasColumnWithExactValuesInAnyOrder("Status",
-            "ERROR: java.lang.IllegalStateException: A GatewaySender with id  AsyncEventQueue_queue  is already defined in this cache.",
-            "ERROR: java.lang.IllegalStateException: A GatewaySender with id  AsyncEventQueue_queue  is already defined in this cache.");
+        .tableHasRowCount("Member", 2)
+        .tableHasColumnWithExactValuesInAnyOrder("Status", "ERROR", "ERROR")
+        .tableHasColumnWithExactValuesInAnyOrder("Message",
+            " java.lang.IllegalStateException: A GatewaySender with id  AsyncEventQueue_queue  is already defined in this cache.",
+            " java.lang.IllegalStateException: A GatewaySender with id  AsyncEventQueue_queue  is already defined in this cache.");
 
     gfsh.executeAndAssertThat("create disk-store --name=diskStore2 --dir=diskstore");
     locator.waitTillDiskstoreIsReady("diskStore2", 2);
@@ -117,7 +123,8 @@ public class CreateAsyncEventQueueCommandDUnitTest {
     });
 
     gfsh.executeAndAssertThat(VALID_COMMAND + " --id=queue").statusIsSuccess()
-        .tableHasRowCount("Member", 1).tableHasColumnWithExactValuesInAnyOrder("Status", "Success");
+        .tableHasRowCount("Member", 1)
+        .tableHasRowWithValues("Member", "Status", "Message", "server-1", "OK", "Success");
 
     locator.invoke(() -> {
       InternalConfigurationPersistenceService service =
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 40c5e76..07d08ff 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
@@ -30,6 +30,7 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.isA;
 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.times;
 import static org.mockito.Mockito.verify;
@@ -48,7 +49,8 @@ import org.apache.geode.cache.execute.Function;
 import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 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.management.internal.cli.functions.CliFunctionResult.StatusState;
+import org.apache.geode.management.internal.cli.remote.CommandExecutor;
 import org.apache.geode.test.junit.categories.UnitTest;
 import org.apache.geode.test.junit.rules.GfshParserRule;
 
@@ -58,6 +60,7 @@ public class CreateAsyncEventQueueCommandTest {
 
   public static final String COMMAND = "create async-event-queue ";
   public static final String MINIUM_COMMAND = COMMAND + "--id=id --listener=xyz";
+
   @ClassRule
   public static GfshParserRule gfsh = new GfshParserRule();
 
@@ -72,19 +75,19 @@ public class CreateAsyncEventQueueCommandTest {
   }
 
   @Test
-  public void mandatoryId() throws Exception {
+  public void mandatoryId() {
     gfsh.executeAndAssertThat(command, COMMAND + "--listener=xyz").statusIsError()
         .containsOutput("Invalid command");
   }
 
   @Test
-  public void mandatoryListener() throws Exception {
+  public void mandatoryListener() {
     gfsh.executeAndAssertThat(command, COMMAND + "--id=id").statusIsError()
         .containsOutput("Invalid command");
   }
 
   @Test
-  public void cannotCreateAEQOnOneMember() throws Exception {
+  public void cannotCreateAEQOnOneMember() {
     // AEQ can not be created on one member since it needs to update CC.
     // This test is to make sure we don't add this option
     gfsh.executeAndAssertThat(command, COMMAND + "--id=id --listener=xyz --member=xyz")
@@ -92,7 +95,7 @@ public class CreateAsyncEventQueueCommandTest {
   }
 
   @Test
-  public void defaultValues() throws Exception {
+  public void defaultValues() {
     GfshParseResult result = gfsh.parse(MINIUM_COMMAND);
     assertThat(result.getParamValue(CREATE_ASYNC_EVENT_QUEUE__BATCHTIMEINTERVAL)).isEqualTo(5);
     assertThat(result.getParamValue(CREATE_ASYNC_EVENT_QUEUE__BATCH_SIZE)).isEqualTo(100);
@@ -113,39 +116,36 @@ public class CreateAsyncEventQueueCommandTest {
   }
 
   @Test
-  public void noMemberFound() throws Exception {
+  public void noMemberFound() {
     doReturn(Collections.emptySet()).when(command).findMembers(any(), any());
     gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsError()
         .containsOutput("No Members Found");
   }
 
   @Test
-  public void buildResult_all_success() throws Exception {
+  public void buildResult_all_success() {
     List<CliFunctionResult> functionResults = new ArrayList<>();
-    XmlEntity xmlEntity = mock(XmlEntity.class);
-    functionResults.add(new CliFunctionResult("member1", xmlEntity, "SUCCESS"));
-    functionResults.add(new CliFunctionResult("member2", xmlEntity, "SUCCESS"));
+    functionResults.add(new CliFunctionResult("member1", StatusState.OK, "SUCCESS"));
+    functionResults.add(new CliFunctionResult("member2", StatusState.OK, "SUCCESS"));
 
     // this is only to make the code pass that member check
     doReturn(Collections.emptySet()).when(command).getMembers(any(), any());
     doReturn(functionResults).when(command).executeAndGetFunctionResult(isA(Function.class),
         isA(Object.class), isA(Set.class));
 
-    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess().hasNoFailToPersistError()
-        .tableHasRowCount("Member", 2)
-        .tableHasRowWithValues("Member", "Status", "member1", "SUCCESS")
-        .tableHasRowWithValues("Member", "Status", "member2", "SUCCESS");
+    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess()
+        .tableHasRowWithValues("Member", "Status", "Message", "member1", "OK", "SUCCESS")
+        .tableHasRowWithValues("Member", "Status", "Message", "member1", "OK", "SUCCESS");
 
     // addXmlEntity should only be called once
-    verify(service).addXmlEntity(xmlEntity, null);
+    verify(service, times(1)).updateCacheConfig(any(), any());
   }
 
 
   @Test
-  public void buildResult_all_failure() throws Exception {
+  public void buildResult_all_failure() {
     List<CliFunctionResult> functionResults = new ArrayList<>();
-    XmlEntity xmlEntity = mock(XmlEntity.class);
-    functionResults.add(new CliFunctionResult("member1", false, "failed"));
+    functionResults.add(new CliFunctionResult("member1", StatusState.ERROR, "failed"));
     functionResults
         .add(new CliFunctionResult("member2", new RuntimeException("exception happened"), null));
 
@@ -154,21 +154,18 @@ public class CreateAsyncEventQueueCommandTest {
     doReturn(functionResults).when(command).executeAndGetFunctionResult(isA(Function.class),
         isA(Object.class), isA(Set.class));
 
-    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsError().hasNoFailToPersistError()
-        .tableHasRowCount("Member", 2)
-        .tableHasRowWithValues("Member", "Status", "member1", "ERROR: failed")
-        .tableHasRowWithValues("Member", "Status", "member2",
-            "ERROR: java.lang.RuntimeException: exception happened");
+    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsError().tableHasRowCount("Member", 2)
+        .tableHasRowWithValues("Member", "Status", "Message", "member1", "ERROR", "failed")
+        .tableHasRowWithValues("Member", "Status", "Message", "member2", "ERROR",
+            " java.lang.RuntimeException: exception happened");
 
-    // addXmlEntity should not be called
-    verify(service, times(0)).addXmlEntity(xmlEntity, null);
+    verify(service, never()).updateCacheConfig(any(), any());
   }
 
   @Test
-  public void buildResult_one_failure_one_success() throws Exception {
+  public void buildResult_one_failure_one_success() {
     List<CliFunctionResult> functionResults = new ArrayList<>();
-    XmlEntity xmlEntity = mock(XmlEntity.class);
-    functionResults.add(new CliFunctionResult("member1", xmlEntity, "SUCCESS"));
+    functionResults.add(new CliFunctionResult("member1", StatusState.OK, "SUCCESS"));
     functionResults
         .add(new CliFunctionResult("member2", new RuntimeException("exception happened"), null));
 
@@ -177,29 +174,28 @@ public class CreateAsyncEventQueueCommandTest {
     doReturn(functionResults).when(command).executeAndGetFunctionResult(isA(Function.class),
         isA(Object.class), isA(Set.class));
 
-    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess().hasNoFailToPersistError()
+    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess()
         .tableHasRowCount("Member", 2)
-        .tableHasRowWithValues("Member", "Status", "member1", "SUCCESS").tableHasRowWithValues(
-            "Member", "Status", "member2", "ERROR: java.lang.RuntimeException: exception happened");
+        .tableHasRowWithValues("Member", "Status", "Message", "member1", "OK", "SUCCESS")
+        .tableHasRowWithValues("Member", "Status", "Message", "member2", "ERROR",
+            " java.lang.RuntimeException: exception happened");
 
-    // addXmlEntity should be called once
-    verify(service).addXmlEntity(xmlEntity, null);
+    verify(service, times(1)).updateCacheConfig(any(), any());
   }
 
   @Test
-  public void command_succeeded_but_no_cluster_config_service() throws Exception {
+  public void command_succeeded_but_no_cluster_config_service() {
     doReturn(null).when(command).getConfigurationPersistenceService();
     doReturn(Collections.emptySet()).when(command).getMembers(any(), any());
 
     List<CliFunctionResult> functionResults = new ArrayList<>();
-    XmlEntity xmlEntity = mock(XmlEntity.class);
-    functionResults.add(new CliFunctionResult("member1", xmlEntity, "SUCCESS"));
+    functionResults.add(new CliFunctionResult("member1", StatusState.OK, "SUCCESS"));
     doReturn(functionResults).when(command).executeAndGetFunctionResult(isA(Function.class),
         isA(Object.class), isA(Set.class));
 
-    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess().hasFailToPersistError();
+    gfsh.executeAndAssertThat(command, MINIUM_COMMAND).statusIsSuccess()
+        .containsOutput(CommandExecutor.SERVICE_NOT_RUNNING_CHANGE_NOT_PERSISTED);
 
-    // addXmlEntity should not be called
-    verify(service, times(0)).addXmlEntity(xmlEntity, null);
+    verify(service, never()).updateCacheConfig(any(), any());
   }
 }

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