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 1ff5f2e  GEODE-6574: be able to list member information using cluster 
management service (#3380)
1ff5f2e is described below

commit 1ff5f2efadf63f5b220e56d6d8a8a6b3d503b263
Author: jinmeiliao <[email protected]>
AuthorDate: Tue Apr 2 08:36:14 2019 -0700

    GEODE-6574: be able to list member information using cluster management 
service (#3380)
    
    Co-authored-by: Jens Deppe <[email protected]>
    
    * create a MemberConfig object to hold all the essential member information.
    * added list(CacheElement elem) interface to cms.
    * added a result object in ClusterManagementResult
    * excluded jackson libraries in geode-web-management module so that jackson 
serialization would honor the annotations.
---
 .../rest/MemberManagementServiceDunitTest.java     |  88 ++++++++++++++++
 .../integrationTest/resources/assembly_content.txt |   8 +-
 geode-common/build.gradle                          |   1 +
 .../geode/util/internal/GeodeJsonMapper.java       |  23 ++--
 geode-common/src/test/resources/expected-pom.xml   |   7 ++
 .../cli/converters/PoolPropertyConverter.java      |   7 +-
 ...ClusterManagementServiceRetrievalDUnitTest.java |   2 +-
 .../RegionConfigMutatorIntegrationTest.java        |   4 +-
 .../distributed/internal/InternalLocator.java      |   2 +-
 .../api/LocatorClusterManagementService.java       |  44 +++++---
 .../cli/converters/ConfigPropertyConverter.java    |   7 +-
 .../cli/functions/DataCommandFunction.java         |   5 +-
 .../functions/GetMemberInformationFunction.java    |   9 +-
 ...ationMutator.java => ConfigurationManager.java} |   6 +-
 .../mutators/MemberConfigManager.java              | 116 +++++++++++++++++++++
 ...ConfigMutator.java => RegionConfigManager.java} |  15 ++-
 .../cache/configuration/RegionConfigTest.java      |   5 +-
 .../api/LocatorClusterManagementServiceTest.java   |  10 +-
 geode-management/build.gradle                      |   1 +
 .../geode/cache/configuration/CacheElement.java    |   3 +
 .../geode/cache/configuration/RegionConfig.java    |   8 +-
 .../management/api/ClusterManagementResult.java    |  14 +++
 .../management/api/ClusterManagementService.java   |   4 +-
 .../geode/management/api/RestfulEndpoint.java      |   3 +
 .../management/configuration/MemberConfig.java     |  95 +++++++++++++++++
 .../internal/ClientClusterManagementService.java   |  32 ++++--
 .../management/internal/cli/domain/ClassName.java  |   9 +-
 .../configuration/CacheElementJsonMappingTest.java |  88 ++++++++++++++++
 geode-web-management/build.gradle                  |  27 +++--
 .../ClientClusterManagementServiceDUnitTest.java   |  13 +--
 ....java => MemberManagementServiceDUnitTest.java} |  80 ++++++++++----
 .../controllers/MemberManagementController.java    |  67 ++++++++++++
 ...ntroller.java => PingManagementController.java} |  20 +---
 .../controllers/RegionManagementController.java    |   8 +-
 .../webapp/WEB-INF/geode-management-servlet.xml    |   1 +
 .../src/test/resources/expected-pom.xml            |  24 +----
 36 files changed, 708 insertions(+), 148 deletions(-)

diff --git 
a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceDunitTest.java
 
b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceDunitTest.java
new file mode 100644
index 0000000..d6a9f34
--- /dev/null
+++ 
b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceDunitTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional 
information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the 
License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software 
distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
+ * or implied. See the License for the specific language governing permissions 
and limitations under
+ * the License.
+ */
+
+package org.apache.geode.management.internal.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+
+import org.apache.geode.cache.configuration.CacheElement;
+import org.apache.geode.management.api.ClusterManagementResult;
+import org.apache.geode.management.api.ClusterManagementService;
+import org.apache.geode.management.client.ClusterManagementServiceProvider;
+import org.apache.geode.management.configuration.MemberConfig;
+import org.apache.geode.test.dunit.rules.ClusterStartupRule;
+import org.apache.geode.test.dunit.rules.MemberVM;
+
+public class MemberManagementServiceDunitTest {
+  @ClassRule
+  public static ClusterStartupRule cluster = new ClusterStartupRule(2);
+
+  private static MemberVM locator, server;
+  private static ClusterManagementService cmsClient;
+
+  @BeforeClass
+  public static void beforeClass() {
+    locator = cluster.startLocatorVM(0, l -> l.withHttpService());
+    server = cluster.startServerVM(1, locator.getPort());
+    cmsClient = ClusterManagementServiceProvider.getService("localhost", 
locator.getHttpPort());
+  }
+
+  @Test
+  public void listAllMembers() {
+    MemberConfig config = new MemberConfig();
+    ClusterManagementResult result = cmsClient.list(config);
+
+    assertThat(result.isSuccessful()).isTrue();
+    
assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
+    assertThat(result.getResult().size()).isEqualTo(2);
+
+    MemberConfig memberConfig =
+        (MemberConfig) CacheElement.findElement(result.getResult(), 
"locator-0");
+    assertThat(memberConfig.isCoordinator()).isTrue();
+    assertThat(memberConfig.isLocator()).isTrue();
+    assertThat(memberConfig.getPorts().get(0)).isEqualTo(locator.getPort());
+  }
+
+  @Test
+  public void listOneMember() throws Exception {
+    MemberConfig config = new MemberConfig();
+    config.setId("locator-0");
+
+    ClusterManagementResult result = cmsClient.list(config);
+    assertThat(result.isSuccessful()).isTrue();
+    
assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
+    assertThat(result.getResult().size()).isEqualTo(1);
+
+    MemberConfig memberConfig = (MemberConfig) result.getResult().get(0);
+    assertThat(memberConfig.isCoordinator()).isTrue();
+    assertThat(memberConfig.isLocator()).isTrue();
+    assertThat(memberConfig.getPorts().get(0)).isEqualTo(locator.getPort());
+  }
+
+  @Test
+  public void listNonExistentMember() throws Exception {
+    MemberConfig config = new MemberConfig();
+    config.setId("locator");
+    ClusterManagementResult result = cmsClient.list(config);
+    assertThat(result.isSuccessful()).isTrue();
+    assertThat(result.getStatusCode())
+        .isEqualTo(ClusterManagementResult.StatusCode.OK);
+    assertThat(result.getResult().size()).isEqualTo(0);
+  }
+}
diff --git a/geode-assembly/src/integrationTest/resources/assembly_content.txt 
b/geode-assembly/src/integrationTest/resources/assembly_content.txt
index 4b098d4..9b8a35f 100644
--- a/geode-assembly/src/integrationTest/resources/assembly_content.txt
+++ b/geode-assembly/src/integrationTest/resources/assembly_content.txt
@@ -705,6 +705,10 @@ 
javadoc/org/apache/geode/management/client/ClusterManagementServiceProvider.html
 javadoc/org/apache/geode/management/client/package-frame.html
 javadoc/org/apache/geode/management/client/package-summary.html
 javadoc/org/apache/geode/management/client/package-tree.html
+javadoc/org/apache/geode/management/configuration/MemberConfig.html
+javadoc/org/apache/geode/management/configuration/package-frame.html
+javadoc/org/apache/geode/management/configuration/package-summary.html
+javadoc/org/apache/geode/management/configuration/package-tree.html
 javadoc/org/apache/geode/management/membership/ClientMembership.html
 javadoc/org/apache/geode/management/membership/ClientMembershipEvent.html
 javadoc/org/apache/geode/management/membership/ClientMembershipListener.html
@@ -904,13 +908,13 @@ lib/geode-cq-0.0.0.jar
 lib/geode-dependencies.jar
 lib/geode-jca-0.0.0.rar
 lib/geode-lucene-0.0.0.jar
