blob: a5cbe02aca23c0f2da398a4e0e828a6df150b33b [file] [log] [blame]
/*
* 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.cli.commands;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.rules.TestName;
import org.apache.geode.cache.CacheLoader;
import org.apache.geode.cache.CacheLoaderException;
import org.apache.geode.cache.CustomExpiry;
import org.apache.geode.cache.Declarable;
import org.apache.geode.cache.EntryOperation;
import org.apache.geode.cache.ExpirationAttributes;
import org.apache.geode.cache.LoaderHelper;
import org.apache.geode.cache.PartitionResolver;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.configuration.CacheConfig;
import org.apache.geode.cache.configuration.CacheElement;
import org.apache.geode.cache.configuration.RegionAttributesDataPolicy;
import org.apache.geode.cache.configuration.RegionAttributesScope;
import org.apache.geode.cache.configuration.RegionAttributesType;
import org.apache.geode.cache.configuration.RegionConfig;
import org.apache.geode.cache.util.CacheListenerAdapter;
import org.apache.geode.cache.util.CacheWriterAdapter;
import org.apache.geode.compression.Compressor;
import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
import org.apache.geode.test.dunit.rules.ClusterStartupRule;
import org.apache.geode.test.dunit.rules.MemberVM;
import org.apache.geode.test.junit.categories.RegionsTest;
import org.apache.geode.test.junit.rules.GfshCommandRule;
import org.apache.geode.test.junit.rules.serializable.SerializableTestName;
@Category({RegionsTest.class})
public class CreateRegionCommandPersistsConfigurationDUnitTest {
private MemberVM locator, server1;
@Rule
public ClusterStartupRule clusterRule = new ClusterStartupRule();
@Rule
public GfshCommandRule gfsh = new GfshCommandRule();
@Rule
public TestName testName = new SerializableTestName();
public static class DummyCacheListener extends CacheListenerAdapter {
}
public static class DummyCustomExpiry implements CustomExpiry, Declarable {
@Override
public ExpirationAttributes getExpiry(Region.Entry entry) {
return null;
}
}
public static class DummyPartitionResolver implements PartitionResolver, Declarable {
@Override
public Object getRoutingObject(EntryOperation opDetails) {
return null;
}
@Override
public String getName() {
return "dummy";
}
}
public static class DummyCompressor implements Compressor, Declarable {
@Override
public byte[] compress(byte[] input) {
return new byte[0];
}
@Override
public byte[] decompress(byte[] input) {
return new byte[0];
}
}
public static class DummyCacheLoader implements CacheLoader, Declarable {
@Override
public Object load(LoaderHelper helper) throws CacheLoaderException {
return null;
}
}
public static class DummyCacheWriter extends CacheWriterAdapter {
}
@Before
public void before() throws Exception {
locator = clusterRule.startLocatorVM(0);
server1 = clusterRule.startServerVM(1, locator.getPort());
gfsh.connectAndVerify(locator);
}
@Test
public void createRegionPersistsDefaultConfig() {
String regionName = testName.getMethodName();
gfsh.executeAndAssertThat("create region --name=" + regionName + " --type=REPLICATE")
.statusIsSuccess();
server1.stop();
server1 = clusterRule.startServerVM(1, "group1", locator.getPort());
gfsh.executeAndAssertThat("list regions")
.statusIsSuccess().containsOutput(regionName);
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
RegionConfig regionConfig = regions.get(0);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(regionName);
assertThat(regionConfig.getIndexes()).isEmpty();
assertThat(regionConfig.getRegions()).isEmpty();
assertThat(regionConfig.getEntries()).isEmpty();
assertThat(regionConfig.getCustomRegionElements()).isEmpty();
});
}
@Test
public void createRegionPersistsConfigParams() {
String regionName = testName.getMethodName();
gfsh.executeAndAssertThat("create region --name=" + regionName + " --type=PARTITION"
+ " --enable-statistics=true" + " --enable-async-conflation=true"
+ " --entry-idle-time-expiration=100").statusIsSuccess();
server1.stop();
server1 = clusterRule.startServerVM(1, "group1", locator.getPort());
gfsh.executeAndAssertThat("list regions")
.statusIsSuccess().containsOutput(regionName);
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
RegionConfig regionConfig = regions.get(0);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(regionName);
assertThat(regionConfig.getRegionAttributes()).isNotNull();
RegionAttributesType attr = regionConfig.getRegionAttributes();
assertThat(attr.isStatisticsEnabled()).isTrue();
assertThat(attr.isEnableAsyncConflation()).isTrue();
RegionAttributesType.ExpirationAttributesType entryIdleTimeExp = attr.getEntryIdleTime();
assertThat(entryIdleTimeExp.getTimeout()).isEqualTo("100");
});
server1.invoke(() -> {
Region<?, ?> region = ClusterStartupRule.getCache().getRegion(regionName);
assertThat(region.getAttributes().getStatisticsEnabled())
.describedAs("Expecting statistics to be enabled")
.isTrue();
assertThat(region.getAttributes().getEnableAsyncConflation())
.describedAs("Expecting async conflation to be enabled")
.isTrue();
assertThat(region.getAttributes().getEntryIdleTimeout().getTimeout())
.describedAs("Expecting entry idle time exp timeout to be 100")
.isEqualTo(100);
});
}
@Test
public void createRegionFromTemplateCreatesCorrectConfig() {
String regionName = testName.getMethodName();
String templateRegionName = regionName + "_template";
gfsh.executeAndAssertThat("create region"
+ " --name=" + templateRegionName
+ " --type=PARTITION"
+ " --cache-listener=" + DummyCacheListener.class.getName()
+ " --enable-statistics=true"
+ " --enable-async-conflation=true"
+ " --entry-idle-time-expiration=100").statusIsSuccess();
gfsh.executeAndAssertThat(
"create region --name=" + regionName + " --template-region=" + templateRegionName);
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
RegionConfig regionConfig = CacheElement.findElement(config.getRegions(), regionName);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(regionName);
assertThat(regionConfig.getRegionAttributes()).isNotNull();
RegionAttributesType attr = regionConfig.getRegionAttributes();
assertThat(attr.isStatisticsEnabled()).isTrue();
assertThat(attr.isEnableAsyncConflation()).isTrue();
RegionAttributesType.ExpirationAttributesType entryIdleTimeExp = attr.getEntryIdleTime();
assertThat(entryIdleTimeExp.getTimeout()).isEqualTo("100");
});
}
@Test
public void createRegionAndValidateAllConfigIsPersistedForReplicatedRegion() {
String regionName = testName.getMethodName();
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=REPLICATE"
+ " --cache-listener=" + DummyCacheListener.class.getName()
+ " --cache-loader=" + DummyCacheLoader.class.getName()
+ " --cache-writer=" + DummyCacheWriter.class.getName()
+ " --compressor=" + DummyCompressor.class.getName()
+ " --enable-async-conflation=false"
+ " --enable-concurrency-checks=false"
+ " --enable-multicast=false"
+ " --concurrency-level=1"
+ " --enable-statistics=true"
+ " --enable-subscription-conflation=true"
+ " --entry-idle-time-expiration=100"
+ " --entry-idle-time-expiration-action=local-destroy"
+ " --entry-time-to-live-expiration=200"
+ " --entry-time-to-live-expiration-action=local-destroy"
+ " --eviction-action=local-destroy"
+ " --eviction-entry-count=1000"
+ " --key-constraint=" + Object.class.getName()
+ " --off-heap=false"
+ " --region-idle-time-expiration=100"
+ " --region-idle-time-expiration-action=local-destroy"
+ " --region-time-to-live-expiration=200"
+ " --region-time-to-live-expiration-action=local-destroy"
+ " --value-constraint=" + Object.class.getName()).statusIsSuccess();
String regionNameFromTemplate = regionName + "-from-template";
gfsh.executeAndAssertThat("create region --name=" + regionNameFromTemplate
+ " --template-region=" + regionName)
.statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(2);
List<String> regionNames = Arrays.asList(regionName, regionNameFromTemplate);
regionNames.forEach(name -> {
RegionConfig regionConfig = CacheElement.findElement(config.getRegions(), name);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(name);
assertThat(regionConfig.getRegionAttributes()).isNotNull();
RegionAttributesType attr = regionConfig.getRegionAttributes();
assertThat(attr.getCacheListeners().get(0).toString())
.describedAs("Expecting one cache listener for region " + name)
.isEqualTo(DummyCacheListener.class.getName());
assertThat(attr.getCacheLoader().toString())
.describedAs("Expecting a DummyCacheLoader for region " + name)
.isEqualTo(DummyCacheLoader.class.getName());
assertThat(attr.getCacheWriter().toString())
.describedAs("Expecting a DummyCacheWriter for region " + name)
.isEqualTo(DummyCacheWriter.class.getName());
assertThat(attr.getCompressor().toString())
.describedAs("Expecting a DummyCompressor for region " + name)
.isEqualTo(DummyCompressor.class.getName());
assertThat(attr.isEnableAsyncConflation())
.describedAs("Expecting async conflation to not be enabled for region "
+ name)
.isFalse();
assertThat(attr.isConcurrencyChecksEnabled())
.describedAs("Expecting concurrency checks not to be enabled for region "
+ name)
.isFalse();
assertThat(attr.isMulticastEnabled())
.describedAs("Expecting multicast is not enabled for region " + name)
.isFalse();
assertThat(attr.getConcurrencyLevel())
.describedAs("Expecting concurrency level to be 1 for region " + name)
.isEqualTo("1");
assertThat(attr.isStatisticsEnabled())
.describedAs("Expecting statistics to be enabled for region " + name)
.isTrue();
assertThat(attr.isCloningEnabled()).isNull();
assertThat(attr.isEnableSubscriptionConflation())
.describedAs("Expecting subscription conflation to be enabled for region "
+ name)
.isTrue();
assertThat(attr.getEntryIdleTime().getTimeout())
.describedAs("Entry idle time timeout should be 100 for region " + name)
.isEqualTo("100");
assertThat(attr.getEntryIdleTime().getAction())
.describedAs("Entry idle time expiration action should be local-destroy for region "
+ name)
.isEqualTo("local-destroy");
assertThat(attr.getEntryTimeToLive().getTimeout())
.describedAs("Expecting entry time to live expiration to be 200 for region "
+ name)
.isEqualTo("200");
assertThat(attr.getEntryTimeToLive().getAction())
.describedAs("Entry time to live expiration action should be local-destroy "
+ "for region " + name)
.isEqualTo("local-destroy");
assertThat(attr.getEvictionAttributes().getLruEntryCount().getAction().value())
.describedAs("Eviction action should be local-destroy for region " + name)
.isEqualTo("local-destroy");
assertThat(attr.getEvictionAttributes().getLruEntryCount().getMaximum())
.describedAs("Eviction max should be 1000 for region " + name)
.isEqualTo("1000");
assertThat(attr.getKeyConstraint())
.describedAs("Expected key constraint to be " + Object.class.getName() +
" for region " + name)
.isEqualTo(Object.class.getName());
assertThat(attr.isOffHeap())
.describedAs("Expected off heap to be false for region " + name)
.isFalse();
assertThat(attr.getRegionIdleTime().getTimeout())
.describedAs("Expecting region idle time expiration to be 100 for region "
+ name)
.isEqualTo("100");
assertThat(attr.getRegionIdleTime().getAction())
.describedAs("Expecting region idle time expiration action to be "
+ "local-destroy for region " + name)
.isEqualTo("local-destroy");
assertThat(attr.getRegionTimeToLive().getTimeout())
.describedAs("Expecting region idle time timeout to be 200 for "
+ "region " + name)
.isEqualTo("200");
assertThat(attr.getRegionTimeToLive().getAction())
.describedAs("Expecting region ttl action to be local-destroy for "
+ "region " + name)
.isEqualTo("local-destroy");
assertThat(attr.getValueConstraint())
.describedAs("Expecting value constraint to be Object.class for "
+ "region " + name)
.isEqualTo(Object.class.getName());
});
});
}
@Test
public void createRegionDoesNotPersistEmptyOrDefaultEvictionAttributes() {
String regionName = testName.getMethodName();
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=REPLICATE").statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(1);
List<String> regionNames = Arrays.asList(regionName);
regionNames.forEach(name -> {
RegionConfig regionConfig = CacheElement.findElement(config.getRegions(), name);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(name);
assertThat(regionConfig.getRegionAttributes()).isNotNull();
RegionAttributesType attr = regionConfig.getRegionAttributes();
assertThat(attr.getEvictionAttributes())
.describedAs("Eviction attributes should be null for " + name)
.isNull();
});
});
}
@Test
public void createRegionPersistsAEQConfig() {
String queueId = "queue1";
gfsh.executeAndAssertThat(
"create async-event-queue --id=" + queueId
+ " --listener=" + CreateRegionCommandDUnitTest.DummyAEQListener.class.getName())
.statusIsSuccess();
String regionName = testName.getMethodName();
gfsh.executeAndAssertThat(
"create region --name=" + regionName
+ " --type=REPLICATE"
+ " --async-event-queue-id=" + queueId)
.statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(1);
RegionConfig regionConfig = CacheElement.findElement(regions, regionName);
assertThat(regionConfig.getRegionAttributes().getAsyncEventQueueIds())
.contains(queueId);
});
}
@Test
public void createRegionWithColocation() {
String regionName = testName.getMethodName();
String colocatedRegionName = regionName + "-colocated";
String colocatedRegionFromTemplateName = colocatedRegionName + "-from-template";
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=PARTITION_REDUNDANT").statusIsSuccess();
gfsh.executeAndAssertThat("create region"
+ " --name=" + colocatedRegionName
+ " --colocated-with=" + regionName
+ " --type=PARTITION_REDUNDANT").statusIsSuccess();
gfsh.executeAndAssertThat("create region"
+ " --name=" + colocatedRegionFromTemplateName
+ " --template-region=" + colocatedRegionName).statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(3);
RegionConfig colocatedConfig = CacheElement.findElement(regions, colocatedRegionName);
assertThat(
colocatedConfig.getRegionAttributes().getPartitionAttributes().getColocatedWith())
.isEqualTo("/" + regionName);
RegionConfig colocatedConfigFromTemplate = CacheElement.findElement(regions,
colocatedRegionFromTemplateName);
assertThat(
colocatedConfigFromTemplate.getRegionAttributes().getPartitionAttributes()
.getColocatedWith())
.isEqualTo("/" + regionName);
});
}
@Test
public void createRegionPersistsDiskstores() throws Exception {
String regionName = testName.getMethodName();
String store = "Store1";
gfsh.executeAndAssertThat("create disk-store"
+ " --name=" + store
+ " --dir=/tmp/foo").statusIsSuccess();
// Give disk store time to get created
Thread.sleep(2000);
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=REPLICATE_PERSISTENT"
+ " --disk-store=" + store
+ " --enable-synchronous-disk=true").statusIsSuccess();
String regionNameFromTemplate = regionName + "-from-template";
gfsh.executeAndAssertThat("create region --name=" + regionNameFromTemplate
+ " --template-region=" + regionName)
.statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(2);
List<String> regionNames = Arrays.asList(regionName, regionNameFromTemplate);
regionNames.forEach(name -> {
RegionConfig regionConfig = CacheElement.findElement(config.getRegions(), name);
assertThat(regionConfig.getName()).isEqualTo(name);
RegionAttributesType regionAttributes = regionConfig.getRegionAttributes();
assertThat(regionAttributes.getDiskStoreName())
.isEqualTo(store);
assertThat(regionAttributes.isDiskSynchronous())
.isTrue();
});
});
}
@Test
public void createRegionPersistsPartitionAttributes() {
String regionName = testName.getMethodName();
String regionFromTemplateName = regionName + "-from-template";
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=PARTITION"
+ " --recovery-delay=1"
+ " --local-max-memory=1000"
+ " --redundant-copies=1"
+ " --startup-recovery-delay=1"
+ " --total-max-memory=100"
+ " --total-num-buckets=1").statusIsSuccess();
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionFromTemplateName
+ " --template-region=" + regionName).statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(2);
List<String> regionNames = Arrays.asList(regionName, regionFromTemplateName);
regionNames.forEach(name -> {
RegionConfig regionConfig = CacheElement.findElement(config.getRegions(), name);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(name);
RegionAttributesType regionAttributes = regionConfig.getRegionAttributes();
RegionAttributesType.PartitionAttributes partitionAttributes =
regionAttributes.getPartitionAttributes();
assertThat(partitionAttributes.getRecoveryDelay())
.describedAs("Recovery delay should be 1 for region " + name)
.isEqualTo("1");
assertThat(partitionAttributes.getLocalMaxMemory())
.describedAs("Local max memory should be 1000 for region " + name)
.isEqualTo("1000");
assertThat(partitionAttributes.getRedundantCopies())
.describedAs("Redundant copies should be 1 for region " + name)
.isEqualTo("1");
assertThat(partitionAttributes.getStartupRecoveryDelay())
.describedAs("Startup recovery delay should be 1 for region " + name)
.isEqualTo("1");
assertThat(partitionAttributes.getTotalMaxMemory())
.describedAs("Total max memory should be 100 for region " + name)
.isEqualTo("100");
assertThat(partitionAttributes.getTotalNumBuckets())
.describedAs("Total num buckets should be 1 for region " + name)
.isEqualTo("1");
});
});
}
@Test
public void createRegionPersistsPartitionResolver() {
String regionName = testName.getMethodName();
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=PARTITION"
+ " --partition-resolver=" + DummyPartitionResolver.class.getName()).statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(1);
RegionConfig regionConfig = CacheElement.findElement(config.getRegions(), regionName);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(regionName);
RegionAttributesType regionAttributes = regionConfig.getRegionAttributes();
RegionAttributesType.PartitionAttributes partitionAttributes =
regionAttributes.getPartitionAttributes();
assertThat(partitionAttributes.getPartitionResolver().getClassName())
.isEqualTo(DummyPartitionResolver.class.getName());
});
}
@Test
public void createRegionDoesNotPersistEmptyOrDefaultPartitionAttributes() {
String regionName = testName.getMethodName();
String regionFromTemplateName = regionName + "-from-template";
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=REPLICATE").statusIsSuccess();
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionFromTemplateName
+ " --template-region=" + regionName);
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(2);
RegionConfig regionConfig =
CacheElement.findElement(config.getRegions(), regionFromTemplateName);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(regionFromTemplateName);
assertThat(regionConfig.getRegionAttributes()).isNotNull();
RegionAttributesType attr = regionConfig.getRegionAttributes();
assertThat(attr.getPartitionAttributes())
.describedAs("Partition attributes should be null for " + regionFromTemplateName)
.isNull();
});
}
@Test
public void createRegionDoestNotPersistEmptyOrDefaultExpirationAttributes() {
String regionName = testName.getMethodName();
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=REPLICATE").statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(1);
RegionConfig regionConfig =
CacheElement.findElement(config.getRegions(), regionName);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(regionName);
assertThat(regionConfig.getRegionAttributes()).isNotNull();
RegionAttributesType attr = regionConfig.getRegionAttributes();
assertThat(attr.getRegionTimeToLive())
.describedAs("Expiration attributes should be null for " + regionName)
.isNull();
assertThat(attr.getRegionIdleTime())
.describedAs("Expiration attributes should be null for " + regionName)
.isNull();
assertThat(attr.getEntryIdleTime())
.describedAs("Expiration attributes should be null for " + regionName)
.isNull();
assertThat(attr.getEntryTimeToLive())
.describedAs("Expiration attributes should be null for " + regionName)
.isNull();
});
}
@Test
public void createRegionPersistsDisableCloningSetting() {
String regionName = testName.getMethodName();
String regionFromTemplateName = regionName + "-from-template";
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=REPLICATE"
+ " --enable-cloning=false").statusIsSuccess();
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionFromTemplateName
+ " --template-region=" + regionName);
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(2);
List<String> regionNames = Arrays.asList(regionName, regionFromTemplateName);
regionNames.forEach(name -> {
RegionConfig regionConfig = CacheElement.findElement(config.getRegions(), name);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(name);
assertThat(regionConfig.getRegionAttributes()).isNotNull();
RegionAttributesType attr = regionConfig.getRegionAttributes();
assertThat(attr.isCloningEnabled())
.describedAs("Cloning should be disabled for " + name)
.isFalse();
});
});
}
@Test
public void createRegionPersistsCustomExpiryClass() {
String regionName = testName.getMethodName();
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=REPLICATE"
+ " --enable-statistics=true"
+ " --entry-idle-time-custom-expiry=" + DummyCustomExpiry.class.getName())
.statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(1);
RegionConfig regionConfig = CacheElement.findElement(config.getRegions(), regionName);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(regionName);
assertThat(regionConfig.getRegionAttributes()).isNotNull();
RegionAttributesType attr = regionConfig.getRegionAttributes();
assertThat(attr.getEntryIdleTime().getCustomExpiry().toString())
.describedAs("Entry expiration custom expiration should be DummyCustomExpiry")
.isEqualTo(DummyCustomExpiry.class.getName());
});
}
@Test
public void createRegionPersistsDataPolicy() {
String regionName = testName.getMethodName();
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=PARTITION")
.statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(1);
RegionConfig regionConfig = CacheElement.findElement(config.getRegions(), regionName);
assertThat(regionConfig).isNotNull();
assertThat(regionConfig.getName()).isEqualTo(regionName);
assertThat(regionConfig.getRegionAttributes()).isNotNull();
RegionAttributesType attr = regionConfig.getRegionAttributes();
assertThat(attr.getDataPolicy())
.describedAs("Data policy for partitioned region should be persisted correctly")
.isEqualTo(RegionAttributesDataPolicy.PARTITION);
});
}
@Test
public void createRegionPersistsScope() {
String regionName = testName.getMethodName();
String regionName2 = regionName + "2";
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName
+ " --type=PARTITION")
.statusIsSuccess();
gfsh.executeAndAssertThat("create region"
+ " --name=" + regionName2
+ " --type=REPLICATE")
.statusIsSuccess();
locator.invoke(() -> {
InternalConfigurationPersistenceService cc =
ClusterStartupRule.getLocator().getConfigurationPersistenceService();
CacheConfig config = cc.getCacheConfig("cluster");
List<RegionConfig> regions = config.getRegions();
assertThat(regions).isNotEmpty();
assertThat(regions).hasSize(2);
RegionConfig regionConfig1 = CacheElement.findElement(config.getRegions(), regionName);
assertThat(regionConfig1).isNotNull();
assertThat(regionConfig1.getName()).isEqualTo(regionName);
assertThat(regionConfig1.getRegionAttributes()).isNotNull();
RegionAttributesType attr1 = regionConfig1.getRegionAttributes();
assertThat(attr1.getScope())
.describedAs("Scope for partitioned region should be null")
.isNull();
RegionConfig regionConfig2 = CacheElement.findElement(config.getRegions(), regionName2);
assertThat(regionConfig2).isNotNull();
assertThat(regionConfig2.getName()).isEqualTo(regionName2);
assertThat(regionConfig2.getRegionAttributes()).isNotNull();
RegionAttributesType attr2 = regionConfig2.getRegionAttributes();
assertThat(attr2.getScope())
.describedAs(
"Scope for replicated region should be persisted as distributed-ack by default")
.isEqualTo(RegionAttributesScope.DISTRIBUTED_ACK);
});
}
}