diff --git a/docs/reference/indices/rollover-index.asciidoc b/docs/reference/indices/rollover-index.asciidoc index 81cf45a75faa8..e38a03e8f896c 100644 --- a/docs/reference/indices/rollover-index.asciidoc +++ b/docs/reference/indices/rollover-index.asciidoc @@ -372,7 +372,7 @@ index is rolled over. For instance: [source,console] -------------------------------------------------- # PUT / with URI encoding: -PUT /%3Clogs-%7Bnow%2Fd%7D-1%3E <1> +PUT /%3Clogs_%7Bnow%2Fd%7D-1%3E <1> { "aliases": { "logs_write": {} @@ -397,8 +397,8 @@ POST /logs_write/_rollover <2> -------------------------------------------------- // TEST[s/now/2016.10.31%7C%7C/] -<1> Creates an index named with today's date (e.g.) `logs-2016.10.31-1` -<2> Rolls over to a new index with today's date, e.g. `logs-2016.10.31-000002` if run immediately, or `logs-2016.11.01-000002` if run after 24 hours +<1> Creates an index named with today's date (e.g.) `logs_2016.10.31-1` +<2> Rolls over to a new index with today's date, e.g. `logs_2016.10.31-000002` if run immediately, or `logs-2016.11.01-000002` if run after 24 hours ////////////////////////// @@ -411,12 +411,12 @@ GET _alias [source,console-result] -------------------------------------------------- { - "logs-2016.10.31-000002": { + "logs_2016.10.31-000002": { "aliases": { "logs_write": {} } }, - "logs-2016.10.31-1": { + "logs_2016.10.31-1": { "aliases": {} } } diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/create/AutoCreateAction.java b/server/src/main/java/org/elasticsearch/action/admin/indices/create/AutoCreateAction.java index 2668a6b63b266..420c200f5ef40 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/create/AutoCreateAction.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/create/AutoCreateAction.java @@ -48,7 +48,7 @@ import java.util.concurrent.atomic.AtomicReference; /** - * Api that auto creates an index that originate from requests that write into an index that doesn't yet exist. + * Api that auto creates an index or data stream that originate from requests that write into an index that doesn't yet exist. */ public final class AutoCreateAction extends ActionType { diff --git a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java index d711774913912..258ac412fa65f 100644 --- a/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java +++ b/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataCreateIndexService.java @@ -497,6 +497,13 @@ private ClusterState applyCreateIndexRequestWithV2Template(final ClusterState cu throws Exception { logger.debug("applying create index request using composable template [{}]", templateName); + ComposableIndexTemplate template = currentState.getMetadata().templatesV2().get(templateName); + if (request.dataStreamName() == null && template.getDataStreamTemplate() != null) { + throw new IllegalArgumentException("cannot create index with name [" + request.index() + + "], because it matches with template [" + templateName + "] that creates data streams only, " + + "use create data stream api instead"); + } + final List>> mappings = collectV2Mappings(request.mappings(), currentState, templateName, xContentRegistry, request.index()); final Settings aggregatedIndexSettings = diff --git a/x-pack/plugin/ccr/qa/security/follower-roles.yml b/x-pack/plugin/ccr/qa/security/follower-roles.yml index 65af995c98a91..0e324236de3f4 100644 --- a/x-pack/plugin/ccr/qa/security/follower-roles.yml +++ b/x-pack/plugin/ccr/qa/security/follower-roles.yml @@ -2,7 +2,7 @@ ccruser: cluster: - manage_ccr indices: - - names: [ 'allowed-index', 'forget-follower', 'logs-eu-*' ] + - names: [ 'allowed-index', 'forget-follower', 'logs-eu*' ] privileges: - monitor - read diff --git a/x-pack/plugin/ccr/qa/security/leader-roles.yml b/x-pack/plugin/ccr/qa/security/leader-roles.yml index b0b528370a6b7..36b1fa8d982db 100644 --- a/x-pack/plugin/ccr/qa/security/leader-roles.yml +++ b/x-pack/plugin/ccr/qa/security/leader-roles.yml @@ -2,7 +2,7 @@ ccruser: cluster: - read_ccr indices: - - names: [ 'allowed-index', 'clean-leader', 'forget-leader', 'logs-eu-*' ] + - names: [ 'allowed-index', 'clean-leader', 'forget-leader', 'logs-eu*' ] privileges: - monitor - read diff --git a/x-pack/plugin/ccr/qa/security/src/test/java/org/elasticsearch/xpack/ccr/FollowIndexSecurityIT.java b/x-pack/plugin/ccr/qa/security/src/test/java/org/elasticsearch/xpack/ccr/FollowIndexSecurityIT.java index da57570ca8da6..672f2c328b6d3 100644 --- a/x-pack/plugin/ccr/qa/security/src/test/java/org/elasticsearch/xpack/ccr/FollowIndexSecurityIT.java +++ b/x-pack/plugin/ccr/qa/security/src/test/java/org/elasticsearch/xpack/ccr/FollowIndexSecurityIT.java @@ -132,8 +132,8 @@ public void testFollowIndex() throws Exception { public void testAutoFollowPatterns() throws Exception { assumeFalse("Test should only run when both clusters are running", "leader".equals(targetCluster)); - String allowedIndex = "logs-eu-20190101"; - String disallowedIndex = "logs-us-20190101"; + String allowedIndex = "logs-eu_20190101"; + String disallowedIndex = "logs-us_20190101"; { Request request = new Request("PUT", "/_ccr/auto_follow/test_pattern"); @@ -143,7 +143,7 @@ public void testAutoFollowPatterns() throws Exception { } Request request = new Request("PUT", "/_ccr/auto_follow/test_pattern"); - request.setJsonEntity("{\"leader_index_patterns\": [\"logs-eu-*\"], \"remote_cluster\": \"leader_cluster\"}"); + request.setJsonEntity("{\"leader_index_patterns\": [\"logs-eu*\"], \"remote_cluster\": \"leader_cluster\"}"); assertOK(client().performRequest(request)); try (RestClient leaderClient = buildLeaderClient()) { diff --git a/x-pack/plugin/src/test/resources/rest-api-spec/test/data_stream/10_basic.yml b/x-pack/plugin/src/test/resources/rest-api-spec/test/data_stream/10_basic.yml index 9005032b032d8..b1e3d8d8dce36 100644 --- a/x-pack/plugin/src/test/resources/rest-api-spec/test/data_stream/10_basic.yml +++ b/x-pack/plugin/src/test/resources/rest-api-spec/test/data_stream/10_basic.yml @@ -354,3 +354,31 @@ setup: indices.delete_data_stream: name: logs-foobar - is_true: acknowledged + +--- +"Create index into a namespace that is governed by a data stream template": + - skip: + version: " - 7.99.99" + reason: "adjust until #62527 is fully backported" + features: allowed_warnings + + - do: + allowed_warnings: + - "index template [generic_logs_template] has index patterns [logs-*] matching patterns from existing older templates [global] with patterns (global => [*]); this template [generic_logs_template] will take precedence during new index creation" + indices.put_index_template: + name: generic_logs_template + body: + index_patterns: logs-* + data_stream: {} + + # test response status code + - do: + catch: bad_request + indices.create: + index: logs-foobar + + # test error message + - do: + catch: /cannot create index with name \[logs-foobar\], because it matches with template \[generic_logs_template\] that creates data streams only, use create data stream api instead/ + indices.create: + index: logs-foobar diff --git a/x-pack/plugin/src/test/resources/rest-api-spec/test/security/authz/50_data_streams.yml b/x-pack/plugin/src/test/resources/rest-api-spec/test/security/authz/50_data_streams.yml index 07bae80eabc4e..582f198f07422 100644 --- a/x-pack/plugin/src/test/resources/rest-api-spec/test/security/authz/50_data_streams.yml +++ b/x-pack/plugin/src/test/resources/rest-api-spec/test/security/authz/50_data_streams.yml @@ -15,7 +15,7 @@ setup: body: > { "indices": [ - { "names": ["simple*"], "privileges": ["read", "write", "create_index", "view_index_metadata", "monitor", "delete_index"] } + { "names": ["simple*", "easy*"], "privileges": ["read", "write", "create_index", "view_index_metadata", "monitor", "delete_index"] } ] } @@ -66,7 +66,7 @@ setup: indices.put_index_template: name: my-template1 body: - index_patterns: [s*, create-doc-data-stream1, write-data-stream1] + index_patterns: [s*, easy-data-stream1, create-doc-data-stream1, write-data-stream1] template: mappings: properties: @@ -174,27 +174,27 @@ teardown: - do: # superuser indices.create_data_stream: - name: simple-data-stream1 + name: easy-data-stream1 - is_true: acknowledged - do: # superuser indices.create: - index: simple-index + index: easy-index body: aliases: - simple-alias: {} + easy-alias: {} - do: headers: { Authorization: "Basic dGVzdF91c2VyOngtcGFjay10ZXN0LXBhc3N3b3Jk" } # test_user indices.get_alias: - name: simple* + name: easy* - - match: {simple-index.aliases.simple-alias: {}} - - is_false: simple-data-stream1 + - match: {easy-index.aliases.easy-alias: {}} + - is_false: easy-data-stream1 - do: # superuser indices.delete_data_stream: - name: simple-data-stream1 + name: easy-data-stream1 - is_true: acknowledged ---