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>