Skip to content

Commit b7f30fc

Browse files
authored
[7.x] Adding new require_alias option to indexing requests (#58917) (#59769)
* Adding new `require_alias` option to indexing requests (#58917) This commit adds the `require_alias` flag to requests that create new documents. This flag, when `true` prevents the request from automatically creating an index. Instead, the destination of the request MUST be an alias. When the flag is not set, or `false`, the behavior defaults to the `action.auto_create_index` settings. This is useful when an alias is required instead of a concrete index. closes #55267
1 parent 65f6fb8 commit b7f30fc

File tree

30 files changed

+447
-36
lines changed

30 files changed

+447
-36
lines changed

client/client-benchmark-noop-api-plugin/src/main/java/org/elasticsearch/plugin/noop/action/bulk/RestNoopBulkAction.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
7070
String defaultType = request.param("type");
7171
String defaultRouting = request.param("routing");
7272
String defaultPipeline = request.param("pipeline");
73+
Boolean defaultRequireAlias = request.paramAsBoolean("require_alias", null);
7374

7475
String waitForActiveShards = request.param("wait_for_active_shards");
7576
if (waitForActiveShards != null) {
@@ -78,7 +79,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
7879
bulkRequest.timeout(request.paramAsTime("timeout", BulkShardRequest.DEFAULT_TIMEOUT));
7980
bulkRequest.setRefreshPolicy(request.param("refresh"));
8081
bulkRequest.add(request.requiredContent(), defaultIndex, defaultType, defaultRouting,
81-
null, defaultPipeline, true, request.getXContentType());
82+
null, defaultPipeline, defaultRequireAlias, true, request.getXContentType());
8283

8384
// short circuit the call to the transport layer
8485
return channel -> {

docs/reference/docs/index_.asciidoc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ and <<update-delete-docs-in-a-backing-index>>.
2525

2626
`POST /<target>/_create/<_id>`
2727

28-
IMPORTANT: You cannot add new documents to a data stream using the
29-
`PUT /<target>/_doc/<_id>` request format. To specify a document ID, use the
30-
`PUT /<target>/_create/<_id>` format instead. See
28+
IMPORTANT: You cannot add new documents to a data stream using the
29+
`PUT /<target>/_doc/<_id>` request format. To specify a document ID, use the
30+
`PUT /<target>/_create/<_id>` format instead. See
3131
<<add-documents-to-a-data-stream>>.
3232

3333
[[docs-index-api-path-params]]
@@ -94,6 +94,8 @@ include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=version_type]
9494

9595
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=wait_for_active_shards]
9696

97+
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=require-alias]
98+
9799
[[docs-index-api-request-body]]
98100
==== {api-request-body-title}
99101

docs/reference/docs/update.asciidoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=if_primary_term]
5353
`lang`::
5454
(Optional, string) The script language. Default: `painless`.
5555

56+
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=require-alias]
57+
5658
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=refresh]
5759

5860
`retry_on_conflict`::

docs/reference/rest-api/common-parms.asciidoc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,12 @@ such as `1264`.
592592
A value of `-1` indicates {es} was unable to compute this number.
593593
end::memory[]
594594

595+
tag::require-alias[]
596+
`require_alias`::
597+
(Optional, boolean) When true, this requires the destination to be an alias.
598+
Defaults to false.
599+
end::require-alias[]
600+
595601
tag::node-filter[]
596602
`<node_filter>`::
597603
(Optional, string)

modules/ingest-common/src/yamlRestTest/resources/rest-api-spec/test/ingest/270_set_processor.yml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,51 @@ teardown:
5353
index: test
5454
id: 2
5555
- match: { _source.foo: "hello" }
56+
---
57+
"Test set processor with index change and require_alias":
58+
- do:
59+
ingest.put_pipeline:
60+
id: "1"
61+
body: >
62+
{
63+
"processors": [
64+
{
65+
"set" : {
66+
"field" : "_index",
67+
"value" : "new_require_alias_index"
68+
}
69+
}
70+
]
71+
}
72+
- match: { acknowledged: true }
73+
- do:
74+
catch: missing
75+
index:
76+
index: test_require_alias
77+
pipeline: 1
78+
require_alias: true
79+
body: { foo: bar }
80+
81+
- do:
82+
catch: missing
83+
indices.get:
84+
index: test_require_alias
85+
- do:
86+
catch: missing
87+
indices.get:
88+
index: new_require_alias_index
89+
90+
- do:
91+
indices.create:
92+
index: backing_index
93+
body:
94+
mappings: {}
95+
aliases:
96+
new_require_alias_index: {}
97+
98+
- do:
99+
index:
100+
index: test_require_alias
101+
pipeline: 1
102+
require_alias: true
103+
body: { foo: bar }

