|
@@ -15,6 +15,12 @@ import org.elasticsearch.cluster.SnapshotsInProgress;
|
|
|
import org.elasticsearch.cluster.metadata.DataStream;
|
|
|
import org.elasticsearch.cluster.metadata.DataStreamTestHelper;
|
|
|
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
|
|
|
+import org.elasticsearch.cluster.metadata.Metadata;
|
|
|
+import org.elasticsearch.cluster.metadata.ProjectId;
|
|
|
+import org.elasticsearch.cluster.metadata.ProjectMetadata;
|
|
|
+import org.elasticsearch.cluster.project.TestProjectResolvers;
|
|
|
+import org.elasticsearch.cluster.routing.GlobalRoutingTable;
|
|
|
+import org.elasticsearch.cluster.routing.RoutingTable;
|
|
|
import org.elasticsearch.common.Strings;
|
|
|
import org.elasticsearch.common.collect.ImmutableOpenMap;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
@@ -47,13 +53,33 @@ public class DeleteDataStreamTransportActionTests extends ESTestCase {
|
|
|
final String dataStreamName = "my-data-stream";
|
|
|
final List<String> otherIndices = randomSubsetOf(List.of("foo", "bar", "baz"));
|
|
|
|
|
|
- ClusterState cs = DataStreamTestHelper.getClusterStateWithDataStreams(List.of(new Tuple<>(dataStreamName, 2)), otherIndices);
|
|
|
+ ClusterState initialState = DataStreamTestHelper.getClusterStateWithDataStreams(
|
|
|
+ List.of(new Tuple<>(dataStreamName, 2)),
|
|
|
+ otherIndices
|
|
|
+ );
|
|
|
+ final var projectId = initialState.metadata().projects().keySet().iterator().next();
|
|
|
+ final var stateWithProjects = addProjectsWithDataStreams(initialState, dataStreamName, otherIndices);
|
|
|
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(TEST_REQUEST_TIMEOUT, new String[] { dataStreamName });
|
|
|
- ClusterState newState = DeleteDataStreamTransportAction.removeDataStream(iner, cs, req, validator, Settings.EMPTY);
|
|
|
- assertThat(newState.metadata().getProject().dataStreams().size(), equalTo(0));
|
|
|
- assertThat(newState.metadata().getProject().indices().size(), equalTo(otherIndices.size()));
|
|
|
+ ClusterState newState = DeleteDataStreamTransportAction.removeDataStream(
|
|
|
+ iner,
|
|
|
+ TestProjectResolvers.singleProject(projectId).getProjectState(stateWithProjects),
|
|
|
+ req,
|
|
|
+ validator,
|
|
|
+ Settings.EMPTY
|
|
|
+ );
|
|
|
+ assertThat(newState.metadata().getProject(projectId).dataStreams().size(), equalTo(0));
|
|
|
+ assertThat(newState.metadata().getProject(projectId).indices().size(), equalTo(otherIndices.size()));
|
|
|
for (String indexName : otherIndices) {
|
|
|
- assertThat(newState.metadata().getProject().indices().get(indexName).getIndex().getName(), equalTo(indexName));
|
|
|
+ assertThat(newState.metadata().getProject(projectId).indices().get(indexName).getIndex().getName(), equalTo(indexName));
|
|
|
+ }
|
|
|
+ // Ensure the other projects did not get affected.
|
|
|
+ for (ProjectMetadata project : stateWithProjects.metadata().projects().values()) {
|
|
|
+ if (project.id().equals(projectId)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ assertEquals(1, project.dataStreams().size());
|
|
|
+ // Other indices + 2 for the backing indices of the data stream.
|
|
|
+ assertEquals(otherIndices.size() + 2, project.indices().size());
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -72,12 +98,29 @@ public class DeleteDataStreamTransportActionTests extends ESTestCase {
|
|
|
false,
|
|
|
true
|
|
|
);
|
|
|
+ final var projectId = cs.metadata().projects().keySet().iterator().next();
|
|
|
+ final var stateWithProjects = addProjectsWithDataStreams(cs, dataStreamName, otherIndices);
|
|
|
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(TEST_REQUEST_TIMEOUT, new String[] { dataStreamName });
|
|
|
- ClusterState newState = DeleteDataStreamTransportAction.removeDataStream(iner, cs, req, validator, Settings.EMPTY);
|
|
|
- assertThat(newState.metadata().getProject().dataStreams().size(), equalTo(0));
|
|
|
- assertThat(newState.metadata().getProject().indices().size(), equalTo(otherIndices.size()));
|
|
|
+ ClusterState newState = DeleteDataStreamTransportAction.removeDataStream(
|
|
|
+ iner,
|
|
|
+ TestProjectResolvers.singleProject(projectId).getProjectState(stateWithProjects),
|
|
|
+ req,
|
|
|
+ validator,
|
|
|
+ Settings.EMPTY
|
|
|
+ );
|
|
|
+ assertThat(newState.metadata().getProject(projectId).dataStreams().size(), equalTo(0));
|
|
|
+ assertThat(newState.metadata().getProject(projectId).indices().size(), equalTo(otherIndices.size()));
|
|
|
for (String indexName : otherIndices) {
|
|
|
- assertThat(newState.metadata().getProject().indices().get(indexName).getIndex().getName(), equalTo(indexName));
|
|
|
+ assertThat(newState.metadata().getProject(projectId).indices().get(indexName).getIndex().getName(), equalTo(indexName));
|
|
|
+ }
|
|
|
+ // Ensure the other projects did not get affected.
|
|
|
+ for (ProjectMetadata project : stateWithProjects.metadata().projects().values()) {
|
|
|
+ if (project.id().equals(projectId)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ assertEquals(1, project.dataStreams().size());
|
|
|
+ // Other indices + 2 for the backing indices of the data stream.
|
|
|
+ assertEquals(otherIndices.size() + 2, project.indices().size());
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -92,15 +135,30 @@ public class DeleteDataStreamTransportActionTests extends ESTestCase {
|
|
|
),
|
|
|
List.of()
|
|
|
);
|
|
|
+ final var projectId = cs.metadata().projects().keySet().iterator().next();
|
|
|
+ final var stateWithProjects = addProjectsWithDataStreams(cs, randomFrom(dataStreamNames), List.of());
|
|
|
|
|
|
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(TEST_REQUEST_TIMEOUT, new String[] { "ba*", "eggplant" });
|
|
|
- ClusterState newState = DeleteDataStreamTransportAction.removeDataStream(iner, cs, req, validator, Settings.EMPTY);
|
|
|
- assertThat(newState.metadata().getProject().dataStreams().size(), equalTo(1));
|
|
|
- DataStream remainingDataStream = newState.metadata().getProject().dataStreams().get(dataStreamNames[0]);
|
|
|
+ ClusterState newState = DeleteDataStreamTransportAction.removeDataStream(
|
|
|
+ iner,
|
|
|
+ TestProjectResolvers.singleProject(projectId).getProjectState(stateWithProjects),
|
|
|
+ req,
|
|
|
+ validator,
|
|
|
+ Settings.EMPTY
|
|
|
+ );
|
|
|
+ assertThat(newState.metadata().getProject(projectId).dataStreams().size(), equalTo(1));
|
|
|
+ DataStream remainingDataStream = newState.metadata().getProject(projectId).dataStreams().get(dataStreamNames[0]);
|
|
|
assertNotNull(remainingDataStream);
|
|
|
- assertThat(newState.metadata().getProject().indices().size(), equalTo(remainingDataStream.getIndices().size()));
|
|
|
+ assertThat(newState.metadata().getProject(projectId).indices().size(), equalTo(remainingDataStream.getIndices().size()));
|
|
|
for (Index i : remainingDataStream.getIndices()) {
|
|
|
- assertThat(newState.metadata().getProject().indices().get(i.getName()).getIndex(), equalTo(i));
|
|
|
+ assertThat(newState.metadata().getProject(projectId).indices().get(i.getName()).getIndex(), equalTo(i));
|
|
|
+ }
|
|
|
+ // Ensure the other projects did not get affected.
|
|
|
+ for (ProjectMetadata project : stateWithProjects.metadata().projects().values()) {
|
|
|
+ if (project.id().equals(projectId)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ assertEquals(1, project.dataStreams().size());
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -116,11 +174,19 @@ public class DeleteDataStreamTransportActionTests extends ESTestCase {
|
|
|
SnapshotsInProgress snapshotsInProgress = SnapshotsInProgress.EMPTY.withAddedEntry(createEntry(dataStreamName, "repo1", false))
|
|
|
.withAddedEntry(createEntry(dataStreamName2, "repo2", true));
|
|
|
ClusterState snapshotCs = ClusterState.builder(cs).putCustom(SnapshotsInProgress.TYPE, snapshotsInProgress).build();
|
|
|
+ final var projectId = snapshotCs.metadata().projects().keySet().iterator().next();
|
|
|
+ final var stateWithProjects = addProjectsWithDataStreams(snapshotCs, dataStreamName2, otherIndices);
|
|
|
|
|
|
DeleteDataStreamAction.Request req = new DeleteDataStreamAction.Request(TEST_REQUEST_TIMEOUT, new String[] { dataStreamName });
|
|
|
SnapshotInProgressException e = expectThrows(
|
|
|
SnapshotInProgressException.class,
|
|
|
- () -> DeleteDataStreamTransportAction.removeDataStream(iner, snapshotCs, req, validator, Settings.EMPTY)
|
|
|
+ () -> DeleteDataStreamTransportAction.removeDataStream(
|
|
|
+ iner,
|
|
|
+ TestProjectResolvers.singleProject(projectId).getProjectState(stateWithProjects),
|
|
|
+ req,
|
|
|
+ validator,
|
|
|
+ Settings.EMPTY
|
|
|
+ )
|
|
|
);
|
|
|
|
|
|
assertThat(
|
|
@@ -130,6 +196,13 @@ public class DeleteDataStreamTransportActionTests extends ESTestCase {
|
|
|
+ "snapshot finishes or cancel the currently running snapshot."
|
|
|
)
|
|
|
);
|
|
|
+ // Ensure the other projects did not get affected.
|
|
|
+ for (ProjectMetadata project : stateWithProjects.metadata().projects().values()) {
|
|
|
+ if (project.id().equals(projectId)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ assertEquals(1, project.dataStreams().size());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private SnapshotsInProgress.Entry createEntry(String dataStreamName, String repo, boolean partial) {
|
|
@@ -162,12 +235,14 @@ public class DeleteDataStreamTransportActionTests extends ESTestCase {
|
|
|
),
|
|
|
List.of()
|
|
|
);
|
|
|
+ final var projectId = cs.metadata().projects().keySet().iterator().next();
|
|
|
+ final var stateWithProjects = addProjectsWithDataStreams(cs, randomFrom(dataStreamNames), List.of());
|
|
|
|
|
|
expectThrows(
|
|
|
ResourceNotFoundException.class,
|
|
|
() -> DeleteDataStreamTransportAction.removeDataStream(
|
|
|
iner,
|
|
|
- cs,
|
|
|
+ TestProjectResolvers.singleProject(projectId).getProjectState(stateWithProjects),
|
|
|
new DeleteDataStreamAction.Request(TEST_REQUEST_TIMEOUT, new String[] { dataStreamName }),
|
|
|
validator,
|
|
|
Settings.EMPTY
|
|
@@ -178,13 +253,44 @@ public class DeleteDataStreamTransportActionTests extends ESTestCase {
|
|
|
TEST_REQUEST_TIMEOUT,
|
|
|
new String[] { dataStreamName + "*" }
|
|
|
);
|
|
|
- ClusterState newState = DeleteDataStreamTransportAction.removeDataStream(iner, cs, req, validator, Settings.EMPTY);
|
|
|
- assertThat(newState, sameInstance(cs));
|
|
|
- assertThat(newState.metadata().getProject().dataStreams().size(), equalTo(cs.metadata().getProject().dataStreams().size()));
|
|
|
+ ClusterState newState = DeleteDataStreamTransportAction.removeDataStream(
|
|
|
+ iner,
|
|
|
+ TestProjectResolvers.singleProject(projectId).getProjectState(stateWithProjects),
|
|
|
+ req,
|
|
|
+ validator,
|
|
|
+ Settings.EMPTY
|
|
|
+ );
|
|
|
+ assertThat(newState, sameInstance(stateWithProjects));
|
|
|
+ assertThat(
|
|
|
+ newState.metadata().getProject(projectId).dataStreams().size(),
|
|
|
+ equalTo(stateWithProjects.metadata().getProject(projectId).dataStreams().size())
|
|
|
+ );
|
|
|
assertThat(
|
|
|
- newState.metadata().getProject().dataStreams().keySet(),
|
|
|
- containsInAnyOrder(cs.metadata().getProject().dataStreams().keySet().toArray(Strings.EMPTY_ARRAY))
|
|
|
+ newState.metadata().getProject(projectId).dataStreams().keySet(),
|
|
|
+ containsInAnyOrder(stateWithProjects.metadata().getProject(projectId).dataStreams().keySet().toArray(Strings.EMPTY_ARRAY))
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ private ClusterState addProjectsWithDataStreams(ClusterState initialState, String dataStreamName, List<String> otherIndices) {
|
|
|
+ final var metadataBuilder = Metadata.builder(initialState.metadata());
|
|
|
+ final var routingTableBuilder = GlobalRoutingTable.builder();
|
|
|
+ final int numberOfProjects = randomIntBetween(0, 5);
|
|
|
+ for (int i = 0; i < numberOfProjects; i++) {
|
|
|
+ final var id = new ProjectId(randomUUID());
|
|
|
+ var projectBuilder = ProjectMetadata.builder(id);
|
|
|
+ DataStreamTestHelper.getClusterStateWithDataStreams(
|
|
|
+ projectBuilder,
|
|
|
+ List.of(Tuple.tuple(dataStreamName, 2)),
|
|
|
+ otherIndices,
|
|
|
+ System.currentTimeMillis(),
|
|
|
+ Settings.EMPTY,
|
|
|
+ 1,
|
|
|
+ false,
|
|
|
+ false
|
|
|
+ );
|
|
|
+ metadataBuilder.put(projectBuilder.build());
|
|
|
+ routingTableBuilder.put(id, RoutingTable.EMPTY_ROUTING_TABLE);
|
|
|
+ }
|
|
|
+ return ClusterState.builder(initialState).metadata(metadataBuilder.build()).routingTable(routingTableBuilder.build()).build();
|
|
|
+ }
|
|
|
}
|