diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/IndexLifecycleClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/IndexLifecycleClient.java index 21fb4a0062402..78816a4f78703 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/IndexLifecycleClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/IndexLifecycleClient.java @@ -21,6 +21,7 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.support.master.AcknowledgedResponse; +import org.elasticsearch.client.indexlifecycle.DeleteLifecyclePolicyRequest; import org.elasticsearch.protocol.xpack.indexlifecycle.ExplainLifecycleRequest; import org.elasticsearch.protocol.xpack.indexlifecycle.ExplainLifecycleResponse; import org.elasticsearch.protocol.xpack.indexlifecycle.SetIndexLifecyclePolicyRequest; @@ -39,6 +40,35 @@ public class IndexLifecycleClient { this.restHighLevelClient = restHighLevelClient; } + /** + * Delete a lifecycle definition + * See + * the docs for more. + * @param request the request + * @param options the request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized + * @return the response + * @throws IOException in case there is a problem sending the request or parsing back the response + */ + public AcknowledgedResponse deleteLifecyclePolicy(DeleteLifecyclePolicyRequest request, + RequestOptions options) throws IOException { + return restHighLevelClient.performRequestAndParseEntity(request, RequestConverters::deleteLifecyclePolicy, options, + AcknowledgedResponse::fromXContent, emptySet()); + } + + /** + * Asynchronously delete a lifecycle definition + * See + * the docs for more. + * @param request the request + * @param options the request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized + * @param listener the listener to be notified upon request completion + */ + public void deleteLifecyclePolicyAsync(DeleteLifecyclePolicyRequest request, RequestOptions options, + ActionListener listener) { + restHighLevelClient.performRequestAsyncAndParseEntity(request, RequestConverters::deleteLifecyclePolicy, options, + AcknowledgedResponse::fromXContent, listener, emptySet()); + } + /** * Set the index lifecycle policy for an index * See diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java index 7916f4e2f9519..4fb4edcf1afdc 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java @@ -88,6 +88,7 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.action.update.UpdateRequest; +import org.elasticsearch.client.indexlifecycle.DeleteLifecyclePolicyRequest; import org.elasticsearch.cluster.health.ClusterHealthStatus; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.Priority; @@ -1190,6 +1191,18 @@ static Request xpackUsage(XPackUsageRequest usageRequest) { return request; } + static Request deleteLifecyclePolicy(DeleteLifecyclePolicyRequest deleteLifecyclePolicyRequest) { + Request request = new Request(HttpDelete.METHOD_NAME, + new EndpointBuilder() + .addPathPartAsIs("_ilm") + .addPathPartAsIs(deleteLifecyclePolicyRequest.getLifecyclePolicy()) + .build()); + Params params = new Params(request); + params.withMasterTimeout(deleteLifecyclePolicyRequest.masterNodeTimeout()); + params.withTimeout(deleteLifecyclePolicyRequest.timeout()); + return request; + } + static Request setIndexLifecyclePolicy(SetIndexLifecyclePolicyRequest setPolicyRequest) { String[] indices = setPolicyRequest.indices() == null ? Strings.EMPTY_ARRAY : setPolicyRequest.indices(); Request request = new Request(HttpPut.METHOD_NAME, diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/TimedRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/TimedRequest.java index af8fbe3e72b37..40388eae288e6 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/TimedRequest.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/TimedRequest.java @@ -28,8 +28,11 @@ */ public class TimedRequest implements Validatable { - private TimeValue timeout; - private TimeValue masterTimeout; + public static final TimeValue DEFAULT_TIMEOUT = TimeValue.timeValueSeconds(30); + public static final TimeValue DEFAULT_MASTER_TIMEOUT = TimeValue.timeValueSeconds(30); + + private TimeValue timeout = DEFAULT_TIMEOUT; + private TimeValue masterTimeout = DEFAULT_MASTER_TIMEOUT; public void setTimeout(TimeValue timeout) { this.timeout = timeout; diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/indexlifecycle/DeleteLifecyclePolicyRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/indexlifecycle/DeleteLifecyclePolicyRequest.java new file mode 100644 index 0000000000000..fc029f37ac928 --- /dev/null +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/indexlifecycle/DeleteLifecyclePolicyRequest.java @@ -0,0 +1,59 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.client.indexlifecycle; + +import org.elasticsearch.client.TimedRequest; +import org.elasticsearch.common.Strings; + +import java.util.Objects; + +public class DeleteLifecyclePolicyRequest extends TimedRequest { + + private final String lifecyclePolicy; + + public DeleteLifecyclePolicyRequest(String lifecyclePolicy) { + if (Strings.isNullOrEmpty(lifecyclePolicy)) { + throw new IllegalArgumentException("lifecycle name must be present"); + } + this.lifecyclePolicy = lifecyclePolicy; + } + + public String getLifecyclePolicy() { + return lifecyclePolicy; + } + + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + DeleteLifecyclePolicyRequest that = (DeleteLifecyclePolicyRequest) o; + return Objects.equals(getLifecyclePolicy(), that.getLifecyclePolicy()); + } + + @Override + public int hashCode() { + return Objects.hash(getLifecyclePolicy()); + } +} diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexLifecycleIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexLifecycleIT.java index ad9064cf160ad..c2ce908efe3e3 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexLifecycleIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexLifecycleIT.java @@ -26,6 +26,7 @@ import org.elasticsearch.action.admin.indices.settings.get.GetSettingsRequest; import org.elasticsearch.action.admin.indices.settings.get.GetSettingsResponse; import org.elasticsearch.action.support.master.AcknowledgedResponse; +import org.elasticsearch.client.indexlifecycle.DeleteLifecyclePolicyRequest; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.protocol.xpack.indexlifecycle.ExplainLifecycleRequest; import org.elasticsearch.protocol.xpack.indexlifecycle.ExplainLifecycleResponse; @@ -36,8 +37,10 @@ import org.elasticsearch.protocol.xpack.indexlifecycle.StopILMRequest; import org.hamcrest.Matchers; +import java.io.IOException; import java.util.Map; +import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; @@ -286,4 +289,70 @@ public void testExplainLifecycle() throws Exception { assertFalse(squashResponse.managedByILM()); assertEquals("squash", squashResponse.getIndex()); } + + public void testDeleteLifecycle() throws IOException { + String policy = randomAlphaOfLength(10); + + // TODO: NORELEASE convert this to using the high level client once there are APIs for it + String jsonString = "{\n" + + " \"policy\": {\n" + + " \"phases\": {\n" + + " \"hot\": {\n" + + " \"actions\": {\n" + + " \"rollover\": {\n" + + " \"max_age\": \"50d\"\n" + + " } \n" + + " }\n" + + " },\n" + + " \"warm\": {\n" + + " \"after\": \"1000s\",\n" + + " \"actions\": {\n" + + " \"allocate\": {\n" + + " \"require\": { \"_name\": \"node-1\" },\n" + + " \"include\": {},\n" + + " \"exclude\": {}\n" + + " },\n" + + " \"shrink\": {\n" + + " \"number_of_shards\": 1\n" + + " },\n" + + " \"forcemerge\": {\n" + + " \"max_num_segments\": 1000\n" + + " }\n" + + " }\n" + + " },\n" + + " \"cold\": {\n" + + " \"after\": \"2000s\",\n" + + " \"actions\": {\n" + + " \"allocate\": {\n" + + " \"number_of_replicas\": 0\n" + + " }\n" + + " }\n" + + " },\n" + + " \"delete\": {\n" + + " \"after\": \"3000s\",\n" + + " \"actions\": {\n" + + " \"delete\": {}\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; + HttpEntity entity = new NStringEntity(jsonString, ContentType.APPLICATION_JSON); + Request request = new Request("PUT", "/_ilm/" + policy); + request.setEntity(entity); + client().performRequest(request); + + DeleteLifecyclePolicyRequest deleteRequest = new DeleteLifecyclePolicyRequest(policy); + assertAcked(execute(deleteRequest, highLevelClient().indexLifecycle()::deleteLifecyclePolicy, + highLevelClient().indexLifecycle()::deleteLifecyclePolicyAsync)); + + // TODO: NORELEASE convert this to using the high level client once there are APIs for it + Request getLifecycle = new Request("GET", "/_ilm/" + policy); + try { + client().performRequest(getLifecycle); + fail("index should not exist after being deleted"); + } catch (ResponseException ex) { + assertEquals(404, ex.getResponse().getStatusLine().getStatusCode()); + } + } } diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java index 5c271eca50505..13de640a91fe8 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java @@ -97,6 +97,7 @@ import org.elasticsearch.action.support.replication.ReplicationRequest; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.client.RequestConverters.EndpointBuilder; +import org.elasticsearch.client.indexlifecycle.DeleteLifecyclePolicyRequest; import org.elasticsearch.cluster.health.ClusterHealthStatus; import org.elasticsearch.common.CheckedBiConsumer; import org.elasticsearch.common.CheckedFunction; @@ -2698,6 +2699,19 @@ public void testGraphExplore() throws Exception { assertToXContentBody(graphExploreRequest, request.getEntity()); } + public void testDeleteLifecycle() { + String lifecycleName = randomAlphaOfLengthBetween(2,20); + DeleteLifecyclePolicyRequest req = new DeleteLifecyclePolicyRequest(lifecycleName); + Map expectedParams = new HashMap<>(); + setRandomMasterTimeout(req::setMasterTimeout, TimedRequest.DEFAULT_TIMEOUT, expectedParams); + setRandomTimeoutTimeValue(req::setTimeout, TimedRequest.DEFAULT_MASTER_TIMEOUT, expectedParams); + + Request request = RequestConverters.deleteLifecyclePolicy(req); + assertEquals(request.getMethod(), HttpDelete.METHOD_NAME); + assertEquals(request.getEndpoint(), "/_ilm/" + lifecycleName); + assertEquals(request.getParameters(), expectedParams); + } + public void testSetIndexLifecyclePolicy() throws Exception { SetIndexLifecyclePolicyRequest req = new SetIndexLifecyclePolicyRequest(); String policyName = randomAlphaOfLength(10); @@ -2892,6 +2906,17 @@ private static void setRandomTimeout(Consumer setter, TimeValue defaultT } } + private static void setRandomTimeoutTimeValue(Consumer setter, TimeValue defaultTimeout, + Map expectedParams) { + if (randomBoolean()) { + TimeValue timeout = TimeValue.parseTimeValue(randomTimeValue(), "random_timeout"); + setter.accept(timeout); + expectedParams.put("timeout", timeout.getStringRep()); + } else { + expectedParams.put("timeout", defaultTimeout.getStringRep()); + } + } + private static void setRandomMasterTimeout(MasterNodeRequest request, Map expectedParams) { if (randomBoolean()) { String masterTimeout = randomTimeValue(); @@ -2902,6 +2927,16 @@ private static void setRandomMasterTimeout(MasterNodeRequest request, Map setter, TimeValue defaultTimeout, Map expectedParams) { + if (randomBoolean()) { + TimeValue masterTimeout = TimeValue.parseTimeValue(randomTimeValue(), "random_master_timeout"); + setter.accept(masterTimeout); + expectedParams.put("master_timeout", masterTimeout.getStringRep()); + } else { + expectedParams.put("master_timeout", defaultTimeout.getStringRep()); + } + } + private static void setRandomWaitForActiveShards(Consumer setter, Map expectedParams) { setRandomWaitForActiveShards(setter, ActiveShardCount.DEFAULT, expectedParams); } diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/indexlifecycle/DeleteLifecyclePolicyRequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/indexlifecycle/DeleteLifecyclePolicyRequestTests.java new file mode 100644 index 0000000000000..01f6288d81d4b --- /dev/null +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/indexlifecycle/DeleteLifecyclePolicyRequestTests.java @@ -0,0 +1,39 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.client.indexlifecycle; + +import org.elasticsearch.test.ESTestCase; + +public class DeleteLifecyclePolicyRequestTests extends ESTestCase { + + private DeleteLifecyclePolicyRequest createTestInstance() { + return new DeleteLifecyclePolicyRequest(randomAlphaOfLengthBetween(2, 20)); + } + + public void testValidate() { + DeleteLifecyclePolicyRequest req = createTestInstance(); + assertFalse(req.validate().isPresent()); + + } + + public void testValidationFailure() { + expectThrows(IllegalArgumentException.class, () -> new DeleteLifecyclePolicyRequest(randomFrom("", null))); + } +}