From c7bfbe3e69db6f2dc478d7f4fd33ffe630d6b627 Mon Sep 17 00:00:00 2001 From: Jason Tedor <jason@tedor.me> Date: Tue, 13 Sep 2016 07:57:18 -0400 Subject: [PATCH] Add health status parameter to cat indices API This commit adds a health status parameter to the cat indices API for filtering on indices that match the specified status (green|yellow|red). Relates #20393 --- .../rest/action/cat/RestIndicesAction.java | 23 +++++++++-- .../action/cat/RestIndicesActionTests.java | 3 +- docs/reference/cat/indices.asciidoc | 2 +- .../rest-api-spec/api/cat.indices.json | 4 ++ .../test/cat.indices/10_basic.yaml | 41 +++++++++++++++++++ 5 files changed, 68 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/rest/action/cat/RestIndicesAction.java b/core/src/main/java/org/elasticsearch/rest/action/cat/RestIndicesAction.java index 3c65e32c746..782c0ea4441 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/cat/RestIndicesAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/cat/RestIndicesAction.java @@ -27,9 +27,10 @@ import org.elasticsearch.action.admin.indices.stats.IndexStats; import org.elasticsearch.action.admin.indices.stats.IndicesStatsRequest; import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse; import org.elasticsearch.action.support.IndicesOptions; -import org.elasticsearch.client.node.NodeClient; import org.elasticsearch.client.Requests; +import org.elasticsearch.client.node.NodeClient; import org.elasticsearch.cluster.ClusterState; +import org.elasticsearch.cluster.health.ClusterHealthStatus; import org.elasticsearch.cluster.health.ClusterIndexHealth; import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; @@ -314,16 +315,32 @@ public class RestIndicesAction extends AbstractCatAction { } // package private for testing - Table buildTable(RestRequest request, Index[] indices, ClusterHealthResponse health, IndicesStatsResponse stats, MetaData indexMetaDatas) { + Table buildTable(RestRequest request, Index[] indices, ClusterHealthResponse response, IndicesStatsResponse stats, MetaData indexMetaDatas) { + final String healthParam = request.param("health"); + final ClusterHealthStatus status; + if (healthParam != null) { + status = ClusterHealthStatus.fromString(healthParam); + } else { + status = null; + } + Table table = getTableWithHeader(request); for (final Index index : indices) { final String indexName = index.getName(); - ClusterIndexHealth indexHealth = health.getIndices().get(indexName); + ClusterIndexHealth indexHealth = response.getIndices().get(indexName); IndexStats indexStats = stats.getIndices().get(indexName); IndexMetaData indexMetaData = indexMetaDatas.getIndices().get(indexName); IndexMetaData.State state = indexMetaData.getState(); + if (status != null) { + if (state == IndexMetaData.State.CLOSE || + (indexHealth == null && !ClusterHealthStatus.RED.equals(status)) || + !indexHealth.getStatus().equals(status)) { + continue; + } + } + table.startRow(); table.addCell(state == IndexMetaData.State.OPEN ? (indexHealth == null ? "red*" : indexHealth.getStatus().toString().toLowerCase(Locale.ROOT)) : null); table.addCell(state.toString().toLowerCase(Locale.ROOT)); diff --git a/core/src/test/java/org/elasticsearch/rest/action/cat/RestIndicesActionTests.java b/core/src/test/java/org/elasticsearch/rest/action/cat/RestIndicesActionTests.java index 6fc0333fecf..abaefcf438e 100644 --- a/core/src/test/java/org/elasticsearch/rest/action/cat/RestIndicesActionTests.java +++ b/core/src/test/java/org/elasticsearch/rest/action/cat/RestIndicesActionTests.java @@ -57,6 +57,7 @@ import org.elasticsearch.index.warmer.WarmerStats; import org.elasticsearch.rest.RestController; import org.elasticsearch.search.suggest.completion.CompletionStats; import org.elasticsearch.test.ESTestCase; +import org.elasticsearch.test.rest.FakeRestRequest; import java.nio.file.Path; import java.util.ArrayList; @@ -107,7 +108,7 @@ public class RestIndicesActionTests extends ESTestCase { clusterState.getClusterName().value(), indicesStr, clusterState, 0, 0, 0, TimeValue.timeValueMillis(1000L) ); - final Table table = action.buildTable(null, indices, clusterHealth, randomIndicesStatsResponse(indices), metaData); + final Table table = action.buildTable(new FakeRestRequest(), indices, clusterHealth, randomIndicesStatsResponse(indices), metaData); // now, verify the table is correct int count = 0; diff --git a/docs/reference/cat/indices.asciidoc b/docs/reference/cat/indices.asciidoc index 3e8938faab7..d87ec6759a1 100644 --- a/docs/reference/cat/indices.asciidoc +++ b/docs/reference/cat/indices.asciidoc @@ -33,7 +33,7 @@ Which indices are yellow? [source,sh] -------------------------------------------------- -% curl localhost:9200/_cat/indices | grep ^yell +% curl localhost:9200/_cat/indices?health=yellow yellow open wiki 2 1 6401 1115 151.4mb 151.4mb yellow open twitter 5 1 11434 0 32mb 32mb -------------------------------------------------- diff --git a/rest-api-spec/src/main/resources/rest-api-spec/api/cat.indices.json b/rest-api-spec/src/main/resources/rest-api-spec/api/cat.indices.json index 7858fc2ee9e..ae5ef206aa4 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/api/cat.indices.json +++ b/rest-api-spec/src/main/resources/rest-api-spec/api/cat.indices.json @@ -33,6 +33,10 @@ "type": "list", "description" : "Comma-separated list of column names to display" }, + "health": { + "type" : "string", + "description" : "A health status (\"green\", \"yellow\", or \"red\" to filter only indices matching the specified health status" + }, "help": { "type": "boolean", "description": "Return help information", diff --git a/rest-api-spec/src/main/resources/rest-api-spec/test/cat.indices/10_basic.yaml b/rest-api-spec/src/main/resources/rest-api-spec/test/cat.indices/10_basic.yaml index b07b5dadd98..24619e53353 100644 --- a/rest-api-spec/src/main/resources/rest-api-spec/test/cat.indices/10_basic.yaml +++ b/rest-api-spec/src/main/resources/rest-api-spec/test/cat.indices/10_basic.yaml @@ -70,6 +70,47 @@ ) $/ +--- +"Test cat indices using health status": + + - do: + cluster.health: {} + + - set: { number_of_data_nodes: count } + + - do: + indices.create: + index: foo + body: + settings: + number_of_shards: "1" + number_of_replicas: "0" + - do: + indices.create: + index: bar + body: + settings: + number_of_shards: "1" + number_of_replicas: $count + + - do: + cat.indices: + health: green + h: index + + - match: + $body: | + /^(foo)$/ + + - do: + cat.indices: + health: yellow + h: index + + - match: + $body: | + /^(bar)$/ + --- "Test cat indices using wildcards":