From 2ee6dc37b6809668673f7affb8792bf9600208be Mon Sep 17 00:00:00 2001 From: Benjamin Trent Date: Fri, 19 Feb 2021 14:18:26 -0500 Subject: [PATCH] [ML][HLRC] adds put and delete trained model alias APIs to rest high-level client (#69214) adds put (and reassign) and delete trained model alias APIs to the rest high-level client. This adds some serialization objects and request wrappers. --- .../client/MLRequestConverters.java | 28 ++++ .../client/MachineLearningClient.java | 88 ++++++++++++ .../ml/DeleteTrainedModelAliasRequest.java | 47 +++++++ .../ml/PutTrainedModelAliasRequest.java | 56 ++++++++ .../client/MLRequestConvertersTests.java | 50 +++++++ .../client/MachineLearningIT.java | 79 +++++++++++ .../MlClientDocumentationIT.java | 125 ++++++++++++++++++ .../ml/delete-trained-model-alias.asciidoc | 39 ++++++ .../ml/put-trained-model-alias.asciidoc | 41 ++++++ .../high-level/supported-apis.asciidoc | 4 + 10 files changed, 557 insertions(+) create mode 100644 client/rest-high-level/src/main/java/org/elasticsearch/client/ml/DeleteTrainedModelAliasRequest.java create mode 100644 client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PutTrainedModelAliasRequest.java create mode 100644 docs/java-rest/high-level/ml/delete-trained-model-alias.asciidoc create mode 100644 docs/java-rest/high-level/ml/put-trained-model-alias.asciidoc diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java index f85fc02be398..9f8a82c33dff 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java @@ -28,6 +28,7 @@ import org.elasticsearch.client.ml.DeleteFilterRequest; import org.elasticsearch.client.ml.DeleteForecastRequest; import org.elasticsearch.client.ml.DeleteJobRequest; import org.elasticsearch.client.ml.DeleteModelSnapshotRequest; +import org.elasticsearch.client.ml.DeleteTrainedModelAliasRequest; import org.elasticsearch.client.ml.DeleteTrainedModelRequest; import org.elasticsearch.client.ml.EstimateModelMemoryRequest; import org.elasticsearch.client.ml.EvaluateDataFrameRequest; @@ -62,6 +63,7 @@ import org.elasticsearch.client.ml.PutDataFrameAnalyticsRequest; import org.elasticsearch.client.ml.PutDatafeedRequest; import org.elasticsearch.client.ml.PutFilterRequest; import org.elasticsearch.client.ml.PutJobRequest; +import org.elasticsearch.client.ml.PutTrainedModelAliasRequest; import org.elasticsearch.client.ml.PutTrainedModelRequest; import org.elasticsearch.client.ml.RevertModelSnapshotRequest; import org.elasticsearch.client.ml.SetUpgradeModeRequest; @@ -857,6 +859,32 @@ final class MLRequestConverters { return request; } + static Request putTrainedModelAlias(PutTrainedModelAliasRequest putTrainedModelAliasRequest) throws IOException { + String endpoint = new EndpointBuilder() + .addPathPartAsIs("_ml", "trained_models") + .addPathPart(putTrainedModelAliasRequest.getModelId()) + .addPathPartAsIs("model_aliases") + .addPathPart(putTrainedModelAliasRequest.getModelAlias()) + .build(); + Request request = new Request(HttpPut.METHOD_NAME, endpoint); + RequestConverters.Params params = new RequestConverters.Params(); + if (putTrainedModelAliasRequest.getReassign() != null) { + params.putParam(PutTrainedModelAliasRequest.REASSIGN, Boolean.toString(putTrainedModelAliasRequest.getReassign())); + } + request.addParameters(params.asMap()); + return request; + } + + static Request deleteTrainedModelAlias(DeleteTrainedModelAliasRequest deleteTrainedModelAliasRequest) throws IOException { + String endpoint = new EndpointBuilder() + .addPathPartAsIs("_ml", "trained_models") + .addPathPart(deleteTrainedModelAliasRequest.getModelId()) + .addPathPartAsIs("model_aliases") + .addPathPart(deleteTrainedModelAliasRequest.getModelAlias()) + .build(); + return new Request(HttpDelete.METHOD_NAME, endpoint); + } + static Request putFilter(PutFilterRequest putFilterRequest) throws IOException { String endpoint = new EndpointBuilder() .addPathPartAsIs("_ml") diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java index 7ef07a8f082f..4f34dd3169bb 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java @@ -11,6 +11,7 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.client.ml.CloseJobRequest; import org.elasticsearch.client.ml.CloseJobResponse; +import org.elasticsearch.client.ml.DeleteTrainedModelAliasRequest; import org.elasticsearch.client.ml.DeleteTrainedModelRequest; import org.elasticsearch.client.ml.EstimateModelMemoryRequest; import org.elasticsearch.client.ml.EstimateModelMemoryResponse; @@ -89,6 +90,7 @@ import org.elasticsearch.client.ml.PutFilterRequest; import org.elasticsearch.client.ml.PutFilterResponse; import org.elasticsearch.client.ml.PutJobRequest; import org.elasticsearch.client.ml.PutJobResponse; +import org.elasticsearch.client.ml.PutTrainedModelAliasRequest; import org.elasticsearch.client.ml.PutTrainedModelRequest; import org.elasticsearch.client.ml.PutTrainedModelResponse; import org.elasticsearch.client.ml.RevertModelSnapshotRequest; @@ -2552,4 +2554,90 @@ public final class MachineLearningClient { listener, Collections.emptySet()); } + + /** + * Creates or reassigns a trained model alias + *

+ * For additional info + * see + * Put Trained Model Aliases documentation + * + * @param request The {@link PutTrainedModelAliasRequest} + * @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized + * @return action acknowledgement + * @throws IOException when there is a serialization issue sending the request or receiving the response + */ + public AcknowledgedResponse putTrainedModelAlias(PutTrainedModelAliasRequest request, RequestOptions options) throws IOException { + return restHighLevelClient.performRequestAndParseEntity(request, + MLRequestConverters::putTrainedModelAlias, + options, + AcknowledgedResponse::fromXContent, + Collections.emptySet()); + } + + /** + * Creates or reassigns a trained model alias asynchronously and notifies listener upon completion + *

+ * For additional info + * see + * Put Trained Model Aliases documentation + * + * @param request The {@link PutTrainedModelAliasRequest} + * @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized + * @param listener Listener to be notified upon request completion + * @return cancellable that may be used to cancel the request + */ + public Cancellable putTrainedModelAliasAsync(PutTrainedModelAliasRequest request, + RequestOptions options, + ActionListener listener) { + return restHighLevelClient.performRequestAsyncAndParseEntity(request, + MLRequestConverters::putTrainedModelAlias, + options, + AcknowledgedResponse::fromXContent, + listener, + Collections.emptySet()); + } + + /** + * Deletes a trained model alias + *

+ * For additional info + * see + * Delete Trained Model Aliases documentation + * + * @param request The {@link DeleteTrainedModelAliasRequest} + * @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized + * @return action acknowledgement + * @throws IOException when there is a serialization issue sending the request or receiving the response + */ + public AcknowledgedResponse deleteTrainedModelAlias(DeleteTrainedModelAliasRequest request, RequestOptions options) throws IOException { + return restHighLevelClient.performRequestAndParseEntity(request, + MLRequestConverters::deleteTrainedModelAlias, + options, + AcknowledgedResponse::fromXContent, + Collections.emptySet()); + } + + /** + * Deletes a trained model alias asynchronously and notifies listener upon completion + *

+ * For additional info + * see + * Delete Trained Model Aliases documentation + * + * @param request The {@link DeleteTrainedModelAliasRequest} + * @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized + * @param listener Listener to be notified upon request completion + * @return cancellable that may be used to cancel the request + */ + public Cancellable deleteTrainedModelAliasAsync(DeleteTrainedModelAliasRequest request, + RequestOptions options, + ActionListener listener) { + return restHighLevelClient.performRequestAsyncAndParseEntity(request, + MLRequestConverters::deleteTrainedModelAlias, + options, + AcknowledgedResponse::fromXContent, + listener, + Collections.emptySet()); + } } diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/DeleteTrainedModelAliasRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/DeleteTrainedModelAliasRequest.java new file mode 100644 index 000000000000..aa0a2c93ea58 --- /dev/null +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/DeleteTrainedModelAliasRequest.java @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +package org.elasticsearch.client.ml; + +import org.elasticsearch.client.Validatable; + +import java.util.Objects; + +public class DeleteTrainedModelAliasRequest implements Validatable { + + private final String modelAlias; + private final String modelId; + + public DeleteTrainedModelAliasRequest(String modelAlias, String modelId) { + this.modelAlias = Objects.requireNonNull(modelAlias); + this.modelId = Objects.requireNonNull(modelId); + } + + public String getModelAlias() { + return modelAlias; + } + + public String getModelId() { + return modelId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DeleteTrainedModelAliasRequest request = (DeleteTrainedModelAliasRequest) o; + return Objects.equals(modelAlias, request.modelAlias) + && Objects.equals(modelId, request.modelId); + } + + @Override + public int hashCode() { + return Objects.hash(modelAlias, modelId); + } + +} diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PutTrainedModelAliasRequest.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PutTrainedModelAliasRequest.java new file mode 100644 index 000000000000..7988ae35f1c6 --- /dev/null +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ml/PutTrainedModelAliasRequest.java @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +package org.elasticsearch.client.ml; + +import org.elasticsearch.client.Validatable; + +import java.util.Objects; + +public class PutTrainedModelAliasRequest implements Validatable { + + public static final String REASSIGN = "reassign"; + + private final String modelAlias; + private final String modelId; + private final Boolean reassign; + + public PutTrainedModelAliasRequest(String modelAlias, String modelId, Boolean reassign) { + this.modelAlias = Objects.requireNonNull(modelAlias); + this.modelId = Objects.requireNonNull(modelId); + this.reassign = reassign; + } + + public String getModelAlias() { + return modelAlias; + } + + public String getModelId() { + return modelId; + } + + public Boolean getReassign() { + return reassign; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PutTrainedModelAliasRequest request = (PutTrainedModelAliasRequest) o; + return Objects.equals(modelAlias, request.modelAlias) + && Objects.equals(modelId, request.modelId) + && Objects.equals(reassign, request.reassign); + } + + @Override + public int hashCode() { + return Objects.hash(modelAlias, modelId, reassign); + } + +} diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/MLRequestConvertersTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/MLRequestConvertersTests.java index 0c6f3fb91125..43c20305239a 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/MLRequestConvertersTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/MLRequestConvertersTests.java @@ -24,6 +24,7 @@ import org.elasticsearch.client.ml.DeleteFilterRequest; import org.elasticsearch.client.ml.DeleteForecastRequest; import org.elasticsearch.client.ml.DeleteJobRequest; import org.elasticsearch.client.ml.DeleteModelSnapshotRequest; +import org.elasticsearch.client.ml.DeleteTrainedModelAliasRequest; import org.elasticsearch.client.ml.DeleteTrainedModelRequest; import org.elasticsearch.client.ml.EstimateModelMemoryRequest; import org.elasticsearch.client.ml.EvaluateDataFrameRequest; @@ -59,6 +60,7 @@ import org.elasticsearch.client.ml.PutDataFrameAnalyticsRequest; import org.elasticsearch.client.ml.PutDatafeedRequest; import org.elasticsearch.client.ml.PutFilterRequest; import org.elasticsearch.client.ml.PutJobRequest; +import org.elasticsearch.client.ml.PutTrainedModelAliasRequest; import org.elasticsearch.client.ml.PutTrainedModelRequest; import org.elasticsearch.client.ml.RevertModelSnapshotRequest; import org.elasticsearch.client.ml.SetUpgradeModeRequest; @@ -119,7 +121,9 @@ import static org.elasticsearch.client.ml.dataframe.DataFrameAnalyticsConfigUpda import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasEntry; +import static org.hamcrest.Matchers.hasKey; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; import static org.hamcrest.core.IsNull.nullValue; public class MLRequestConvertersTests extends ESTestCase { @@ -965,6 +969,52 @@ public class MLRequestConvertersTests extends ESTestCase { } } + public void testPutTrainedModelAlias() throws IOException { + PutTrainedModelAliasRequest putTrainedModelAliasRequest = new PutTrainedModelAliasRequest( + randomAlphaOfLength(10), + randomAlphaOfLength(10), + randomBoolean() ? null : randomBoolean() + ); + + Request request = MLRequestConverters.putTrainedModelAlias(putTrainedModelAliasRequest); + + assertEquals(HttpPut.METHOD_NAME, request.getMethod()); + assertThat( + request.getEndpoint(), + equalTo( + "/_ml/trained_models/" + + putTrainedModelAliasRequest.getModelId() + + "/model_aliases/" + + putTrainedModelAliasRequest.getModelAlias() + ) + ); + if (putTrainedModelAliasRequest.getReassign() != null) { + assertThat(request.getParameters().get("reassign"), equalTo(putTrainedModelAliasRequest.getReassign().toString())); + } else { + assertThat(request.getParameters(), not(hasKey("reassign"))); + } + } + + public void testDeleteTrainedModelAlias() throws IOException { + DeleteTrainedModelAliasRequest deleteTrainedModelAliasRequest = new DeleteTrainedModelAliasRequest( + randomAlphaOfLength(10), + randomAlphaOfLength(10) + ); + + Request request = MLRequestConverters.deleteTrainedModelAlias(deleteTrainedModelAliasRequest); + + assertEquals(HttpDelete.METHOD_NAME, request.getMethod()); + assertThat( + request.getEndpoint(), + equalTo( + "/_ml/trained_models/" + + deleteTrainedModelAliasRequest.getModelId() + + "/model_aliases/" + + deleteTrainedModelAliasRequest.getModelAlias() + ) + ); + } + public void testPutFilter() throws IOException { MlFilter filter = MlFilterTests.createRandomBuilder("foo").build(); PutFilterRequest putFilterRequest = new PutFilterRequest(filter); diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java index 626c9fe81e65..230552bbf9a2 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/MachineLearningIT.java @@ -36,6 +36,7 @@ import org.elasticsearch.client.ml.DeleteForecastRequest; import org.elasticsearch.client.ml.DeleteJobRequest; import org.elasticsearch.client.ml.DeleteJobResponse; import org.elasticsearch.client.ml.DeleteModelSnapshotRequest; +import org.elasticsearch.client.ml.DeleteTrainedModelAliasRequest; import org.elasticsearch.client.ml.DeleteTrainedModelRequest; import org.elasticsearch.client.ml.EstimateModelMemoryRequest; import org.elasticsearch.client.ml.EstimateModelMemoryResponse; @@ -92,6 +93,7 @@ import org.elasticsearch.client.ml.PutFilterRequest; import org.elasticsearch.client.ml.PutFilterResponse; import org.elasticsearch.client.ml.PutJobRequest; import org.elasticsearch.client.ml.PutJobResponse; +import org.elasticsearch.client.ml.PutTrainedModelAliasRequest; import org.elasticsearch.client.ml.PutTrainedModelRequest; import org.elasticsearch.client.ml.PutTrainedModelResponse; import org.elasticsearch.client.ml.RevertModelSnapshotRequest; @@ -2389,6 +2391,83 @@ public class MachineLearningIT extends ESRestHighLevelClientTestCase { assertThat(getTrainedModelsResponse.getTrainedModels().get(0).getModelId(), equalTo(modelIdCompressed)); } + public void testPutTrainedModelAlias() throws Exception { + MachineLearningClient machineLearningClient = highLevelClient().machineLearning(); + String modelId = "model-with-an-alias"; + putTrainedModel(modelId); + String modelId2 = "another-model-with-an-alias"; + putTrainedModel(modelId2); + + AcknowledgedResponse acknowledgedResponse = execute( + new PutTrainedModelAliasRequest("my-first-alias", modelId, null), + machineLearningClient::putTrainedModelAlias, + machineLearningClient::putTrainedModelAliasAsync + ); + assertThat(acknowledgedResponse.isAcknowledged(), is(true)); + + GetTrainedModelsResponse getTrainedModelsResponse = execute( + new GetTrainedModelsRequest("my-first-alias"), + machineLearningClient::getTrainedModels, + machineLearningClient::getTrainedModelsAsync); + + assertThat(getTrainedModelsResponse.getCount(), equalTo(1L)); + assertThat(getTrainedModelsResponse.getTrainedModels(), hasSize(1)); + assertThat(getTrainedModelsResponse.getTrainedModels().get(0).getModelId(), equalTo(modelId)); + + acknowledgedResponse = execute( + new PutTrainedModelAliasRequest("my-first-alias", modelId2, true), + machineLearningClient::putTrainedModelAlias, + machineLearningClient::putTrainedModelAliasAsync + ); + assertThat(acknowledgedResponse.isAcknowledged(), is(true)); + + getTrainedModelsResponse = execute( + new GetTrainedModelsRequest("my-first-alias"), + machineLearningClient::getTrainedModels, + machineLearningClient::getTrainedModelsAsync + ); + + assertThat(getTrainedModelsResponse.getCount(), equalTo(1L)); + assertThat(getTrainedModelsResponse.getTrainedModels(), hasSize(1)); + assertThat(getTrainedModelsResponse.getTrainedModels().get(0).getModelId(), equalTo(modelId2)); + } + + public void testDeleteTrainedModelAlias() throws Exception { + MachineLearningClient machineLearningClient = highLevelClient().machineLearning(); + String modelId = "model-with-an-deleted-alias"; + putTrainedModel(modelId); + + AcknowledgedResponse acknowledgedResponse = execute( + new PutTrainedModelAliasRequest("my-first-deleted-alias", modelId, null), + machineLearningClient::putTrainedModelAlias, + machineLearningClient::putTrainedModelAliasAsync + ); + assertThat(acknowledgedResponse.isAcknowledged(), is(true)); + + GetTrainedModelsResponse getTrainedModelsResponse = execute( + new GetTrainedModelsRequest("my-first-deleted-alias"), + machineLearningClient::getTrainedModels, + machineLearningClient::getTrainedModelsAsync); + + assertThat(getTrainedModelsResponse.getCount(), equalTo(1L)); + assertThat(getTrainedModelsResponse.getTrainedModels(), hasSize(1)); + assertThat(getTrainedModelsResponse.getTrainedModels().get(0).getModelId(), equalTo(modelId)); + + acknowledgedResponse = execute( + new DeleteTrainedModelAliasRequest("my-first-deleted-alias", modelId), + machineLearningClient::deleteTrainedModelAlias, + machineLearningClient::deleteTrainedModelAliasAsync + ); + assertThat(acknowledgedResponse.isAcknowledged(), is(true)); + ElasticsearchStatusException exception = expectThrows(ElasticsearchStatusException.class, + () -> execute( + new GetTrainedModelsRequest("my-first-deleted-alias"), + machineLearningClient::getTrainedModels, + machineLearningClient::getTrainedModelsAsync + )); + assertThat(exception.status().getStatus(), equalTo(404)); + } + public void testGetTrainedModelsStats() throws Exception { MachineLearningClient machineLearningClient = highLevelClient().machineLearning(); String modelIdPrefix = "a-get-trained-model-stats-"; diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java index f6ac64c0002b..ea5c08b6c0bc 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/MlClientDocumentationIT.java @@ -38,6 +38,7 @@ import org.elasticsearch.client.ml.DeleteForecastRequest; import org.elasticsearch.client.ml.DeleteJobRequest; import org.elasticsearch.client.ml.DeleteJobResponse; import org.elasticsearch.client.ml.DeleteModelSnapshotRequest; +import org.elasticsearch.client.ml.DeleteTrainedModelAliasRequest; import org.elasticsearch.client.ml.DeleteTrainedModelRequest; import org.elasticsearch.client.ml.EstimateModelMemoryRequest; import org.elasticsearch.client.ml.EstimateModelMemoryResponse; @@ -104,6 +105,7 @@ import org.elasticsearch.client.ml.PutFilterRequest; import org.elasticsearch.client.ml.PutFilterResponse; import org.elasticsearch.client.ml.PutJobRequest; import org.elasticsearch.client.ml.PutJobResponse; +import org.elasticsearch.client.ml.PutTrainedModelAliasRequest; import org.elasticsearch.client.ml.PutTrainedModelRequest; import org.elasticsearch.client.ml.PutTrainedModelResponse; import org.elasticsearch.client.ml.RevertModelSnapshotRequest; @@ -3891,6 +3893,129 @@ public class MlClientDocumentationIT extends ESRestHighLevelClientTestCase { } } + public void testPutTrainedModelAlias() throws Exception { + putTrainedModel("my-trained-model-with-alias"); + RestHighLevelClient client = highLevelClient(); + { + // tag::put-trained-model-alias-request + PutTrainedModelAliasRequest request = new PutTrainedModelAliasRequest( + "my-alias", // <1> + "my-trained-model-with-alias", // <2> + false // <3> + ); + // end::put-trained-model-alias-request + + // tag::put-trained-model-alias-execute + AcknowledgedResponse response = + client.machineLearning().putTrainedModelAlias(request, RequestOptions.DEFAULT); + // end::put-trained-model-alias-execute + + // tag::put-trained-model-alias-response + boolean acknowledged = response.isAcknowledged(); + // end::put-trained-model-alias-response + + assertThat(acknowledged, is(true)); + } + { + PutTrainedModelAliasRequest request = new PutTrainedModelAliasRequest( + "my-second-alias", + "my-trained-model-with-alias", + false + ); + // tag::put-trained-model-alias-execute-listener + ActionListener listener = new ActionListener<>() { + @Override + public void onResponse(AcknowledgedResponse response) { + // <1> + } + + @Override + public void onFailure(Exception e) { + // <2> + } + }; + // end::put-trained-model-alias-execute-listener + + // Replace the empty listener by a blocking listener in test + CountDownLatch latch = new CountDownLatch(1); + listener = new LatchedActionListener<>(listener, latch); + + // tag::put-trained-model-alias-execute-async + client.machineLearning() + .putTrainedModelAliasAsync(request, RequestOptions.DEFAULT, listener); // <1> + // end::put-trained-model-alias-execute-async + + assertTrue(latch.await(30L, TimeUnit.SECONDS)); + } + } + + public void testDeleteTrainedModelAlias() throws Exception { + putTrainedModel("my-trained-model-with-delete-alias"); + RestHighLevelClient client = highLevelClient(); + { + client.machineLearning() + .putTrainedModelAlias( + new PutTrainedModelAliasRequest("my-alias-to-delete", "my-trained-model-with-delete-alias", false), + RequestOptions.DEFAULT + ); + + // tag::delete-trained-model-alias-request + DeleteTrainedModelAliasRequest request = new DeleteTrainedModelAliasRequest( + "my-alias-to-delete", // <1> + "my-trained-model-with-delete-alias" // <2> + ); + // end::delete-trained-model-alias-request + + // tag::delete-trained-model-alias-execute + AcknowledgedResponse response = + client.machineLearning().deleteTrainedModelAlias(request, RequestOptions.DEFAULT); + // end::delete-trained-model-alias-execute + + // tag::delete-trained-model-alias-response + boolean acknowledged = response.isAcknowledged(); + // end::delete-trained-model-alias-response + + assertThat(acknowledged, is(true)); + } + { + client.machineLearning() + .putTrainedModelAlias( + new PutTrainedModelAliasRequest("my-alias-to-delete", "my-trained-model-with-delete-alias", false), + RequestOptions.DEFAULT + ); + + DeleteTrainedModelAliasRequest request = new DeleteTrainedModelAliasRequest( + "my-alias-to-delete", + "my-trained-model-with-delete-alias" + ); + // tag::delete-trained-model-alias-execute-listener + ActionListener listener = new ActionListener<>() { + @Override + public void onResponse(AcknowledgedResponse response) { + // <1> + } + + @Override + public void onFailure(Exception e) { + // <2> + } + }; + // end::delete-trained-model-alias-execute-listener + + // Replace the empty listener by a blocking listener in test + CountDownLatch latch = new CountDownLatch(1); + listener = new LatchedActionListener<>(listener, latch); + + // tag::delete-trained-model-alias-execute-async + client.machineLearning() + .deleteTrainedModelAliasAsync(request, RequestOptions.DEFAULT, listener); // <1> + // end::delete-trained-model-alias-execute-async + + assertTrue(latch.await(30L, TimeUnit.SECONDS)); + } + } + + public void testGetTrainedModelsStats() throws Exception { putTrainedModel("my-trained-model"); RestHighLevelClient client = highLevelClient(); diff --git a/docs/java-rest/high-level/ml/delete-trained-model-alias.asciidoc b/docs/java-rest/high-level/ml/delete-trained-model-alias.asciidoc new file mode 100644 index 000000000000..34195d38241a --- /dev/null +++ b/docs/java-rest/high-level/ml/delete-trained-model-alias.asciidoc @@ -0,0 +1,39 @@ +-- +:api: delete-trained-model-alias +:request: DeleteTrainedModelAliasRequest +:response: AcknowledgedResponse +-- +[role="xpack"] +[id="{upid}-{api}"] +=== Delete trained model alias API + +beta::[] + +Deletes a trained model alias. +The API accepts a +{request}+ object as a request and returns a +{response}+. +If the model alias is not assigned to the provided model id, or if the model +alias does not exist, this API will result in an error. + +[id="{upid}-{api}-request"] +==== Delete trained model alias request + +A +{request}+ requires the following arguments: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-request] +-------------------------------------------------- +<1> The trained model alias to delete +<2> The trained model id to which model alias is assigned + +include::../execution.asciidoc[] + +[id="{upid}-{api}-response"] +==== Response + +The returned +{response}+ + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-response] +-------------------------------------------------- diff --git a/docs/java-rest/high-level/ml/put-trained-model-alias.asciidoc b/docs/java-rest/high-level/ml/put-trained-model-alias.asciidoc new file mode 100644 index 000000000000..be2c913d5562 --- /dev/null +++ b/docs/java-rest/high-level/ml/put-trained-model-alias.asciidoc @@ -0,0 +1,41 @@ +-- +:api: put-trained-model-alias +:request: PutTrainedModelAliasRequest +:response: AcknowledgedResponse +-- +[role="xpack"] +[id="{upid}-{api}"] +=== Put trained model alias API + +beta::[] + +Creates or reassigns a trained model alias. +The API accepts a +{request}+ object as a request and returns a +{response}+. +The created trained model alias can then be used for other APIs in the stack +instead of the referenced model id. + +[id="{upid}-{api}-request"] +==== Put trained model alias request + +A +{request}+ requires the following arguments: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-request] +-------------------------------------------------- +<1> The trained model alias to create or reassign +<2> The trained model id to which to assign the alias +<3> (Optional) whether or not to reassign the model alias if it +is already pointing to a model. Defaults to false. + +include::../execution.asciidoc[] + +[id="{upid}-{api}-response"] +==== Response + +The returned +{response}+ + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests-file}[{api}-response] +-------------------------------------------------- diff --git a/docs/java-rest/high-level/supported-apis.asciidoc b/docs/java-rest/high-level/supported-apis.asciidoc index acdb3fe9a3ee..9cb41a7e5d19 100644 --- a/docs/java-rest/high-level/supported-apis.asciidoc +++ b/docs/java-rest/high-level/supported-apis.asciidoc @@ -298,6 +298,7 @@ The Java High Level REST Client supports the following {ml} APIs: * <<{upid}-delete-forecast>> * <<{upid}-delete-model-snapshot>> * <<{upid}-delete-trained-models>> +* <<{upid}-delete-trained-model-alias>> * <<{upid}-estimate-model-memory>> * <<{upid}-evaluate-data-frame>> * <<{upid}-explain-data-frame-analytics>> @@ -332,6 +333,7 @@ The Java High Level REST Client supports the following {ml} APIs: * <<{upid}-put-datafeed>> * <<{upid}-put-filter>> * <<{upid}-put-trained-model>> +* <<{upid}-put-trained-model-alias>> * <<{upid}-revert-model-snapshot>> * <<{upid}-set-upgrade-mode>> * <<{upid}-start-data-frame-analytics>> @@ -359,6 +361,7 @@ include::ml/delete-filter.asciidoc[] include::ml/delete-forecast.asciidoc[] include::ml/delete-model-snapshot.asciidoc[] include::ml/delete-trained-models.asciidoc[] +include::ml/delete-trained-model-alias.asciidoc[] // ESTIMATE include::ml/estimate-model-memory.asciidoc[] // EVALUATE @@ -403,6 +406,7 @@ include::ml/put-data-frame-analytics.asciidoc[] include::ml/put-datafeed.asciidoc[] include::ml/put-filter.asciidoc[] include::ml/put-trained-model.asciidoc[] +include::ml/put-trained-model-alias.asciidoc[] // REVERT include::ml/revert-model-snapshot.asciidoc[] // SET