You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2018/11/10 01:19:24 UTC
[geode] branch feature/GEODE-6010 updated: gfsh create mapping now
has tests to validate both server and cluster config changes
This is an automated email from the ASF dual-hosted git repository.
dschneider pushed a commit to branch feature/GEODE-6010
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/feature/GEODE-6010 by this push:
new c4186a3 gfsh create mapping now has tests to validate both server and cluster config changes
c4186a3 is described below
commit c4186a3131fb4a95b78dc1907eb700114b85fbbe
Author: Darrel Schneider <ds...@pivotal.io>
AuthorDate: Fri Nov 9 17:18:29 2018 -0800
gfsh create mapping now has tests to validate both server and cluster config changes
---
.../cli/CreateMappingCommandDUnitTest.java | 179 +++++++++++++++++++--
.../jdbc/internal/cli/CreateMappingCommand.java | 4 +-
.../jdbc/internal/cli/CreateMappingFunction.java | 2 +-
.../internal/cli/CreateMappingCommandTest.java | 7 +-
.../internal/cli/CreateMappingFunctionTest.java | 13 +-
5 files changed, 180 insertions(+), 25 deletions(-)
diff --git a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommandDUnitTest.java b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommandDUnitTest.java
index efb010d..be6686e 100644
--- a/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommandDUnitTest.java
+++ b/geode-connectors/src/distributedTest/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommandDUnitTest.java
@@ -21,16 +21,24 @@ import static org.apache.geode.connectors.jdbc.internal.cli.CreateMappingCommand
import static org.apache.geode.connectors.jdbc.internal.cli.CreateMappingCommand.CREATE_MAPPING__TABLE_NAME;
import static org.assertj.core.api.Assertions.assertThat;
+import java.util.List;
+
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.asyncqueue.AsyncEventQueue;
import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.configuration.RegionAttributesType;
import org.apache.geode.cache.configuration.RegionConfig;
+import org.apache.geode.connectors.jdbc.JdbcAsyncWriter;
+import org.apache.geode.connectors.jdbc.JdbcLoader;
import org.apache.geode.connectors.jdbc.internal.JdbcConnectorService;
import org.apache.geode.connectors.jdbc.internal.configuration.RegionMapping;
import org.apache.geode.distributed.internal.InternalLocator;
+import org.apache.geode.internal.cache.InternalCache;
import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
import org.apache.geode.test.dunit.rules.ClusterStartupRule;
import org.apache.geode.test.dunit.rules.MemberVM;
@@ -62,12 +70,117 @@ public class CreateMappingCommandDUnitTest {
gfsh.connectAndVerify(locator);
- gfsh.executeAndAssertThat("create region --name=" + REGION_NAME + " --type=REPLICATE")
+ }
+
+ private void setupReplicate() {
+ setupReplicate(false);
+ }
+
+ private void setupReplicate(boolean addLoader) {
+ gfsh.executeAndAssertThat("create region --name=" + REGION_NAME + " --type=REPLICATE"
+ + (addLoader ? " --cache-loader=" + JdbcLoader.class.getName() : ""))
.statusIsSuccess();
}
+ private void setupPartition() {
+ gfsh.executeAndAssertThat("create region --name=" + REGION_NAME + " --type=PARTITION")
+ .statusIsSuccess();
+ }
+
+ private void setupAsyncEventQueue() {
+ gfsh.executeAndAssertThat(
+ "create async-event-queue --id=" + CreateMappingCommand.getAsyncEventQueueName(REGION_NAME)
+ + " --listener=" + JdbcAsyncWriter.class.getName())
+ .statusIsSuccess();
+ }
+
+ private static RegionMapping getRegionMappingFromClusterConfig() {
+ CacheConfig cacheConfig =
+ InternalLocator.getLocator().getConfigurationPersistenceService().getCacheConfig(null);
+ RegionConfig regionConfig = cacheConfig.getRegions().stream()
+ .filter(region -> region.getName().equals(REGION_NAME)).findFirst().orElse(null);
+ return (RegionMapping) regionConfig.getCustomRegionElements().stream()
+ .filter(element -> element instanceof RegionMapping).findFirst().orElse(null);
+ }
+
+ private static RegionMapping getRegionMappingFromService() {
+ return ClusterStartupRule.getCache().getService(JdbcConnectorService.class)
+ .getMappingForRegion(REGION_NAME);
+ }
+
+ private static void validateAsyncEventQueueCreatedInClusterConfig(boolean isParallel) {
+ CacheConfig cacheConfig =
+ InternalLocator.getLocator().getConfigurationPersistenceService().getCacheConfig(null);
+ List<CacheConfig.AsyncEventQueue> queueList = cacheConfig.getAsyncEventQueues();
+ CacheConfig.AsyncEventQueue queue = queueList.get(0);
+ String queueName = CreateMappingCommand.getAsyncEventQueueName(REGION_NAME);
+ assertThat(queue.getId()).isEqualTo(queueName);
+ assertThat(queue.getAsyncEventListener().getClassName())
+ .isEqualTo(JdbcAsyncWriter.class.getName());
+ assertThat(queue.isParallel()).isEqualTo(isParallel);
+ }
+
+ private static void validateRegionAlteredInClusterConfig() {
+ CacheConfig cacheConfig =
+ InternalLocator.getLocator().getConfigurationPersistenceService().getCacheConfig(null);
+ RegionConfig regionConfig = cacheConfig.getRegions().stream()
+ .filter(region -> region.getName().equals(REGION_NAME)).findFirst().orElse(null);
+ RegionAttributesType attributes = regionConfig.getRegionAttributes().get(0);
+ assertThat(attributes.getCacheLoader().getClassName()).isEqualTo(JdbcLoader.class.getName());
+ String queueName = CreateMappingCommand.getAsyncEventQueueName(REGION_NAME);
+ assertThat(attributes.getAsyncEventQueueIds()).isEqualTo(queueName);
+ }
+
+ private static void validateAsyncEventQueueCreatedOnServer(boolean isParallel) {
+ InternalCache cache = ClusterStartupRule.getCache();
+ String queueName = CreateMappingCommand.getAsyncEventQueueName(REGION_NAME);
+ AsyncEventQueue queue = cache.getAsyncEventQueue(queueName);
+ assertThat(queue).isNotNull();
+ assertThat(queue.getAsyncEventListener()).isInstanceOf(JdbcAsyncWriter.class);
+ assertThat(queue.isParallel()).isEqualTo(isParallel);
+ }
+
+ private static void validateRegionAlteredOnServer() {
+ InternalCache cache = ClusterStartupRule.getCache();
+ String queueName = CreateMappingCommand.getAsyncEventQueueName(REGION_NAME);
+ Region<?, ?> region = cache.getRegion(REGION_NAME);
+ assertThat(region.getAttributes().getCacheLoader()).isInstanceOf(JdbcLoader.class);
+ assertThat(region.getAttributes().getAsyncEventQueueIds()).contains(queueName);
+ }
+
@Test
public void createMappingUpdatesServiceAndClusterConfig() {
+ setupReplicate();
+ CommandStringBuilder csb = new CommandStringBuilder(CREATE_MAPPING);
+ csb.addOption(CREATE_MAPPING__REGION_NAME, REGION_NAME);
+ csb.addOption(CREATE_MAPPING__DATA_SOURCE_NAME, "connection");
+ csb.addOption(CREATE_MAPPING__TABLE_NAME, "myTable");
+ csb.addOption(CREATE_MAPPING__PDX_NAME, "myPdxClass");
+
+ gfsh.executeAndAssertThat(csb.toString()).statusIsSuccess();
+
+ server.invoke(() -> {
+ RegionMapping mapping = getRegionMappingFromService();
+ assertThat(mapping.getDataSourceName()).isEqualTo("connection");
+ assertThat(mapping.getTableName()).isEqualTo("myTable");
+ assertThat(mapping.getPdxName()).isEqualTo("myPdxClass");
+ validateRegionAlteredOnServer();
+ validateAsyncEventQueueCreatedOnServer(false);
+ });
+
+ locator.invoke(() -> {
+ RegionMapping regionMapping = getRegionMappingFromClusterConfig();
+ assertThat(regionMapping.getDataSourceName()).isEqualTo("connection");
+ assertThat(regionMapping.getTableName()).isEqualTo("myTable");
+ assertThat(regionMapping.getPdxName()).isEqualTo("myPdxClass");
+ validateRegionAlteredInClusterConfig();
+ validateAsyncEventQueueCreatedInClusterConfig(false);
+ });
+ }
+
+ @Test
+ public void createMappingWithPartitionUpdatesServiceAndClusterConfig() {
+ setupPartition();
CommandStringBuilder csb = new CommandStringBuilder(CREATE_MAPPING);
csb.addOption(CREATE_MAPPING__REGION_NAME, REGION_NAME);
csb.addOption(CREATE_MAPPING__DATA_SOURCE_NAME, "connection");
@@ -81,6 +194,8 @@ public class CreateMappingCommandDUnitTest {
assertThat(mapping.getDataSourceName()).isEqualTo("connection");
assertThat(mapping.getTableName()).isEqualTo("myTable");
assertThat(mapping.getPdxName()).isEqualTo("myPdxClass");
+ validateRegionAlteredOnServer();
+ validateAsyncEventQueueCreatedOnServer(true);
});
locator.invoke(() -> {
@@ -88,11 +203,14 @@ public class CreateMappingCommandDUnitTest {
assertThat(regionMapping.getDataSourceName()).isEqualTo("connection");
assertThat(regionMapping.getTableName()).isEqualTo("myTable");
assertThat(regionMapping.getPdxName()).isEqualTo("myPdxClass");
+ validateRegionAlteredInClusterConfig();
+ validateAsyncEventQueueCreatedInClusterConfig(true);
});
}
@Test
public void createMappingWithNoTable() {
+ setupReplicate();
CommandStringBuilder csb = new CommandStringBuilder(CREATE_MAPPING);
csb.addOption(CREATE_MAPPING__REGION_NAME, REGION_NAME);
csb.addOption(CREATE_MAPPING__DATA_SOURCE_NAME, "connection");
@@ -105,6 +223,8 @@ public class CreateMappingCommandDUnitTest {
assertThat(mapping.getDataSourceName()).isEqualTo("connection");
assertThat(mapping.getTableName()).isNull();
assertThat(mapping.getPdxName()).isEqualTo("myPdxClass");
+ validateRegionAlteredOnServer();
+ validateAsyncEventQueueCreatedOnServer(false);
});
locator.invoke(() -> {
@@ -112,11 +232,14 @@ public class CreateMappingCommandDUnitTest {
assertThat(regionMapping.getDataSourceName()).isEqualTo("connection");
assertThat(regionMapping.getTableName()).isNull();
assertThat(regionMapping.getPdxName()).isEqualTo("myPdxClass");
+ validateRegionAlteredInClusterConfig();
+ validateAsyncEventQueueCreatedInClusterConfig(false);
});
}
@Test
public void createExistingRegionMappingFails() {
+ setupReplicate();
CommandStringBuilder csb = new CommandStringBuilder(CREATE_MAPPING);
csb.addOption(CREATE_MAPPING__REGION_NAME, REGION_NAME);
csb.addOption(CREATE_MAPPING__DATA_SOURCE_NAME, "connection");
@@ -147,27 +270,55 @@ public class CreateMappingCommandDUnitTest {
});
}
- private static RegionMapping getRegionMappingFromClusterConfig() {
- CacheConfig cacheConfig =
- InternalLocator.getLocator().getConfigurationPersistenceService().getCacheConfig(null);
- RegionConfig regionConfig = cacheConfig.getRegions().stream()
- .filter(region -> region.getName().equals(REGION_NAME)).findFirst().orElse(null);
- return (RegionMapping) regionConfig.getCustomRegionElements().stream()
- .filter(element -> element instanceof RegionMapping).findFirst().orElse(null);
+
+ @Test
+ public void createMappingWithoutPdxNameFails() {
+ setupReplicate();
+ CommandStringBuilder csb = new CommandStringBuilder(CREATE_MAPPING);
+ csb.addOption(CREATE_MAPPING__REGION_NAME, REGION_NAME);
+ csb.addOption(CREATE_MAPPING__DATA_SOURCE_NAME, "connection");
+
+ // NOTE: --table is optional so it should not be in the output but it is. See GEODE-3468.
+ gfsh.executeAndAssertThat(csb.toString()).statusIsError()
+ .containsOutput("You should specify option (--table, --pdx-name) for this command");
}
- private static RegionMapping getRegionMappingFromService() {
- return ClusterStartupRule.getCache().getService(JdbcConnectorService.class)
- .getMappingForRegion(REGION_NAME);
+ @Test
+ public void createMappingWithNonExistentRegionFails() {
+ setupReplicate();
+ CommandStringBuilder csb = new CommandStringBuilder(CREATE_MAPPING);
+ csb.addOption(CREATE_MAPPING__REGION_NAME, "bogusRegion");
+ csb.addOption(CREATE_MAPPING__DATA_SOURCE_NAME, "connection");
+ csb.addOption(CREATE_MAPPING__PDX_NAME, "myPdxClass");
+
+ gfsh.executeAndAssertThat(csb.toString()).statusIsError()
+ .containsOutput("A region named bogusRegion must already exist");
}
@Test
- public void createMappingWithoutPdxNameFails() {
+ public void createMappingWithRegionThatHasALoaderFails() {
+ setupReplicate(true);
CommandStringBuilder csb = new CommandStringBuilder(CREATE_MAPPING);
csb.addOption(CREATE_MAPPING__REGION_NAME, REGION_NAME);
csb.addOption(CREATE_MAPPING__DATA_SOURCE_NAME, "connection");
- // NOTE: --table is optional so it should not be in the ouput but it is. See GEODE-3468.
+ csb.addOption(CREATE_MAPPING__PDX_NAME, "myPdxClass");
+
gfsh.executeAndAssertThat(csb.toString()).statusIsError()
- .containsOutput("You should specify option (--table, --pdx-name) for this command");
+ .containsOutput("The existing region " + REGION_NAME
+ + " must not already have a cache-loader, but it has " + JdbcLoader.class.getName());
+ }
+
+ @Test
+ public void createMappingWithExistingQueueFails() {
+ setupReplicate();
+ setupAsyncEventQueue();
+ CommandStringBuilder csb = new CommandStringBuilder(CREATE_MAPPING);
+ csb.addOption(CREATE_MAPPING__REGION_NAME, REGION_NAME);
+ csb.addOption(CREATE_MAPPING__DATA_SOURCE_NAME, "connection");
+ csb.addOption(CREATE_MAPPING__PDX_NAME, "myPdxClass");
+
+ gfsh.executeAndAssertThat(csb.toString()).statusIsError()
+ .containsOutput("An async-event-queue named JDBC-testRegion must not already exist.");
}
+
}
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
index c603e68..901967f 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommand.java
@@ -26,6 +26,7 @@ import org.apache.geode.annotations.Experimental;
import org.apache.geode.cache.configuration.CacheConfig;
import org.apache.geode.cache.configuration.CacheConfig.AsyncEventQueue;
import org.apache.geode.cache.configuration.DeclarableType;
+import org.apache.geode.cache.configuration.RegionAttributesDataPolicy;
import org.apache.geode.cache.configuration.RegionAttributesType;
import org.apache.geode.cache.configuration.RegionConfig;
import org.apache.geode.connectors.jdbc.JdbcAsyncWriter;
@@ -163,7 +164,8 @@ public class CreateMappingCommand extends SingleGfshCommand {
String queueName) {
AsyncEventQueue asyncEventQueue = new AsyncEventQueue();
asyncEventQueue.setId(queueName);
- boolean isPartitioned = attributes.getPartitionAttributes() != null;
+ boolean isPartitioned = attributes.getDataPolicy().equals(RegionAttributesDataPolicy.PARTITION)
+ || attributes.getDataPolicy().equals(RegionAttributesDataPolicy.PERSISTENT_PARTITION);
asyncEventQueue.setParallel(isPartitioned);
DeclarableType listener = new DeclarableType();
listener.setClassName(JdbcAsyncWriter.class.getName());
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunction.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunction.java
index ed03ff7..97c954d 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunction.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunction.java
@@ -47,7 +47,7 @@ public class CreateMappingFunction extends CliFunction<RegionMapping> {
// action
String queueName = CreateMappingCommand.getAsyncEventQueueName(regionName);
createAsyncEventQueue(context.getCache(), queueName,
- region.getAttributes().getPartitionAttributes() != null);
+ region.getAttributes().getDataPolicy().withPartitioning());
alterRegion(region, queueName);
createRegionMapping(service, regionMapping);
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommandTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommandTest.java
index 3bf8c7b..a02596b 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommandTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingCommandTest.java
@@ -37,8 +37,8 @@ import org.apache.geode.cache.configuration.CacheConfig;
import org.apache.geode.cache.configuration.CacheConfig.AsyncEventQueue;
import org.apache.geode.cache.configuration.CacheElement;
import org.apache.geode.cache.configuration.DeclarableType;
+import org.apache.geode.cache.configuration.RegionAttributesDataPolicy;
import org.apache.geode.cache.configuration.RegionAttributesType;
-import org.apache.geode.cache.configuration.RegionAttributesType.PartitionAttributes;
import org.apache.geode.cache.configuration.RegionConfig;
import org.apache.geode.connectors.jdbc.JdbcAsyncWriter;
import org.apache.geode.connectors.jdbc.internal.configuration.RegionMapping;
@@ -98,6 +98,7 @@ public class CreateMappingCommandTest {
when(matchingRegion.getName()).thenReturn(regionName);
List<RegionAttributesType> attributesList = new ArrayList<>();
matchingRegionAttributes = mock(RegionAttributesType.class);
+ when(matchingRegionAttributes.getDataPolicy()).thenReturn(RegionAttributesDataPolicy.REPLICATE);
attributesList.add(matchingRegionAttributes);
when(matchingRegion.getRegionAttributes()).thenReturn(attributesList);
@@ -328,8 +329,8 @@ public class CreateMappingCommandTest {
when(cacheConfig.getRegions()).thenReturn(list);
List<CacheConfig.AsyncEventQueue> queueList = new ArrayList<>();
when(cacheConfig.getAsyncEventQueues()).thenReturn(queueList);
- when(matchingRegionAttributes.getPartitionAttributes())
- .thenReturn(mock(PartitionAttributes.class));
+ when(matchingRegionAttributes.getDataPolicy())
+ .thenReturn(RegionAttributesDataPolicy.PARTITION);
createRegionMappingCommand.updateClusterConfig(null, cacheConfig, mapping);
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunctionTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunctionTest.java
index eb54614..b7eb973 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunctionTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/cli/CreateMappingFunctionTest.java
@@ -34,7 +34,7 @@ import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.apache.geode.cache.AttributesMutator;
-import org.apache.geode.cache.PartitionAttributes;
+import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionAttributes;
import org.apache.geode.cache.asyncqueue.AsyncEventQueueFactory;
@@ -59,6 +59,7 @@ public class CreateMappingFunctionTest {
private JdbcConnectorService service;
private InternalCache cache;
private Region region;
+ private RegionAttributes attributes;
private AsyncEventQueueFactory asyncEventQueueFactory;
private CreateMappingFunction function;
@@ -82,7 +83,9 @@ public class CreateMappingFunctionTest {
when(system.getDistributedMember()).thenReturn(distributedMember);
when(context.getArguments()).thenReturn(regionMapping);
when(cache.getService(eq(JdbcConnectorService.class))).thenReturn(service);
- when(region.getAttributes()).thenReturn(mock(RegionAttributes.class));
+ attributes = mock(RegionAttributes.class);
+ when(attributes.getDataPolicy()).thenReturn(DataPolicy.REPLICATE);
+ when(region.getAttributes()).thenReturn(attributes);
when(region.getAttributesMutator()).thenReturn(mock(AttributesMutator.class));
asyncEventQueueFactory = mock(AsyncEventQueueFactory.class);
when(cache.createAsyncEventQueueFactory()).thenReturn(asyncEventQueueFactory);
@@ -167,8 +170,7 @@ public class CreateMappingFunctionTest {
@Test
public void executeCreatesSerialAsyncQueueForNonPartitionedRegion() throws Exception {
- RegionAttributes attributes = region.getAttributes();
- when(attributes.getPartitionAttributes()).thenReturn(null);
+ when(attributes.getDataPolicy()).thenReturn(DataPolicy.REPLICATE);
function.executeFunction(context);
verify(asyncEventQueueFactory, times(1)).create(any(), any());
@@ -177,8 +179,7 @@ public class CreateMappingFunctionTest {
@Test
public void executeCreatesParallelAsyncQueueForPartitionedRegion() throws Exception {
- RegionAttributes attributes = region.getAttributes();
- when(attributes.getPartitionAttributes()).thenReturn(mock(PartitionAttributes.class));
+ when(attributes.getDataPolicy()).thenReturn(DataPolicy.PARTITION);
function.executeFunction(context);
verify(asyncEventQueueFactory, times(1)).create(any(), any());