Browse Source

Provide 'system' attribute when resolving system indices (#85042)

* Resolve indices api: add 'system' attribute
* Update docs/changelog/85042.yaml
* Remove magic strings for attribute values
* Update API docs to provide possible resolved index attributes
William Brafford 3 years ago
parent
commit
03985f1953

+ 6 - 0
docs/changelog/85042.yaml

@@ -0,0 +1,6 @@
+pr: 85042
+summary: Provide 'system' attribute when resolving system indices
+area: Infra/Core
+type: enhancement
+issues:
+ - 82671

+ 6 - 5
docs/reference/indices/resolve.asciidoc

@@ -99,7 +99,7 @@ The API returns the following response:
     {
       "name": "foo_closed",
       "attributes": [
-        "closed"
+        "closed"                               <2>
       ]
     },
     {
@@ -118,7 +118,7 @@ The API returns the following response:
       ]
     }
   ],
-  "aliases": [                                 <2>
+  "aliases": [                                 <3>
     {
       "name": "f-alias",
       "indices": [
@@ -127,7 +127,7 @@ The API returns the following response:
       ]
     }
   ],
-  "data_streams": [                            <3>
+  "data_streams": [                            <4>
     {
       "name": "foo",
       "backing_indices": [
@@ -142,5 +142,6 @@ The API returns the following response:
 // TESTRESPONSE[s/.ds-foo-2099.03.07-000001/$body.data_streams.0.backing_indices.0/]
 
 <1> All indices matching the supplied names or expressions
-<2> All aliases matching the supplied names or expressions
-<3> All data streams matching the supplied names or expressions
+<2> Possible index attributes are `open`, `closed`, `hidden`, `system`, and `frozen`
+<3> All aliases matching the supplied names or expressions
+<4> All data streams matching the supplied names or expressions

+ 21 - 0
rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/indices.resolve_index/20_resolve_system_index.yml

@@ -0,0 +1,21 @@
+---
+setup:
+  - skip:
+      version: " - 8.1.99"
+      reason: "system index attribute introduced in 8.2"
+
+  - do:
+      indices.create:
+        index: ".tasks"
+---
+"Resolve system index":
+
+  - do:
+      indices.resolve_index:
+        name: '.tasks'
+        expand_wildcards: [all]
+
+  - match: {indices.0.name: ".tasks"}
+  - match: {indices.0.attributes.0: hidden}
+  - match: {indices.0.attributes.1: open}
+  - match: {indices.0.attributes.2: system}

+ 19 - 6
server/src/main/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexAction.java

@@ -50,6 +50,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
 import java.util.SortedMap;
@@ -580,21 +581,24 @@ public class ResolveIndexAction extends ActionType<ResolveIndexAction.Response>
                     case CONCRETE_INDEX -> {
                         IndexMetadata writeIndex = metadata.index(ia.getWriteIndex());
                         String[] aliasNames = writeIndex.getAliases().keySet().stream().sorted().toArray(String[]::new);
-                        List<String> attributes = new ArrayList<>();
-                        attributes.add(writeIndex.getState() == IndexMetadata.State.OPEN ? "open" : "closed");
+                        List<Attribute> attributes = new ArrayList<>();
+                        attributes.add(writeIndex.getState() == IndexMetadata.State.OPEN ? Attribute.OPEN : Attribute.CLOSED);
                         if (ia.isHidden()) {
-                            attributes.add("hidden");
+                            attributes.add(Attribute.HIDDEN);
+                        }
+                        if (ia.isSystem()) {
+                            attributes.add(Attribute.SYSTEM);
                         }
                         final boolean isFrozen = Boolean.parseBoolean(writeIndex.getSettings().get("index.frozen"));
                         if (isFrozen) {
-                            attributes.add("frozen");
+                            attributes.add(Attribute.FROZEN);
                         }
-                        attributes.sort(String::compareTo);
+                        attributes.sort(Comparator.comparing(e -> e.name().toLowerCase(Locale.ROOT)));
                         indices.add(
                             new ResolvedIndex(
                                 ia.getName(),
                                 aliasNames,
-                                attributes.toArray(Strings.EMPTY_ARRAY),
+                                attributes.stream().map(Enum::name).map(e -> e.toLowerCase(Locale.ROOT)).toArray(String[]::new),
                                 ia.getParentDataStream() == null ? null : ia.getParentDataStream().getName()
                             )
                         );
@@ -619,5 +623,14 @@ public class ResolveIndexAction extends ActionType<ResolveIndexAction.Response>
                 }
             }
         }
+
+        enum Attribute {
+            OPEN,
+            CLOSED,
+            HIDDEN,
+            SYSTEM,
+            FROZEN
+        }
+
     }
 }

+ 33 - 17
server/src/test/java/org/elasticsearch/action/admin/indices/resolve/ResolveIndexTests.java

@@ -49,13 +49,14 @@ import static org.hamcrest.core.IsNull.notNullValue;
 public class ResolveIndexTests extends ESTestCase {
 
     private final Object[][] indices = new Object[][] {
-        // name, isClosed, isHidden, isFrozen, dataStream, aliases
-        { "logs-pgsql-prod-20200101", false, false, true, null, new String[] { "logs-pgsql-prod" } },
-        { "logs-pgsql-prod-20200102", false, false, true, null, new String[] { "logs-pgsql-prod", "one-off-alias" } },
-        { "logs-pgsql-prod-20200103", false, false, false, null, new String[] { "logs-pgsql-prod" } },
-        { "logs-pgsql-test-20200101", true, false, false, null, new String[] { "logs-pgsql-test" } },
-        { "logs-pgsql-test-20200102", false, false, false, null, new String[] { "logs-pgsql-test" } },
-        { "logs-pgsql-test-20200103", false, false, false, null, new String[] { "logs-pgsql-test" } } };
+        // name, isClosed, isHidden, isSystem, isFrozen, dataStream, aliases
+        { "logs-pgsql-prod-20200101", false, false, false, true, null, new String[] { "logs-pgsql-prod" } },
+        { "logs-pgsql-prod-20200102", false, false, false, true, null, new String[] { "logs-pgsql-prod", "one-off-alias" } },
+        { "logs-pgsql-prod-20200103", false, false, false, false, null, new String[] { "logs-pgsql-prod" } },
+        { "logs-pgsql-test-20200101", true, false, false, false, null, new String[] { "logs-pgsql-test" } },
+        { "logs-pgsql-test-20200102", false, false, false, false, null, new String[] { "logs-pgsql-test" } },
+        { "logs-pgsql-test-20200103", false, false, false, false, null, new String[] { "logs-pgsql-test" } },
+        { ".test-system-index", false, false, true, false, null, new String[] {} } };
 
     private final Object[][] dataStreams = new Object[][] {
         // name, timestampField, numBackingIndices
@@ -86,6 +87,7 @@ public class ResolveIndexTests extends ESTestCase {
 
         validateIndices(
             indices,
+            ".test-system-index",
             "logs-pgsql-prod-20200101",
             "logs-pgsql-prod-20200102",
             "logs-pgsql-prod-20200103",
@@ -114,6 +116,7 @@ public class ResolveIndexTests extends ESTestCase {
             ".ds-logs-mysql-prod-" + dateString + "-000004",
             ".ds-logs-mysql-test-" + dateString + "-000001",
             ".ds-logs-mysql-test-" + dateString + "-000002",
+            ".test-system-index",
             "logs-pgsql-prod-20200101",
             "logs-pgsql-prod-20200102",
             "logs-pgsql-prod-20200103",
@@ -210,8 +213,8 @@ public class ResolveIndexTests extends ESTestCase {
         String tomorrowSuffix = dateFormatter.format(now.plus(Duration.ofDays(1L)));
         Object[][] indices = new Object[][] {
             // name, isClosed, isHidden, isFrozen, dataStream, aliases
-            { "logs-pgsql-prod-" + todaySuffix, false, true, false, null, Strings.EMPTY_ARRAY },
-            { "logs-pgsql-prod-" + tomorrowSuffix, false, true, false, null, Strings.EMPTY_ARRAY } };
+            { "logs-pgsql-prod-" + todaySuffix, false, true, false, false, null, Strings.EMPTY_ARRAY },
+            { "logs-pgsql-prod-" + tomorrowSuffix, false, true, false, false, null, Strings.EMPTY_ARRAY } };
         Metadata metadata = buildMetadata(new Object[][] {}, indices);
 
         String requestedIndex = "<logs-pgsql-prod-{now/d}>";
@@ -237,9 +240,9 @@ public class ResolveIndexTests extends ESTestCase {
             }
             assertThat(indexInfo, notNullValue());
             assertThat(resolvedIndex.getName(), equalTo((String) indexInfo[0]));
-            assertThat(resolvedIndex.getAliases(), is(((String[]) indexInfo[5])));
+            assertThat(resolvedIndex.getAliases(), is(((String[]) indexInfo[6])));
             assertThat(resolvedIndex.getAttributes(), is(flagsToAttributes(indexInfo)));
-            assertThat(resolvedIndex.getDataStream(), equalTo((String) indexInfo[4]));
+            assertThat(resolvedIndex.getDataStream(), equalTo((String) indexInfo[5]));
         }
     }
 
@@ -248,7 +251,7 @@ public class ResolveIndexTests extends ESTestCase {
 
         Map<String, Set<String>> aliasToIndicesMap = new HashMap<>();
         for (Object[] indexInfo : indices) {
-            String[] aliases = (String[]) indexInfo[5];
+            String[] aliases = (String[]) indexInfo[6];
             for (String alias : aliases) {
                 Set<String> indicesSet = aliasToIndicesMap.get(alias);
                 if (indicesSet == null) {
@@ -312,11 +315,12 @@ public class ResolveIndexTests extends ESTestCase {
 
         for (Object[] indexInfo : indices) {
             String indexName = (String) indexInfo[0];
-            String[] aliases = (String[]) indexInfo[5];
+            String[] aliases = (String[]) indexInfo[6];
             boolean closed = (boolean) indexInfo[1];
             boolean hidden = (boolean) indexInfo[2];
-            boolean frozen = (boolean) indexInfo[3];
-            allIndices.add(createIndexMetadata(indexName, aliases, closed, hidden, frozen));
+            boolean system = (boolean) indexInfo[3];
+            boolean frozen = (boolean) indexInfo[4];
+            allIndices.add(createIndexMetadata(indexName, aliases, closed, hidden, system, frozen));
         }
 
         for (IndexMetadata index : allIndices) {
@@ -326,7 +330,14 @@ public class ResolveIndexTests extends ESTestCase {
         return builder.build();
     }
 
-    private static IndexMetadata createIndexMetadata(String name, String[] aliases, boolean closed, boolean hidden, boolean frozen) {
+    private static IndexMetadata createIndexMetadata(
+        String name,
+        String[] aliases,
+        boolean closed,
+        boolean hidden,
+        boolean system,
+        boolean frozen
+    ) {
         Settings.Builder settingsBuilder = Settings.builder()
             .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT)
             .put("index.hidden", hidden)
@@ -335,6 +346,7 @@ public class ResolveIndexTests extends ESTestCase {
         IndexMetadata.Builder indexBuilder = IndexMetadata.builder(name)
             .settings(settingsBuilder)
             .state(closed ? IndexMetadata.State.CLOSE : IndexMetadata.State.OPEN)
+            .system(system)
             .numberOfShards(1)
             .numberOfReplicas(1);
 
@@ -346,7 +358,7 @@ public class ResolveIndexTests extends ESTestCase {
     }
 
     private static IndexMetadata createIndexMetadata(String name, boolean hidden) {
-        return createIndexMetadata(name, Strings.EMPTY_ARRAY, false, true, false);
+        return createIndexMetadata(name, Strings.EMPTY_ARRAY, false, true, false, false);
     }
 
     private static Object[] findInfo(Object[][] indexSource, String indexName) {
@@ -369,6 +381,7 @@ public class ResolveIndexTests extends ESTestCase {
                         false,
                         true,
                         false,
+                        false,
                         dataStreamName,
                         Strings.EMPTY_ARRAY };
                 }
@@ -384,6 +397,9 @@ public class ResolveIndexTests extends ESTestCase {
             attributes.add("hidden");
         }
         if ((boolean) indexInfo[3]) {
+            attributes.add("system");
+        }
+        if ((boolean) indexInfo[4]) {
             attributes.add("frozen");
         }
         attributes.sort(String::compareTo);