From ca4f5fbea76732389021584f7bffb961cc45d189 Mon Sep 17 00:00:00 2001 From: pranishd1 <8871437+pranishd1@users.noreply.github.com> Date: Sat, 7 Oct 2023 15:20:10 -0500 Subject: [PATCH] Added withJson to PutIndexTemplateRequest #618 Signed-off-by: pranishd1 <8871437+pranishd1@users.noreply.github.com> --- .../indices/PutIndexTemplateRequest.java | 31 ++++++ .../integTest/AbstractIndicesClientIT.java | 98 +++++++++++++++++++ 2 files changed, 129 insertions(+) diff --git a/java-client/src/main/java/org/opensearch/client/opensearch/indices/PutIndexTemplateRequest.java b/java-client/src/main/java/org/opensearch/client/opensearch/indices/PutIndexTemplateRequest.java index 4fd03a126f..0a709f1293 100644 --- a/java-client/src/main/java/org/opensearch/client/opensearch/indices/PutIndexTemplateRequest.java +++ b/java-client/src/main/java/org/opensearch/client/opensearch/indices/PutIndexTemplateRequest.java @@ -32,6 +32,8 @@ package org.opensearch.client.opensearch.indices; +import jakarta.json.stream.JsonParser; +import org.opensearch.client.json.jsonb.JsonbJsonpMapper; import org.opensearch.client.opensearch._types.ErrorResponse; import org.opensearch.client.opensearch._types.RequestBase; import org.opensearch.client.opensearch.indices.put_index_template.IndexTemplateMapping; @@ -49,10 +51,13 @@ import org.opensearch.client.util.ObjectBuilderBase; import jakarta.json.stream.JsonGenerator; +import java.io.InputStream; +import java.io.InputStreamReader; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Function; +import java.util.function.Supplier; import javax.annotation.Nullable; // typedef: indices.put_index_template.Request @@ -375,6 +380,32 @@ public final Builder version(@Nullable Long value) { return this; } + /** + * Re-writes previous builder fields ( template, index_patterns, version, priority, data_streams ) + * + * @throws NullPointerException + * if value is null. + */ + public final Builder withJson(InputStream value){ + assert value != null; + JsonpMapper mapper = new JsonbJsonpMapper(); + JsonParser parser = mapper.jsonProvider().createParser(new InputStreamReader(value)); + var builder = ObjectBuilderDeserializer.lazy( + Builder::new, + PutIndexTemplateRequest::setupPutIndexTemplateRequestDeserializer, + _builder -> _builder + ).deserialize(parser,mapper); + + template(builder.template); + indexPatterns(builder.indexPatterns); + version(builder.version); + priority(builder.priority); + dataStream(builder.dataStream); + + return this; + } + + /** * Builds a {@link PutIndexTemplateRequest}. * diff --git a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractIndicesClientIT.java b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractIndicesClientIT.java index 869e63cc1c..f8435f68c9 100644 --- a/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractIndicesClientIT.java +++ b/java-client/src/test/java/org/opensearch/client/opensearch/integTest/AbstractIndicesClientIT.java @@ -8,8 +8,12 @@ package org.opensearch.client.opensearch.integTest; +import jakarta.json.stream.JsonParser; +import org.opensearch.client.json.JsonpMapper; +import org.opensearch.client.json.jsonb.JsonbJsonpMapper; import org.opensearch.client.opensearch.OpenSearchAsyncClient; import org.opensearch.client.opensearch._types.OpenSearchException; +import org.opensearch.client.opensearch._types.mapping.Property; import org.opensearch.client.opensearch.indices.CreateDataStreamResponse; import org.opensearch.client.opensearch.indices.CreateIndexResponse; import org.opensearch.client.opensearch.indices.DataStream; @@ -21,11 +25,16 @@ import org.opensearch.client.opensearch.indices.GetIndexRequest; import org.opensearch.client.opensearch.indices.GetIndexResponse; import org.opensearch.client.opensearch.indices.GetIndicesSettingsRequest; +import org.opensearch.client.opensearch.indices.DeleteIndexTemplateResponse; +import org.opensearch.client.opensearch.indices.GetIndexTemplateResponse; import org.opensearch.client.opensearch.indices.IndexState; import org.opensearch.client.opensearch.indices.PutIndexTemplateResponse; +import org.opensearch.client.opensearch.indices.get_index_template.IndexTemplate; import org.opensearch.common.settings.Settings; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -205,4 +214,93 @@ public void testGetNotExistingIndexAlias() throws Exception { "alias [alias_not_exists] missing"); } } + + public void testWithJsonPutIndexTemplateRequest() throws IOException { + + String jsonTemplate ="{ " + + " \"index_patterns\": [ " + + " \"logs-2023-01-*\"" + + " ], " + + " \"composed_of\":[], "+ + " \"template\": { " + + " \"aliases\": { " + + " \"my_logs\": {} " + + " }, " + + " \"settings\": { " + + " \"number_of_shards\": 2, " + + " \"number_of_replicas\": 1 " + + " }, " + + " \"mappings\": { " + + " \"properties\": { " + + " \"timestamp\": { " + + " \"type\": \"date\"," + + " \"format\": \"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"" + + " },\n" + + " \"value\": { " + + " \"type\": \"double\" " + + " } " + + " } " + + " } " + + " } " + + "}"; + + final var pTemplateName = "daily_logs"; + InputStream pTemplateJson = new ByteArrayInputStream(jsonTemplate.getBytes()); + + // create an index template before creating data streams + PutIndexTemplateResponse putIndexTemplateResponse = javaClient().indices() + .putIndexTemplate(b -> b.name(pTemplateName).withJson(pTemplateJson)); + assertTrue(putIndexTemplateResponse.acknowledged()); + + + // verify the settings + GetIndexTemplateResponse getIndexTemplateResponse = javaClient().indices() + .getIndexTemplate(b->b.name(pTemplateName)); + assertEquals(1, getIndexTemplateResponse.indexTemplates().size()); + assertEquals("logs-2023-01-*",getIndexTemplateResponse.indexTemplates() + .get(0).indexTemplate().indexPatterns().get(0)); + + IndexTemplate responseIndexTemplate = getIndexTemplateResponse.indexTemplates().get(0).indexTemplate(); + + JsonpMapper mapper = new JsonbJsonpMapper(); + JsonParser parser = mapper.jsonProvider().createParser(new ByteArrayInputStream(jsonTemplate.getBytes())); + IndexTemplate indexTemplate = IndexTemplate._DESERIALIZER.deserialize(parser,mapper); + + assertEquals(indexTemplate.priority(),responseIndexTemplate.priority()); + assert indexTemplate.template() != null; + assert responseIndexTemplate.template() != null; + assertEquals(indexTemplate.template().aliases().size(),responseIndexTemplate.template().aliases().size()); + assert indexTemplate.template().mappings() != null; + assert responseIndexTemplate.template().mappings() != null; + assertEquals(indexTemplate.template().mappings().size(),responseIndexTemplate.template().mappings().size()); + + var mappings = indexTemplate.template().mappings().properties(); + var mappingValues = mappings.get("value"); + assertEquals(Property.Kind.Double,mappingValues._kind()); + + var timestampValues = mappings.get("timestamp"); + assertEquals("yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",timestampValues.date().format()); + + var indicesSettings = responseIndexTemplate.template().settings().get("index").toJson().asJsonObject(); + assertEquals("\"2\"",indicesSettings.get("number_of_shards").toString()); + assertEquals("\"1\"",indicesSettings.get("number_of_replicas").toString()); + + // delete index template index + DeleteIndexTemplateResponse deleteIndexTemplateResponse = javaClient().indices() + .deleteIndexTemplate(b -> b.name(pTemplateName)); + assertTrue(deleteIndexTemplateResponse.acknowledged()); + + // verify index template is deleted + try { + javaClient().indices().getIndexTemplate(b -> b.name(pTemplateName)); + fail(); + } catch (OpenSearchException ex) { + assertNotNull(ex); + assertEquals(ex.status(), 404); + } + + + + } + } \ No newline at end of file