-lib/geode-redis-0.0.0.jar
-lib/geode-memcached-0.0.0.jar
 lib/geode-management-0.0.0.jar
+lib/geode-memcached-0.0.0.jar
 lib/geode-old-client-support-0.0.0.jar
 lib/geode-protobuf-0.0.0.jar
 lib/geode-protobuf-messages-0.0.0.jar
 lib/geode-rebalancer-0.0.0.jar
+lib/geode-redis-0.0.0.jar
 lib/geode-wan-0.0.0.jar
 lib/gfsh-dependencies.jar
 lib/grumpy-core-0.2.2.jar
diff --git a/geode-common/build.gradle b/geode-common/build.gradle
index 6a2ed39..9bf17b1 100755
--- a/geode-common/build.gradle
+++ b/geode-common/build.gradle
@@ -19,6 +19,7 @@ apply from: "${project.projectDir}/../gradle/publish.gradle"
 
 dependencies {
   compile(platform(project(':boms:geode-all-bom')))
+  compile('com.fasterxml.jackson.core:jackson-databind')
   testCompile('junit:junit')
   testCompile('org.assertj:assertj-core')
 }
diff --git 
a/geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java
 
b/geode-common/src/main/java/org/apache/geode/util/internal/GeodeJsonMapper.java
similarity index 52%
copy from 
geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java
copy to 
geode-common/src/main/java/org/apache/geode/util/internal/GeodeJsonMapper.java
index 591c399..7fd8f91 100644
--- 
a/geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java
+++ 
b/geode-common/src/main/java/org/apache/geode/util/internal/GeodeJsonMapper.java
@@ -13,14 +13,25 @@
  * the License.
  */
 
-package org.apache.geode.management.api;
+package org.apache.geode.util.internal;
 
