diff --git a/server/src/main/java/org/elasticsearch/index/reindex/ReindexRequest.java b/server/src/main/java/org/elasticsearch/index/reindex/ReindexRequest.java index c01edd25b24ab..9ed9396942a7b 100644 --- a/server/src/main/java/org/elasticsearch/index/reindex/ReindexRequest.java +++ b/server/src/main/java/org/elasticsearch/index/reindex/ReindexRequest.java @@ -365,7 +365,7 @@ public static ReindexRequest fromXContent(XContentParser parser) throws IOExcept /** * Yank a string array from a map. Emulates XContent's permissive String to - * String array conversions. + * String array conversions and allow comma separated String. */ private static String[] extractStringArray(Map source, String name) { Object value = source.remove(name); @@ -377,9 +377,9 @@ private static String[] extractStringArray(Map source, String na List list = (List) value; return list.toArray(new String[list.size()]); } else if (value instanceof String) { - return new String[] {(String) value}; + return Strings.splitStringByCommaToArray((String) value); } else { - throw new IllegalArgumentException("Expected [" + name + "] to be a list of a string but was [" + value + ']'); + throw new IllegalArgumentException("Expected [" + name + "] to be a list or a string but was [" + value + ']'); } } diff --git a/server/src/test/java/org/elasticsearch/index/reindex/ReindexRequestTests.java b/server/src/test/java/org/elasticsearch/index/reindex/ReindexRequestTests.java index 90fe2dac38d71..1cabb051cc94e 100644 --- a/server/src/test/java/org/elasticsearch/index/reindex/ReindexRequestTests.java +++ b/server/src/test/java/org/elasticsearch/index/reindex/ReindexRequestTests.java @@ -36,6 +36,7 @@ import java.io.IOException; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import static java.util.Collections.emptyMap; @@ -320,4 +321,43 @@ private RemoteInfo buildRemoteInfoHostTestCase(String hostInRest) throws IOExcep return ReindexRequest.buildRemoteInfo(source); } + + public void testCommaSeparatedSourceIndices() throws IOException { + ReindexRequest r = parseRequestWithSourceIndices("a,b"); + assertArrayEquals(new String[]{"a", "b"}, r.getSearchRequest().indices()); + } + + public void testArraySourceIndices() throws IOException { + ReindexRequest r = parseRequestWithSourceIndices(new String[]{"a", "b"}); + assertArrayEquals(new String[]{"a", "b"}, r.getSearchRequest().indices()); + } + + public void testEmptyStringSourceIndices() throws IOException { + ReindexRequest r = parseRequestWithSourceIndices(""); + assertArrayEquals(new String[0], r.getSearchRequest().indices()); + ActionRequestValidationException validationException = r.validate(); + assertNotNull(validationException); + assertEquals(List.of("use _all if you really want to copy from all existing indexes"), validationException.validationErrors()); + } + + private ReindexRequest parseRequestWithSourceIndices(Object sourceIndices) throws IOException { + BytesReference request; + try (XContentBuilder b = JsonXContent.contentBuilder()) { + b.startObject(); { + b.startObject("source"); { + b.field("index", sourceIndices); + } + b.endObject(); + b.startObject("dest"); { + b.field("index", "dest"); + } + b.endObject(); + } + b.endObject(); + request = BytesReference.bytes(b); + } + try (XContentParser p = createParser(JsonXContent.jsonXContent, request)) { + return ReindexRequest.fromXContent(p); + } + } }