WIP: cluster integration tests

Original commit: elastic/x-pack-elasticsearch@99d055e04f
This commit is contained in:
Areek Zillur 2014-10-30 17:29:55 -04:00
parent d518cd86db
commit 1b9f069837
4 changed files with 105 additions and 61 deletions

View File

@ -654,9 +654,8 @@ public class LicensesService extends AbstractLifecycleComponent<LicensesService>
@Override
public void run() {
if (logger.isTraceEnabled()) {
logger.trace("Performing LicensingClientNotificationJob");
}
logger.info("Performing LicensingClientNotificationJob");
// next clusterChanged event will deal with the missed notifications
if (!clusterService.state().blocks().hasGlobalBlock(GatewayService.STATE_NOT_RECOVERED_BLOCK)) {
@ -669,6 +668,8 @@ public class LicensesService extends AbstractLifecycleComponent<LicensesService>
logger.info("Reschedule licensing client notification job was rejected", ex);
}
}
} else {
logger.info("skip notification [STATE_NOT_RECOVERED_BLOCK]");
}
}
}

View File

@ -10,19 +10,24 @@ import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.ProcessedClusterStateUpdateTask;
import org.elasticsearch.cluster.metadata.MetaData;
import org.elasticsearch.common.Nullable;
import org.elasticsearch.common.base.Predicate;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.license.core.ESLicense;
import org.elasticsearch.license.licensor.ESLicenseSigner;
import org.elasticsearch.license.plugin.core.LicensesManagerService;
import org.elasticsearch.license.plugin.core.LicensesMetaData;
import org.elasticsearch.test.ElasticsearchIntegrationTest;
import org.elasticsearch.test.InternalTestCluster;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static org.elasticsearch.license.AbstractLicensingTestBase.getTestPriKeyPath;
import static org.elasticsearch.license.AbstractLicensingTestBase.getTestPubKeyPath;
import static org.hamcrest.CoreMatchers.equalTo;
/**
*/
@ -82,4 +87,57 @@ public abstract class AbstractLicensesIntegrationTests extends ElasticsearchInte
ESLicenseSigner signer = new ESLicenseSigner(getTestPriKeyPath(), getTestPubKeyPath());
return signer.sign(licenseSpec);
}
protected void assertLicenseManagerEnabledFeatureFor(final String feature) throws InterruptedException {
assertLicenseManagerStatusFor(feature, true);
}
protected void assertLicenseManagerDisabledFeatureFor(final String feature) throws InterruptedException {
assertLicenseManagerStatusFor(feature, false);
}
protected void assertLicenseManagerStatusFor(final String feature, final boolean expectedEnabled) throws InterruptedException {
assertThat(awaitBusy(new Predicate<Object>() {
@Override
public boolean apply(Object o) {
for (LicensesManagerService managerService : licensesManagerServices()) {
if (expectedEnabled != managerService.enabledFeatures().contains(feature)) {
return false;
}
}
return true;
}
}, 2, TimeUnit.SECONDS), equalTo(true));
}
protected void assertConsumerPluginDisableNotification(int timeoutInSec) throws InterruptedException {
assertConsumerPluginNotification(false, timeoutInSec);
}
protected void assertConsumerPluginEnableNotification(int timeoutInSec) throws InterruptedException {
assertConsumerPluginNotification(true, timeoutInSec);
}
protected void assertConsumerPluginNotification(final boolean expectedEnabled, int timeoutInSec) throws InterruptedException {
assertThat(awaitBusy(new Predicate<Object>() {
@Override
public boolean apply(Object o) {
for (TestPluginService pluginService : consumerPluginServices()) {
if (expectedEnabled != pluginService.enabled()) {
return false;
}
}
return true;
}
}, timeoutInSec, TimeUnit.SECONDS), equalTo(true));
}
private Iterable<TestPluginService> consumerPluginServices() {
final InternalTestCluster clients = internalCluster();
return clients.getDataNodeInstances(TestPluginService.class);
}
private Iterable<LicensesManagerService> licensesManagerServices() {
final InternalTestCluster clients = internalCluster();
return clients.getDataNodeInstances(LicensesManagerService.class);
}
}

View File

