From 3c954b5978fc6a9ca9f92a8c1457972a1c1dfd80 Mon Sep 17 00:00:00 2001 From: Dan Hermann Date: Wed, 11 Mar 2020 17:06:00 -0500 Subject: [PATCH] =?UTF-8?q?Fix=20ingest=20pipeline=20=5Fsimulate=20api=20w?= =?UTF-8?q?ith=20empty=20docs=20never=20returns=20a=20res=E2=80=A6=20(#529?= =?UTF-8?q?37)=20(#53436)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ingest/SimulateExecutionService.java | 7 +++++ .../ingest/SimulatePipelineRequest.java | 9 +++++- .../SimulatePipelineRequestParsingTests.java | 31 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/action/ingest/SimulateExecutionService.java b/server/src/main/java/org/elasticsearch/action/ingest/SimulateExecutionService.java index aa2e0a893a667..191457096808a 100644 --- a/server/src/main/java/org/elasticsearch/action/ingest/SimulateExecutionService.java +++ b/server/src/main/java/org/elasticsearch/action/ingest/SimulateExecutionService.java @@ -69,6 +69,13 @@ public void execute(SimulatePipelineRequest.Parsed request, ActionListener responses = new CopyOnWriteArrayList<>(new SimulateDocumentBaseResult[request.getDocuments().size()]); + + if (request.getDocuments().isEmpty()) { + l.onResponse(new SimulatePipelineResponse(request.getPipeline().getId(), + request.isVerbose(), responses)); + return; + } + int iter = 0; for (IngestDocument ingestDocument : request.getDocuments()) { final int index = iter; diff --git a/server/src/main/java/org/elasticsearch/action/ingest/SimulatePipelineRequest.java b/server/src/main/java/org/elasticsearch/action/ingest/SimulatePipelineRequest.java index de0b0c18a9113..65de150546d2f 100644 --- a/server/src/main/java/org/elasticsearch/action/ingest/SimulatePipelineRequest.java +++ b/server/src/main/java/org/elasticsearch/action/ingest/SimulatePipelineRequest.java @@ -173,8 +173,15 @@ static Parsed parse(Map config, boolean verbose, IngestService i private static List parseDocs(Map config) { List> docs = ConfigurationUtils.readList(null, null, config, Fields.DOCS); + if (docs.isEmpty()) { + throw new IllegalArgumentException("must specify at least one document in [docs]"); + } List ingestDocumentList = new ArrayList<>(); - for (Map dataMap : docs) { + for (Object object : docs) { + if ((object instanceof Map) == false) { + throw new IllegalArgumentException("malformed [docs] section, should include an inner object"); + } + Map dataMap = (Map) object; Map document = ConfigurationUtils.readMap(null, null, dataMap, Fields.SOURCE); String index = ConfigurationUtils.readStringOrIntProperty(null, null, diff --git a/server/src/test/java/org/elasticsearch/action/ingest/SimulatePipelineRequestParsingTests.java b/server/src/test/java/org/elasticsearch/action/ingest/SimulatePipelineRequestParsingTests.java index 8e313e7cdbb1a..7dd4a25437adf 100644 --- a/server/src/test/java/org/elasticsearch/action/ingest/SimulatePipelineRequestParsingTests.java +++ b/server/src/test/java/org/elasticsearch/action/ingest/SimulatePipelineRequestParsingTests.java @@ -19,6 +19,7 @@ package org.elasticsearch.action.ingest; +import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.index.VersionType; import org.elasticsearch.ingest.CompoundProcessor; import org.elasticsearch.ingest.IngestDocument; @@ -46,6 +47,7 @@ import static org.elasticsearch.ingest.IngestDocument.MetaData.TYPE; import static org.elasticsearch.ingest.IngestDocument.MetaData.VERSION; import static org.elasticsearch.ingest.IngestDocument.MetaData.VERSION_TYPE; +import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; import static org.mockito.Mockito.mock; @@ -257,4 +259,33 @@ public void testNonExistentPipelineId() { () -> SimulatePipelineRequest.parseWithPipelineId(pipelineId, requestContent, false, ingestService)); assertThat(e.getMessage(), equalTo("pipeline [" + pipelineId + "] does not exist")); } + + public void testNotValidDocs() { + Map requestContent = new HashMap<>(); + List> docs = new ArrayList<>(); + Map pipelineConfig = new HashMap<>(); + List> processors = new ArrayList<>(); + pipelineConfig.put("processors", processors); + requestContent.put(Fields.DOCS, docs); + requestContent.put(Fields.PIPELINE, pipelineConfig); + Exception e1 = expectThrows(IllegalArgumentException.class, + () -> SimulatePipelineRequest.parse(requestContent, false, ingestService)); + assertThat(e1.getMessage(), equalTo("must specify at least one document in [docs]")); + + List stringList = new ArrayList<>(); + stringList.add("test"); + pipelineConfig.put("processors", processors); + requestContent.put(Fields.DOCS, stringList); + requestContent.put(Fields.PIPELINE, pipelineConfig); + Exception e2 = expectThrows(IllegalArgumentException.class, + () -> SimulatePipelineRequest.parse(requestContent, false, ingestService)); + assertThat(e2.getMessage(), equalTo("malformed [docs] section, should include an inner object")); + + docs.add(new HashMap<>()); + requestContent.put(Fields.DOCS, docs); + requestContent.put(Fields.PIPELINE, pipelineConfig); + Exception e3 = expectThrows(ElasticsearchParseException.class, + () -> SimulatePipelineRequest.parse(requestContent, false, ingestService)); + assertThat(e3.getMessage(), containsString("required property is missing")); + } }