|
@@ -11,6 +11,7 @@ package org.elasticsearch.rest.streams.logs;
|
|
|
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
|
import org.apache.logging.log4j.Logger;
|
|
|
+import org.elasticsearch.ElasticsearchStatusException;
|
|
|
import org.elasticsearch.action.ActionListener;
|
|
|
import org.elasticsearch.action.support.ActionFilters;
|
|
|
import org.elasticsearch.action.support.master.AcknowledgedRequest;
|
|
@@ -22,12 +23,15 @@ import org.elasticsearch.cluster.SequentialAckingBatchedTaskExecutor;
|
|
|
import org.elasticsearch.cluster.block.ClusterBlockException;
|
|
|
import org.elasticsearch.cluster.block.ClusterBlockLevel;
|
|
|
import org.elasticsearch.cluster.metadata.ProjectId;
|
|
|
+import org.elasticsearch.cluster.metadata.ProjectMetadata;
|
|
|
import org.elasticsearch.cluster.metadata.StreamsMetadata;
|
|
|
import org.elasticsearch.cluster.project.ProjectResolver;
|
|
|
import org.elasticsearch.cluster.service.ClusterService;
|
|
|
import org.elasticsearch.cluster.service.MasterServiceTaskQueue;
|
|
|
import org.elasticsearch.common.Priority;
|
|
|
+import org.elasticsearch.common.streams.StreamType;
|
|
|
import org.elasticsearch.injection.guice.Inject;
|
|
|
+import org.elasticsearch.rest.RestStatus;
|
|
|
import org.elasticsearch.tasks.Task;
|
|
|
import org.elasticsearch.threadpool.ThreadPool;
|
|
|
import org.elasticsearch.transport.TransportService;
|
|
@@ -75,19 +79,45 @@ public class TransportLogsStreamsToggleActivation extends AcknowledgedTransportM
|
|
|
LogsStreamsActivationToggleAction.Request request,
|
|
|
ClusterState state,
|
|
|
ActionListener<AcknowledgedResponse> listener
|
|
|
- ) throws Exception {
|
|
|
+ ) {
|
|
|
ProjectId projectId = projectResolver.getProjectId();
|
|
|
- StreamsMetadata streamsState = state.metadata().getProject(projectId).custom(StreamsMetadata.TYPE, StreamsMetadata.EMPTY);
|
|
|
+ ProjectMetadata projectMetadata = state.metadata().getProject(projectId);
|
|
|
+ StreamsMetadata streamsState = projectMetadata.custom(StreamsMetadata.TYPE, StreamsMetadata.EMPTY);
|
|
|
boolean currentlyEnabled = streamsState.isLogsEnabled();
|
|
|
boolean shouldEnable = request.shouldEnable();
|
|
|
- if (shouldEnable != currentlyEnabled) {
|
|
|
- StreamsMetadataUpdateTask updateTask = new StreamsMetadataUpdateTask(request, listener, projectId, shouldEnable);
|
|
|
- String taskName = String.format(Locale.ROOT, "enable-streams-logs-[%s]", shouldEnable ? "enable" : "disable");
|
|
|
- taskQueue.submitTask(taskName, updateTask, updateTask.timeout());
|
|
|
- } else {
|
|
|
+
|
|
|
+ if (shouldEnable == currentlyEnabled) {
|
|
|
logger.debug("Logs streams are already in the requested state: {}", shouldEnable);
|
|
|
listener.onResponse(AcknowledgedResponse.TRUE);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (shouldEnable && logsIndexExists(projectMetadata)) {
|
|
|
+ listener.onFailure(
|
|
|
+ new ElasticsearchStatusException(
|
|
|
+ "Cannot enable logs streams: indices named 'logs' or starting with 'logs.' already exist.",
|
|
|
+ RestStatus.CONFLICT
|
|
|
+ )
|
|
|
+ );
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ StreamsMetadataUpdateTask updateTask = new StreamsMetadataUpdateTask(request, listener, projectId, shouldEnable);
|
|
|
+ String taskName = String.format(Locale.ROOT, "enable-streams-logs-[%s]", shouldEnable ? "enable" : "disable");
|
|
|
+ taskQueue.submitTask(taskName, updateTask, updateTask.timeout());
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean logsIndexExists(ProjectMetadata projectMetadata) {
|
|
|
+ String logsStreamName = StreamType.LOGS.getStreamName();
|
|
|
+ String logsStreamPrefix = logsStreamName + ".";
|
|
|
+
|
|
|
+ for (String name : projectMetadata.getConcreteAllIndices()) {
|
|
|
+ if (name.equals(logsStreamName) || name.startsWith(logsStreamPrefix)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -111,7 +141,7 @@ public class TransportLogsStreamsToggleActivation extends AcknowledgedTransportM
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public ClusterState execute(ClusterState currentState) throws Exception {
|
|
|
+ public ClusterState execute(ClusterState currentState) {
|
|
|
return currentState.copyAndUpdateProject(
|
|
|
projectId,
|
|
|
builder -> builder.putCustom(StreamsMetadata.TYPE, new StreamsMetadata(enabled))
|