diff --git a/server/src/main/java/org/elasticsearch/cluster/project/ProjectStateRegistry.java b/server/src/main/java/org/elasticsearch/cluster/project/ProjectStateRegistry.java index 014ee37724cbc..464c28a4cc834 100644 --- a/server/src/main/java/org/elasticsearch/cluster/project/ProjectStateRegistry.java +++ b/server/src/main/java/org/elasticsearch/cluster/project/ProjectStateRegistry.java @@ -54,6 +54,10 @@ public class ProjectStateRegistry extends AbstractNamedDiffable implemen // A counter that is incremented each time one or more projects are marked for deletion. private final long projectsMarkedForDeletionGeneration; + public static ProjectStateRegistry get(ClusterState clusterState) { + return clusterState.custom(TYPE, EMPTY); + } + public ProjectStateRegistry(StreamInput in) throws IOException { if (in.getTransportVersion().onOrAfter(TransportVersions.PROJECT_STATE_REGISTRY_ENTRY)) { projectsEntries = in.readMap(ProjectId::readFrom, Entry::readFrom); @@ -80,6 +84,10 @@ private ProjectStateRegistry( this.projectsMarkedForDeletionGeneration = projectsMarkedForDeletionGeneration; } + public boolean hasProject(ProjectId projectId) { + return projectsEntries.containsKey(projectId); + } + /** * Retrieves the settings for a specific project based on its project ID from the specified cluster state without creating a new object. * If you need a full state of the project rather than just its setting, please use {@link ClusterState#projectState(ProjectId)} @@ -97,6 +105,10 @@ public Settings getProjectSettings(ProjectId projectId) { return projectsEntries.getOrDefault(projectId, EMPTY_ENTRY).settings; } + public Set getProjectsMarkedForDeletion() { + return projectsMarkedForDeletion; + } + public boolean isProjectMarkedForDeletion(ProjectId projectId) { return projectsMarkedForDeletion.contains(projectId); } @@ -310,6 +322,12 @@ public Builder markProjectForDeletion(ProjectId projectId) { return this; } + public Builder removeProject(ProjectId projectId) { + projectsEntries.remove(projectId); + projectsMarkedForDeletion.remove(projectId); + return this; + } + public ProjectStateRegistry build() { final var unknownButUnderDeletion = Sets.difference(projectsMarkedForDeletion, projectsEntries.keys()); if (unknownButUnderDeletion.isEmpty() == false) { @@ -319,7 +337,7 @@ public ProjectStateRegistry build() { } return new ProjectStateRegistry( projectsEntries.build(), - projectsMarkedForDeletion, + Collections.unmodifiableSet(projectsMarkedForDeletion), newProjectMarkedForDeletion ? projectsMarkedForDeletionGeneration + 1 : projectsMarkedForDeletionGeneration ); } diff --git a/server/src/test/java/org/elasticsearch/cluster/project/ProjectStateRegistryTests.java b/server/src/test/java/org/elasticsearch/cluster/project/ProjectStateRegistryTests.java index 5fdc73e9a6cf8..891995d36568b 100644 --- a/server/src/test/java/org/elasticsearch/cluster/project/ProjectStateRegistryTests.java +++ b/server/src/test/java/org/elasticsearch/cluster/project/ProjectStateRegistryTests.java @@ -46,6 +46,11 @@ public void testBuilder() { var unknownProjectId = randomUniqueProjectId(); var throwingBuilder = ProjectStateRegistry.builder(projectStateRegistry).markProjectForDeletion(unknownProjectId); assertThrows(IllegalArgumentException.class, throwingBuilder::build); + + var projectToRemove = randomFrom(projectStateRegistry.knownProjects()); + projectStateRegistry = ProjectStateRegistry.builder(projectStateRegistry).removeProject(projectToRemove).build(); + assertFalse(projectStateRegistry.hasProject(projectToRemove)); + assertFalse(projectStateRegistry.isProjectMarkedForDeletion(projectToRemove)); } public void testDiff() {