Pārlūkot izejas kodu

ILM: Get policy support wildcard name (#89238)

ILM Get policy support wildcard name is a useful feature.
We can use Get /_ilm/policy/policy* to get the wildcard result.
weizijun 3 gadi atpakaļ
vecāks
revīzija
50cfd2b17a

+ 5 - 0
docs/changelog/89238.yaml

@@ -0,0 +1,5 @@
+pr: 89238
+summary: "ILM: Get policy support wildcard name"
+area: ILM+SLM
+type: enhancement
+issues: []

+ 90 - 0
x-pack/plugin/ilm/qa/rest/src/yamlRestTest/resources/rest-api-spec/test/ilm/10_basic.yml

@@ -58,6 +58,96 @@ setup:
       ilm.get_lifecycle:
         policy: "my_timeseries_lifecycle"
 
+---
+"Test Policy Get":
+  - do:
+      ilm.put_lifecycle:
+        policy: "my_timeseries_lifecycle_1"
+        body: |
+          {
+            "policy": {
+              "phases": {
+                "warm": {
+                  "min_age": "10s",
+                  "actions": {
+                    "forcemerge": {
+                      "max_num_segments": 10000
+                    }
+                  }
+                }
+              }
+            }
+          }
+
+  - do:
+      ilm.put_lifecycle:
+        policy: "my_timeseries_lifecycle_2"
+        body: |
+          {
+            "policy": {
+              "phases": {
+                 "delete": {
+                   "min_age": "30s",
+                   "actions": {
+                     "delete": {}
+                   }
+                 }
+              }
+            }
+          }
+
+  - do:
+      ilm.put_lifecycle:
+        policy: "other_lifecycle"
+        body: |
+          {
+            "policy": {
+              "phases": {
+                "warm": {
+                  "min_age": "10s",
+                  "actions": {
+                    "forcemerge": {
+                      "max_num_segments": 10000
+                    }
+                  }
+                },
+                "delete": {
+                  "min_age": "30s",
+                  "actions": {
+                    "delete": {}
+                  }
+                }
+              }
+            }
+          }
+
+  - do:
+      ilm.get_lifecycle:
+        policy: "my_timeseries*"
+  - match: { my_timeseries_lifecycle_1.version: 1 }
+  - match: { my_timeseries_lifecycle_2.version: 1 }
+
+  - do:
+      ilm.get_lifecycle:
+        policy: "my_timeseries_lifecycle_1,my_timeseries_lifecycle_2"
+  - match: { my_timeseries_lifecycle_1.version: 1 }
+  - match: { my_timeseries_lifecycle_2.version: 1 }
+
+  - do:
+      catch: missing
+      ilm.get_lifecycle:
+        policy: "lifecycle_not_found"
+
+  - do:
+      catch: /wildcard only supports a single value, please use comma-separated values or a single wildcard value/
+      ilm.get_lifecycle:
+        policy: "my_timeseries*,other_lifecycle"
+
+  - do:
+      catch: missing
+      ilm.get_lifecycle:
+        policy: "other_lifecycle,lifecycle_not_found"
+
 ---
 "Test Policy Update":
   - do:

+ 35 - 16
x-pack/plugin/ilm/src/main/java/org/elasticsearch/xpack/ilm/action/TransportGetLifecycleAction.java

@@ -17,6 +17,7 @@ import org.elasticsearch.cluster.block.ClusterBlockLevel;
 import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
 import org.elasticsearch.cluster.service.ClusterService;
 import org.elasticsearch.common.inject.Inject;
+import org.elasticsearch.common.regex.Regex;
 import org.elasticsearch.tasks.Task;
 import org.elasticsearch.threadpool.ThreadPool;
 import org.elasticsearch.transport.TransportService;
@@ -31,7 +32,9 @@ import org.elasticsearch.xpack.core.ilm.action.GetLifecycleAction.Response;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 public class TransportGetLifecycleAction extends TransportMasterNodeAction<Request, Response> {
 
@@ -68,29 +71,44 @@ public class TransportGetLifecycleAction extends TransportMasterNodeAction<Reque
                 );
             }
         } else {
-            List<LifecyclePolicyResponseItem> requestedPolicies;
-            // if no policies explicitly provided, behave as if `*` was specified
+            List<String> names;
             if (request.getPolicyNames().length == 0) {
-                requestedPolicies = new ArrayList<>(metadata.getPolicyMetadatas().size());
-                for (LifecyclePolicyMetadata policyMetadata : metadata.getPolicyMetadatas().values()) {
-                    requestedPolicies.add(
-                        new LifecyclePolicyResponseItem(
-                            policyMetadata.getPolicy(),
-                            policyMetadata.getVersion(),
-                            policyMetadata.getModifiedDateString(),
-                            LifecyclePolicyUtils.calculateUsage(indexNameExpressionResolver, state, policyMetadata.getName())
-                        )
-                    );
-                }
+                names = List.of("*");
             } else {
-                requestedPolicies = new ArrayList<>(request.getPolicyNames().length);
-                for (String name : request.getPolicyNames()) {
+                names = Arrays.asList(request.getPolicyNames());
+            }
+
+            if (names.size() > 1 && names.stream().filter(Regex::isSimpleMatchPattern).count() > 0) {
+                throw new IllegalArgumentException(
+                    "wildcard only supports a single value, please use comma-separated values or a single wildcard value"
+                );
+            }
+
+            Map<String, LifecyclePolicyResponseItem> policyResponseItemMap = new LinkedHashMap<>();
+            for (String name : names) {
+                if (Regex.isSimpleMatchPattern(name)) {
+                    for (Map.Entry<String, LifecyclePolicyMetadata> entry : metadata.getPolicyMetadatas().entrySet()) {
+                        LifecyclePolicyMetadata policyMetadata = entry.getValue();
+                        if (Regex.simpleMatch(name, entry.getKey())) {
+                            policyResponseItemMap.put(
+                                entry.getKey(),
+                                new LifecyclePolicyResponseItem(
+                                    policyMetadata.getPolicy(),
+                                    policyMetadata.getVersion(),
+                                    policyMetadata.getModifiedDateString(),
+                                    LifecyclePolicyUtils.calculateUsage(indexNameExpressionResolver, state, policyMetadata.getName())
+                                )
+                            );
+                        }
+                    }
+                } else {
                     LifecyclePolicyMetadata policyMetadata = metadata.getPolicyMetadatas().get(name);
                     if (policyMetadata == null) {
                         listener.onFailure(new ResourceNotFoundException("Lifecycle policy not found: {}", name));
                         return;
                     }
-                    requestedPolicies.add(
+                    policyResponseItemMap.put(
+                        name,
                         new LifecyclePolicyResponseItem(
                             policyMetadata.getPolicy(),
                             policyMetadata.getVersion(),
@@ -100,6 +118,7 @@ public class TransportGetLifecycleAction extends TransportMasterNodeAction<Reque
                     );
                 }
             }
+            List<LifecyclePolicyResponseItem> requestedPolicies = new ArrayList<>(policyResponseItemMap.values());
             listener.onResponse(new Response(requestedPolicies));
         }
     }