@ -124,58 +124,6 @@ public class LicensesPluginIntegrationTests extends AbstractLicensesIntegrationT
assertLicenseManagerDisabledFeatureFor(TestPluginService.FEATURE_NAME);
}
private void assertLicenseManagerEnabledFeatureFor(final String feature) throws InterruptedException {
assertLicenseManagerStatusFor(feature, true);
}
private void assertLicenseManagerDisabledFeatureFor(final String feature) throws InterruptedException {
assertLicenseManagerStatusFor(feature, false);
}
private void assertLicenseManagerStatusFor(final String feature, final boolean expectedEnabled) throws InterruptedException {
assertThat(awaitBusy(new Predicate<Object>() {
@Override
public boolean apply(Object o) {
for (LicensesManagerService managerService : licensesManagerServices()) {
if (expectedEnabled != managerService.enabledFeatures().contains(feature)) {
return false;
}
}
return true;
}
}, 2, TimeUnit.SECONDS), equalTo(true));
}
private void assertConsumerPluginDisableNotification(int timeoutInSec) throws InterruptedException {
assertConsumerPluginNotification(false, timeoutInSec);
}
private void assertConsumerPluginEnableNotification(int timeoutInSec) throws InterruptedException {
assertConsumerPluginNotification(true, timeoutInSec);
}
private void assertConsumerPluginNotification(final boolean expectedEnabled, int timeoutInSec) throws InterruptedException {
assertThat(awaitBusy(new Predicate<Object>() {
@Override
public boolean apply(Object o) {
for (TestPluginService pluginService : consumerPluginServices()) {
if (expectedEnabled != pluginService.enabled()) {
return false;
}
}
return true;
}
}, timeoutInSec, TimeUnit.SECONDS), equalTo(true));
}
private Iterable<TestPluginService> consumerPluginServices() {
final InternalTestCluster clients = internalCluster();
return clients.getDataNodeInstances(TestPluginService.class);
}
private Iterable<LicensesManagerService> licensesManagerServices() {
final InternalTestCluster clients = internalCluster();
return clients.getDataNodeInstances(LicensesManagerService.class);
}
private LicensesManagerService masterLicenseManagerService() {
final InternalTestCluster clients = internalCluster();

View File

@ -16,7 +16,9 @@ import org.elasticsearch.license.plugin.action.get.GetLicenseResponse;
import org.elasticsearch.license.plugin.action.put.PutLicenseRequestBuilder;
import org.elasticsearch.license.plugin.action.put.PutLicenseResponse;
import org.elasticsearch.license.plugin.core.LicensesStatus;
import org.elasticsearch.node.internal.InternalNode;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import java.util.Arrays;
@ -26,7 +28,7 @@ import static org.elasticsearch.test.ElasticsearchIntegrationTest.ClusterScope;
import static org.elasticsearch.test.ElasticsearchIntegrationTest.Scope.TEST;
import static org.hamcrest.CoreMatchers.equalTo;
@ClusterScope(scope = TEST, numDataNodes = 0)
@ClusterScope(scope = TEST, numDataNodes = 0, numClientNodes = 0)
public class LicensesServiceClusterRestartTest extends AbstractLicensesIntegrationTests {
@Override
@ -36,11 +38,19 @@ public class LicensesServiceClusterRestartTest extends AbstractLicensesIntegrati
@Override
protected Settings nodeSettings(int nodeOrdinal) {
return nodeSettingsBuilder(nodeOrdinal).build();
}
private ImmutableSettings.Builder nodeSettingsBuilder(int nodeOrdinal) {
return ImmutableSettings.settingsBuilder()
.put(super.nodeSettings(nodeOrdinal))
//.put(super.nodeSettings(nodeOrdinal))
.put("gateway.type", "local")
.put("plugins.load_classpath_plugins", false)
.put("node.data", true)
.put("format", "json")
.build();
.put("test_consumer_plugin.trial_license_duration_in_seconds", 5)
.putArray("plugin.types", LicensePlugin.class.getName(), TestConsumerPlugin.class.getName())
.put(InternalNode.HTTP_ENABLED, true);
}
@Before
@ -48,12 +58,11 @@ public class LicensesServiceClusterRestartTest extends AbstractLicensesIntegrati
wipeAllLicenses();
}
@Test
@Test @Ignore
public void testClusterRestart() throws Exception {
logger.info("--> starting 1 node");
internalCluster().startNode();
internalCluster().startNode(nodeSettingsBuilder(0));
ensureGreen();
wipeAllLicenses();
final List<ESLicense> esLicenses = generateAndPutLicense();
getAndCheckLicense(esLicenses);
@ -64,6 +73,34 @@ public class LicensesServiceClusterRestartTest extends AbstractLicensesIntegrati
getAndCheckLicense(esLicenses);
}
@Test
public void testClusterNotRecovered() throws Exception {
logger.info("--> start 1 node (should not recover)");
internalCluster().startNode(nodeSettingsBuilder(0).put("gateway.recover_after_nodes", 3));
assertLicenseManagerEnabledFeatureFor(TestPluginService.FEATURE_NAME);
assertConsumerPluginEnableNotification(1);
internalCluster().startNode(nodeSettingsBuilder(1).put("gateway.recover_after_nodes", 3));
assertLicenseManagerEnabledFeatureFor(TestPluginService.FEATURE_NAME);
assertConsumerPluginEnableNotification(1);
internalCluster().startNode(nodeSettingsBuilder(2).put("gateway.recover_after_nodes", 3));
assertLicenseManagerEnabledFeatureFor(TestPluginService.FEATURE_NAME);
assertConsumerPluginEnableNotification(1);
internalCluster().stopRandomNonMasterNode();
// sleep for the entire trial license duration
assertLicenseManagerEnabledFeatureFor(TestPluginService.FEATURE_NAME);
assertConsumerPluginEnableNotification(1);
Thread.sleep(5 * 1050l);
internalCluster().startNode(nodeSettingsBuilder(3).put("gateway.recover_after_nodes", 3));
assertLicenseManagerDisabledFeatureFor(TestPluginService.FEATURE_NAME);
assertConsumerPluginDisableNotification(1);
}
private List<ESLicense> generateAndPutLicense() throws Exception {
ClusterAdminClient cluster = internalCluster().client().admin().cluster();
ESLicense license = generateSignedLicense("shield", TimeValue.timeValueMinutes(1));