Skip to content

Commit 09a308b

Browse files
committed
Introduced explicit index resolution API
Signed-off-by: Nils Bandener <nils.bandener@eliatra.com>
1 parent 7d2b8cc commit 09a308b

File tree

42 files changed

+952
-131
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+952
-131
lines changed

modules/reindex/src/test/java/org/opensearch/index/reindex/ReindexFromRemoteWithAuthTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.opensearch.action.search.SearchAction;
4040
import org.opensearch.action.support.ActionFilter;
4141
import org.opensearch.action.support.ActionFilterChain;
42+
import org.opensearch.action.support.ActionRequestMetadata;
4243
import org.opensearch.action.support.WriteRequest.RefreshPolicy;
4344
import org.opensearch.cluster.metadata.IndexNameExpressionResolver;
4445
import org.opensearch.cluster.service.ClusterService;
@@ -233,6 +234,7 @@ public <Request extends ActionRequest, Response extends ActionResponse> void app
233234
Task task,
234235
String action,
235236
Request request,
237+
ActionRequestMetadata<Request, Response> actionRequestMetadata,
236238
ActionListener<Response> listener,
237239
ActionFilterChain<Request, Response> chain
238240
) {

plugins/workload-management/src/main/java/org/opensearch/plugin/wlm/AutoTaggingActionFilter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.opensearch.action.search.SearchRequest;
1414
import org.opensearch.action.support.ActionFilter;
1515
import org.opensearch.action.support.ActionFilterChain;
16+
import org.opensearch.action.support.ActionRequestMetadata;
1617
import org.opensearch.core.action.ActionListener;
1718
import org.opensearch.core.action.ActionResponse;
1819
import org.opensearch.plugin.wlm.rule.attribute_extractor.IndicesExtractor;
@@ -51,6 +52,7 @@ public <Request extends ActionRequest, Response extends ActionResponse> void app
5152
Task task,
5253
String action,
5354
Request request,
55+
ActionRequestMetadata<Request, Response> actionRequestMetadata,
5456
ActionListener<Response> listener,
5557
ActionFilterChain<Request, Response> chain
5658
) {

server/src/main/java/org/opensearch/action/admin/indices/alias/IndicesAliasesRequest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.opensearch.OpenSearchGenerationException;
3636
import org.opensearch.action.ActionRequestValidationException;
3737
import org.opensearch.action.AliasesRequest;
38+
import org.opensearch.action.CompositeIndicesRequest;
3839
import org.opensearch.action.support.IndicesOptions;
3940
import org.opensearch.action.support.clustermanager.AcknowledgedRequest;
4041
import org.opensearch.cluster.metadata.AliasAction;
@@ -76,7 +77,7 @@
7677
* @opensearch.api
7778
*/
7879
@PublicApi(since = "1.0.0")
79-
public class IndicesAliasesRequest extends AcknowledgedRequest<IndicesAliasesRequest> implements ToXContentObject {
80+
public class IndicesAliasesRequest extends AcknowledgedRequest<IndicesAliasesRequest> implements ToXContentObject, CompositeIndicesRequest {
8081

8182
private List<AliasActions> allAliasActions = new ArrayList<>();
8283
private String origin = "";

server/src/main/java/org/opensearch/action/admin/indices/alias/TransportIndicesAliasesAction.java

Lines changed: 84 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.apache.logging.log4j.Logger;
3737
import org.opensearch.action.RequestValidators;
3838
import org.opensearch.action.support.ActionFilters;
39+
import org.opensearch.action.support.TransportIndicesResolvingAction;
3940
import org.opensearch.action.support.clustermanager.AcknowledgedResponse;
4041
import org.opensearch.action.support.clustermanager.TransportClusterManagerNodeAction;
4142
import org.opensearch.cluster.ClusterState;
@@ -48,6 +49,7 @@
4849
import org.opensearch.cluster.metadata.IndexNameExpressionResolver;
4950
import org.opensearch.cluster.metadata.Metadata;
5051
import org.opensearch.cluster.metadata.MetadataIndexAliasesService;
52+
import org.opensearch.cluster.metadata.ResolvedIndices;
5153
import org.opensearch.cluster.service.ClusterService;
5254
import org.opensearch.common.inject.Inject;
5355
import org.opensearch.common.regex.Regex;
@@ -68,6 +70,7 @@
6870
import java.util.Objects;
6971
import java.util.Optional;
7072
import java.util.Set;
73+
import java.util.stream.Collectors;
7174

7275
import static java.util.Collections.unmodifiableList;
7376

@@ -76,7 +79,9 @@
7679
*
7780
* @opensearch.internal
7881
*/
79-
public class TransportIndicesAliasesAction extends TransportClusterManagerNodeAction<IndicesAliasesRequest, AcknowledgedResponse> {
82+
public class TransportIndicesAliasesAction extends TransportClusterManagerNodeAction<IndicesAliasesRequest, AcknowledgedResponse>
83+
implements
84+
TransportIndicesResolvingAction<IndicesAliasesRequest> {
8085

8186
private static final Logger logger = LogManager.getLogger(TransportIndicesAliasesAction.class);
8287

@@ -131,45 +136,97 @@ protected void clusterManagerOperation(
131136
final IndicesAliasesRequest request,
132137
final ClusterState state,
133138
final ActionListener<AcknowledgedResponse> listener
134-
) {
139+
) throws Exception {
135140

136141
// Expand the indices names
137142
List<IndicesAliasesRequest.AliasActions> actions = request.aliasActions();
138-
List<AliasAction> finalActions = new ArrayList<>();
143+
List<AliasAction> finalActions = resolvedAliasActions(request, state, true);
144+
if (finalActions.isEmpty() && false == actions.isEmpty()) {
145+
throw new AliasesNotFoundException(
146+
actions.stream().flatMap(a -> Arrays.stream(a.getOriginalAliases())).collect(Collectors.toSet()).toArray(new String[0])
147+
);
148+
}
149+
request.aliasActions().clear();
150+
IndicesAliasesClusterStateUpdateRequest updateRequest = new IndicesAliasesClusterStateUpdateRequest(unmodifiableList(finalActions))
151+
.ackTimeout(request.timeout())
152+
.clusterManagerNodeTimeout(request.clusterManagerNodeTimeout());
153+
154+
indexAliasesService.indicesAliases(updateRequest, new ActionListener<ClusterStateUpdateResponse>() {
155+
@Override
156+
public void onResponse(ClusterStateUpdateResponse response) {
157+
listener.onResponse(new AcknowledgedResponse(response.isAcknowledged()));
158+
}
159+
160+
@Override
161+
public void onFailure(Exception t) {
162+
logger.debug("failed to perform aliases", t);
163+
listener.onFailure(t);
164+
}
165+
});
166+
}
167+
168+
@Override
169+
public ResolvedIndices resolveIndices(IndicesAliasesRequest request) {
170+
try {
171+
Set<String> indices = new HashSet<>();
172+
173+
for (AliasAction aliasAction : resolvedAliasActions(request, clusterService.state(), false)) {
174+
if (aliasAction instanceof AliasAction.Add addAliasAction) {
175+
indices.add(addAliasAction.getIndex());
176+
indices.add(addAliasAction.getAlias());
177+
} else if (aliasAction instanceof AliasAction.Remove removeAliasAction) {
178+
indices.add(removeAliasAction.getIndex());
179+
indices.add(removeAliasAction.getAlias());
180+
} else if (aliasAction instanceof AliasAction.RemoveIndex removeIndexAction) {
181+
// TODO special action
182+
indices.add(removeIndexAction.getIndex());
183+
}
184+
}
185+
186+
return ResolvedIndices.of(indices);
187+
} catch (RuntimeException e) {
188+
throw e;
189+
} catch (Exception e) {
190+
// This should not happen if validate=false is passed to resolvedAliasActions()
191+
throw new RuntimeException(e);
192+
}
193+
}
194+
195+
private List<AliasAction> resolvedAliasActions(IndicesAliasesRequest request, ClusterState state, boolean validate) throws Exception {
196+
List<AliasAction> result = new ArrayList<>();
139197
// Resolve all the AliasActions into AliasAction instances and gather all the aliases
140-
Set<String> aliases = new HashSet<>();
141-
for (IndicesAliasesRequest.AliasActions action : actions) {
198+
for (IndicesAliasesRequest.AliasActions action : request.aliasActions()) {
142199
final Index[] concreteIndices = indexNameExpressionResolver.concreteIndices(
143200
state,
144201
request.indicesOptions(),
145202
false,
146203
action.indices()
147204
);
148-
for (Index concreteIndex : concreteIndices) {
149-
IndexAbstraction indexAbstraction = state.metadata().getIndicesLookup().get(concreteIndex.getName());
150-
assert indexAbstraction != null : "invalid cluster metadata. index [" + concreteIndex.getName() + "] was not found";
151-
if (indexAbstraction.getParentDataStream() != null) {
152-
throw new IllegalArgumentException(
153-
"The provided expressions ["
154-
+ String.join(",", action.indices())
155-
+ "] match a backing index belonging to data stream ["
156-
+ indexAbstraction.getParentDataStream().getName()
157-
+ "]. Data streams and their backing indices don't support aliases."
158-
);
205+
if (validate) {
206+
for (Index concreteIndex : concreteIndices) {
207+
IndexAbstraction indexAbstraction = state.metadata().getIndicesLookup().get(concreteIndex.getName());
208+
assert indexAbstraction != null : "invalid cluster metadata. index [" + concreteIndex.getName() + "] was not found";
209+
if (indexAbstraction.getParentDataStream() != null) {
210+
throw new IllegalArgumentException(
211+
"The provided expressions ["
212+
+ String.join(",", action.indices())
213+
+ "] match a backing index belonging to data stream ["
214+
+ indexAbstraction.getParentDataStream().getName()
215+
+ "]. Data streams and their backing indices don't support aliases."
216+
);
217+
}
218+
}
219+
final Optional<Exception> maybeException = requestValidators.validateRequest(request, state, concreteIndices);
220+
if (maybeException.isPresent()) {
221+
throw maybeException.get();
159222
}
160-
}
161-
final Optional<Exception> maybeException = requestValidators.validateRequest(request, state, concreteIndices);
162-
if (maybeException.isPresent()) {
163-
listener.onFailure(maybeException.get());
164-
return;
165223
}
166224

167-
Collections.addAll(aliases, action.getOriginalAliases());
168225
for (final Index index : concreteIndices) {
169226
switch (action.actionType()) {
170227
case ADD:
171228
for (String alias : concreteAliases(action, state.metadata(), index.getName())) {
172-
finalActions.add(
229+
result.add(
173230
new AliasAction.Add(
174231
index.getName(),
175232
alias,
@@ -184,37 +241,19 @@ protected void clusterManagerOperation(
184241
break;
185242
case REMOVE:
186243
for (String alias : concreteAliases(action, state.metadata(), index.getName())) {
187-
finalActions.add(new AliasAction.Remove(index.getName(), alias, action.mustExist()));
244+
result.add(new AliasAction.Remove(index.getName(), alias, action.mustExist()));
188245
}
189246
break;
190247
case REMOVE_INDEX:
191-
finalActions.add(new AliasAction.RemoveIndex(index.getName()));
248+
result.add(new AliasAction.RemoveIndex(index.getName()));
192249
break;
193250
default:
194251
throw new IllegalArgumentException("Unsupported action [" + action.actionType() + "]");
195252
}
196253
}
197254
}
198-
if (finalActions.isEmpty() && false == actions.isEmpty()) {
199-
throw new AliasesNotFoundException(aliases.toArray(new String[0]));
200-
}
201-
request.aliasActions().clear();
202-
IndicesAliasesClusterStateUpdateRequest updateRequest = new IndicesAliasesClusterStateUpdateRequest(unmodifiableList(finalActions))
203-
.ackTimeout(request.timeout())
204-
.clusterManagerNodeTimeout(request.clusterManagerNodeTimeout());
205255

206-
indexAliasesService.indicesAliases(updateRequest, new ActionListener<ClusterStateUpdateResponse>() {
207-
@Override
208-
public void onResponse(ClusterStateUpdateResponse response) {
209-
listener.onResponse(new AcknowledgedResponse(response.isAcknowledged()));
210-
}
211-
212-
@Override
213-
public void onFailure(Exception t) {
214-
logger.debug("failed to perform aliases", t);
215-
listener.onFailure(t);
216-
}
217-
});
256+
return result;
218257
}
219258

220259
private static String[] concreteAliases(IndicesAliasesRequest.AliasActions action, Metadata metadata, String concreteIndex) {
@@ -255,4 +294,5 @@ private static String[] concreteAliases(IndicesAliasesRequest.AliasActions actio
255294
return action.aliases();
256295
}
257296
}
297+
258298
}

server/src/main/java/org/opensearch/action/admin/indices/create/AutoCreateAction.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.opensearch.action.support.ActionFilters;
3636
import org.opensearch.action.support.ActiveShardCount;
3737
import org.opensearch.action.support.ActiveShardsObserver;
38+
import org.opensearch.action.support.TransportIndicesResolvingAction;
3839
import org.opensearch.action.support.clustermanager.TransportClusterManagerNodeAction;
3940
import org.opensearch.cluster.AckedClusterStateUpdateTask;
4041
import org.opensearch.cluster.ClusterState;
@@ -49,6 +50,7 @@
4950
import org.opensearch.cluster.metadata.MetadataCreateDataStreamService.CreateDataStreamClusterStateUpdateRequest;
5051
import org.opensearch.cluster.metadata.MetadataCreateIndexService;
5152
import org.opensearch.cluster.metadata.MetadataIndexTemplateService;
53+
import org.opensearch.cluster.metadata.ResolvedIndices;
5254
import org.opensearch.cluster.service.ClusterManagerTaskThrottler;
5355
import org.opensearch.cluster.service.ClusterService;
5456
import org.opensearch.common.Priority;
@@ -82,7 +84,9 @@ private AutoCreateAction() {
8284
*
8385
* @opensearch.internal
8486
*/
85-
public static final class TransportAction extends TransportClusterManagerNodeAction<CreateIndexRequest, CreateIndexResponse> {
87+
public static final class TransportAction extends TransportClusterManagerNodeAction<CreateIndexRequest, CreateIndexResponse>
88+
implements
89+
TransportIndicesResolvingAction<CreateIndexRequest> {
8690

8791
private final ActiveShardsObserver activeShardsObserver;
8892
private final MetadataCreateIndexService createIndexService;
@@ -187,6 +191,19 @@ public ClusterState execute(ClusterState currentState) throws Exception {
187191
protected ClusterBlockException checkBlock(CreateIndexRequest request, ClusterState state) {
188192
return state.blocks().indexBlockedException(ClusterBlockLevel.METADATA_WRITE, request.index());
189193
}
194+
195+
@Override
196+
public ResolvedIndices resolveIndices(CreateIndexRequest request) {
197+
ClusterState clusterState = clusterService.state();
198+
DataStreamTemplate dataStreamTemplate = resolveAutoCreateDataStream(request, clusterState.metadata());
199+
200+
if (dataStreamTemplate != null) {
201+
// No date math is supported when a data stream is created
202+
return ResolvedIndices.of(request.index());
203+
} else {
204+
return ResolvedIndices.of(indexNameExpressionResolver.resolveDateMathExpression(request.index()));
205+
}
206+
}
190207
}
191208

192209
static DataStreamTemplate resolveAutoCreateDataStream(CreateIndexRequest request, Metadata metadata) {

server/src/main/java/org/opensearch/action/admin/indices/create/TransportCreateIndexAction.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,14 @@
3333
package org.opensearch.action.admin.indices.create;
3434

3535
import org.opensearch.action.support.ActionFilters;
36+
import org.opensearch.action.support.TransportIndicesResolvingAction;
3637
import org.opensearch.action.support.clustermanager.TransportClusterManagerNodeAction;
3738
import org.opensearch.cluster.ClusterState;
3839
import org.opensearch.cluster.block.ClusterBlockException;
3940
import org.opensearch.cluster.block.ClusterBlockLevel;
4041
import org.opensearch.cluster.metadata.IndexNameExpressionResolver;
4142
import org.opensearch.cluster.metadata.MetadataCreateIndexService;
43+
import org.opensearch.cluster.metadata.ResolvedIndices;
4244
import org.opensearch.cluster.service.ClusterService;
4345
import org.opensearch.common.inject.Inject;
4446
import org.opensearch.core.action.ActionListener;
@@ -54,7 +56,9 @@
5456
*
5557
* @opensearch.internal
5658
*/
57-
public class TransportCreateIndexAction extends TransportClusterManagerNodeAction<CreateIndexRequest, CreateIndexResponse> {
59+
public class TransportCreateIndexAction extends TransportClusterManagerNodeAction<CreateIndexRequest, CreateIndexResponse>
60+
implements
61+
TransportIndicesResolvingAction<CreateIndexRequest> {
5862

5963
private final MetadataCreateIndexService createIndexService;
6064
private final MappingTransformerRegistry mappingTransformerRegistry;
@@ -115,7 +119,7 @@ protected void clusterManagerOperation(
115119
cause = "api";
116120
}
117121

118-
final String indexName = indexNameExpressionResolver.resolveDateMathExpression(request.index());
122+
final String indexName = resolveIndexName(request);
119123

120124
final String finalCause = cause;
121125
final ActionListener<String> mappingTransformListener = ActionListener.wrap(transformedMappings -> {
@@ -143,4 +147,12 @@ protected void clusterManagerOperation(
143147
mappingTransformerRegistry.applyTransformers(request.mappings(), null, mappingTransformListener);
144148
}
145149

150+
@Override
151+
public ResolvedIndices resolveIndices(CreateIndexRequest request) {
152+
return ResolvedIndices.of(resolveIndexName(request));
153+
}
154+
155+
private String resolveIndexName(CreateIndexRequest request) {
156+
return indexNameExpressionResolver.resolveDateMathExpression(request.index());
157+
}
146158
}

server/src/main/java/org/opensearch/action/admin/indices/datastream/CreateDataStreamAction.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.opensearch.action.ValidateActions;
3838
import org.opensearch.action.support.ActionFilters;
3939
import org.opensearch.action.support.IndicesOptions;
40+
import org.opensearch.action.support.TransportIndicesResolvingAction;
4041
import org.opensearch.action.support.clustermanager.AcknowledgedRequest;
4142
import org.opensearch.action.support.clustermanager.AcknowledgedResponse;
4243
import org.opensearch.action.support.clustermanager.TransportClusterManagerNodeAction;
@@ -46,6 +47,7 @@
4647
import org.opensearch.cluster.metadata.IndexNameExpressionResolver;
4748
import org.opensearch.cluster.metadata.MetadataCreateDataStreamService;
4849
import org.opensearch.cluster.metadata.MetadataCreateDataStreamService.CreateDataStreamClusterStateUpdateRequest;
50+
import org.opensearch.cluster.metadata.ResolvedIndices;
4951
import org.opensearch.cluster.service.ClusterService;
5052
import org.opensearch.common.annotation.PublicApi;
5153
import org.opensearch.common.inject.Inject;
@@ -137,7 +139,9 @@ public IndicesOptions indicesOptions() {
137139
*
138140
* @opensearch.internal
139141
*/
140-
public static class TransportAction extends TransportClusterManagerNodeAction<Request, AcknowledgedResponse> {
142+
public static class TransportAction extends TransportClusterManagerNodeAction<Request, AcknowledgedResponse>
143+
implements
144+
TransportIndicesResolvingAction<Request> {
141145

142146
private final MetadataCreateDataStreamService metadataCreateDataStreamService;
143147

@@ -179,6 +183,11 @@ protected void clusterManagerOperation(Request request, ClusterState state, Acti
179183
protected ClusterBlockException checkBlock(Request request, ClusterState state) {
180184
return state.blocks().globalBlockedException(ClusterBlockLevel.METADATA_WRITE);
181185
}
186+
187+
@Override
188+
public ResolvedIndices resolveIndices(Request request) {
189+
return ResolvedIndices.of(request.name);
190+
}
182191
}
183192

184193
}

0 commit comments

Comments
 (0)