DataNode: RemoteReindex backend impl (#17485)

* Remote Reindex Backend

* fixing missing classes

* Added integration test for remote reindex migration

---------

Co-authored-by: Tomas Dvorak <tomas.dvorak@graylog.com>
This commit is contained in:
Jan Heise
2024-01-15 09:41:02 +01:00
committed by GitHub
parent fb4b721e89
commit 8039e214cc
17 changed files with 663 additions and 9 deletions

View File

@@ -26,6 +26,7 @@ import org.graylog2.cluster.nodes.DataNodeDto;
import org.graylog2.cluster.nodes.NodeService;
import org.graylog2.cluster.preflight.DataNodeProvisioningStateChangeEvent;
import org.graylog2.datanode.DataNodeLifecycleEvent;
import org.graylog2.datanode.RemoteReindexAllowlistEvent;
import org.graylog2.plugin.system.NodeId;
import org.graylog2.security.CustomCAX509TrustManager;
import org.slf4j.Logger;
@@ -34,6 +35,8 @@ import org.slf4j.LoggerFactory;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import java.util.HashMap;
import java.util.Map;
@Singleton
public class OpensearchProcessService extends AbstractIdleService implements Provider<OpensearchProcess> {
@@ -70,6 +73,16 @@ public class OpensearchProcessService extends AbstractIdleService implements Pro
return process;
}
@Subscribe
@SuppressWarnings("unused")
public void handleRemoteReindexAllowlistEvent(RemoteReindexAllowlistEvent event) {
switch (event.action()) {
case ADD ->
startWithConfig(Map.of("reindex.remote.whitelist", event.host())); // , "action.auto_create_index", "false"));
case REMOVE -> startWithConfig();
}
}
@Subscribe
@SuppressWarnings("unused")
public void handlePreflightConfigEvent(DataNodeProvisioningStateChangeEvent event) {
@@ -97,19 +110,42 @@ public class OpensearchProcessService extends AbstractIdleService implements Pro
}
private void startWithConfig() {
final OpensearchConfiguration config = configurationProvider.get();
this.startWithConfig(Map.of());
}
private void startWithConfig(Map<String, String> additionalConfig) {
final OpensearchConfiguration original = configurationProvider.get();
final var finalAdditionalConfig = new HashMap<String, String>();
finalAdditionalConfig.putAll(original.additionalConfiguration());
finalAdditionalConfig.putAll(additionalConfig);
final var config = new OpensearchConfiguration(
original.opensearchDistribution(),
original.datanodeDirectories(),
original.bindAddress(),
original.hostname(),
original.httpPort(),
original.transportPort(),
original.clusterName(),
original.nodeName(),
original.nodeRoles(),
original.discoverySeedHosts(),
original.opensearchSecurityConfiguration(),
finalAdditionalConfig);
if (config.securityConfigured()) {
this.process.startWithConfig(config);
} else {
String noConfigMessage = """
\n
========================================================================================================
It seems you are starting Data node for the first time. The current configuration is not sufficient to
start the indexer process because a security configuration is missing. You have to either provide http
and transport SSL certificates or use the Graylog preflight interface to configure this Data node remotely.
========================================================================================================
""";
\n
========================================================================================================
It seems you are starting Data node for the first time. The current configuration is not sufficient to
start the indexer process because a security configuration is missing. You have to either provide http
and transport SSL certificates or use the Graylog preflight interface to configure this Data node remotely.
========================================================================================================
""";
LOG.info(noConfigMessage);
}
eventBus.post(new OpensearchConfigurationChangeEvent(config));