Skip to content

Commit c17bfcb

Browse files
authored
Migrate the reserved repository action to be per-project (#130155)
Resolves: ES-10479
1 parent f3c5eb7 commit c17bfcb

File tree

5 files changed

+40
-29
lines changed

5 files changed

+40
-29
lines changed

server/src/main/java/org/elasticsearch/action/admin/cluster/repositories/delete/TransportDeleteRepositoryAction.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,16 @@ public Optional<String> reservedStateHandlerName() {
8585
public Set<String> modifiedKeys(DeleteRepositoryRequest request) {
8686
return Set.of(request.name());
8787
}
88+
89+
@Override
90+
protected void validateForReservedState(DeleteRepositoryRequest request, ClusterState state) {
91+
super.validateForReservedState(request, state);
92+
93+
validateForReservedState(
94+
projectResolver.getProjectMetadata(state).reservedStateMetadata().values(),
95+
reservedStateHandlerName().get(),
96+
modifiedKeys(request),
97+
request.toString()
98+
);
99+
}
88100
}

server/src/main/java/org/elasticsearch/action/admin/cluster/repositories/reservedstate/ReservedRepositoryAction.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@
1212
import org.elasticsearch.action.admin.cluster.repositories.put.PutRepositoryRequest;
1313
import org.elasticsearch.cluster.ClusterState;
1414
import org.elasticsearch.cluster.metadata.ProjectId;
15-
import org.elasticsearch.core.FixForMultiProject;
1615
import org.elasticsearch.repositories.RepositoriesService;
17-
import org.elasticsearch.reservedstate.ReservedClusterStateHandler;
16+
import org.elasticsearch.reservedstate.ReservedProjectStateHandler;
1817
import org.elasticsearch.reservedstate.TransformState;
1918
import org.elasticsearch.xcontent.XContentParser;
2019
import org.elasticsearch.xcontent.XContentParserConfiguration;
@@ -36,7 +35,7 @@
3635
* It is used by the ReservedClusterStateService to add/update or remove snapshot repositories. Typical usage
3736
* for this action is in the context of file based settings.
3837
*/
39-
public class ReservedRepositoryAction implements ReservedClusterStateHandler<List<PutRepositoryRequest>> {
38+
public class ReservedRepositoryAction implements ReservedProjectStateHandler<List<PutRepositoryRequest>> {
4039
public static final String NAME = "snapshot_repositories";
4140

4241
private final RepositoriesService repositoriesService;
@@ -56,28 +55,24 @@ public String name() {
5655
}
5756

5857
@SuppressWarnings("unchecked")
59-
public Collection<PutRepositoryRequest> prepare(Object input) {
58+
public Collection<PutRepositoryRequest> prepare(ProjectId projectId, Object input) {
6059
List<PutRepositoryRequest> repositories = (List<PutRepositoryRequest>) input;
6160

6261
for (var repositoryRequest : repositories) {
6362
validate(repositoryRequest);
6463
RepositoriesService.validateRepositoryName(repositoryRequest.name());
65-
@FixForMultiProject(description = "resolve the actual projectId, ES-10479")
66-
final var projectId = ProjectId.DEFAULT;
6764
repositoriesService.validateRepositoryCanBeCreated(projectId, repositoryRequest);
6865
}
6966

7067
return repositories;
7168
}
7269

7370
@Override
74-
public TransformState transform(List<PutRepositoryRequest> source, TransformState prevState) throws Exception {
75-
var requests = prepare(source);
71+
public TransformState transform(ProjectId projectId, List<PutRepositoryRequest> source, TransformState prevState) throws Exception {
72+
var requests = prepare(projectId, source);
7673

7774
ClusterState state = prevState.state();
7875

79-
@FixForMultiProject(description = "resolve the actual projectId, ES-10479")
80-
final var projectId = ProjectId.DEFAULT;
8176
for (var request : requests) {
8277
RepositoriesService.RegisterRepositoryTask task = new RepositoriesService.RegisterRepositoryTask(
8378
repositoriesService,

server/src/main/java/org/elasticsearch/node/NodeConstruction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1125,7 +1125,7 @@ public Map<String, String> queryFields() {
11251125
indicesService
11261126
);
11271127

1128-
actionModule.getReservedClusterStateService().installClusterStateHandler(new ReservedRepositoryAction(repositoriesService));
1128+
actionModule.getReservedClusterStateService().installProjectStateHandler(new ReservedRepositoryAction(repositoriesService));
11291129
actionModule.getReservedClusterStateService().installProjectStateHandler(new ReservedPipelineAction());
11301130

11311131
var fileSettingsHealthIndicatorPublisher = new FileSettingsService.FileSettingsHealthIndicatorPublisherImpl(clusterService, client);

server/src/test/java/org/elasticsearch/action/admin/cluster/repositories/reservedstate/ReservedRepositoryActionTests.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.cluster.ClusterName;
1515
import org.elasticsearch.cluster.ClusterState;
1616
import org.elasticsearch.cluster.metadata.ProjectId;
17+
import org.elasticsearch.cluster.metadata.ProjectMetadata;
1718
import org.elasticsearch.cluster.metadata.RepositoryMetadata;
1819
import org.elasticsearch.cluster.service.ClusterService;
1920
import org.elasticsearch.common.settings.Settings;
@@ -34,7 +35,6 @@
3435

3536
import static org.hamcrest.Matchers.containsInAnyOrder;
3637
import static org.mockito.ArgumentMatchers.any;
37-
import static org.mockito.ArgumentMatchers.eq;
3838
import static org.mockito.Mockito.doAnswer;
3939
import static org.mockito.Mockito.mock;
4040
import static org.mockito.Mockito.spy;
@@ -44,9 +44,10 @@
4444
*/
4545
public class ReservedRepositoryActionTests extends ESTestCase {
4646

47-
private TransformState processJSON(ReservedRepositoryAction action, TransformState prevState, String json) throws Exception {
47+
private TransformState processJSON(ProjectId projectId, ReservedRepositoryAction action, TransformState prevState, String json)
48+
throws Exception {
4849
try (XContentParser parser = XContentType.JSON.xContent().createParser(XContentParserConfiguration.EMPTY, json)) {
49-
return action.transform(action.fromXContent(parser), prevState);
50+
return action.transform(projectId, action.fromXContent(parser), prevState);
5051
}
5152
}
5253

@@ -69,20 +70,24 @@ public void testValidation() throws Exception {
6970

7071
assertEquals(
7172
"[repo] repository type [inter_planetary] does not exist",
72-
expectThrows(RepositoryException.class, () -> processJSON(action, prevState, badPolicyJSON)).getMessage()
73+
expectThrows(RepositoryException.class, () -> processJSON(randomProjectIdOrDefault(), action, prevState, badPolicyJSON))
74+
.getMessage()
7375
);
7476
}
7577

7678
public void testAddRepo() throws Exception {
7779
var repositoriesService = mockRepositoriesService();
80+
final var projectId = randomProjectIdOrDefault();
7881

79-
ClusterState state = ClusterState.builder(new ClusterName("elasticsearch")).build();
82+
ClusterState state = ClusterState.builder(new ClusterName("elasticsearch"))
83+
.putProjectMetadata(ProjectMetadata.builder(projectId))
84+
.build();
8085
TransformState prevState = new TransformState(state, Collections.emptySet());
8186
ReservedRepositoryAction action = new ReservedRepositoryAction(repositoriesService);
8287

8388
String emptyJSON = "";
8489

85-
TransformState updatedState = processJSON(action, prevState, emptyJSON);
90+
TransformState updatedState = processJSON(projectId, action, prevState, emptyJSON);
8691
assertEquals(0, updatedState.keys().size());
8792
assertEquals(prevState.state(), updatedState.state());
8893

@@ -103,14 +108,17 @@ public void testAddRepo() throws Exception {
103108
}""";
104109

105110
prevState = updatedState;
106-
updatedState = processJSON(action, prevState, settingsJSON);
111+
updatedState = processJSON(projectId, action, prevState, settingsJSON);
107112
assertThat(updatedState.keys(), containsInAnyOrder("repo", "repo1"));
108113
}
109114

110115
public void testRemoveRepo() {
111116
var repositoriesService = mockRepositoriesService();
117+
final var projectId = randomProjectIdOrDefault();
112118

113-
ClusterState state = ClusterState.builder(new ClusterName("elasticsearch")).build();
119+
ClusterState state = ClusterState.builder(new ClusterName("elasticsearch"))
120+
.putProjectMetadata(ProjectMetadata.builder(projectId))
121+
.build();
114122
TransformState prevState = new TransformState(state, Set.of("repo1"));
115123
ReservedRepositoryAction action = new ReservedRepositoryAction(repositoriesService);
116124

@@ -120,7 +128,7 @@ public void testRemoveRepo() {
120128
// missing is sufficient to tell that we attempted to delete that repo
121129
assertEquals(
122130
"[repo1] missing",
123-
expectThrows(RepositoryMissingException.class, () -> processJSON(action, prevState, emptyJSON)).getMessage()
131+
expectThrows(RepositoryMissingException.class, () -> processJSON(projectId, action, prevState, emptyJSON)).getMessage()
124132
);
125133
}
126134

@@ -153,7 +161,7 @@ public Repository create(ProjectId projectId, RepositoryMetadata metadata) {
153161
throw new RepositoryException(request.name(), "repository type [" + request.type() + "] does not exist");
154162
}
155163
return null;
156-
}).when(repositoriesService).validateRepositoryCanBeCreated(eq(ProjectId.DEFAULT), any());
164+
}).when(repositoriesService).validateRepositoryCanBeCreated(any(ProjectId.class), any());
157165

158166
return repositoriesService;
159167
}

x-pack/plugin/slm/src/test/java/org/elasticsearch/xpack/slm/action/ReservedSnapshotLifecycleStateServiceTests.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -290,8 +290,8 @@ public void testOperatorControllerFromJSONContent() throws IOException {
290290
ReservedClusterStateService controller = new ReservedClusterStateService(
291291
clusterService,
292292
null,
293-
List.of(new ReservedClusterSettingsAction(clusterSettings), new ReservedRepositoryAction(repositoriesService)),
294-
List.of()
293+
List.of(new ReservedClusterSettingsAction(clusterSettings)),
294+
List.of(new ReservedRepositoryAction(repositoriesService))
295295
);
296296

297297
String testJSON = """
@@ -362,12 +362,8 @@ public void testOperatorControllerFromJSONContent() throws IOException {
362362
controller = new ReservedClusterStateService(
363363
clusterService,
364364
null,
365-
List.of(
366-
new ReservedClusterSettingsAction(clusterSettings),
367-
new ReservedSnapshotAction(),
368-
new ReservedRepositoryAction(repositoriesService)
369-
),
370-
List.of()
365+
List.of(new ReservedClusterSettingsAction(clusterSettings), new ReservedSnapshotAction()),
366+
List.of(new ReservedRepositoryAction(repositoriesService))
371367
);
372368

373369
try (XContentParser parser = XContentType.JSON.xContent().createParser(XContentParserConfiguration.EMPTY, testJSON)) {

0 commit comments

Comments
 (0)