diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverService.java b/server/src/main/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverService.java index 65057c29c734b..01fe91f6df948 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverService.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverService.java @@ -307,15 +307,6 @@ static List rolloverAliasToNewIndex(String oldIndex, String newInde */ static void checkNoDuplicatedAliasInIndexTemplate(Metadata metadata, String rolloverIndexName, String rolloverRequestAlias, @Nullable Boolean isHidden) { - final List matchedTemplates = findV1Templates(metadata, rolloverIndexName, isHidden); - for (IndexTemplateMetadata template : matchedTemplates) { - if (template.aliases().containsKey(rolloverRequestAlias)) { - throw new IllegalArgumentException(String.format(Locale.ROOT, - "Rollover alias [%s] can point to multiple indices, found duplicated alias [%s] in index template [%s]", - rolloverRequestAlias, template.aliases().keys(), template.name())); - } - } - final String matchedV2Template = findV2Template(metadata, rolloverIndexName, isHidden == null ? false : isHidden); if (matchedV2Template != null) { List> aliases = MetadataIndexTemplateService.resolveAliases(metadata, matchedV2Template); @@ -326,6 +317,16 @@ static void checkNoDuplicatedAliasInIndexTemplate(Metadata metadata, String roll rolloverRequestAlias, aliasConfig.keySet(), matchedV2Template)); } } + return; + } + + final List matchedTemplates = findV1Templates(metadata, rolloverIndexName, isHidden); + for (IndexTemplateMetadata template : matchedTemplates) { + if (template.aliases().containsKey(rolloverRequestAlias)) { + throw new IllegalArgumentException(String.format(Locale.ROOT, + "Rollover alias [%s] can point to multiple indices, found duplicated alias [%s] in index template [%s]", + rolloverRequestAlias, template.aliases().keys(), template.name())); + } } } diff --git a/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverServiceTests.java b/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverServiceTests.java index 89166f2690a06..351b4e4a0604e 100644 --- a/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverServiceTests.java +++ b/server/src/test/java/org/elasticsearch/action/admin/indices/rollover/MetadataRolloverServiceTests.java @@ -391,6 +391,25 @@ public void testRejectDuplicateAliasV2UsingComponentTemplates() { assertThat(ex.getMessage(), containsString("index template [test-template]")); } + public void testRolloverDoesntRejectOperationIfValidComposableTemplateOverridesLegacyTemplate() { + final IndexTemplateMetadata legacyTemplate = IndexTemplateMetadata.builder("legacy-template") + .patterns(Arrays.asList("foo-*", "bar-*")) + .putAlias(AliasMetadata.builder("foo-write")).putAlias(AliasMetadata.builder("bar-write").writeIndex(randomBoolean())) + .build(); + + // v2 template overrides the v1 template and does not define the rollover aliases + final ComposableIndexTemplate composableTemplate = new ComposableIndexTemplate.Builder().indexPatterns(Arrays.asList("foo-*", + "bar-*")).template(new Template(null, null, null)).build(); + + final Metadata metadata = Metadata.builder().put(createMetadata(randomAlphaOfLengthBetween(5, 7)), false) + .put(legacyTemplate).put("composable-template", composableTemplate).build(); + String indexName = randomFrom("foo-123", "bar-xyz"); + String aliasName = randomFrom("foo-write", "bar-write"); + + // the valid v2 template takes priority over the v1 template so the validation should not throw any exception + MetadataRolloverService.checkNoDuplicatedAliasInIndexTemplate(metadata, indexName, aliasName, randomBoolean()); + } + public void testHiddenAffectsResolvedTemplates() { final IndexTemplateMetadata template = IndexTemplateMetadata.builder("test-template") .patterns(Collections.singletonList("*"))