Skip to content

Commit f72b893

Browse files
authored
Adding new require_alias option to indexing requests (elastic#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 elastic#55267
1 parent 42377c7 commit f72b893

File tree

30 files changed

+447
-33
lines changed

30 files changed

+447
-33
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
@@ -65,6 +65,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
6565
String defaultIndex = request.param("index");
6666
String defaultRouting = request.param("routing");
6767
String defaultPipeline = request.param("pipeline");
68+
Boolean defaultRequireAlias = request.paramAsBoolean("require_alias", null);
6869

6970
String waitForActiveShards = request.param("wait_for_active_shards");
7071
if (waitForActiveShards != null) {
@@ -73,7 +74,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC
7374
bulkRequest.timeout(request.paramAsTime("timeout", BulkShardRequest.DEFAULT_TIMEOUT));
7475
bulkRequest.setRefreshPolicy(request.param("refresh"));
7576
bulkRequest.add(request.requiredContent(), defaultIndex, defaultRouting,
76-
null, defaultPipeline, true, request.getXContentType());
77+
null, defaultPipeline, defaultRequireAlias, true, request.getXContentType());
7778

7879
// short circuit the call to the transport layer
7980
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
@@ -570,6 +570,12 @@ such as `1264`.
570570
A value of `-1` indicates {es} was unable to compute this number.
571571
end::memory[]
572572

573+
tag::require-alias[]
574+
`require_alias`::
575+
(Optional, boolean) When true, this requires the destination to be an alias.
576+
Defaults to false.
577+
end::require-alias[]
578+
573579
tag::node-filter[]
574580
`<node_filter>`::
575581
(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
@@ -25,6 +25,7 @@
2525
import org.apache.lucene.util.automaton.MinimizationOperations;
2626
import org.apache.lucene.util.automaton.Operations;
2727
import org.elasticsearch.action.ActionRequestValidationException;
28+
import org.elasticsearch.action.DocWriteRequest;
2829
import org.elasticsearch.action.index.IndexRequest;
2930
import org.elasticsearch.action.search.SearchRequest;
3031
import org.elasticsearch.action.support.AutoCreateIndex;
@@ -35,6 +36,7 @@
3536
import org.elasticsearch.common.logging.DeprecationLogger;
3637
import org.elasticsearch.common.regex.Regex;
3738
import org.elasticsearch.common.settings.Settings;
39+
import org.elasticsearch.index.IndexNotFoundException;
3840
import org.elasticsearch.search.builder.SearchSourceBuilder;
3941

4042
import java.util.List;
@@ -111,6 +113,14 @@ static void validateAgainstAliases(SearchRequest source, IndexRequest destinatio
111113
return;
112114
}
113115
String target = destination.index();
116+
if (destination.isRequireAlias() && (false == clusterState.getMetadata().hasAlias(target))) {
117+
throw new IndexNotFoundException("["
118+
+ DocWriteRequest.REQUIRE_ALIAS
119+
+ "] request flag is [true] and ["
120+
+ target
121+
+ "] is not an alias",
122+
target);
123+
}
114124
if (false == autoCreateIndex.shouldAutoCreate(target, clusterState)) {
115125
/*
116126
* 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: 4 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;
@@ -68,6 +69,9 @@ protected ReindexRequest buildRequest(RestRequest request) throws IOException {
6869
if (request.hasParam("scroll")) {
6970
internal.setScroll(parseTimeValue(request.param("scroll"), "scroll"));
7071
}
72+
if (request.hasParam(DocWriteRequest.REQUIRE_ALIAS)) {
73+
internal.setRequireAlias(request.paramAsBoolean(DocWriteRequest.REQUIRE_ALIAS, false));
74+
}
7175

7276
return internal;
7377
}

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
@@ -92,6 +92,10 @@
9292
"pipeline":{
9393
"type":"string",
9494
"description":"The pipeline id to preprocess incoming documents with"
95+
},
96+
"require_alias": {
97+
"type": "boolean",
98+
"description": "When true, requires destination to be an alias. Default is false"
9599
}
96100
},
97101
"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)