From e32623ef527c477edfe759e12f1ca885e34f3020 Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Thu, 2 Jul 2020 08:23:34 -0600 Subject: [PATCH] [7.x] Add test for component templates updated after cluster restart (#58883) (#58914) This commit adds an integration test that component templates used to form a composite template can still be updated after a cluster restart. In #58643 an issue arose where mappings were causing problems because of the way we unwrap `_doc` in template mappings. This was also related to the mappings being merged manually rather than using the `MapperService` to do the merging. #58643 was fixed in 7.9 and master with the #58521 change, since mappings now are read and digested by the actual mapper service. This test passes for 7.x and master, and I intend to open a separate PR including this test for 7.8.1 along with a bug fix for #58643. This test is to ensure we don't have any regression in the future. --- .../template/ComposableTemplateIT.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 server/src/internalClusterTest/java/org/elasticsearch/indices/template/ComposableTemplateIT.java diff --git a/server/src/internalClusterTest/java/org/elasticsearch/indices/template/ComposableTemplateIT.java b/server/src/internalClusterTest/java/org/elasticsearch/indices/template/ComposableTemplateIT.java new file mode 100644 index 00000000000..df8c85d9b51 --- /dev/null +++ b/server/src/internalClusterTest/java/org/elasticsearch/indices/template/ComposableTemplateIT.java @@ -0,0 +1,86 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.indices.template; + +import org.elasticsearch.action.admin.indices.template.put.PutComponentTemplateAction; +import org.elasticsearch.action.admin.indices.template.put.PutComposableIndexTemplateAction; +import org.elasticsearch.cluster.metadata.ComponentTemplate; +import org.elasticsearch.cluster.metadata.ComposableIndexTemplate; +import org.elasticsearch.cluster.metadata.Template; +import org.elasticsearch.common.compress.CompressedXContent; +import org.elasticsearch.test.ESIntegTestCase; + +import java.util.Collections; + +public class ComposableTemplateIT extends ESIntegTestCase { + + // See: https://github.com/elastic/elasticsearch/issues/58643 + public void testComponentTemplatesCanBeUpdatedAfterRestart() throws Exception { + ComponentTemplate ct = new ComponentTemplate(new Template(null, new CompressedXContent("{\n" + + " \"dynamic\": false,\n" + + " \"properties\": {\n" + + " \"foo\": {\n" + + " \"type\": \"text\"\n" + + " }\n" + + " }\n" + + " }"), null), 3L, Collections.singletonMap("eggplant", "potato")); + client().execute(PutComponentTemplateAction.INSTANCE, new PutComponentTemplateAction.Request("my-ct").componentTemplate(ct)).get(); + + ComposableIndexTemplate cit = new ComposableIndexTemplate(Collections.singletonList("coleslaw"), + new Template(null, new CompressedXContent("{\n" + + " \"dynamic\": false,\n" + + " \"properties\": {\n" + + " \"foo\": {\n" + + " \"type\": \"keyword\"\n" + + " }\n" + + " }\n" + + " }"), null), Collections.singletonList("my-ct"), + 4L, 5L, Collections.singletonMap("egg", "bread")); + client().execute(PutComposableIndexTemplateAction.INSTANCE, + new PutComposableIndexTemplateAction.Request("my-it").indexTemplate(cit)).get(); + + internalCluster().fullRestart(); + ensureGreen(); + + ComponentTemplate ct2 = new ComponentTemplate(new Template(null, new CompressedXContent("{\n" + + " \"dynamic\": true,\n" + + " \"properties\": {\n" + + " \"foo\": {\n" + + " \"type\": \"keyword\"\n" + + " }\n" + + " }\n" + + " }"), null), 3L, Collections.singletonMap("eggplant", "potato")); + client().execute(PutComponentTemplateAction.INSTANCE, + new PutComponentTemplateAction.Request("my-ct").componentTemplate(ct2)).get(); + + ComposableIndexTemplate cit2 = new ComposableIndexTemplate(Collections.singletonList("coleslaw"), + new Template(null, new CompressedXContent("{\n" + + " \"dynamic\": true,\n" + + " \"properties\": {\n" + + " \"foo\": {\n" + + " \"type\": \"integer\"\n" + + " }\n" + + " }\n" + + " }"), null), Collections.singletonList("my-ct"), + 4L, 5L, Collections.singletonMap("egg", "bread")); + client().execute(PutComposableIndexTemplateAction.INSTANCE, + new PutComposableIndexTemplateAction.Request("my-it").indexTemplate(cit2)).get(); + } +}