HLRC: Add Lifecycle Policy delete to the HLRC (#33142)
Adds support for Lifecycle Policy deletion to the Java High-Level Rest Client. Relates to #33100
This commit is contained in:
parent
454ce99b01
commit
ba8d4eba8b
|
@ -21,6 +21,7 @@ package org.elasticsearch.client;
|
|||
|
||||
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 <a href="https://fix-me-when-we-have-docs.com">
|
||||
* the docs</a> 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 <a href="https://fix-me-when-we-have-docs.com">
|
||||
* the docs</a> 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<AcknowledgedResponse> listener) {
|
||||
restHighLevelClient.performRequestAsyncAndParseEntity(request, RequestConverters::deleteLifecyclePolicy, options,
|
||||
AcknowledgedResponse::fromXContent, listener, emptySet());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the index lifecycle policy for an index
|
||||
* See <a href="https://fix-me-when-we-have-docs.com">
|
||||
|
|
|
@ -88,6 +88,7 @@ import org.elasticsearch.action.support.ActiveShardCount;
|
|||
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 @@ final class RequestConverters {
|
|||
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,
|
||||
|
|
|
@ -28,8 +28,11 @@ import org.elasticsearch.common.unit.TimeValue;
|
|||
*/
|
||||
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;
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -26,6 +26,7 @@ import org.apache.http.util.EntityUtils;
|
|||
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.StartILMRequest;
|
|||
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 class IndexLifecycleIT extends ESRestHighLevelClientTestCase {
|
|||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -97,6 +97,7 @@ import org.elasticsearch.action.support.master.MasterNodeRequest;
|
|||
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 class RequestConvertersTests extends ESTestCase {
|
|||
assertToXContentBody(graphExploreRequest, request.getEntity());
|
||||
}
|
||||
|
||||
public void testDeleteLifecycle() {
|
||||
String lifecycleName = randomAlphaOfLengthBetween(2,20);
|
||||
DeleteLifecyclePolicyRequest req = new DeleteLifecyclePolicyRequest(lifecycleName);
|
||||
Map<String, String> 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 @@ public class RequestConvertersTests extends ESTestCase {
|
|||
}
|
||||
}
|
||||
|
||||
private static void setRandomTimeoutTimeValue(Consumer<TimeValue> setter, TimeValue defaultTimeout,
|
||||
Map<String, String> 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<String, String> expectedParams) {
|
||||
if (randomBoolean()) {
|
||||
String masterTimeout = randomTimeValue();
|
||||
|
@ -2902,6 +2927,16 @@ public class RequestConvertersTests extends ESTestCase {
|
|||
}
|
||||
}
|
||||
|
||||
private static void setRandomMasterTimeout(Consumer<TimeValue> setter, TimeValue defaultTimeout, Map<String, String> 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<ActiveShardCount> setter, Map<String, String> expectedParams) {
|
||||
setRandomWaitForActiveShards(setter, ActiveShardCount.DEFAULT, expectedParams);
|
||||
}
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue