Skip to content

Commit 0830cc7

Browse files
committed
New logic to check for conflicting indices before enabling streams plus tests
1 parent 01c6dda commit 0830cc7

File tree

3 files changed

+54
-7
lines changed

3 files changed

+54
-7
lines changed

modules/streams/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ esplugin {
2020

2121
restResources {
2222
restApi {
23-
include '_common', 'streams'
23+
include '_common', 'streams', 'indices'
2424
}
2525
}
2626

modules/streams/src/main/java/org/elasticsearch/rest/streams/logs/TransportLogsStreamsToggleActivation.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import org.apache.logging.log4j.LogManager;
1313
import org.apache.logging.log4j.Logger;
14+
import org.elasticsearch.ElasticsearchStatusException;
1415
import org.elasticsearch.action.ActionListener;
1516
import org.elasticsearch.action.support.ActionFilters;
1617
import org.elasticsearch.action.support.master.AcknowledgedRequest;
@@ -22,16 +23,19 @@
2223
import org.elasticsearch.cluster.block.ClusterBlockException;
2324
import org.elasticsearch.cluster.block.ClusterBlockLevel;
2425
import org.elasticsearch.cluster.metadata.ProjectId;
26+
import org.elasticsearch.cluster.metadata.ProjectMetadata;
2527
import org.elasticsearch.cluster.metadata.StreamsMetadata;
2628
import org.elasticsearch.cluster.project.ProjectResolver;
2729
import org.elasticsearch.cluster.service.ClusterService;
2830
import org.elasticsearch.cluster.service.MasterServiceTaskQueue;
2931
import org.elasticsearch.common.Priority;
3032
import org.elasticsearch.injection.guice.Inject;
33+
import org.elasticsearch.rest.RestStatus;
3134
import org.elasticsearch.tasks.Task;
3235
import org.elasticsearch.threadpool.ThreadPool;
3336
import org.elasticsearch.transport.TransportService;
3437

38+
import java.util.Arrays;
3539
import java.util.Locale;
3640

3741
/**
@@ -77,17 +81,34 @@ protected void masterOperation(
7781
ActionListener<AcknowledgedResponse> listener
7882
) throws Exception {
7983
ProjectId projectId = projectResolver.getProjectId();
80-
StreamsMetadata streamsState = state.metadata().getProject(projectId).custom(StreamsMetadata.TYPE, StreamsMetadata.EMPTY);
84+
ProjectMetadata projectMetadata = state.metadata().getProject(projectId);
85+
StreamsMetadata streamsState = projectMetadata.custom(StreamsMetadata.TYPE, StreamsMetadata.EMPTY);
8186
boolean currentlyEnabled = streamsState.isLogsEnabled();
8287
boolean shouldEnable = request.shouldEnable();
83-
if (shouldEnable != currentlyEnabled) {
84-
StreamsMetadataUpdateTask updateTask = new StreamsMetadataUpdateTask(request, listener, projectId, shouldEnable);
85-
String taskName = String.format(Locale.ROOT, "enable-streams-logs-[%s]", shouldEnable ? "enable" : "disable");
86-
taskQueue.submitTask(taskName, updateTask, updateTask.timeout());
87-
} else {
88+
89+
if (shouldEnable == currentlyEnabled) {
8890
logger.debug("Logs streams are already in the requested state: {}", shouldEnable);
8991
listener.onResponse(AcknowledgedResponse.TRUE);
92+
return;
93+
}
94+
95+
if (shouldEnable && logsIndexExists(projectMetadata)) {
96+
listener.onFailure(
97+
new ElasticsearchStatusException(
98+
"Cannot enable logs streams: indices named 'logs' or starting with 'logs.' already exist.",
99+
RestStatus.CONFLICT
100+
)
101+
);
102+
return;
90103
}
104+
105+
StreamsMetadataUpdateTask updateTask = new StreamsMetadataUpdateTask(request, listener, projectId, shouldEnable);
106+
String taskName = String.format(Locale.ROOT, "enable-streams-logs-[%s]", shouldEnable ? "enable" : "disable");
107+
taskQueue.submitTask(taskName, updateTask, updateTask.timeout());
108+
}
109+
110+
private boolean logsIndexExists(ProjectMetadata projectMetadata) {
111+
return Arrays.stream(projectMetadata.getConcreteAllIndices()).anyMatch(name -> name.equals("logs") || name.startsWith("logs."));
91112
}
92113

93114
@Override

modules/streams/src/yamlRestTest/resources/rest-api-spec/test/streams/logs/10_basic.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,29 @@
4141
- do:
4242
streams.status: { }
4343
- is_true: logs.enabled
44+
45+
---
46+
"Check streams can't be enabled with existing logs indices":
47+
- do:
48+
indices.create:
49+
index: logs
50+
- do:
51+
catch: conflict
52+
streams.logs_enable: { }
53+
- match: { error.reason: "Cannot enable logs streams: indices named 'logs' or starting with 'logs.' already exist." }
54+
55+
- do:
56+
indices.delete:
57+
index: logs
58+
59+
- do:
60+
indices.create:
61+
index: logs.test
62+
- do:
63+
catch: conflict
64+
streams.logs_enable: { }
65+
- match: { error.reason: "Cannot enable logs streams: indices named 'logs' or starting with 'logs.' already exist." }
66+
67+
- do:
68+
indices.delete:
69+
index: logs.test

0 commit comments

Comments
 (0)