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