mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-25 01:19:02 +00:00
[7.x] Delete data stream API accepts multiple names (#59064)
This commit is contained in:
parent
31c71914b7
commit
550dcb0ca6
@ -14,8 +14,8 @@
|
||||
],
|
||||
"parts":{
|
||||
"name":{
|
||||
"type":"string",
|
||||
"description":"The name of the data stream"
|
||||
"type":"list",
|
||||
"description":"A comma-separated list of data streams to delete; use `*` to delete all data streams"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -275,7 +275,7 @@ public class BulkIntegrationIT extends ESIntegTestCase {
|
||||
assertThat(getIndexResponse.getIndices(), hasItemInArray("logs-barfoo2"));
|
||||
assertThat(getIndexResponse.getIndices(), hasItemInArray("logs-barfoo3"));
|
||||
|
||||
DeleteDataStreamAction.Request deleteDSReq = new DeleteDataStreamAction.Request("*");
|
||||
DeleteDataStreamAction.Request deleteDSReq = new DeleteDataStreamAction.Request(new String[]{"*"});
|
||||
client().execute(DeleteDataStreamAction.INSTANCE, deleteDSReq).actionGet();
|
||||
DeleteComposableIndexTemplateAction.Request deleteTemplateRequest = new DeleteComposableIndexTemplateAction.Request("*");
|
||||
client().execute(DeleteComposableIndexTemplateAction.INSTANCE, deleteTemplateRequest).actionGet();
|
||||
|
@ -101,7 +101,7 @@ public class DataStreamIT extends ESIntegTestCase {
|
||||
|
||||
@After
|
||||
public void deleteAllComposableTemplates() {
|
||||
DeleteDataStreamAction.Request deleteDSRequest = new DeleteDataStreamAction.Request("*");
|
||||
DeleteDataStreamAction.Request deleteDSRequest = new DeleteDataStreamAction.Request(new String[]{"*"});
|
||||
client().execute(DeleteDataStreamAction.INSTANCE, deleteDSRequest).actionGet();
|
||||
DeleteComposableIndexTemplateAction.Request deleteTemplateRequest = new DeleteComposableIndexTemplateAction.Request("*");
|
||||
client().execute(DeleteComposableIndexTemplateAction.INSTANCE, deleteTemplateRequest).actionGet();
|
||||
@ -186,7 +186,7 @@ public class DataStreamIT extends ESIntegTestCase {
|
||||
verifyDocs("metrics-bar", numDocsBar + numDocsBar2, 1, 2);
|
||||
verifyDocs("metrics-foo", numDocsFoo + numDocsFoo2, 1, 2);
|
||||
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request("metrics-*");
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request(new String[]{"metrics-*"});
|
||||
client().admin().indices().deleteDataStream(deleteDataStreamRequest).actionGet();
|
||||
getDataStreamResponse = client().admin().indices().getDataStreams(getDataStreamRequest).actionGet();
|
||||
assertThat(getDataStreamResponse.getDataStreams().size(), equalTo(0));
|
||||
@ -329,7 +329,7 @@ public class DataStreamIT extends ESIntegTestCase {
|
||||
indexDocs(dataStreamName, "@timestamp", numDocs2);
|
||||
verifyDocs(dataStreamName, numDocs + numDocs2, 1, 2);
|
||||
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request(dataStreamName);
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request(new String[]{dataStreamName});
|
||||
client().admin().indices().deleteDataStream(deleteDataStreamRequest).actionGet();
|
||||
getDataStreamResponse = client().admin().indices().getDataStreams(getDataStreamRequest).actionGet();
|
||||
assertThat(getDataStreamResponse.getDataStreams().size(), equalTo(0));
|
||||
@ -545,7 +545,7 @@ public class DataStreamIT extends ESIntegTestCase {
|
||||
indexResponse = client().index(indexRequest).actionGet();
|
||||
assertThat(indexResponse.getIndex(), equalTo(DataStream.getDefaultBackingIndexName("logs-foobar", 3)));
|
||||
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request("logs-foobar");
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request(new String[]{"logs-foobar"});
|
||||
client().admin().indices().deleteDataStream(deleteDataStreamRequest).actionGet();
|
||||
}
|
||||
|
||||
@ -581,7 +581,7 @@ public class DataStreamIT extends ESIntegTestCase {
|
||||
assertTrue(rolloverResponse.isRolledOver());
|
||||
assertBackingIndex(DataStream.getDefaultBackingIndexName("logs-foobar", 2), "properties.event.properties.@timestamp");
|
||||
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request("logs-foobar");
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request(new String[]{"logs-foobar"});
|
||||
client().admin().indices().deleteDataStream(deleteDataStreamRequest).actionGet();
|
||||
}
|
||||
|
||||
@ -619,7 +619,7 @@ public class DataStreamIT extends ESIntegTestCase {
|
||||
assertTrue(rolloverResponse.isRolledOver());
|
||||
assertBackingIndex(DataStream.getDefaultBackingIndexName("logs-foobar", 2), "properties.@timestamp", expectedTimestampMapping);
|
||||
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request("logs-foobar");
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request(new String[]{"logs-foobar"});
|
||||
client().admin().indices().deleteDataStream(deleteDataStreamRequest).actionGet();
|
||||
}
|
||||
|
||||
|
@ -100,7 +100,8 @@ public class DataStreamsSnapshotsIT extends AbstractSnapshotIntegTestCase {
|
||||
assertEquals(1, snap.size());
|
||||
assertEquals(Collections.singletonList(DS_BACKING_INDEX_NAME), snap.get(0).indices());
|
||||
|
||||
assertTrue(client.admin().indices().deleteDataStream(new DeleteDataStreamAction.Request("ds")).get().isAcknowledged());
|
||||
assertTrue(client.admin().indices().deleteDataStream(new DeleteDataStreamAction.Request(new String[]{"ds"})).get()
|
||||
.isAcknowledged());
|
||||
|
||||
RestoreSnapshotResponse restoreSnapshotResponse = client.admin().cluster()
|
||||
.prepareRestoreSnapshot(REPO, SNAPSHOT)
|
||||
@ -137,7 +138,7 @@ public class DataStreamsSnapshotsIT extends AbstractSnapshotIntegTestCase {
|
||||
assertEquals(1, snap.size());
|
||||
assertEquals(Collections.singletonList(DS_BACKING_INDEX_NAME), snap.get(0).indices());
|
||||
|
||||
assertAcked(client.admin().indices().deleteDataStream(new DeleteDataStreamAction.Request("*")).get());
|
||||
assertAcked(client.admin().indices().deleteDataStream(new DeleteDataStreamAction.Request(new String[]{"*"})).get());
|
||||
assertAcked(client.admin().indices().prepareDelete("*").setIndicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN_CLOSED_HIDDEN));
|
||||
|
||||
RestoreSnapshotResponse restoreSnapshotResponse = client.admin().cluster()
|
||||
@ -158,7 +159,7 @@ public class DataStreamsSnapshotsIT extends AbstractSnapshotIntegTestCase {
|
||||
assertEquals(1, ds.getDataStreams().get(0).getIndices().size());
|
||||
assertEquals(DS_BACKING_INDEX_NAME, ds.getDataStreams().get(0).getIndices().get(0).getName());
|
||||
|
||||
assertAcked(client().admin().indices().deleteDataStream(new DeleteDataStreamAction.Request("ds")).get());
|
||||
assertAcked(client().admin().indices().deleteDataStream(new DeleteDataStreamAction.Request(new String[]{"ds"})).get());
|
||||
}
|
||||
|
||||
public void testRename() throws Exception {
|
||||
@ -194,6 +195,82 @@ public class DataStreamsSnapshotsIT extends AbstractSnapshotIntegTestCase {
|
||||
assertEquals(DOCUMENT_SOURCE, client.prepareGet(DS2_BACKING_INDEX_NAME, "_doc", id).get().getSourceAsMap());
|
||||
}
|
||||
|
||||
public void testBackingIndexIsNotRenamedWhenRestoringDataStream() {
|
||||
CreateSnapshotResponse createSnapshotResponse = client.admin().cluster()
|
||||
.prepareCreateSnapshot(REPO, SNAPSHOT)
|
||||
.setWaitForCompletion(true)
|
||||
.setIndices("ds")
|
||||
.setIncludeGlobalState(false)
|
||||
.get();
|
||||
|
||||
RestStatus status = createSnapshotResponse.getSnapshotInfo().status();
|
||||
assertEquals(RestStatus.OK, status);
|
||||
|
||||
expectThrows(SnapshotRestoreException.class, () -> client.admin().cluster()
|
||||
.prepareRestoreSnapshot(REPO, SNAPSHOT)
|
||||
.setWaitForCompletion(true)
|
||||
.setIndices("ds")
|
||||
.get());
|
||||
|
||||
// delete data stream
|
||||
client.admin().indices().deleteDataStream(new DeleteDataStreamAction.Request(new String[]{"ds"})).actionGet();
|
||||
|
||||
// restore data stream attempting to rename the backing index
|
||||
RestoreSnapshotResponse restoreSnapshotResponse = client.admin().cluster()
|
||||
.prepareRestoreSnapshot(REPO, SNAPSHOT)
|
||||
.setWaitForCompletion(true)
|
||||
.setIndices("ds")
|
||||
.setRenamePattern(DS_BACKING_INDEX_NAME)
|
||||
.setRenameReplacement("new_index_name")
|
||||
.get();
|
||||
|
||||
assertThat(restoreSnapshotResponse.status(), is(RestStatus.OK));
|
||||
|
||||
GetDataStreamAction.Request getDSRequest = new GetDataStreamAction.Request("ds");
|
||||
GetDataStreamAction.Response response = client.admin().indices().getDataStreams(getDSRequest).actionGet();
|
||||
assertThat(response.getDataStreams().get(0).getIndices().get(0).getName(), is(DS_BACKING_INDEX_NAME));
|
||||
}
|
||||
|
||||
public void testDataStreamAndBackingIndidcesAreRenamedUsingRegex() {
|
||||
CreateSnapshotResponse createSnapshotResponse = client.admin().cluster()
|
||||
.prepareCreateSnapshot(REPO, SNAPSHOT)
|
||||
.setWaitForCompletion(true)
|
||||
.setIndices("ds")
|
||||
.setIncludeGlobalState(false)
|
||||
.get();
|
||||
|
||||
RestStatus status = createSnapshotResponse.getSnapshotInfo().status();
|
||||
assertEquals(RestStatus.OK, status);
|
||||
|
||||
expectThrows(SnapshotRestoreException.class, () -> client.admin().cluster()
|
||||
.prepareRestoreSnapshot(REPO, SNAPSHOT)
|
||||
.setWaitForCompletion(true)
|
||||
.setIndices("ds")
|
||||
.get());
|
||||
|
||||
// restore data stream attempting to rename the backing index
|
||||
RestoreSnapshotResponse restoreSnapshotResponse = client.admin().cluster()
|
||||
.prepareRestoreSnapshot(REPO, SNAPSHOT)
|
||||
.setWaitForCompletion(true)
|
||||
.setIndices("ds")
|
||||
.setRenamePattern("(.+)")
|
||||
.setRenameReplacement("test-$1")
|
||||
.get();
|
||||
|
||||
assertThat(restoreSnapshotResponse.status(), is(RestStatus.OK));
|
||||
|
||||
// assert "ds" was restored as "test-ds" and the backing index has a valid name
|
||||
GetDataStreamAction.Request getRenamedDS = new GetDataStreamAction.Request("test-ds");
|
||||
GetDataStreamAction.Response response = client.admin().indices().getDataStreams(getRenamedDS).actionGet();
|
||||
assertThat(response.getDataStreams().get(0).getIndices().get(0).getName(),
|
||||
is(DataStream.getDefaultBackingIndexName("test-ds", 1L)));
|
||||
|
||||
// data stream "ds" should still exist in the system
|
||||
GetDataStreamAction.Request getDSRequest = new GetDataStreamAction.Request("ds");
|
||||
response = client.admin().indices().getDataStreams(getDSRequest).actionGet();
|
||||
assertThat(response.getDataStreams().get(0).getIndices().get(0).getName(), is(DS_BACKING_INDEX_NAME));
|
||||
}
|
||||
|
||||
public void testWildcards() throws Exception {
|
||||
CreateSnapshotResponse createSnapshotResponse = client.admin().cluster()
|
||||
.prepareCreateSnapshot(REPO, "snap2")
|
||||
@ -249,7 +326,8 @@ public class DataStreamsSnapshotsIT extends AbstractSnapshotIntegTestCase {
|
||||
RestStatus status = createSnapshotResponse.getSnapshotInfo().status();
|
||||
assertEquals(RestStatus.OK, status);
|
||||
|
||||
assertTrue(client.admin().indices().deleteDataStream(new DeleteDataStreamAction.Request("ds")).get().isAcknowledged());
|
||||
assertTrue(client.admin().indices().deleteDataStream(new DeleteDataStreamAction.Request(new String[]{"ds"})).get()
|
||||
.isAcknowledged());
|
||||
|
||||
RestoreSnapshotResponse restoreSnapshotResponse = client.admin().cluster()
|
||||
.prepareRestoreSnapshot(REPO, "snap2")
|
||||
@ -274,7 +352,7 @@ public class DataStreamsSnapshotsIT extends AbstractSnapshotIntegTestCase {
|
||||
assertThat(createSnapshotResponse.getSnapshotInfo().state(), is(SnapshotState.SUCCESS));
|
||||
|
||||
assertThat(client().admin().indices()
|
||||
.deleteDataStream(new DeleteDataStreamAction.Request("*")).get().isAcknowledged(), is(true));
|
||||
.deleteDataStream(new DeleteDataStreamAction.Request(new String[]{"*"})).get().isAcknowledged(), is(true));
|
||||
|
||||
final RestoreSnapshotResponse restoreSnapshotResponse =
|
||||
client().admin().cluster().prepareRestoreSnapshot(REPO, snapshotName).get();
|
||||
|
@ -2269,7 +2269,7 @@ public class SharedClusterSnapshotRestoreIT extends AbstractSnapshotIntegTestCas
|
||||
// non-partial snapshots do not allow delete operations on data streams where snapshot has not been completed
|
||||
try {
|
||||
logger.info("--> delete index while non-partial snapshot is running");
|
||||
client.admin().indices().deleteDataStream(new DeleteDataStreamAction.Request(dataStream)).actionGet();
|
||||
client.admin().indices().deleteDataStream(new DeleteDataStreamAction.Request(new String[]{dataStream})).actionGet();
|
||||
fail("Expected deleting index to fail during snapshot");
|
||||
} catch (SnapshotInProgressException e) {
|
||||
assertThat(e.getMessage(), containsString("Cannot delete data streams that are being snapshotted: [test-ds"));
|
||||
|
@ -24,7 +24,6 @@ import org.elasticsearch.ResourceNotFoundException;
|
||||
import org.elasticsearch.action.ActionListener;
|
||||
import org.elasticsearch.action.ActionRequestValidationException;
|
||||
import org.elasticsearch.action.ActionType;
|
||||
import org.elasticsearch.action.ValidateActions;
|
||||
import org.elasticsearch.action.support.ActionFilters;
|
||||
import org.elasticsearch.action.support.master.AcknowledgedResponse;
|
||||
import org.elasticsearch.action.support.master.MasterNodeRequest;
|
||||
@ -45,6 +44,7 @@ import org.elasticsearch.common.io.stream.StreamInput;
|
||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||
import org.elasticsearch.common.regex.Regex;
|
||||
import org.elasticsearch.common.unit.TimeValue;
|
||||
import org.elasticsearch.common.util.CollectionUtils;
|
||||
import org.elasticsearch.index.Index;
|
||||
import org.elasticsearch.snapshots.SnapshotInProgressException;
|
||||
import org.elasticsearch.snapshots.SnapshotsService;
|
||||
@ -52,12 +52,13 @@ import org.elasticsearch.threadpool.ThreadPool;
|
||||
import org.elasticsearch.transport.TransportService;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.elasticsearch.action.ValidateActions.addValidationError;
|
||||
|
||||
public class DeleteDataStreamAction extends ActionType<AcknowledgedResponse> {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger(DeleteDataStreamAction.class);
|
||||
@ -71,30 +72,30 @@ public class DeleteDataStreamAction extends ActionType<AcknowledgedResponse> {
|
||||
|
||||
public static class Request extends MasterNodeRequest<Request> {
|
||||
|
||||
private final String name;
|
||||
private final String[] names;
|
||||
|
||||
public Request(String name) {
|
||||
this.name = Objects.requireNonNull(name);
|
||||
public Request(String[] names) {
|
||||
this.names = Objects.requireNonNull(names);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionRequestValidationException validate() {
|
||||
ActionRequestValidationException validationException = null;
|
||||
if (Strings.hasText(name) == false) {
|
||||
validationException = ValidateActions.addValidationError("name is missing", validationException);
|
||||
if (CollectionUtils.isEmpty(names)) {
|
||||
validationException = addValidationError("no data stream(s) specified", validationException);
|
||||
}
|
||||
return validationException;
|
||||
}
|
||||
|
||||
public Request(StreamInput in) throws IOException {
|
||||
super(in);
|
||||
this.name = in.readString();
|
||||
this.names = in.readStringArray();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeTo(StreamOutput out) throws IOException {
|
||||
super.writeTo(out);
|
||||
out.writeString(name);
|
||||
out.writeStringArray(names);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -102,12 +103,12 @@ public class DeleteDataStreamAction extends ActionType<AcknowledgedResponse> {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
Request request = (Request) o;
|
||||
return name.equals(request.name);
|
||||
return Arrays.equals(names, request.names);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(name);
|
||||
return Arrays.hashCode(names);
|
||||
}
|
||||
}
|
||||
|
||||
@ -136,7 +137,8 @@ public class DeleteDataStreamAction extends ActionType<AcknowledgedResponse> {
|
||||
@Override
|
||||
protected void masterOperation(Request request, ClusterState state,
|
||||
ActionListener<AcknowledgedResponse> listener) throws Exception {
|
||||
clusterService.submitStateUpdateTask("remove-data-stream [" + request.name + "]", new ClusterStateUpdateTask(Priority.HIGH) {
|
||||
clusterService.submitStateUpdateTask("remove-data-stream [" + Strings.arrayToCommaDelimitedString(request.names) + "]",
|
||||
new ClusterStateUpdateTask(Priority.HIGH) {
|
||||
|
||||
@Override
|
||||
public TimeValue timeout() {
|
||||
@ -162,33 +164,37 @@ public class DeleteDataStreamAction extends ActionType<AcknowledgedResponse> {
|
||||
|
||||
static ClusterState removeDataStream(MetadataDeleteIndexService deleteIndexService, ClusterState currentState, Request request) {
|
||||
Set<String> dataStreams = new HashSet<>();
|
||||
for (String dataStreamName : currentState.metadata().dataStreams().keySet()) {
|
||||
if (Regex.simpleMatch(request.name, dataStreamName)) {
|
||||
dataStreams.add(dataStreamName);
|
||||
Set<String> snapshottingDataStreams = new HashSet<>();
|
||||
for (String name : request.names) {
|
||||
for (String dataStreamName : currentState.metadata().dataStreams().keySet()) {
|
||||
if (Regex.simpleMatch(name, dataStreamName)) {
|
||||
dataStreams.add(dataStreamName);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dataStreams.isEmpty()) {
|
||||
// if a match-all pattern was specified and no data streams were found because none exist, do not
|
||||
// fail with data stream missing exception
|
||||
if (Regex.isMatchAllPattern(request.name)) {
|
||||
return currentState;
|
||||
}
|
||||
throw new ResourceNotFoundException("data_streams matching [" + request.name + "] not found");
|
||||
|
||||
snapshottingDataStreams.addAll(SnapshotsService.snapshottingDataStreams(currentState, dataStreams));
|
||||
}
|
||||
|
||||
if (dataStreams.isEmpty()) {
|
||||
// if only a match-all pattern was specified and no data streams were found because none exist, do not
|
||||
// fail with data stream missing exception
|
||||
if (request.names.length == 1 && Regex.isMatchAllPattern(request.names[0])) {
|
||||
return currentState;
|
||||
}
|
||||
throw new ResourceNotFoundException("data_streams matching [" + Strings.arrayToCommaDelimitedString(request.names) +
|
||||
"] not found");
|
||||
}
|
||||
|
||||
Set<String> snapshottingDataStreams = SnapshotsService.snapshottingDataStreams(currentState, dataStreams);
|
||||
if (snapshottingDataStreams.isEmpty() == false) {
|
||||
throw new SnapshotInProgressException("Cannot delete data streams that are being snapshotted: " + snapshottingDataStreams +
|
||||
". Try again after snapshot finishes or cancel the currently running snapshot.");
|
||||
}
|
||||
|
||||
List<String> dataStreamsToRemove = new ArrayList<>();
|
||||
Set<Index> backingIndicesToRemove = new HashSet<>();
|
||||
for (String dataStreamName : dataStreams) {
|
||||
DataStream dataStream = currentState.metadata().dataStreams().get(dataStreamName);
|
||||
assert dataStream != null;
|
||||
backingIndicesToRemove.addAll(dataStream.getIndices());
|
||||
dataStreamsToRemove.add(dataStreamName);
|
||||
}
|
||||
|
||||
// first delete the data streams and then the indices:
|
||||
@ -196,7 +202,7 @@ public class DeleteDataStreamAction extends ActionType<AcknowledgedResponse> {
|
||||
// without updating the data stream)
|
||||
// TODO: change order when delete index api also updates the data stream the index to be removed is member of
|
||||
Metadata.Builder metadata = Metadata.builder(currentState.metadata());
|
||||
for (String ds : dataStreamsToRemove) {
|
||||
for (String ds : dataStreams) {
|
||||
logger.info("removing data stream [{}]", ds);
|
||||
metadata.removeDataStream(ds);
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ package org.elasticsearch.rest.action.admin.indices;
|
||||
|
||||
import org.elasticsearch.action.admin.indices.datastream.DeleteDataStreamAction;
|
||||
import org.elasticsearch.client.node.NodeClient;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.rest.BaseRestHandler;
|
||||
import org.elasticsearch.rest.RestRequest;
|
||||
import org.elasticsearch.rest.action.RestToXContentListener;
|
||||
@ -42,7 +43,8 @@ public class RestDeleteDataStreamAction extends BaseRestHandler {
|
||||
|
||||
@Override
|
||||
protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request(request.param("name"));
|
||||
DeleteDataStreamAction.Request deleteDataStreamRequest = new DeleteDataStreamAction.Request(
|
||||
Strings.splitStringByCommaToArray(request.param("name")));
|
||||
return channel -> client.admin().indices().deleteDataStream(deleteDataStreamRequest, new RestToXContentListener<>(channel));
|
||||
}
|
||||
}
|
||||
|
@ -61,21 +61,21 @@ public class DeleteDataStreamRequestTests extends AbstractWireSerializingTestCas
|
||||
|
||||
@Override
|
||||
protected Request createTestInstance() {
|
||||
return new Request(randomAlphaOfLength(8));
|
||||
return new Request(randomArray(1, 3, String[]::new, () -> randomAlphaOfLength(6)));
|
||||
}
|
||||
|
||||
public void testValidateRequest() {
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request("my-data-stream");
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(new String[]{"my-data-stream"});
|
||||
ActionRequestValidationException e = req.validate();
|
||||
assertNull(e);
|
||||
}
|
||||
|
||||
public void testValidateRequestWithoutName() {
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request("");
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(new String[0]);
|
||||
ActionRequestValidationException e = req.validate();
|
||||
assertNotNull(e);
|
||||
assertThat(e.validationErrors().size(), equalTo(1));
|
||||
assertThat(e.validationErrors().get(0), containsString("name is missing"));
|
||||
assertThat(e.validationErrors().get(0), containsString("no data stream(s) specified"));
|
||||
}
|
||||
|
||||
public void testDeleteDataStream() {
|
||||
@ -83,7 +83,7 @@ public class DeleteDataStreamRequestTests extends AbstractWireSerializingTestCas
|
||||
final List<String> otherIndices = randomSubsetOf(org.elasticsearch.common.collect.List.of("foo", "bar", "baz"));
|
||||
ClusterState cs = getClusterStateWithDataStreams(
|
||||
org.elasticsearch.common.collect.List.of(new Tuple<>(dataStreamName, 2)), otherIndices);
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(dataStreamName);
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(new String[]{dataStreamName});
|
||||
ClusterState newState = DeleteDataStreamAction.TransportAction.removeDataStream(getMetadataDeleteIndexService(), cs, req);
|
||||
assertThat(newState.metadata().dataStreams().size(), equalTo(0));
|
||||
assertThat(newState.metadata().indices().size(), equalTo(otherIndices.size()));
|
||||
@ -92,6 +92,26 @@ public class DeleteDataStreamRequestTests extends AbstractWireSerializingTestCas
|
||||
}
|
||||
}
|
||||
|
||||
public void testDeleteMultipleDataStreams() {
|
||||
String[] dataStreamNames = {"foo", "bar", "baz", "eggplant"};
|
||||
ClusterState cs = getClusterStateWithDataStreams(org.elasticsearch.common.collect.List.of(
|
||||
new Tuple<>(dataStreamNames[0], randomIntBetween(1, 3)),
|
||||
new Tuple<>(dataStreamNames[1], randomIntBetween(1, 3)),
|
||||
new Tuple<>(dataStreamNames[2], randomIntBetween(1, 3)),
|
||||
new Tuple<>(dataStreamNames[3], randomIntBetween(1, 3))
|
||||
), org.elasticsearch.common.collect.List.of());
|
||||
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(new String[]{"ba*", "eggplant"});
|
||||
ClusterState newState = DeleteDataStreamAction.TransportAction.removeDataStream(getMetadataDeleteIndexService(), cs, req);
|
||||
assertThat(newState.metadata().dataStreams().size(), equalTo(1));
|
||||
DataStream remainingDataStream = newState.metadata().dataStreams().get(dataStreamNames[0]);
|
||||
assertNotNull(remainingDataStream);
|
||||
assertThat(newState.metadata().indices().size(), equalTo(remainingDataStream.getIndices().size()));
|
||||
for (Index i : remainingDataStream.getIndices()) {
|
||||
assertThat(newState.metadata().indices().get(i.getName()).getIndex(), equalTo(i));
|
||||
}
|
||||
}
|
||||
|
||||
public void testDeleteSnapshottingDataStream() {
|
||||
final String dataStreamName = "my-data-stream1";
|
||||
final String dataStreamName2 = "my-data-stream2";
|
||||
@ -104,7 +124,7 @@ public class DeleteDataStreamRequestTests extends AbstractWireSerializingTestCas
|
||||
createEntry(dataStreamName2, "repo2", true)));
|
||||
ClusterState snapshotCs = ClusterState.builder(cs).putCustom(SnapshotsInProgress.TYPE, snapshotsInProgress).build();
|
||||
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(dataStreamName);
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(new String[]{dataStreamName});
|
||||
SnapshotInProgressException e = expectThrows(SnapshotInProgressException.class,
|
||||
() -> DeleteDataStreamAction.TransportAction.removeDataStream(getMetadataDeleteIndexService(), snapshotCs, req));
|
||||
|
||||
@ -121,7 +141,7 @@ public class DeleteDataStreamRequestTests extends AbstractWireSerializingTestCas
|
||||
public void testDeleteNonexistentDataStream() {
|
||||
final String dataStreamName = "my-data-stream";
|
||||
ClusterState cs = ClusterState.builder(new ClusterName("_name")).build();
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(dataStreamName);
|
||||
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(new String[]{dataStreamName});
|
||||
ResourceNotFoundException e = expectThrows(ResourceNotFoundException.class,
|
||||
() -> DeleteDataStreamAction.TransportAction.removeDataStream(getMetadataDeleteIndexService(), cs, req));
|
||||
assertThat(e.getMessage(), containsString("data_streams matching [" + dataStreamName + "] not found"));
|
||||
|
@ -143,7 +143,7 @@ public abstract class TestCluster implements Closeable {
|
||||
// Feature flag may not be enabled in all gradle modules that use ESIntegTestCase
|
||||
if (size() > 0 && ActionModule.DATASTREAMS_FEATURE_ENABLED) {
|
||||
AcknowledgedResponse response =
|
||||
client().admin().indices().deleteDataStream(new DeleteDataStreamAction.Request("*")).actionGet();
|
||||
client().admin().indices().deleteDataStream(new DeleteDataStreamAction.Request(new String[]{"*"})).actionGet();
|
||||
assertAcked(response);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user