|
14 | 14 | import org.elasticsearch.cluster.metadata.IndexGraveyard; |
15 | 15 | import org.elasticsearch.cluster.metadata.IndexMetadata; |
16 | 16 | import org.elasticsearch.cluster.metadata.Metadata; |
| 17 | +import org.elasticsearch.cluster.metadata.ProjectId; |
17 | 18 | import org.elasticsearch.cluster.metadata.ProjectMetadata; |
| 19 | +import org.elasticsearch.cluster.metadata.ReservedStateMetadata; |
18 | 20 | import org.elasticsearch.cluster.node.DiscoveryNode; |
19 | 21 | import org.elasticsearch.cluster.node.DiscoveryNodeRole; |
20 | 22 | import org.elasticsearch.cluster.node.DiscoveryNodeUtils; |
@@ -520,6 +522,65 @@ public void testChangedCustomMetadataSetMultiProject() { |
520 | 522 | assertEquals(Set.of(IndexGraveyard.TYPE, project2Custom.getWriteableName()), event.changedCustomProjectMetadataSet()); |
521 | 523 | } |
522 | 524 |
|
| 525 | + public void testProjectsDelta() { |
| 526 | + final var state0 = ClusterState.builder(TEST_CLUSTER_NAME).build(); |
| 527 | + |
| 528 | + // No project changes |
| 529 | + final var state1 = ClusterState.builder(state0) |
| 530 | + .metadata(Metadata.builder(state0.metadata()).put(ReservedStateMetadata.builder("test").build())) |
| 531 | + .build(); |
| 532 | + ClusterChangedEvent event = new ClusterChangedEvent("test", state1, state0); |
| 533 | + assertTrue(event.projectDelta().isEmpty()); |
| 534 | + |
| 535 | + // Add projects |
| 536 | + final List<ProjectId> projectIds = randomList(1, 5, ESTestCase::randomUniqueProjectId); |
| 537 | + Metadata.Builder metadataBuilder = Metadata.builder(state1.metadata()); |
| 538 | + for (ProjectId projectId : projectIds) { |
| 539 | + metadataBuilder.put(ProjectMetadata.builder(projectId)); |
| 540 | + } |
| 541 | + final var state2 = ClusterState.builder(state1).metadata(metadataBuilder.build()).build(); |
| 542 | + event = new ClusterChangedEvent("test", state2, state1); |
| 543 | + assertThat(event.projectDelta().added(), containsInAnyOrder(projectIds.toArray())); |
| 544 | + assertThat(event.projectDelta().removed(), empty()); |
| 545 | + |
| 546 | + // Add more projects and delete one |
| 547 | + final var removedProjectIds = randomNonEmptySubsetOf(projectIds); |
| 548 | + final List<ProjectId> moreProjectIds = randomList(1, 3, ESTestCase::randomUniqueProjectId); |
| 549 | + metadataBuilder = Metadata.builder(state2.metadata()); |
| 550 | + GlobalRoutingTable.Builder routingTableBuilder = GlobalRoutingTable.builder(state2.globalRoutingTable()); |
| 551 | + for (ProjectId projectId : removedProjectIds) { |
| 552 | + metadataBuilder.removeProject(projectId); |
| 553 | + routingTableBuilder.removeProject(projectId); |
| 554 | + } |
| 555 | + for (ProjectId projectId : moreProjectIds) { |
| 556 | + metadataBuilder.put(ProjectMetadata.builder(projectId)); |
| 557 | + } |
| 558 | + |
| 559 | + final var state3 = ClusterState.builder(state2).metadata(metadataBuilder.build()).routingTable(routingTableBuilder.build()).build(); |
| 560 | + |
| 561 | + event = new ClusterChangedEvent("test", state3, state2); |
| 562 | + assertThat(event.projectDelta().added(), containsInAnyOrder(moreProjectIds.toArray())); |
| 563 | + assertThat(event.projectDelta().removed(), containsInAnyOrder(removedProjectIds.toArray())); |
| 564 | + |
| 565 | + // Remove all projects |
| 566 | + final List<ProjectId> remainingProjects = state3.metadata() |
| 567 | + .projects() |
| 568 | + .keySet() |
| 569 | + .stream() |
| 570 | + .filter(projectId -> ProjectId.DEFAULT.equals(projectId) == false) |
| 571 | + .toList(); |
| 572 | + metadataBuilder = Metadata.builder(state3.metadata()); |
| 573 | + routingTableBuilder = GlobalRoutingTable.builder(state3.globalRoutingTable()); |
| 574 | + for (ProjectId projectId : remainingProjects) { |
| 575 | + metadataBuilder.removeProject(projectId); |
| 576 | + routingTableBuilder.removeProject(projectId); |
| 577 | + } |
| 578 | + final var state4 = ClusterState.builder(state3).metadata(metadataBuilder.build()).routingTable(routingTableBuilder.build()).build(); |
| 579 | + event = new ClusterChangedEvent("test", state4, state3); |
| 580 | + assertThat(event.projectDelta().added(), empty()); |
| 581 | + assertThat(event.projectDelta().removed(), containsInAnyOrder(remainingProjects.toArray())); |
| 582 | + } |
| 583 | + |
523 | 584 | private static class CustomClusterMetadata2 extends TestClusterCustomMetadata { |
524 | 585 | protected CustomClusterMetadata2(String data) { |
525 | 586 | super(data); |
|
0 commit comments