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());