Skip to content

Commit 12e2cc8

Browse files
authored
[7.x] [ML][HLRC] adds put and delete trained model alias APIs to rest high-level client (#69214) (#69297)
* [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.
1 parent 5ed27a7 commit 12e2cc8

File tree

10 files changed

+557
-0
lines changed

10 files changed

+557
-0
lines changed

client/rest-high-level/src/main/java/org/elasticsearch/client/MLRequestConverters.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.elasticsearch.client.ml.DeleteForecastRequest;
2929
import org.elasticsearch.client.ml.DeleteJobRequest;
3030
import org.elasticsearch.client.ml.DeleteModelSnapshotRequest;
31+
import org.elasticsearch.client.ml.DeleteTrainedModelAliasRequest;
3132
import org.elasticsearch.client.ml.DeleteTrainedModelRequest;
3233
import org.elasticsearch.client.ml.EstimateModelMemoryRequest;
3334
import org.elasticsearch.client.ml.EvaluateDataFrameRequest;
@@ -62,6 +63,7 @@
6263
import org.elasticsearch.client.ml.PutDatafeedRequest;
6364
import org.elasticsearch.client.ml.PutFilterRequest;
6465
import org.elasticsearch.client.ml.PutJobRequest;
66+
import org.elasticsearch.client.ml.PutTrainedModelAliasRequest;
6567
import org.elasticsearch.client.ml.PutTrainedModelRequest;
6668
import org.elasticsearch.client.ml.RevertModelSnapshotRequest;
6769
import org.elasticsearch.client.ml.SetUpgradeModeRequest;
@@ -857,6 +859,32 @@ static Request putTrainedModel(PutTrainedModelRequest putTrainedModelRequest) th
857859
return request;
858860
}
859861

862+
static Request putTrainedModelAlias(PutTrainedModelAliasRequest putTrainedModelAliasRequest) throws IOException {
863+
String endpoint = new EndpointBuilder()
864+
.addPathPartAsIs("_ml", "trained_models")
865+
.addPathPart(putTrainedModelAliasRequest.getModelId())
866+
.addPathPartAsIs("model_aliases")
867+
.addPathPart(putTrainedModelAliasRequest.getModelAlias())
868+
.build();
869+
Request request = new Request(HttpPut.METHOD_NAME, endpoint);
870+
RequestConverters.Params params = new RequestConverters.Params();
871+
if (putTrainedModelAliasRequest.getReassign() != null) {
872+
params.putParam(PutTrainedModelAliasRequest.REASSIGN, Boolean.toString(putTrainedModelAliasRequest.getReassign()));
873+
}
874+
request.addParameters(params.asMap());
875+
return request;
876+
}
877+
878+
static Request deleteTrainedModelAlias(DeleteTrainedModelAliasRequest deleteTrainedModelAliasRequest) throws IOException {
879+
String endpoint = new EndpointBuilder()
880+
.addPathPartAsIs("_ml", "trained_models")
881+
.addPathPart(deleteTrainedModelAliasRequest.getModelId())
882+
.addPathPartAsIs("model_aliases")
883+
.addPathPart(deleteTrainedModelAliasRequest.getModelAlias())
884+
.build();
885+
return new Request(HttpDelete.METHOD_NAME, endpoint);
886+
}
887+
860888
static Request putFilter(PutFilterRequest putFilterRequest) throws IOException {
861889
String endpoint = new EndpointBuilder()
862890
.addPathPartAsIs("_ml")

client/rest-high-level/src/main/java/org/elasticsearch/client/MachineLearningClient.java

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.elasticsearch.action.support.master.AcknowledgedResponse;
1212
import org.elasticsearch.client.ml.CloseJobRequest;
1313
import org.elasticsearch.client.ml.CloseJobResponse;
14+
import org.elasticsearch.client.ml.DeleteTrainedModelAliasRequest;
1415
import org.elasticsearch.client.ml.DeleteTrainedModelRequest;
1516
import org.elasticsearch.client.ml.EstimateModelMemoryRequest;
1617
import org.elasticsearch.client.ml.EstimateModelMemoryResponse;
@@ -89,6 +90,7 @@
8990
import org.elasticsearch.client.ml.PutFilterResponse;
9091
import org.elasticsearch.client.ml.PutJobRequest;
9192
import org.elasticsearch.client.ml.PutJobResponse;
93+
import org.elasticsearch.client.ml.PutTrainedModelAliasRequest;
9294
import org.elasticsearch.client.ml.PutTrainedModelRequest;
9395
import org.elasticsearch.client.ml.PutTrainedModelResponse;
9496
import org.elasticsearch.client.ml.RevertModelSnapshotRequest;
@@ -2552,4 +2554,90 @@ public Cancellable deleteTrainedModelAsync(DeleteTrainedModelRequest request,
25522554
listener,
25532555
Collections.emptySet());
25542556
}
2557+
2558+
/**
2559+
* Creates or reassigns a trained model alias
2560+
* <p>
2561+
* For additional info
2562+
* see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/put-trained-models-aliases.html">
2563+
* Put Trained Model Aliases documentation</a>
2564+
*
2565+
* @param request The {@link PutTrainedModelAliasRequest}
2566+
* @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
2567+
* @return action acknowledgement
2568+
* @throws IOException when there is a serialization issue sending the request or receiving the response
2569+
*/
2570+
public AcknowledgedResponse putTrainedModelAlias(PutTrainedModelAliasRequest request, RequestOptions options) throws IOException {
2571+
return restHighLevelClient.performRequestAndParseEntity(request,
2572+
MLRequestConverters::putTrainedModelAlias,
2573+
options,
2574+
AcknowledgedResponse::fromXContent,
2575+
Collections.emptySet());
2576+
}
2577+
2578+
/**
2579+
* Creates or reassigns a trained model alias asynchronously and notifies listener upon completion
2580+
* <p>
2581+
* For additional info
2582+
* see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/put-trained-models-aliases.html">
2583+
* Put Trained Model Aliases documentation</a>
2584+
*
2585+
* @param request The {@link PutTrainedModelAliasRequest}
2586+
* @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
2587+
* @param listener Listener to be notified upon request completion
2588+
* @return cancellable that may be used to cancel the request
2589+
*/
2590+
public Cancellable putTrainedModelAliasAsync(PutTrainedModelAliasRequest request,
2591+
RequestOptions options,
2592+
ActionListener<AcknowledgedResponse> listener) {
2593+
return restHighLevelClient.performRequestAsyncAndParseEntity(request,
2594+
MLRequestConverters::putTrainedModelAlias,
2595+
options,
2596+
AcknowledgedResponse::fromXContent,
2597+
listener,
2598+
Collections.emptySet());
2599+
}
2600+
2601+
/**
2602+
* Deletes a trained model alias
2603+
* <p>
2604+
* For additional info
2605+
* see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/delete-trained-models-aliases.html">
2606+
* Delete Trained Model Aliases documentation</a>
2607+
*
2608+
* @param request The {@link DeleteTrainedModelAliasRequest}
2609+
* @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
2610+
* @return action acknowledgement
2611+
* @throws IOException when there is a serialization issue sending the request or receiving the response
2612+
*/
2613+
public AcknowledgedResponse deleteTrainedModelAlias(DeleteTrainedModelAliasRequest request, RequestOptions options) throws IOException {
2614+
return restHighLevelClient.performRequestAndParseEntity(request,
2615+
MLRequestConverters::deleteTrainedModelAlias,
2616+
options,
2617+
AcknowledgedResponse::fromXContent,
2618+
Collections.emptySet());
2619+
}
2620+
2621+
/**
2622+
* Deletes a trained model alias asynchronously and notifies listener upon completion
2623+
* <p>
2624+
* For additional info
2625+
* see <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/delete-trained-models-aliases.html">
2626+
* Delete Trained Model Aliases documentation</a>
2627+
*
2628+
* @param request The {@link DeleteTrainedModelAliasRequest}
2629+
* @param options Additional request options (e.g. headers), use {@link RequestOptions#DEFAULT} if nothing needs to be customized
2630+
* @param listener Listener to be notified upon request completion
2631+
* @return cancellable that may be used to cancel the request
2632+
*/
2633+
public Cancellable deleteTrainedModelAliasAsync(DeleteTrainedModelAliasRequest request,
2634+
RequestOptions options,
2635+
ActionListener<AcknowledgedResponse> listener) {
2636+
return restHighLevelClient.performRequestAsyncAndParseEntity(request,
2637+
MLRequestConverters::deleteTrainedModelAlias,
2638+
options,
2639+
AcknowledgedResponse::fromXContent,
2640+
listener,
2641+
Collections.emptySet());
2642+
}
25552643
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0 and the Server Side Public License, v 1; you may not use this file except
5+
* in compliance with, at your election, the Elastic License 2.0 or the Server
6+
* Side Public License, v 1.
7+
*/
8+
9+
package org.elasticsearch.client.ml;
10+
11+
import org.elasticsearch.client.Validatable;
12+
13+
import java.util.Objects;
14+
15+
public class DeleteTrainedModelAliasRequest implements Validatable {
16+
17+
private final String modelAlias;
18+
private final String modelId;
19+
20+
public DeleteTrainedModelAliasRequest(String modelAlias, String modelId) {
21+
this.modelAlias = Objects.requireNonNull(modelAlias);
22+
this.modelId = Objects.requireNonNull(modelId);
23+
}
24+
25+
public String getModelAlias() {
26+
return modelAlias;
27+
}
28+
29+
public String getModelId() {
30+
return modelId;
31+
}
32+
33+
@Override
34+
public boolean equals(Object o) {
35+
if (this == o) return true;
36+
if (o == null || getClass() != o.getClass()) return false;
37+
DeleteTrainedModelAliasRequest request = (DeleteTrainedModelAliasRequest) o;
38+
return Objects.equals(modelAlias, request.modelAlias)
39+
&& Objects.equals(modelId, request.modelId);
40+
}
41+
42+
@Override
43+
public int hashCode() {
44+
return Objects.hash(modelAlias, modelId);
45+
}
46+
47+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0 and the Server Side Public License, v 1; you may not use this file except
5+
* in compliance with, at your election, the Elastic License 2.0 or the Server
6+
* Side Public License, v 1.
7+
*/
8+
9+
package org.elasticsearch.client.ml;
10+
11+
import org.elasticsearch.client.Validatable;
12+
13+
import java.util.Objects;
14+
15+
public class PutTrainedModelAliasRequest implements Validatable {
16+
17+
public static final String REASSIGN = "reassign";
18+
19+
private final String modelAlias;
20+
private final String modelId;
21+
private final Boolean reassign;
22+
23+
public PutTrainedModelAliasRequest(String modelAlias, String modelId, Boolean reassign) {
24+
this.modelAlias = Objects.requireNonNull(modelAlias);
25+
this.modelId = Objects.requireNonNull(modelId);
26+
this.reassign = reassign;
27+
}
28+
29+
public String getModelAlias() {
30+
return modelAlias;
31+
}
32+
33+
public String getModelId() {
34+
return modelId;
35+
}
36+
37+
public Boolean getReassign() {
38+
return reassign;
39+
}
40+
41+
@Override
42+
public boolean equals(Object o) {
43+
if (this == o) return true;
44+
if (o == null || getClass() != o.getClass()) return false;
45+
PutTrainedModelAliasRequest request = (PutTrainedModelAliasRequest) o;
46+
return Objects.equals(modelAlias, request.modelAlias)
47+
&& Objects.equals(modelId, request.modelId)
48+
&& Objects.equals(reassign, request.reassign);
49+
}
50+
51+
@Override
52+
public int hashCode() {
53+
return Objects.hash(modelAlias, modelId, reassign);
54+
}
55+
56+
}

client/rest-high-level/src/test/java/org/elasticsearch/client/MLRequestConvertersTests.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.elasticsearch.client.ml.DeleteForecastRequest;
2525
import org.elasticsearch.client.ml.DeleteJobRequest;
2626
import org.elasticsearch.client.ml.DeleteModelSnapshotRequest;
27+
import org.elasticsearch.client.ml.DeleteTrainedModelAliasRequest;
2728
import org.elasticsearch.client.ml.DeleteTrainedModelRequest;
2829
import org.elasticsearch.client.ml.EstimateModelMemoryRequest;
2930
import org.elasticsearch.client.ml.EvaluateDataFrameRequest;
@@ -59,6 +60,7 @@
5960
import org.elasticsearch.client.ml.PutDatafeedRequest;
6061
import org.elasticsearch.client.ml.PutFilterRequest;
6162
import org.elasticsearch.client.ml.PutJobRequest;
63+
import org.elasticsearch.client.ml.PutTrainedModelAliasRequest;
6264
import org.elasticsearch.client.ml.PutTrainedModelRequest;
6365
import org.elasticsearch.client.ml.RevertModelSnapshotRequest;
6466
import org.elasticsearch.client.ml.SetUpgradeModeRequest;
@@ -119,7 +121,9 @@
119121
import static org.hamcrest.Matchers.allOf;
120122
import static org.hamcrest.Matchers.equalTo;
121123
import static org.hamcrest.Matchers.hasEntry;
124+
import static org.hamcrest.Matchers.hasKey;
122125
import static org.hamcrest.Matchers.is;
126+
import static org.hamcrest.Matchers.not;
123127
import static org.hamcrest.core.IsNull.nullValue;
124128

125129
public class MLRequestConvertersTests extends ESTestCase {
@@ -965,6 +969,52 @@ public void testPutTrainedModel() throws IOException {
965969
}
966970
}
967971

972+
public void testPutTrainedModelAlias() throws IOException {
973+
PutTrainedModelAliasRequest putTrainedModelAliasRequest = new PutTrainedModelAliasRequest(
974+
randomAlphaOfLength(10),
975+
randomAlphaOfLength(10),
976+
randomBoolean() ? null : randomBoolean()
977+
);
978+
979+
Request request = MLRequestConverters.putTrainedModelAlias(putTrainedModelAliasRequest);
980+
981+
assertEquals(HttpPut.METHOD_NAME, request.getMethod());
982+
assertThat(
983+
request.getEndpoint(),
984+
equalTo(
985+
"/_ml/trained_models/"
986+
+ putTrainedModelAliasRequest.getModelId()
987+
+ "/model_aliases/"
988+
+ putTrainedModelAliasRequest.getModelAlias()
989+
)
990+
);
991+
if (putTrainedModelAliasRequest.getReassign() != null) {
992+
assertThat(request.getParameters().get("reassign"), equalTo(putTrainedModelAliasRequest.getReassign().toString()));
993+
} else {
994+
assertThat(request.getParameters(), not(hasKey("reassign")));
995+
}
996+
}
997+
998+
public void testDeleteTrainedModelAlias() throws IOException {
999+
DeleteTrainedModelAliasRequest deleteTrainedModelAliasRequest = new DeleteTrainedModelAliasRequest(
1000+
randomAlphaOfLength(10),
1001+
randomAlphaOfLength(10)
1002+
);
1003+
1004+
Request request = MLRequestConverters.deleteTrainedModelAlias(deleteTrainedModelAliasRequest);
1005+
1006+
assertEquals(HttpDelete.METHOD_NAME, request.getMethod());
1007+
assertThat(
1008+
request.getEndpoint(),
1009+
equalTo(
1010+
"/_ml/trained_models/"
1011+
+ deleteTrainedModelAliasRequest.getModelId()
1012+
+ "/model_aliases/"
1013+
+ deleteTrainedModelAliasRequest.getModelAlias()
1014+
)
1015+
);
1016+
}
1017+
9681018
public void testPutFilter() throws IOException {
9691019
MlFilter filter = MlFilterTests.createRandomBuilder("foo").build();
9701020
PutFilterRequest putFilterRequest = new PutFilterRequest(filter);

0 commit comments

Comments
 (0)