-public interface RestfulEndpoint {
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * helper class for creating various json mappers used by Geode Project
+ */
+public class GeodeJsonMapper {
 
   /**
-   * this needs to return the uri portion after the /geode-management/v2
-   *
-   * @return e.g. /regions
+   * @return a jackson json mapper that allows single quotes and is able to 
deserialize json
+   *         string without @JsonTypeInfo if base class is a concrete 
implementation.
    */
-  String getEndpoint();
+  public static ObjectMapper getMapper() {
+    ObjectMapper mapper = new ObjectMapper();
+    mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
+    mapper.configure(MapperFeature.USE_BASE_TYPE_AS_DEFAULT_IMPL, true);
+    return mapper;
+  }
 }
diff --git a/geode-common/src/test/resources/expected-pom.xml 
b/geode-common/src/test/resources/expected-pom.xml
index 0012117..259eb66 100644
--- a/geode-common/src/test/resources/expected-pom.xml
+++ b/geode-common/src/test/resources/expected-pom.xml
@@ -45,4 +45,11 @@
       </dependency>
     </dependencies>
   </dependencyManagement>
+  <dependencies>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <scope>compile</scope>
+    </dependency>
+  </dependencies>
 </project>
diff --git 
a/geode-connectors/src/main/java/org/apache/geode/management/internal/cli/converters/PoolPropertyConverter.java
 
b/geode-connectors/src/main/java/org/apache/geode/management/internal/cli/converters/PoolPropertyConverter.java
index d99709c..6127a18 100644
--- 
a/geode-connectors/src/main/java/org/apache/geode/management/internal/cli/converters/PoolPropertyConverter.java
+++ 
b/geode-connectors/src/main/java/org/apache/geode/management/internal/cli/converters/PoolPropertyConverter.java
@@ -17,13 +17,13 @@ package org.apache.geode.management.internal.cli.converters;
 import java.io.IOException;
 import java.util.List;
 
-import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.shell.core.Completion;
 import org.springframework.shell.core.Converter;
 import org.springframework.shell.core.MethodTarget;
 
 import org.apache.geode.connectors.jdbc.internal.cli.CreateDataSourceCommand;
+import org.apache.geode.util.internal.GeodeJsonMapper;
 
 /***
  * Converter for CreateDataSourceCommand's --pool-properties option.
@@ -32,10 +32,7 @@ import 
org.apache.geode.connectors.jdbc.internal.cli.CreateDataSourceCommand;
 public class PoolPropertyConverter
     implements Converter<CreateDataSourceCommand.PoolProperty> {
 
-  private static final ObjectMapper mapper = new ObjectMapper();
-  static {
-    mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
-  }
+  private static final ObjectMapper mapper = GeodeJsonMapper.getMapper();
 
   @Override
   public boolean supports(Class<?> type, String optionContext) {
diff --git 
a/geode-core/src/distributedTest/java/org/apache/geode/management/api/ClusterManagementServiceRetrievalDUnitTest.java
 
b/geode-core/src/distributedTest/java/org/apache/geode/management/api/ClusterManagementServiceRetrievalDUnitTest.java
index f34f857..2deaabc 100644
--- 
a/geode-core/src/distributedTest/java/org/apache/geode/management/api/ClusterManagementServiceRetrievalDUnitTest.java
+++ 
b/geode-core/src/distributedTest/java/org/apache/geode/management/api/ClusterManagementServiceRetrievalDUnitTest.java
@@ -41,7 +41,7 @@ public class ClusterManagementServiceRetrievalDUnitTest {
     server1 = cluster.startServerVM(1, locator.getPort());
 
     final String url =
-        String.format("http://localhost:%d/geode-management/v2";, 
locator.getHttpPort());
+        String.format("http://localhost:%d/geode-management";, 
locator.getHttpPort());
     server1.invoke(() -> {
       ClientClusterManagementService cms =
           (ClientClusterManagementService) 
ClusterManagementServiceProvider.getService();
diff --git 
a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutatorIntegrationTest.java
 
b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutatorIntegrationTest.java
index 5a599bb..d7068a3 100644
--- 
a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutatorIntegrationTest.java
+++ 
b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutatorIntegrationTest.java
@@ -31,13 +31,13 @@ public class RegionConfigMutatorIntegrationTest {
   @Rule
   public LocatorStarterRule locator = new LocatorStarterRule().withAutoStart();
 
-  private RegionConfigMutator mutator;
+  private RegionConfigManager mutator;
   private RegionConfig config;
 
   @Before
   public void before() throws Exception {
     config = new RegionConfig();
-    mutator = new RegionConfigMutator();
+    mutator = new RegionConfigManager();
   }
 
   @Test
diff --git 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
index 46b80d5..127a264 100644
--- 
a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
+++ 
b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
@@ -691,7 +691,7 @@ public class InternalLocator extends Locator implements 
ConnectListener, LogConf
     }
 
     clusterManagementService =
-        new 
LocatorClusterManagementService(locator.myCache.getDistributionManager(),
+        new LocatorClusterManagementService(locator.myCache,
             locator.configurationPersistenceService);
 
     // start management rest service
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java
index d9abc02..511cc3f 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java
@@ -33,42 +33,45 @@ import org.apache.geode.cache.execute.Function;
 import org.apache.geode.cache.execute.ResultCollector;
 import org.apache.geode.distributed.ConfigurationPersistenceService;
 import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.DistributionManager;
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
+import org.apache.geode.management.configuration.MemberConfig;
 import org.apache.geode.management.internal.cli.CliUtil;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.UpdateCacheFunction;
-import 
org.apache.geode.management.internal.configuration.mutators.ConfigurationMutator;
-import 
org.apache.geode.management.internal.configuration.mutators.RegionConfigMutator;
+import 
org.apache.geode.management.internal.configuration.mutators.ConfigurationManager;
+import 
org.apache.geode.management.internal.configuration.mutators.MemberConfigManager;
+import 
org.apache.geode.management.internal.configuration.mutators.RegionConfigManager;
 import 
org.apache.geode.management.internal.configuration.validators.ConfigurationValidator;
 import 
org.apache.geode.management.internal.configuration.validators.RegionConfigValidator;
 import org.apache.geode.management.internal.exceptions.EntityExistsException;
 
 public class LocatorClusterManagementService implements 
ClusterManagementService {
   private static final Logger logger = LogService.getLogger();
-  private DistributionManager distributionManager;
+  private InternalCache cache;
   private ConfigurationPersistenceService persistenceService;
-  private HashMap<Class, ConfigurationMutator> mutators;
+  private HashMap<Class, ConfigurationManager> managers;
   private HashMap<Class, ConfigurationValidator> validators;
 
-  public LocatorClusterManagementService(DistributionManager 
distributionManager,
+  public LocatorClusterManagementService(InternalCache cache,
       ConfigurationPersistenceService persistenceService) {
-    this(distributionManager, persistenceService, new HashMap(), new 
HashMap());
-    // initialize the list of mutators
-    mutators.put(RegionConfig.class, new RegionConfigMutator());
+    this(cache, persistenceService, new HashMap(), new HashMap());
+    // initialize the list of managers
+    managers.put(RegionConfig.class, new RegionConfigManager());
+    managers.put(MemberConfig.class, new MemberConfigManager(cache));
 
     // initialize the list of validators
     validators.put(RegionConfig.class, new RegionConfigValidator());
   }
 
   @VisibleForTesting
-  public LocatorClusterManagementService(DistributionManager 
distributionManager,
-      ConfigurationPersistenceService persistenceService, HashMap mutators, 
HashMap validators) {
-    this.distributionManager = distributionManager;
+  public LocatorClusterManagementService(InternalCache cache,
+      ConfigurationPersistenceService persistenceService, HashMap managers, 
HashMap validators) {
+    this.cache = cache;
     this.persistenceService = persistenceService;
-    this.mutators = mutators;
+    this.managers = managers;
     this.validators = validators;
   }
 
@@ -84,7 +87,7 @@ public class LocatorClusterManagementService implements 
ClusterManagementService
     }
 
     ClusterManagementResult result = new ClusterManagementResult();
-    ConfigurationMutator configurationMutator = 
mutators.get(config.getClass());
+    ConfigurationManager configurationMutator = 
managers.get(config.getClass());
 
     ConfigurationValidator validator = validators.get(config.getClass());
     if (validator != null) {
@@ -148,13 +151,24 @@ public class LocatorClusterManagementService implements 
ClusterManagementService
   }
 
   @Override
+  public ClusterManagementResult list(CacheElement filter) {
+    ConfigurationManager manager = managers.get(filter.getClass());
+    List<CacheElement> listResults = manager.list(filter, null);
+
+    ClusterManagementResult result = new ClusterManagementResult();
+    result.setResult(listResults);
+
+    return result;
+  }
+
+  @Override
   public boolean isConnected() {
     return true;
   }
 
   @VisibleForTesting
   Set<DistributedMember> findMembers(String[] groups, String[] members) {
-    return CliUtil.findMembers(groups, members, distributionManager);
+    return CliUtil.findMembers(groups, members, cache);
   }
 
   @VisibleForTesting
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverter.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverter.java
index 8a17f3c..adff1ea 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverter.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/converters/ConfigPropertyConverter.java
@@ -17,7 +17,6 @@ package org.apache.geode.management.internal.cli.converters;
 import java.io.IOException;
 import java.util.List;
 
-import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.shell.core.Completion;
 import org.springframework.shell.core.Converter;
@@ -25,6 +24,7 @@ import org.springframework.shell.core.MethodTarget;
 
 import org.apache.geode.annotations.Immutable;
 import org.apache.geode.cache.configuration.JndiBindingsType;
+import org.apache.geode.util.internal.GeodeJsonMapper;
 
 /***
  * Added converter to enable auto-completion for index-type
@@ -34,10 +34,7 @@ public class ConfigPropertyConverter
     implements Converter<JndiBindingsType.JndiBinding.ConfigProperty> {
 
   @Immutable
-  private static final ObjectMapper mapper = new ObjectMapper();
-  static {
-    mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
-  }
+  private static final ObjectMapper mapper = GeodeJsonMapper.getMapper();
 
   @Override
   public boolean supports(Class<?> type, String optionContext) {
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DataCommandFunction.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DataCommandFunction.java
index 3da2b6a..95c4caa 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DataCommandFunction.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/DataCommandFunction.java
@@ -22,7 +22,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.lang3.StringUtils;
@@ -59,6 +58,7 @@ import 
org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.util.JsonUtil;
 import org.apache.geode.pdx.JSONFormatter;
 import org.apache.geode.pdx.PdxInstance;
+import org.apache.geode.util.internal.GeodeJsonMapper;
 
 /**
  * @since GemFire 7.0
@@ -586,8 +586,7 @@ public class DataCommandFunction implements 
InternalFunction {
 
     Object resultObject;
     try {
-      ObjectMapper mapper = new ObjectMapper();
-      mapper.enable(JsonParser.Feature.ALLOW_SINGLE_QUOTES);
+      ObjectMapper mapper = GeodeJsonMapper.getMapper();
       resultObject = mapper.readValue(string, klass);
     } catch (IOException e) {
       throw new IllegalArgumentException(
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GetMemberInformationFunction.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GetMemberInformationFunction.java
index f0c3562..18457ad 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GetMemberInformationFunction.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GetMemberInformationFunction.java
@@ -30,6 +30,7 @@ import org.apache.geode.cache.server.CacheServer;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.InternalLocator;
 import org.apache.geode.internal.admin.SSLConfig;
 import org.apache.geode.internal.cache.CacheClientStatus;
 import org.apache.geode.internal.cache.InternalCache;
@@ -118,7 +119,7 @@ public class GetMemberInformationFunction implements 
InternalFunction {
       List<CacheServer> csList = cache.getCacheServers();
 
       // A member is a server only if it has a cacheserver
-      if (csList != null) {
+      if (csList != null && !csList.isEmpty()) {
         memberInfo.setServer(true);
         Iterator<CacheServer> iters = csList.iterator();
         while (iters.hasNext()) {
@@ -143,6 +144,10 @@ public class GetMemberInformationFunction implements 
InternalFunction {
         memberInfo.setClientCount(numConnections);
       } else {
         memberInfo.setServer(false);
+        InternalLocator locator = InternalLocator.getLocator();
+        if (locator != null) {
+          memberInfo.setLocatorPort(locator.getPort());
+        }
       }
       functionContext.getResultSender().lastResult(memberInfo);
     } catch (CacheClosedException e) {
@@ -152,6 +157,8 @@ public class GetMemberInformationFunction implements 
InternalFunction {
     }
   }
 
+
+
   private long bytesToMeg(long bytes) {
     return bytes / (1024L * 1024L);
   }
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/ConfigurationMutator.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/ConfigurationManager.java
similarity index 91%
rename from 
geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/ConfigurationMutator.java
rename to 
geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/ConfigurationManager.java
index 5f68d45..c3c1105 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/ConfigurationMutator.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/ConfigurationManager.java
@@ -17,6 +17,8 @@
 
 package org.apache.geode.management.internal.configuration.mutators;
 
+import java.util.List;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.cache.configuration.CacheElement;
@@ -28,10 +30,12 @@ import org.apache.geode.cache.configuration.CacheElement;
  * type {@link CacheElement}, which represents the configuration change.
  */
 @Experimental
-public interface ConfigurationMutator<T extends CacheElement> {
+public interface ConfigurationManager<T extends CacheElement> {
   void add(T config, CacheConfig existing);
 
   void update(T config, CacheConfig existing);
 
   void delete(T config, CacheConfig existing);
+
+  List<T> list(T filterConfig, CacheConfig existing);
 }
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/MemberConfigManager.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/MemberConfigManager.java
new file mode 100644
index 0000000..3cbf533
--- /dev/null
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/MemberConfigManager.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional 
information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the 
License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software 
distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
+ * or implied. See the License for the specific language governing permissions 
and limitations under
+ * the License.
+ */
+
+package org.apache.geode.management.internal.configuration.mutators;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.NotImplementedException;
+
+import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.execute.Execution;
+import org.apache.geode.cache.execute.FunctionService;
+import org.apache.geode.cache.execute.ResultCollector;
+import org.apache.geode.distributed.DistributedMember;
+import org.apache.geode.distributed.internal.membership.MembershipManager;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.management.configuration.MemberConfig;
+import org.apache.geode.management.internal.cli.domain.CacheServerInfo;
+import org.apache.geode.management.internal.cli.domain.MemberInformation;
+import 
org.apache.geode.management.internal.cli.functions.GetMemberInformationFunction;
+
+public class MemberConfigManager implements ConfigurationManager<MemberConfig> 
{
+
+  private InternalCache cache;
+
+  public MemberConfigManager(InternalCache cache) {
+    this.cache = cache;
+  }
+
+  @Override
+  public void add(MemberConfig config, CacheConfig existing) {
+    throw new NotImplementedException("Not implemented");
+  }
+
+  @Override
+  public void update(MemberConfig config, CacheConfig existing) {
+    throw new NotImplementedException("Not implemented");
+  }
+
+  @Override
+  public void delete(MemberConfig config, CacheConfig existing) {
+    throw new NotImplementedException("Not implemented");
+  }
+
+  @Override
+  public List<MemberConfig> list(MemberConfig filter, CacheConfig existing) {
+    String coordinatorId = null;
+    List<MemberConfig> results = new ArrayList<>();
+
+    Set<DistributedMember> members = 
cache.getDistributionManager().getDistributionManagerIds()
+        .stream().filter(m -> (filter.getId() == null || 
filter.getId().equals(m.getName())))
+        .map(DistributedMember.class::cast).collect(Collectors.toSet());
+
+    if (members.size() == 0) {
+      return results;
+    }
+
+    for (DistributedMember member : members) {
+      if (member == getCoordinator()) {
+        coordinatorId = member.getId();
+      }
+    }
+
+    Execution execution = FunctionService.onMembers(members);
+    ResultCollector<?, ?> rc = execution.execute(new 
GetMemberInformationFunction());
+
+    ArrayList<MemberInformation> output = (ArrayList<MemberInformation>) 
rc.getResult();
+
+
+    for (MemberInformation mInfo : output) {
+      MemberConfig member = new MemberConfig();
+      member.setId(mInfo.getName());
+      member.setHost(mInfo.getHost());
+      member.setPid(mInfo.getProcessId());
+
+      if (mInfo.isServer() && mInfo.getCacheServeInfo() != null) {
+        
member.setPorts(mInfo.getCacheServeInfo().stream().map(CacheServerInfo::getPort)
+            .collect(Collectors.toList()));
+        member.setLocator(false);
+      } else {
+        member.setPorts(Arrays.asList(mInfo.getLocatorPort()));
+        member.setLocator(true);
+      }
+
+      member.setCoordinator(mInfo.getId().equals(coordinatorId));
+      results.add(member);
+    }
+
+    return results;
+  }
+
+  private DistributedMember getCoordinator() {
+    MembershipManager mmgr = 
cache.getDistributionManager().getMembershipManager();
+    if (mmgr == null) {
+      return null;
+    }
+
+    return mmgr.getCoordinator();
+  }
+}
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutator.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManager.java
similarity index 74%
rename from 
geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutator.java
rename to 
geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManager.java
index c964164..cc34220 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutator.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManager.java
@@ -17,12 +17,16 @@
 
 package org.apache.geode.management.internal.configuration.mutators;
 
+import java.util.List;
+
+import org.apache.commons.lang3.NotImplementedException;
+
 import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.cache.configuration.RegionConfig;
 
-public class RegionConfigMutator implements ConfigurationMutator<RegionConfig> 
{
+public class RegionConfigManager implements ConfigurationManager<RegionConfig> 
{
 
-  public RegionConfigMutator() {}
+  public RegionConfigManager() {}
 
   @Override
   public void add(RegionConfig configElement, CacheConfig existingConfig) {
@@ -31,11 +35,16 @@ public class RegionConfigMutator implements 
ConfigurationMutator<RegionConfig> {
 
   @Override
   public void update(RegionConfig config, CacheConfig existing) {
-
+    throw new NotImplementedException("Not implemented yet");
   }
 
   @Override
   public void delete(RegionConfig config, CacheConfig existing) {
+    throw new NotImplementedException("Not implemented yet");
+  }
 
+  @Override
+  public List<RegionConfig> list(RegionConfig config, CacheConfig existing) {
+    throw new NotImplementedException("Not implemented yet");
   }
 }
diff --git 
a/geode-core/src/test/java/org/apache/geode/cache/configuration/RegionConfigTest.java
 
b/geode-core/src/test/java/org/apache/geode/cache/configuration/RegionConfigTest.java
index fa7e298..62dd8c3 100644
--- 
a/geode-core/src/test/java/org/apache/geode/cache/configuration/RegionConfigTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/cache/configuration/RegionConfigTest.java
@@ -27,6 +27,7 @@ import org.junit.Test;
 
 import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.internal.config.JAXBService;
+import org.apache.geode.util.internal.GeodeJsonMapper;
 
 public class RegionConfigTest {
 
@@ -76,14 +77,14 @@ public class RegionConfigTest {
   @Test
   public void correctJsonAndXml() throws Exception {
     String json = "{\"name\":\"test\", \"type\":\"REPLICATE\"}";
-    ObjectMapper mapper = new ObjectMapper();
+    ObjectMapper mapper = GeodeJsonMapper.getMapper();
     regionConfig = mapper.readValue(json, RegionConfig.class);
     assertThat(regionConfig.getName()).isEqualTo("test");
     assertThat(regionConfig.getType()).isEqualTo("REPLICATE");
 
     String json2 = mapper.writeValueAsString(regionConfig);
     assertThat(json2).contains("\"type\":\"REPLICATE\"");
-    assertThat(json2).contains("\"id\":\"test\"");
+    assertThat(json2).contains("\"name\":\"test\"");
 
     CacheConfig cacheConfig = new CacheConfig();
     cacheConfig.getRegions().add(regionConfig);
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java
index 5b8755d..2aaf71e 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java
@@ -34,7 +34,7 @@ import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.distributed.ConfigurationPersistenceService;
 import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.DistributionManager;
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.exceptions.EntityExistsException;
@@ -42,22 +42,22 @@ import 
org.apache.geode.management.internal.exceptions.EntityExistsException;
 public class LocatorClusterManagementServiceTest {
 
   private LocatorClusterManagementService service;
-  private DistributionManager distributionManager;
+  private InternalCache cache;
   private ConfigurationPersistenceService persistenceService;
   private RegionConfig regionConfig;
   private ClusterManagementResult result;
 
   @Before
   public void before() throws Exception {
-    distributionManager = mock(DistributionManager.class);
+    cache = mock(InternalCache.class);
     persistenceService = mock(ConfigurationPersistenceService.class);
-    service = spy(new LocatorClusterManagementService(distributionManager, 
persistenceService));
+    service = spy(new LocatorClusterManagementService(cache, 
persistenceService));
     regionConfig = new RegionConfig();
   }
 
   @Test
   public void persistenceIsNull() throws Exception {
-    service = new LocatorClusterManagementService(distributionManager, null);
+    service = new LocatorClusterManagementService(cache, null);
     result = service.create(regionConfig, "cluster");
     assertThat(result.isSuccessful()).isFalse();
     assertThat(result.getStatusMessage())
diff --git a/geode-management/build.gradle b/geode-management/build.gradle
index a30d1df..fede2f3 100755
--- a/geode-management/build.gradle
+++ b/geode-management/build.gradle
@@ -32,6 +32,7 @@ dependencies {
     exclude module: 'junit'
   }
 
+  testCompile(project(':geode-common'))
   testCompile(project(':geode-junit')) {
     exclude module: 'geode-core'
   }
diff --git 
a/geode-management/src/main/java/org/apache/geode/cache/configuration/CacheElement.java
 
b/geode-management/src/main/java/org/apache/geode/cache/configuration/CacheElement.java
index 070a4d2..6ab7173 100644
--- 
a/geode-management/src/main/java/org/apache/geode/cache/configuration/CacheElement.java
+++ 
b/geode-management/src/main/java/org/apache/geode/cache/configuration/CacheElement.java
@@ -20,10 +20,13 @@ package org.apache.geode.cache.configuration;
 import java.io.Serializable;
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.lang.Identifiable;
 
 @Experimental
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class")
 public interface CacheElement extends Identifiable<String>, Serializable {
 
   static <T extends CacheElement> boolean exists(List<T> list, String id) {
diff --git 
a/geode-management/src/main/java/org/apache/geode/cache/configuration/RegionConfig.java
 
b/geode-management/src/main/java/org/apache/geode/cache/configuration/RegionConfig.java
index fb6e831..43ea718 100644
--- 
a/geode-management/src/main/java/org/apache/geode/cache/configuration/RegionConfig.java
+++ 
b/geode-management/src/main/java/org/apache/geode/cache/configuration/RegionConfig.java
@@ -29,6 +29,8 @@ import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlType;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.management.api.RestfulEndpoint;
@@ -152,6 +154,9 @@ import org.apache.geode.management.api.RestfulEndpoint;
     propOrder = {"regionAttributes", "indexes", "entries", "regionElements", 
"regions"})
 @Experimental
 public class RegionConfig implements CacheElement, RestfulEndpoint {
+
+  public static final String REGION_CONFIG_ENDPOINT = "/regions";
+
   @XmlElement(name = "region-attributes", namespace = 
"http://geode.apache.org/schema/cache";)
   protected RegionAttributesType regionAttributes;
   @XmlElement(name = "index", namespace = 
"http://geode.apache.org/schema/cache";)
@@ -176,7 +181,7 @@ public class RegionConfig implements CacheElement, 
RestfulEndpoint {
 
   @Override
   public String getEndpoint() {
-    return "/regions";
+    return REGION_CONFIG_ENDPOINT;
   }
 
   public RegionAttributesType getRegionAttributes() {
@@ -504,6 +509,7 @@ public class RegionConfig implements CacheElement, 
RestfulEndpoint {
   }
 
   @Override
+  @JsonIgnore
   public String getId() {
     return getName();
   }
diff --git 
a/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementResult.java
 
b/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementResult.java
index 92e18a1..2f61e8d 100644
--- 
a/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementResult.java
+++ 
b/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementResult.java
@@ -14,11 +14,15 @@
  */
 package org.apache.geode.management.api;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 
+import org.apache.geode.cache.configuration.CacheElement;
+
 
 public class ClusterManagementResult {
   // this error code should include a one-to-one mapping to the http status 
code returned
@@ -54,6 +58,8 @@ public class ClusterManagementResult {
   private StatusCode statusCode = StatusCode.OK;
   private String statusMessage;
 
+  private List<CacheElement> result = new ArrayList<>();
+
   public ClusterManagementResult() {}
 
   public ClusterManagementResult(boolean success, String message) {
@@ -101,4 +107,12 @@ public class ClusterManagementResult {
   public StatusCode getStatusCode() {
     return statusCode;
   }
+
+  public List<CacheElement> getResult() {
+    return result;
+  }
+
+  public void setResult(List<CacheElement> result) {
+    this.result = result;
+  }
 }
diff --git 
a/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementService.java
 
b/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementService.java
index d6f8ffa..053fd62 100644
--- 
a/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementService.java
+++ 
b/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementService.java
@@ -74,8 +74,10 @@ public interface ClusterManagementService {
     return update(config, null);
   }
 
+  ClusterManagementResult list(CacheElement config);
+
   /**
-   * Test to see if this instance of ClsuterManagmentService retrieved from 
the client side is
+   * Test to see if this instance of ClusterManagementService retrieved from 
the client side is
    * properly connected to the locator or not
    *
    * @return true if connected
diff --git 
a/geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java
 
b/geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java
index 591c399..fb01e2c 100644
--- 
a/geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java
+++ 
b/geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java
@@ -15,6 +15,8 @@
 
 package org.apache.geode.management.api;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 public interface RestfulEndpoint {
 
   /**
@@ -22,5 +24,6 @@ public interface RestfulEndpoint {
    *
    * @return e.g. /regions
    */
+  @JsonIgnore
   String getEndpoint();
 }
diff --git 
a/geode-management/src/main/java/org/apache/geode/management/configuration/MemberConfig.java
 
b/geode-management/src/main/java/org/apache/geode/management/configuration/MemberConfig.java
new file mode 100644
index 0000000..174d79a
--- /dev/null
+++ 
b/geode-management/src/main/java/org/apache/geode/management/configuration/MemberConfig.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional 
information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the 
License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software 
distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
+ * or implied. See the License for the specific language governing permissions 
and limitations under
+ * the License.
+ */
+
+package org.apache.geode.management.configuration;
+
+import java.util.List;
+
+import org.apache.geode.annotations.Experimental;
+import org.apache.geode.cache.configuration.CacheElement;
+import org.apache.geode.management.api.RestfulEndpoint;
+
+@Experimental
+public class MemberConfig implements CacheElement, RestfulEndpoint {
+
+  private static final long serialVersionUID = -6262538068604902018L;
+
+  public static final String MEMBER_CONFIG_ENDPOINT = "/members";
+
+  private boolean isLocator;
+  private boolean isCoordinator;
+  private String id;
+  private String host;
+  private String pid;
+  private List<Integer> ports;
+
+  public MemberConfig() {
+
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public boolean isLocator() {
+    return isLocator;
+  }
+
+  public void setLocator(boolean locator) {
+    isLocator = locator;
+  }
+
+  public boolean isCoordinator() {
+    return isCoordinator;
+  }
+
+  public void setCoordinator(boolean coordinator) {
+    isCoordinator = coordinator;
+  }
+
+  public String getHost() {
+    return host;
+  }
+
+  public void setHost(String host) {
+    this.host = host;
+  }
+
+  public String getPid() {
+    return pid;
+  }
+
+  public void setPid(String pid) {
+    this.pid = pid;
+  }
+
+  public List<Integer> getPorts() {
+    return ports;
+  }
+
+  public void setPorts(List<Integer> port) {
+    this.ports = port;
+  }
+
+  @Override
+  public String getEndpoint() {
+    return MEMBER_CONFIG_ENDPOINT;
+  }
+
+  @Override
+  public String getId() {
+    return id;
+  }
+}
diff --git 
a/geode-management/src/main/java/org/apache/geode/management/internal/ClientClusterManagementService.java
 
b/geode-management/src/main/java/org/apache/geode/management/internal/ClientClusterManagementService.java
index f3d7cff..26592f0 100644
--- 
a/geode-management/src/main/java/org/apache/geode/management/internal/ClientClusterManagementService.java
+++ 
b/geode-management/src/main/java/org/apache/geode/management/internal/ClientClusterManagementService.java
@@ -15,6 +15,7 @@
 
 package org.apache.geode.management.internal;
 
+
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.SSLContext;
 
@@ -24,8 +25,6 @@ import org.apache.http.auth.UsernamePasswordCredentials;
 import org.apache.http.client.CredentialsProvider;
 import org.apache.http.impl.client.BasicCredentialsProvider;
 import org.apache.http.impl.client.HttpClientBuilder;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
 import org.springframework.http.client.ClientHttpRequestFactory;
 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
 import org.springframework.web.client.ResponseErrorHandler;
@@ -58,6 +57,8 @@ public class ClientClusterManagementService implements 
ClusterManagementService
   private static final ResponseErrorHandler DEFAULT_ERROR_HANDLER =
       new RestTemplateResponseErrorHandler();
 
+  private static final String VERSION = "/v2";
+
   private final RestTemplate restTemplate;
 
   private ClientClusterManagementService() {
@@ -75,7 +76,7 @@ public class ClientClusterManagementService implements 
ClusterManagementService
 
     DefaultUriTemplateHandler templateHandler = new 
DefaultUriTemplateHandler();
     String schema = (sslContext == null) ? "http" : "https";
-    templateHandler.setBaseUrl(schema + "://" + host + ":" + port + 
"/geode-management/v2");
+    templateHandler.setBaseUrl(schema + "://" + host + ":" + port + 
"/geode-management");
     restTemplate.setUriTemplateHandler(templateHandler);
 
     // HttpComponentsClientHttpRequestFactory allows use to preconfigure 
httpClient for
@@ -107,10 +108,9 @@ public class ClientClusterManagementService implements 
ClusterManagementService
   @Override
   public ClusterManagementResult create(CacheElement config, String group) {
     String endPoint = getEndpoint(config);
-    HttpHeaders headers = new HttpHeaders();
-    headers.setContentType(MediaType.APPLICATION_JSON);
     // the response status code info is represented by the 
ClusterManagementResult.errorCode already
-    return restTemplate.postForObject(endPoint, config, 
ClusterManagementResult.class);
+    return restTemplate.postForEntity(VERSION + endPoint, config, 
ClusterManagementResult.class)
+        .getBody();
   }
 
   @Override
@@ -123,6 +123,23 @@ public class ClientClusterManagementService implements 
ClusterManagementService
     throw new NotImplementedException("Not Implemented");
   }
 
+  @Override
+  public ClusterManagementResult list(CacheElement config) {
+    String endPoint = getEndpoint(config);
+    String id = config.getId();
+
+    // return restTemplate
+    // .getForEntity(VERSION + endPoint + ((id == null) ? "" : "/{id}"),
+    // ClusterManagementResult.class, id)
+    // .getBody();
+
+    return restTemplate
+        .getForEntity(VERSION + endPoint + ((id == null) ? "" : "/?id=" + id),
+            ClusterManagementResult.class)
+        .getBody();
+
+  }
+
   public RestTemplate getRestTemplate() {
     return restTemplate;
   }
@@ -138,7 +155,8 @@ public class ClientClusterManagementService implements 
ClusterManagementService
   }
 
   public boolean isConnected() {
-    return restTemplate.getForObject("/ping", String.class).equals("pong");
+    return restTemplate.getForEntity(VERSION + "/ping", String.class)
+        .getBody().equals("pong");
   }
 
 }
diff --git 
a/geode-management/src/main/java/org/apache/geode/management/internal/cli/domain/ClassName.java
 
b/geode-management/src/main/java/org/apache/geode/management/internal/cli/domain/ClassName.java
index 362a4ce..8510c81 100644
--- 
a/geode-management/src/main/java/org/apache/geode/management/internal/cli/domain/ClassName.java
+++ 
b/geode-management/src/main/java/org/apache/geode/management/internal/cli/domain/ClassName.java
@@ -21,10 +21,11 @@ import java.util.Objects;
 import java.util.Properties;
 import java.util.regex.Pattern;
 
-import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.lang3.StringUtils;
 
+import org.apache.geode.util.internal.GeodeJsonMapper;
+
 /**
  * This is mostly used for Gfsh command options that need to specify a 
className for instantiation.
  *
@@ -35,11 +36,7 @@ public class ClassName<T> implements Serializable {
 
   private String className = "";
   private Properties initProperties = new Properties();
-  private static ObjectMapper mapper = new ObjectMapper();
-
-  static {
-    mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
-  }
+  private static ObjectMapper mapper = GeodeJsonMapper.getMapper();
 
   // used to remove a Declarable through gfsh command
   // e.g. alter region --name=regionA --cache-loader=''
diff --git 
a/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementJsonMappingTest.java
 
b/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementJsonMappingTest.java
new file mode 100644
index 0000000..297fd47
--- /dev/null
+++ 
b/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementJsonMappingTest.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional 
information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the 
License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software 
distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
+ * or implied. See the License for the specific language governing permissions 
and limitations under
+ * the License.
+ */
+
+package org.apache.geode.cache.configuration;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.geode.management.api.ClusterManagementResult;
+import org.apache.geode.management.configuration.MemberConfig;
+import org.apache.geode.util.internal.GeodeJsonMapper;
+
+public class CacheElementJsonMappingTest {
+  private static ObjectMapper mapper = GeodeJsonMapper.getMapper();
+
+  private static MemberConfig member;
+  private static RegionConfig region;
+
+  @BeforeClass
+  public static void beforeClass() throws Exception {
+    member = new MemberConfig();
+    member.setId("server");
+    member.setPid("123");
+
+    region = new RegionConfig();
+    region.setName("test");
+  }
+
+  @Test
+  public void serializeRegion() throws Exception {
+    String json = mapper.writeValueAsString(region);
+    System.out.println(json);
+    assertThat(json).contains("class").contains("\"name\":\"test\"");
+
+    RegionConfig config = mapper.readValue(json, RegionConfig.class);
+    assertThat(config.getName()).isEqualTo(region.getName());
+  }
+
+  @Test
+  public void serializeMember() throws Exception {
+    String json = mapper.writeValueAsString(member);
+    System.out.println(json);
+    assertThat(json).contains("class").contains("\"id\":\"server\"");
+
+    MemberConfig config = mapper.readValue(json, MemberConfig.class);
+    assertThat(config.getId()).isEqualTo(member.getId());
+  }
+
+  @Test
+  public void serializeResult() throws Exception {
+    ClusterManagementResult result = new ClusterManagementResult();
+    List<CacheElement> elements = new ArrayList<>();
+    elements.add(region);
+    elements.add(member);
+    result.setResult(elements);
+
+    String json = mapper.writeValueAsString(result);
+    System.out.println(json);
+
+    ClusterManagementResult result1 = mapper.readValue(json, 
ClusterManagementResult.class);
+    assertThat(result1.getResult()).hasSize(2);
+  }
+
+  @Test
+  public void deserializeWithoutTypeInfo() throws Exception {
+    String json = "{'name':'test'}";
+    RegionConfig config = mapper.readValue(json, RegionConfig.class);
+    assertThat(config.getName()).isEqualTo("test");
+  }
+}
diff --git a/geode-web-management/build.gradle 
b/geode-web-management/build.gradle
index d890570..959ccf8 100644
--- a/geode-web-management/build.gradle
+++ b/geode-web-management/build.gradle
@@ -17,11 +17,8 @@ apply plugin: 'war'
 
 apply from: "${project.projectDir}/../gradle/publish.gradle"
 
-apply plugin: 'nebula.facet'
-facets {
-  commonTest {
-    parentSourceSet = 'main'
-  }
+configurations {
+  commonTestCompile
 }
 
 sourceSets {
@@ -36,10 +33,19 @@ sourceSets {
       srcDir "${projectDir}/src/main/webapp"
     }
   }
+
+  commonTest {
+    java {
+      srcDir "${projectDir}/src/commonTest/java"
+    }
+    compileClasspath = configurations.commonTestCompile
+  }
 }
 
 dependencies {
-  compile(platform(project(':boms:geode-all-bom')))
+  compile(platform(project(':boms:geode-all-bom'))) {
+    exclude module: "jackson-annotations"
+  }
   compileOnly(project(':geode-core'))
 
   compileOnly('javax.servlet:javax.servlet-api')
@@ -48,12 +54,13 @@ dependencies {
   compile('commons-fileupload:commons-fileupload') {
     exclude module: 'commons-io'
   }
-  compile('com.fasterxml.jackson.core:jackson-annotations')
-  compile('com.fasterxml.jackson.core:jackson-core')
-  compile('com.fasterxml.jackson.core:jackson-databind')
-  compile('com.fasterxml.jackson.module:jackson-module-scala_2.10')
+  compileOnly('com.fasterxml.jackson.core:jackson-annotations')
+  compileOnly('com.fasterxml.jackson.core:jackson-core')
+  compileOnly('com.fasterxml.jackson.core:jackson-databind')
+  compileOnly('com.fasterxml.jackson.module:jackson-module-scala_2.10')
   compile('io.springfox:springfox-swagger2') {
     exclude module: 'slf4j-api'
+    exclude module: "jackson-annotations"
   }
   compile('io.springfox:springfox-swagger-ui') {
     exclude module: 'slf4j-api'
diff --git 
a/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java
 
b/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java
index df2a937..e0c7f28 100644
--- 
a/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java
+++ 
b/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java
@@ -16,6 +16,8 @@
 package org.apache.geode.management.client;
 
 
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -28,14 +30,12 @@ import 
org.springframework.test.context.web.WebAppConfiguration;
 import org.springframework.test.web.client.MockMvcClientHttpRequestFactory;
 import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-import org.springframework.web.client.ResponseErrorHandler;
 import org.springframework.web.context.WebApplicationContext;
 
 import org.apache.geode.cache.RegionShortcut;
 import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
-import org.apache.geode.management.internal.RestTemplateResponseErrorHandler;
 import org.apache.geode.management.internal.rest.BaseLocatorContextLoader;
 import org.apache.geode.management.internal.rest.PlainLocatorContextLoader;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
@@ -46,7 +46,6 @@ import org.apache.geode.test.dunit.rules.MemberVM;
     loader = PlainLocatorContextLoader.class)
 @WebAppConfiguration
 public class ClientClusterManagementServiceDUnitTest {
-  private static final ResponseErrorHandler ERROR_HANDLER = new 
RestTemplateResponseErrorHandler();
 
   @Autowired
   private WebApplicationContext webApplicationContext;
@@ -78,12 +77,6 @@ public class ClientClusterManagementServiceDUnitTest {
 
     ClusterManagementResult result = client.create(region, "");
 
-    // This all fails in light of running this test repeatedly as a stress 
test. Until we introduce
-    // idempotency and/or the ability to call client.delete we can't do this. 
But it will get fixed
-    // assertThat(result.isSuccessful()).isTrue();
-
-    // Not implemented yet
-    // result = client.delete(region, "");
-    // assertThat(result.isSuccessful()).isTrue();
+    assertThat(client.isConnected()).isTrue();
   }
 }
diff --git 
a/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java
 
b/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/MemberManagementServiceDUnitTest.java
similarity index 50%
copy from 
geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java
copy to 
geode-web-management/src/distributedTest/java/org/apache/geode/management/client/MemberManagementServiceDUnitTest.java
index df2a937..a0cd8f7 100644
--- 
a/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java
+++ 
b/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/MemberManagementServiceDUnitTest.java
@@ -16,6 +16,13 @@
 package org.apache.geode.management.client;
 
 
+import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.iterableWithSize;
+import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -27,17 +34,16 @@ import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.context.web.WebAppConfiguration;
 import org.springframework.test.web.client.MockMvcClientHttpRequestFactory;
 import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.request.RequestPostProcessor;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-import org.springframework.web.client.ResponseErrorHandler;
 import org.springframework.web.context.WebApplicationContext;
 
-import org.apache.geode.cache.RegionShortcut;
-import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
-import org.apache.geode.management.internal.RestTemplateResponseErrorHandler;
+import org.apache.geode.management.configuration.MemberConfig;
 import org.apache.geode.management.internal.rest.BaseLocatorContextLoader;
 import org.apache.geode.management.internal.rest.PlainLocatorContextLoader;
+import org.apache.geode.management.internal.rest.StandardRequestPostProcessor;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 
@@ -45,8 +51,9 @@ import org.apache.geode.test.dunit.rules.MemberVM;
 @ContextConfiguration(locations = 
{"classpath*:WEB-INF/geode-management-servlet.xml"},
     loader = PlainLocatorContextLoader.class)
 @WebAppConfiguration
-public class ClientClusterManagementServiceDUnitTest {
-  private static final ResponseErrorHandler ERROR_HANDLER = new 
RestTemplateResponseErrorHandler();
+public class MemberManagementServiceDUnitTest {
+
+  static RequestPostProcessor POST_PROCESSOR = new 
StandardRequestPostProcessor();
 
   @Autowired
   private WebApplicationContext webApplicationContext;
@@ -56,11 +63,12 @@ public class ClientClusterManagementServiceDUnitTest {
 
   private MemberVM server1;
   private ClusterManagementService client;
+  private MockMvc mockMvc;
 
   @Before
   public void before() {
     cluster.setSkipLocalDistributedSystemCleanup(true);
-    MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
+    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
         .build();
     MockMvcClientHttpRequestFactory requestFactory = new 
MockMvcClientHttpRequestFactory(mockMvc);
     client = ClusterManagementServiceProvider.getService(requestFactory);
@@ -71,19 +79,55 @@ public class ClientClusterManagementServiceDUnitTest {
 
   @Test
   @WithMockUser
-  public void createRegion() {
-    RegionConfig region = new RegionConfig();
-    region.setName("customer");
-    region.setType(RegionShortcut.REPLICATE);
+  public void listMember() {
+    MemberConfig memberConfig = new MemberConfig();
+    ClusterManagementResult result = client.list(memberConfig);
+
+    assertThat(result.isSuccessful()).isTrue();
+    
assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
+    assertThat(result.getResult().size()).isEqualTo(2);
+  }
+
+  @Test
+  @WithMockUser
+  public void getOneMember() throws Exception {
+    MemberConfig config = new MemberConfig();
+    config.setId("server-0");
+    ClusterManagementResult result = client.list(config);
+    assertThat(result.isSuccessful()).isTrue();
+    
assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
+    assertThat(result.getResult().size()).isEqualTo(1);
+  }
 
-    ClusterManagementResult result = client.create(region, "");
+  @Test
+  @WithMockUser
+  public void noMatchWithJavaAPI() throws Exception {
+    MemberConfig config = new MemberConfig();
+    // look for a member with a non-existent id
+    config.setId("server");
+    ClusterManagementResult result = client.list(config);
+    assertThat(result.isSuccessful()).isTrue();
+    assertThat(result.getStatusCode())
+        .isEqualTo(ClusterManagementResult.StatusCode.OK);
+    assertThat(result.getResult().size()).isEqualTo(0);
+  }
 
-    // This all fails in light of running this test repeatedly as a stress 
test. Until we introduce
-    // idempotency and/or the ability to call client.delete we can't do this. 
But it will get fixed
-    // assertThat(result.isSuccessful()).isTrue();
+  @Test
+  @WithMockUser
+  public void noMatchWithFilter() throws Exception {
+    mockMvc.perform(get("/v2/members?id=server"))
+        .andExpect(status().isOk())
+        .andExpect(jsonPath("$.statusCode", is("OK")))
+        .andExpect(jsonPath("$.result", iterableWithSize(0)));
+  }
 
-    // Not implemented yet
-    // result = client.delete(region, "");
-    // assertThat(result.isSuccessful()).isTrue();
+  @Test
+  @WithMockUser
+  public void noMatchWithUriVariable() throws Exception {
+    mockMvc.perform(get("/v2/members/server"))
+        .andExpect(status().isNotFound())
+        .andExpect(jsonPath("$.statusCode", is("ENTITY_NOT_FOUND")))
+        .andExpect(jsonPath("$.statusMessage",
+            is("Unable to find the member with id = server")));
   }
 }
diff --git 
a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/MemberManagementController.java
 
b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/MemberManagementController.java
new file mode 100644
index 0000000..4e4c075
--- /dev/null
+++ 
b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/MemberManagementController.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license
+ * agreements. See the NOTICE file distributed with this work for additional 
information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache 
License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the 
License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software 
distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
KIND, either express
+ * or implied. See the License for the specific language governing permissions 
and limitations under
+ * the License.
+ */
+
+package org.apache.geode.management.internal.rest.controllers;
+
+import static 
org.apache.geode.management.configuration.MemberConfig.MEMBER_CONFIG_ENDPOINT;
+import static 
org.apache.geode.management.internal.rest.controllers.AbstractManagementController.MANAGEMENT_API_VERSION;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import org.apache.geode.management.api.ClusterManagementResult;
+import org.apache.geode.management.configuration.MemberConfig;
+import org.apache.geode.management.internal.exceptions.EntityNotFoundException;
+
+@Controller("members")
+@RequestMapping(MANAGEMENT_API_VERSION)
+public class MemberManagementController extends AbstractManagementController {
+  @PreAuthorize("@securityService.authorize('CLUSTER', 'READ')")
+  @RequestMapping(method = RequestMethod.GET, value = MEMBER_CONFIG_ENDPOINT + 
"/{id}")
+  public ResponseEntity<ClusterManagementResult> getMember(
+      @PathVariable(name = "id", required = false) String id) {
+    MemberConfig config = new MemberConfig();
+    config.setId(id);
+    ClusterManagementResult result = clusterManagementService.list(config);
+
+    if (result.getResult().size() == 0) {
+      throw new EntityNotFoundException("Unable to find the member with id = " 
+ id);
+    }
+
+    return new ResponseEntity<>(result,
+        result.isSuccessful() ? HttpStatus.OK : 
HttpStatus.INTERNAL_SERVER_ERROR);
+  }
+
+  @PreAuthorize("@securityService.authorize('CLUSTER', 'READ')")
+  @RequestMapping(method = RequestMethod.GET, value = MEMBER_CONFIG_ENDPOINT)
+  public ResponseEntity<ClusterManagementResult> listMembers(
+      @RequestParam(required = false) String id) {
+    MemberConfig filter = new MemberConfig();
+    if (id != null) {
+      filter.setId(id);
+    }
+    ClusterManagementResult result = clusterManagementService.list(filter);
+
+    return new ResponseEntity<>(result,
+        result.isSuccessful() ? HttpStatus.OK : 
HttpStatus.INTERNAL_SERVER_ERROR);
+  }
+
+}
diff --git 
a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java
 
b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/PingManagementController.java
similarity index 63%
copy from 
geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java
copy to 
geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/PingManagementController.java
index e59c0a1..28ef412 100644
--- 
a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java
+++ 
b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/PingManagementController.java
@@ -15,32 +15,18 @@
 
 package org.apache.geode.management.internal.rest.controllers;
 
+
 import static 
org.apache.geode.management.internal.rest.controllers.AbstractManagementController.MANAGEMENT_API_VERSION;
 
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
-import org.apache.geode.cache.configuration.RegionConfig;
-import org.apache.geode.management.api.ClusterManagementResult;
-
-@Controller("regionManagement")
+@Controller("ping")
 @RequestMapping(MANAGEMENT_API_VERSION)
-public class RegionManagementController extends AbstractManagementController {
-
-  @PreAuthorize("@securityService.authorize('DATA', 'MANAGE')")
-  @RequestMapping(method = RequestMethod.POST, value = "/regions")
-  public ResponseEntity<ClusterManagementResult> createRegion(
-      @RequestBody RegionConfig regionConfig) {
-    ClusterManagementResult result =
-        clusterManagementService.create(regionConfig, "cluster");
-    return new ResponseEntity<>(result,
-        result.isSuccessful() ? HttpStatus.CREATED : 
HttpStatus.INTERNAL_SERVER_ERROR);
-  }
+public class PingManagementController extends AbstractManagementController {
 
   @RequestMapping(method = RequestMethod.GET, value = "/ping")
   public ResponseEntity<String> ping() {
diff --git 
a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java
 
b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java
index e59c0a1..45333b2 100644
--- 
a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java
+++ 
b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java
@@ -15,6 +15,7 @@
 
 package org.apache.geode.management.internal.rest.controllers;
 
+import static 
org.apache.geode.cache.configuration.RegionConfig.REGION_CONFIG_ENDPOINT;
 import static 
org.apache.geode.management.internal.rest.controllers.AbstractManagementController.MANAGEMENT_API_VERSION;
 
 import org.springframework.http.HttpStatus;
@@ -33,7 +34,7 @@ import 
org.apache.geode.management.api.ClusterManagementResult;
 public class RegionManagementController extends AbstractManagementController {
 
   @PreAuthorize("@securityService.authorize('DATA', 'MANAGE')")
-  @RequestMapping(method = RequestMethod.POST, value = "/regions")
+  @RequestMapping(method = RequestMethod.POST, value = REGION_CONFIG_ENDPOINT)
   public ResponseEntity<ClusterManagementResult> createRegion(
       @RequestBody RegionConfig regionConfig) {
     ClusterManagementResult result =
@@ -41,9 +42,4 @@ public class RegionManagementController extends 
AbstractManagementController {
     return new ResponseEntity<>(result,
         result.isSuccessful() ? HttpStatus.CREATED : 
HttpStatus.INTERNAL_SERVER_ERROR);
   }
-
-  @RequestMapping(method = RequestMethod.GET, value = "/ping")
-  public ResponseEntity<String> ping() {
-    return new ResponseEntity<>("pong", HttpStatus.OK);
-  }
 }
diff --git 
a/geode-web-management/src/main/webapp/WEB-INF/geode-management-servlet.xml 
b/geode-web-management/src/main/webapp/WEB-INF/geode-management-servlet.xml
index 22cae8e..a2cc948 100644
--- a/geode-web-management/src/main/webapp/WEB-INF/geode-management-servlet.xml
+++ b/geode-web-management/src/main/webapp/WEB-INF/geode-management-servlet.xml
@@ -65,6 +65,7 @@
       <array>
         <util:constant 
static-field="com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_COMMENTS"/>
         <util:constant 
static-field="com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_SINGLE_QUOTES"/>
+        <util:constant 
static-field="com.fasterxml.jackson.databind.MapperFeature.USE_BASE_TYPE_AS_DEFAULT_IMPL"/>
         <util:constant 
static-field="com.fasterxml.jackson.databind.DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT"/>
       </array>
     </property>
diff --git a/geode-web-management/src/test/resources/expected-pom.xml 
b/geode-web-management/src/test/resources/expected-pom.xml
index 5eec71a..d9e364c 100644
--- a/geode-web-management/src/test/resources/expected-pom.xml
+++ b/geode-web-management/src/test/resources/expected-pom.xml
@@ -63,26 +63,6 @@
       </exclusions>
     </dependency>
     <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-annotations</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-core</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.module</groupId>
-      <artifactId>jackson-module-scala_2.10</artifactId>
-      <scope>compile</scope>
-    </dependency>
-    <dependency>
       <groupId>io.springfox</groupId>
       <artifactId>springfox-swagger2</artifactId>
       <scope>compile</scope>
@@ -91,6 +71,10 @@
           <artifactId>slf4j-api</artifactId>
           <groupId>*</groupId>
         </exclusion>
+        <exclusion>
+          <artifactId>jackson-annotations</artifactId>
+          <groupId>*</groupId>
+        </exclusion>
       </exclusions>
     </dependency>
     <dependency>

Reply via email to