modules/reindex/src/main/java/org/elasticsearch/index/reindex/ReindexValidator.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.lucene.util.automaton.MinimizationOperations;
2828
import org.apache.lucene.util.automaton.Operations;
2929
import org.elasticsearch.action.ActionRequestValidationException;
30+
import org.elasticsearch.action.DocWriteRequest;
3031
import org.elasticsearch.action.index.IndexRequest;
3132
import org.elasticsearch.action.search.SearchRequest;
3233
import org.elasticsearch.action.support.AutoCreateIndex;
@@ -37,6 +38,7 @@
3738
import org.elasticsearch.common.logging.DeprecationLogger;
3839
import org.elasticsearch.common.regex.Regex;
3940
import org.elasticsearch.common.settings.Settings;
41+
import org.elasticsearch.index.IndexNotFoundException;
4042
import org.elasticsearch.search.builder.SearchSourceBuilder;
4143

4244
import java.util.List;
@@ -114,6 +116,14 @@ static void validateAgainstAliases(SearchRequest source, IndexRequest destinatio
114116
return;
115117
}
116118
String target = destination.index();
119+
if (destination.isRequireAlias() && (false == clusterState.getMetadata().hasAlias(target))) {
120+
throw new IndexNotFoundException("["
121+
+ DocWriteRequest.REQUIRE_ALIAS
122+
+ "] request flag is [true] and ["
123+
+ target
124+
+ "] is not an alias",
125+
target);
126+
}
117127
if (false == autoCreateIndex.shouldAutoCreate(target, clusterState)) {
118128
/*
119129
* If we're going to autocreate the index we don't need to resolve

modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.index.reindex;
2121

22+
import org.elasticsearch.action.DocWriteRequest;
2223
import org.elasticsearch.client.node.NodeClient;
2324
import org.elasticsearch.common.xcontent.XContentParser;
2425
import org.elasticsearch.rest.RestRequest;
@@ -69,6 +70,10 @@ protected ReindexRequest buildRequest(RestRequest request) throws IOException {
6970
if (request.hasParam("scroll")) {
7071
internal.setScroll(parseTimeValue(request.param("scroll"), "scroll"));
7172
}
73+
if (request.hasParam(DocWriteRequest.REQUIRE_ALIAS)) {
74+
internal.setRequireAlias(request.paramAsBoolean(DocWriteRequest.REQUIRE_ALIAS, false));
75+
}
76+
7277
return internal;
7378
}
7479
}

rest-api-spec/src/main/resources/rest-api-spec/api/bulk.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@
8787
"pipeline":{
8888
"type":"string",
8989
"description":"The pipeline id to preprocess incoming documents with"
90+
},
91+
"require_alias": {
92+
"type": "boolean",
93+
"description": "Sets require_alias for all incoming documents. Defaults to unset (false)"
9094
}
9195
},
9296
"body":{

rest-api-spec/src/main/resources/rest-api-spec/api/index.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@
139139
"pipeline":{
140140
"type":"string",
141141
"description":"The pipeline id to preprocess incoming documents with"
142+
},
143+
"require_alias": {
144+
"type": "boolean",
145+
"description": "When true, requires destination to be an alias. Default is false"
142146
}
143147
},
144148
"body":{

rest-api-spec/src/main/resources/rest-api-spec/api/update.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@
9999
"if_primary_term":{
100100
"type":"number",
101101
"description":"only perform the update operation if the last operation that has changed the document has the specified primary term"
102+
},
103+
"require_alias": {
104+
"type": "boolean",
105+
"description": "When true, requires destination is an alias. Default is false"
102106
}
103107
},
104108
"body":{

0 commit comments

Comments
 (0)