package org.infinispan.xsite;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
/**
* Abstract test class that allows to create multiple combination of sites and nodes.
* <p>
* So far, each site only has the same number of nodes. But it can modified to support asymmetric number of nodes per
* site.
*
* @author Pedro Ruivo
* @since 8.1
*/
public abstract class AbstractMultipleSitesTest extends AbstractXSiteTest {
//if more sites are needed, you have to update these constants and the configuration file in config/xsite/relay-config.xml
//the SITE_NAME should have the same site name as in configuration
private static final int MAX_NUM_SITE = 3;
private static final String[] SITE_NAME = {"LON", "NYC", "SFO"};
/**
* It returns the number of sites to create.
* <p>
* It may be overwrite for different number of sites needed. The default value is 2 and it the value should be less
* than {@link #MAX_NUM_SITE}.
*/
protected int defaultNumberOfSites() {
return 2;
}
/**
* @return the number of nodes per site.
*/
protected int defaultNumberOfNodes() {
return 2;
}
/**
* The default cache configuration for that site index.
*
* @param siteIndex the site index.
*/
protected ConfigurationBuilder defaultConfigurationForSite(int siteIndex) {
return new ConfigurationBuilder();
}
/**
* The default global configuration for a site.
*
* @param siteIndex the site index.
*/
protected GlobalConfigurationBuilder defaultGlobalConfigurationForSite(int siteIndex) {
GlobalConfigurationBuilder builder = GlobalConfigurationBuilder.defaultClusteredBuilder();
builder.site().localSite(siteName(siteIndex));
return builder;
}
/**
* It converts the site index to a name.
*
* @param siteIndex the site index to be converted.
* @return the site name corresponding to the site index.
*/
protected final String siteName(int siteIndex) {
assertValidSiteIndex(siteIndex);
return SITE_NAME[siteIndex];
}
/**
* Invoked after all the sites and default caches are created.
*/
protected void afterSitesCreated() {
}
@Override
protected void createSites() {
final int numberOfSites = defaultNumberOfSites();
if (numberOfSites <= 0) {
throw new IllegalArgumentException("Default number of sites must be positive.");
} else if (numberOfSites > MAX_NUM_SITE) {
throw new IllegalArgumentException("Default number of sites must be less than the max number of configured sites.");
}
for (int siteIndex = 0; siteIndex < defaultNumberOfSites(); siteIndex++) {
createSite(siteName(siteIndex), defaultNumberOfNodes(), defaultGlobalConfigurationForSite(siteIndex), defaultConfigurationForSite(siteIndex));
}
afterSitesCreated();
}
private void assertValidSiteIndex(int index) {
if (index < 0) {
throw new IllegalArgumentException("Site index must be positive or zero.");
} else if (index >= MAX_NUM_SITE) {
throw new IllegalArgumentException("Site index must be less than the max number of configured sites.");
} else if (index >= defaultNumberOfSites()) {
throw new IllegalArgumentException("Site index must be less than the number of sites configured.");
}
}
protected static void defineInSite(TestSite site, String cacheName, Configuration configuration) {
site.cacheManagers().forEach(cacheManager -> cacheManager.defineConfiguration(cacheName, configuration));
}
}