Skip to content

Commit b13cca3

Browse files
author
Hendrik Muhs
authored
[ML-Dataframe] add stop and delete endpoints (#33597)
add rest endpoints to stop and delete feature build indexer tasks and fix task saving/reloading
1 parent 4946d33 commit b13cca3

13 files changed

+706
-22
lines changed

x-pack/plugin/ml-feature-index-builder/src/main/java/org/elasticsearch/xpack/ml/featureindexbuilder/FeatureIndexBuilder.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,36 @@
1919
import org.elasticsearch.common.settings.Settings;
2020
import org.elasticsearch.common.settings.SettingsFilter;
2121
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
22+
import org.elasticsearch.license.XPackLicenseState;
2223
import org.elasticsearch.persistent.PersistentTaskParams;
24+
import org.elasticsearch.persistent.PersistentTaskState;
2325
import org.elasticsearch.persistent.PersistentTasksExecutor;
2426
import org.elasticsearch.plugins.ActionPlugin;
2527
import org.elasticsearch.plugins.PersistentTaskPlugin;
2628
import org.elasticsearch.plugins.Plugin;
2729
import org.elasticsearch.rest.RestController;
2830
import org.elasticsearch.rest.RestHandler;
31+
import org.elasticsearch.tasks.Task;
2932
import org.elasticsearch.threadpool.ExecutorBuilder;
3033
import org.elasticsearch.threadpool.FixedExecutorBuilder;
3134
import org.elasticsearch.threadpool.ThreadPool;
3235
import org.elasticsearch.xpack.core.XPackPlugin;
3336
import org.elasticsearch.xpack.core.scheduler.SchedulerEngine;
37+
import org.elasticsearch.xpack.ml.featureindexbuilder.action.DeleteFeatureIndexBuilderJobAction;
3438
import org.elasticsearch.xpack.ml.featureindexbuilder.action.PutFeatureIndexBuilderJobAction;
3539
import org.elasticsearch.xpack.ml.featureindexbuilder.action.StartFeatureIndexBuilderJobAction;
40+
import org.elasticsearch.xpack.ml.featureindexbuilder.action.StopFeatureIndexBuilderJobAction;
41+
import org.elasticsearch.xpack.ml.featureindexbuilder.action.TransportDeleteFeatureIndexBuilderJobAction;
3642
import org.elasticsearch.xpack.ml.featureindexbuilder.action.TransportPutFeatureIndexBuilderJobAction;
3743
import org.elasticsearch.xpack.ml.featureindexbuilder.action.TransportStartFeatureIndexBuilderJobAction;
44+
import org.elasticsearch.xpack.ml.featureindexbuilder.action.TransportStopFeatureIndexBuilderJobAction;
3845
import org.elasticsearch.xpack.ml.featureindexbuilder.job.FeatureIndexBuilderJob;
3946
import org.elasticsearch.xpack.ml.featureindexbuilder.job.FeatureIndexBuilderJobPersistentTasksExecutor;
47+
import org.elasticsearch.xpack.ml.featureindexbuilder.job.FeatureIndexBuilderJobState;
48+
import org.elasticsearch.xpack.ml.featureindexbuilder.rest.action.RestDeleteFeatureIndexBuilderJobAction;
4049
import org.elasticsearch.xpack.ml.featureindexbuilder.rest.action.RestPutFeatureIndexBuilderJobAction;
4150
import org.elasticsearch.xpack.ml.featureindexbuilder.rest.action.RestStartFeatureIndexBuilderJobAction;
51+
import org.elasticsearch.xpack.ml.featureindexbuilder.rest.action.RestStopFeatureIndexBuilderJobAction;
4252

4353
import java.time.Clock;
4454
import java.util.ArrayList;
@@ -64,22 +74,30 @@ public class FeatureIndexBuilder extends Plugin implements ActionPlugin, Persist
6474

6575
private final boolean enabled;
6676
private final Settings settings;
77+
private final boolean transportClientMode;
6778

6879
public FeatureIndexBuilder(Settings settings) {
6980
this.settings = settings;
7081

7182
// todo: XPackSettings.FEATURE_INDEX_BUILDER_ENABLED.get(settings);
7283
this.enabled = true;
84+
this.transportClientMode = XPackPlugin.transportClientMode(settings);
7385
}
7486

7587
@Override
7688
public Collection<Module> createGuiceModules() {
7789
List<Module> modules = new ArrayList<>();
7890

91+
if (transportClientMode) {
92+
return modules;
93+
}
94+
7995
modules.add(b -> XPackPlugin.bindFeatureSet(b, FeatureIndexBuilderFeatureSet.class));
8096
return modules;
8197
}
8298

99+
protected XPackLicenseState getLicenseState() { return XPackPlugin.getSharedLicenseState(); }
100+
83101
@Override
84102
public List<RestHandler> getRestHandlers(final Settings settings, final RestController restController,
85103
final ClusterSettings clusterSettings, final IndexScopedSettings indexScopedSettings, final SettingsFilter settingsFilter,
@@ -91,7 +109,9 @@ public List<RestHandler> getRestHandlers(final Settings settings, final RestCont
91109

92110
return Arrays.asList(
93111
new RestPutFeatureIndexBuilderJobAction(settings, restController),
94-
new RestStartFeatureIndexBuilderJobAction(settings, restController)
112+
new RestStartFeatureIndexBuilderJobAction(settings, restController),
113+
new RestStopFeatureIndexBuilderJobAction(settings, restController),
114+
new RestDeleteFeatureIndexBuilderJobAction(settings, restController)
95115
);
96116
}
97117

@@ -103,13 +123,15 @@ public List<RestHandler> getRestHandlers(final Settings settings, final RestCont
103123

104124
return Arrays.asList(
105125
new ActionHandler<>(PutFeatureIndexBuilderJobAction.INSTANCE, TransportPutFeatureIndexBuilderJobAction.class),
106-
new ActionHandler<>(StartFeatureIndexBuilderJobAction.INSTANCE, TransportStartFeatureIndexBuilderJobAction.class)
126+
new ActionHandler<>(StartFeatureIndexBuilderJobAction.INSTANCE, TransportStartFeatureIndexBuilderJobAction.class),
127+
new ActionHandler<>(StopFeatureIndexBuilderJobAction.INSTANCE, TransportStopFeatureIndexBuilderJobAction.class),
128+
new ActionHandler<>(DeleteFeatureIndexBuilderJobAction.INSTANCE, TransportDeleteFeatureIndexBuilderJobAction.class)
107129
);
108130
}
109131

110132
@Override
111133
public List<ExecutorBuilder<?>> getExecutorBuilders(Settings settings) {
112-
if (false == enabled) {
134+
if (false == enabled || transportClientMode) {
113135
return emptyList();
114136
}
115137

@@ -122,22 +144,27 @@ public List<ExecutorBuilder<?>> getExecutorBuilders(Settings settings) {
122144
@Override
123145
public List<PersistentTasksExecutor<?>> getPersistentTasksExecutor(ClusterService clusterService, ThreadPool threadPool,
124146
Client client) {
125-
if (enabled == false) {
147+
if (enabled == false || transportClientMode) {
126148
return emptyList();
127149
}
128150

129151
SchedulerEngine schedulerEngine = new SchedulerEngine(settings, Clock.systemUTC());
130152
return Collections.singletonList(new FeatureIndexBuilderJobPersistentTasksExecutor(settings, client,
131153
schedulerEngine, threadPool));
132154
}
155+
133156
@Override
134157
public List<NamedXContentRegistry.Entry> getNamedXContent() {
135158
if (enabled == false) {
136159
return emptyList();
137160
}
138-
return Collections.singletonList(
161+
return Arrays.asList(
139162
new NamedXContentRegistry.Entry(PersistentTaskParams.class, new ParseField("xpack/feature_index_builder/job"),
140-
FeatureIndexBuilderJob::fromXContent)
163+
FeatureIndexBuilderJob::fromXContent),
164+
new NamedXContentRegistry.Entry(Task.Status.class, new ParseField(FeatureIndexBuilderJobState.NAME),
165+
FeatureIndexBuilderJobState::fromXContent),
166+
new NamedXContentRegistry.Entry(PersistentTaskState.class, new ParseField(FeatureIndexBuilderJobState.NAME),
167+
FeatureIndexBuilderJobState::fromXContent)
141168
);
142169
}
143170
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
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+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
package org.elasticsearch.xpack.ml.featureindexbuilder.action;
7+
8+
import org.elasticsearch.action.Action;
9+
import org.elasticsearch.action.ActionRequestValidationException;
10+
import org.elasticsearch.action.support.master.AcknowledgedRequest;
11+
import org.elasticsearch.action.support.master.AcknowledgedResponse;
12+
import org.elasticsearch.action.support.master.MasterNodeOperationRequestBuilder;
13+
import org.elasticsearch.client.ElasticsearchClient;
14+
import org.elasticsearch.common.io.stream.StreamInput;
15+
import org.elasticsearch.common.io.stream.StreamOutput;
16+
import org.elasticsearch.common.xcontent.ToXContent;
17+
import org.elasticsearch.common.xcontent.XContentBuilder;
18+
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
19+
import org.elasticsearch.xpack.ml.featureindexbuilder.job.FeatureIndexBuilderJob;
20+
21+
import java.io.IOException;
22+
import java.util.Objects;
23+
24+
public class DeleteFeatureIndexBuilderJobAction extends Action<AcknowledgedResponse> {
25+
26+
public static final DeleteFeatureIndexBuilderJobAction INSTANCE = new DeleteFeatureIndexBuilderJobAction();
27+
public static final String NAME = "cluster:admin/xpack/feature_index_builder/delete";
28+
29+
private DeleteFeatureIndexBuilderJobAction() {
30+
super(NAME);
31+
}
32+
33+
@Override
34+
public AcknowledgedResponse newResponse() {
35+
return new AcknowledgedResponse();
36+
}
37+
38+
public static class Request extends AcknowledgedRequest<Request> implements ToXContent {
39+
private String id;
40+
41+
public Request(String id) {
42+
this.id = ExceptionsHelper.requireNonNull(id, FeatureIndexBuilderJob.ID.getPreferredName());
43+
}
44+
45+
public Request() {
46+
}
47+
48+
public String getId() {
49+
return id;
50+
}
51+
52+
@Override
53+
public void readFrom(StreamInput in) throws IOException {
54+
super.readFrom(in);
55+
id = in.readString();
56+
}
57+
58+
@Override
59+
public void writeTo(StreamOutput out) throws IOException {
60+
super.writeTo(out);
61+
out.writeString(id);
62+
}
63+
64+
@Override
65+
public ActionRequestValidationException validate() {
66+
return null;
67+
}
68+
69+
@Override
70+
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
71+
builder.field(FeatureIndexBuilderJob.ID.getPreferredName(), id);
72+
return builder;
73+
}
74+
75+
@Override
76+
public int hashCode() {
77+
return Objects.hash(id);
78+
}
79+
80+
@Override
81+
public boolean equals(Object obj) {
82+
if (this == obj) {
83+
return true;
84+
}
85+
86+
if (obj == null || getClass() != obj.getClass()) {
87+
return false;
88+
}
89+
Request other = (Request) obj;
90+
return Objects.equals(id, other.id);
91+
}
92+
}
93+
94+
public static class RequestBuilder extends MasterNodeOperationRequestBuilder<Request, AcknowledgedResponse, RequestBuilder> {
95+
96+
protected RequestBuilder(ElasticsearchClient client, DeleteFeatureIndexBuilderJobAction action) {
97+
super(client, action, new Request());
98+
}
99+
}
100+
}

x-pack/plugin/ml-feature-index-builder/src/main/java/org/elasticsearch/xpack/ml/featureindexbuilder/action/StartFeatureIndexBuilderJobAction.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
import org.elasticsearch.common.xcontent.ToXContentObject;
2020
import org.elasticsearch.common.xcontent.XContentBuilder;
2121
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
22-
import org.elasticsearch.xpack.core.rollup.RollupField;
22+
import org.elasticsearch.xpack.ml.featureindexbuilder.job.FeatureIndexBuilderJob;
23+
2324
import java.io.IOException;
2425
import java.util.Collections;
2526
import java.util.Objects;
@@ -42,7 +43,7 @@ public static class Request extends BaseTasksRequest<Request> implements ToXCont
4243
private String id;
4344

4445
public Request(String id) {
45-
this.id = ExceptionsHelper.requireNonNull(id, RollupField.ID.getPreferredName());
46+
this.id = ExceptionsHelper.requireNonNull(id, FeatureIndexBuilderJob.ID.getPreferredName());
4647
}
4748

4849
public Request() {
@@ -71,7 +72,7 @@ public ActionRequestValidationException validate() {
7172

7273
@Override
7374
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
74-
builder.field(RollupField.ID.getPreferredName(), id);
75+
builder.field(FeatureIndexBuilderJob.ID.getPreferredName(), id);
7576
return builder;
7677
}
7778

@@ -92,7 +93,7 @@ public boolean equals(Object obj) {
9293
return Objects.equals(id, other.id);
9394
}
9495
}
95-
96+
9697
public static class RequestBuilder extends ActionRequestBuilder<Request, Response> {
9798

9899
protected RequestBuilder(ElasticsearchClient client, StartFeatureIndexBuilderJobAction action) {
@@ -142,12 +143,15 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
142143
}
143144

144145
@Override
145-
public boolean equals(Object o) {
146-
if (this == o)
146+
public boolean equals(Object obj) {
147+
if (this == obj) {
147148
return true;
148-
if (o == null || getClass() != o.getClass())
149+
}
150+
151+
if (obj == null || getClass() != obj.getClass()) {
149152
return false;
150-
Response response = (Response) o;
153+
}
154+
Response response = (Response) obj;
151155
return started == response.started;
152156
}
153157

0 commit comments

Comments
 (0)