Skip to content

Commit 221b005

Browse files
authored
Make ML index aliases hidden (#53160)
1 parent 98c509a commit 221b005

File tree

12 files changed

+87
-37
lines changed

12 files changed

+87
-37
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/annotations/AnnotationIndex.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@ public static void createAnnotationsIndexIfNecessary(Settings settings, Client c
4444
final ActionListener<Boolean> finalListener) {
4545

4646
final ActionListener<Boolean> createAliasListener = ActionListener.wrap(success -> {
47-
final IndicesAliasesRequest request = client.admin().indices().prepareAliases()
48-
.addAlias(INDEX_NAME, READ_ALIAS_NAME)
49-
.addAlias(INDEX_NAME, WRITE_ALIAS_NAME).request();
47+
final IndicesAliasesRequest request =
48+
client.admin().indices().prepareAliases()
49+
.addAliasAction(IndicesAliasesRequest.AliasActions.add().index(INDEX_NAME).alias(READ_ALIAS_NAME).isHidden(true))
50+
.addAliasAction(IndicesAliasesRequest.AliasActions.add().index(INDEX_NAME).alias(WRITE_ALIAS_NAME).isHidden(true))
51+
.request();
5052
executeAsyncWithOrigin(client.threadPool().getThreadContext(), ML_ORIGIN, request,
5153
ActionListener.<AcknowledgedResponse>wrap(r -> finalListener.onResponse(r.isAcknowledged()), finalListener::onFailure),
5254
client.admin().indices()::aliases);

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAlias.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ private static void createFirstConcreteIndex(Client client,
136136
.indices()
137137
.prepareCreate(index);
138138
if (addAlias) {
139-
requestBuilder.addAlias(new Alias(alias));
139+
requestBuilder.addAlias(new Alias(alias).isHidden(true));
140140
}
141141
CreateIndexRequest request = requestBuilder.request();
142142

@@ -166,7 +166,7 @@ private static void updateWriteAlias(Client client,
166166
IndicesAliasesRequestBuilder requestBuilder = client.admin()
167167
.indices()
168168
.prepareAliases()
169-
.addAlias(newIndex, alias);
169+
.addAliasAction(IndicesAliasesRequest.AliasActions.add().index(newIndex).alias(alias).isHidden(true));
170170
if (currentIndex != null) {
171171
requestBuilder.removeAlias(currentIndex, alias);
172172
}

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ public void testCreateStateIndexAndAliasIfNecessary_CleanState() {
114114

115115
CreateIndexRequest createRequest = createRequestCaptor.getValue();
116116
assertThat(createRequest.index(), equalTo(FIRST_CONCRETE_INDEX));
117-
assertThat(createRequest.aliases(), equalTo(Collections.singleton(new Alias(TEST_INDEX_ALIAS))));
117+
assertThat(createRequest.aliases(), equalTo(Collections.singleton(new Alias(TEST_INDEX_ALIAS).isHidden(true))));
118118
}
119119

120120
private void assertNoClientInteractionsWhenWriteAliasAlreadyExists(String indexName) {
@@ -157,7 +157,7 @@ public void testCreateStateIndexAndAliasIfNecessary_WriteAliasAlreadyExistsAndPo
157157
assertThat(
158158
indicesAliasesRequest.getAliasActions(),
159159
contains(
160-
AliasActions.add().alias(TEST_INDEX_ALIAS).index(FIRST_CONCRETE_INDEX),
160+
AliasActions.add().alias(TEST_INDEX_ALIAS).index(FIRST_CONCRETE_INDEX).isHidden(true),
161161
AliasActions.remove().alias(TEST_INDEX_ALIAS).index(LEGACY_INDEX_WITHOUT_SUFFIX)));
162162
}
163163

@@ -175,7 +175,7 @@ private void assertMlStateWriteAliasAddedToMostRecentMlStateIndex(List<String> e
175175
IndicesAliasesRequest indicesAliasesRequest = aliasesRequestCaptor.getValue();
176176
assertThat(
177177
indicesAliasesRequest.getAliasActions(),
178-
contains(AliasActions.add().alias(TEST_INDEX_ALIAS).index(expectedWriteIndexName)));
178+
contains(AliasActions.add().alias(TEST_INDEX_ALIAS).index(expectedWriteIndexName).isHidden(true)));
179179
}
180180

181181
public void testCreateStateIndexAndAliasIfNecessary_WriteAliasDoesNotExistButInitialStateIndexExists() {
@@ -205,7 +205,7 @@ public void testCreateStateIndexAndAliasIfNecessary_WriteAliasDoesNotExistButLeg
205205

206206
CreateIndexRequest createRequest = createRequestCaptor.getValue();
207207
assertThat(createRequest.index(), equalTo(FIRST_CONCRETE_INDEX));
208-
assertThat(createRequest.aliases(), equalTo(Collections.singleton(new Alias(TEST_INDEX_ALIAS))));
208+
assertThat(createRequest.aliases(), equalTo(Collections.singleton(new Alias(TEST_INDEX_ALIAS).isHidden(true))));
209209
}
210210

211211
public void testIndexNameComparator() {

x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/DeleteExpiredDataIT.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.elasticsearch.action.bulk.BulkResponse;
1111
import org.elasticsearch.action.index.IndexRequest;
1212
import org.elasticsearch.action.search.SearchResponse;
13+
import org.elasticsearch.action.support.IndicesOptions;
1314
import org.elasticsearch.action.support.WriteRequest;
1415
import org.elasticsearch.action.update.UpdateAction;
1516
import org.elasticsearch.action.update.UpdateRequest;
@@ -183,6 +184,7 @@ public void testDeleteExpiredData() throws Exception {
183184
retainAllSnapshots("snapshots-retention-with-retain");
184185

185186
long totalModelSizeStatsBeforeDelete = client().prepareSearch("*")
187+
.setIndicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN_CLOSED_HIDDEN)
186188
.setQuery(QueryBuilders.termQuery("result_type", "model_size_stats"))
187189
.get().getHits().getTotalHits().value;
188190
long totalNotificationsCountBeforeDelete =
@@ -231,6 +233,7 @@ public void testDeleteExpiredData() throws Exception {
231233
assertThat(getModelSnapshots("results-and-snapshots-retention").size(), equalTo(1));
232234

233235
long totalModelSizeStatsAfterDelete = client().prepareSearch("*")
236+
.setIndicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN_CLOSED_HIDDEN)
234237
.setQuery(QueryBuilders.termQuery("result_type", "model_size_stats"))
235238
.get().getHits().getTotalHits().value;
236239
long totalNotificationsCountAfterDelete =

x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -194,15 +194,17 @@ public void testCreateJobsWithIndexNameOption() throws Exception {
194194
// appear immediately so wait here.
195195
assertBusy(() -> {
196196
try {
197-
String aliasesResponse = EntityUtils.toString(client().performRequest(new Request("GET", "/_aliases")).getEntity());
198-
assertThat(aliasesResponse,
199-
containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName("custom-" + indexName) + "\":{\"aliases\":{"));
197+
String aliasesResponse = getAliases();
198+
assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName("custom-" + indexName)
199+
+ "\":{\"aliases\":{"));
200200
assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId1)
201-
+ "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId1 + "\",\"boost\":1.0}}}}"));
202-
assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId1) + "\":{}"));
201+
+ "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId1 + "\",\"boost\":1.0}}},\"is_hidden\":true}"));
202+
assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId1)
203+
+ "\":{\"is_hidden\":true}"));
203204
assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId2)
204-
+ "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId2 + "\",\"boost\":1.0}}}}"));
205-
assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId2) + "\":{}"));
205+
+ "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId2 + "\",\"boost\":1.0}}},\"is_hidden\":true}"));
206+
assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId2)
207+
+ "\":{\"is_hidden\":true}"));
206208
} catch (ResponseException e) {
207209
throw new AssertionError(e);
208210
}
@@ -270,7 +272,7 @@ public void testCreateJobsWithIndexNameOption() throws Exception {
270272
client().performRequest(new Request("DELETE", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId1));
271273

272274
// check that indices still exist, but no longer have job1 entries and aliases are gone
273-
responseAsString = EntityUtils.toString(client().performRequest(new Request("GET", "/_aliases")).getEntity());
275+
responseAsString = getAliases();
274276
assertThat(responseAsString, not(containsString(AnomalyDetectorsIndex.jobResultsAliasedName(jobId1))));
275277
assertThat(responseAsString, containsString(AnomalyDetectorsIndex.jobResultsAliasedName(jobId2))); //job2 still exists
276278

@@ -286,7 +288,7 @@ public void testCreateJobsWithIndexNameOption() throws Exception {
286288

287289
// Delete the second job and verify aliases are gone, and original concrete/custom index is gone
288290
client().performRequest(new Request("DELETE", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId2));
289-
responseAsString = EntityUtils.toString(client().performRequest(new Request("GET", "/_aliases")).getEntity());
291+
responseAsString = getAliases();
290292
assertThat(responseAsString, not(containsString(AnomalyDetectorsIndex.jobResultsAliasedName(jobId2))));
291293

292294
refreshAllIndices();
@@ -626,6 +628,7 @@ public void testMultiIndexDelete() throws Exception {
626628
extraIndex1.setJsonEntity("{\n" +
627629
" \"aliases\" : {\n" +
628630
" \"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId)+ "\" : {\n" +
631+
" \"is_hidden\" : true,\n" +
629632
" \"filter\" : {\n" +
630633
" \"term\" : {\"" + Job.ID + "\" : \"" + jobId + "\" }\n" +
631634
" }\n" +
@@ -637,6 +640,7 @@ public void testMultiIndexDelete() throws Exception {
637640
extraIndex2.setJsonEntity("{\n" +
638641
" \"aliases\" : {\n" +
639642
" \"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId)+ "\" : {\n" +
643+
" \"is_hidden\" : true,\n" +
640644
" \"filter\" : {\n" +
641645
" \"term\" : {\"" + Job.ID + "\" : \"" + jobId + "\" }\n" +
642646
" }\n" +
@@ -784,6 +788,9 @@ public void testDelete_multipleRequest() throws Exception {
784788
assertNull(recreationException.get().getMessage(), recreationException.get());
785789
}
786790

791+
String expectedReadAliasString = "\"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId)
792+
+ "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId + "\",\"boost\":1.0}}},\"is_hidden\":true}";
793+
String expectedWriteAliasString = "\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId) + "\":{\"is_hidden\":true}";
787794
try {
788795
// The idea of the code above is that the deletion is sufficiently time-consuming that
789796
// all threads enter the deletion call before the first one exits it. Usually this happens,
@@ -796,9 +803,8 @@ public void testDelete_multipleRequest() throws Exception {
796803
// if there's been a race between deletion and recreation these are what will be missing.
797804
String aliases = getAliases();
798805

799-
assertThat(aliases, containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId)
800-
+ "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId + "\",\"boost\":1.0}}}}"));
801-
assertThat(aliases, containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId) + "\":{}"));
806+
assertThat(aliases, containsString(expectedReadAliasString));
807+
assertThat(aliases, containsString(expectedWriteAliasString));
802808

803809

804810
} catch (ResponseException missingJobException) {
@@ -807,9 +813,8 @@ public void testDelete_multipleRequest() throws Exception {
807813

808814
// The job aliases should be deleted
809815
String aliases = getAliases();
810-
assertThat(aliases, not(containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId)
811-
+ "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId + "\",\"boost\":1.0}}}}")));
812-
assertThat(aliases, not(containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId) + "\":{}")));
816+
assertThat(aliases, not(containsString(expectedReadAliasString)));
817+
assertThat(aliases, not(containsString(expectedWriteAliasString)));
813818
}
814819

815820
assertEquals(numThreads, recreationGuard.get());

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteJobAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ private void deleteAliases(ParentTaskAssigningClient parentTaskClient, String jo
489489

490490
// first find the concrete indices associated with the aliases
491491
GetAliasesRequest aliasesRequest = new GetAliasesRequest().aliases(readAliasName, writeAliasName)
492-
.indicesOptions(IndicesOptions.lenientExpandOpen());
492+
.indicesOptions(IndicesOptions.lenientExpandOpenHidden());
493493
executeAsyncWithOrigin(parentTaskClient.threadPool().getThreadContext(), ML_ORIGIN, aliasesRequest,
494494
ActionListener.<GetAliasesResponse>wrap(
495495
getAliasesResponse -> {

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProvider.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,16 @@ public void createJobResultIndex(Job job, ClusterState state, final ActionListen
282282
final String indexName = tempIndexName;
283283

284284
ActionListener<Boolean> indexAndMappingsListener = ActionListener.wrap(success -> {
285-
final IndicesAliasesRequest request = client.admin().indices().prepareAliases()
286-
.addAlias(indexName, readAliasName, QueryBuilders.termQuery(Job.ID.getPreferredName(), job.getId()))
287-
.addAlias(indexName, writeAliasName).request();
285+
final IndicesAliasesRequest request =
286+
client.admin().indices().prepareAliases()
287+
.addAliasAction(
288+
IndicesAliasesRequest.AliasActions.add()
289+
.index(indexName)
290+
.alias(readAliasName)
291+
.isHidden(true)
292+
.filter(QueryBuilders.termQuery(Job.ID.getPreferredName(), job.getId())))
293+
.addAliasAction(IndicesAliasesRequest.AliasActions.add().index(indexName).alias(writeAliasName).isHidden(true))
294+
.request();
288295
executeAsyncWithOrigin(client.threadPool().getThreadContext(), ML_ORIGIN, request,
289296
ActionListener.<AcknowledgedResponse>wrap(r -> finalListener.onResponse(true), finalListener::onFailure),
290297
client.admin().indices()::aliases);

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/integration/AnnotationIndexIT.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
import java.util.List;
2121

22+
import static org.hamcrest.Matchers.is;
23+
2224
public class AnnotationIndexIT extends MlSingleNodeTestCase {
2325

2426
@Override
@@ -72,6 +74,9 @@ private int numberOfAnnotationsAliases() {
7274
.getAliases();
7375
if (aliases != null) {
7476
for (ObjectObjectCursor<String, List<AliasMetaData>> entry : aliases) {
77+
for (AliasMetaData aliasMetaData : entry.value) {
78+
assertThat("Annotations aliases should be hidden but are not: " + aliases, aliasMetaData.isHidden(), is(true));
79+
}
7580
count += entry.value.size();
7681
}
7782
}

x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/integration/JobResultsProviderIT.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,10 @@ public void testPutJob_CreatesResultsIndex() {
142142
assertThat(mappingProperties.keySet(), hasItem("by_field_1"));
143143

144144
// Check aliases have been created
145-
assertThat(getAliases(sharedResultsIndex), containsInAnyOrder(AnomalyDetectorsIndex.jobResultsAliasedName(job1.getId()),
146-
AnomalyDetectorsIndex.resultsWriteAlias(job1.getId())));
145+
assertThat(getAliases(sharedResultsIndex), containsInAnyOrder(
146+
AnomalyDetectorsIndex.jobResultsAliasedName(job1.getId()),
147+
AnomalyDetectorsIndex.resultsWriteAlias(job1.getId())
148+
));
147149

148150
// Now let's create a second job to test things work when the index exists already
149151
assertThat(mappingProperties.keySet(), not(hasItem("by_field_2")));
@@ -187,8 +189,10 @@ public void testPutJob_WithCustomResultsIndex() {
187189
assertThat(mappingProperties.keySet(), hasItem("by_field"));
188190

189191
// Check aliases have been created
190-
assertThat(getAliases(customIndex), containsInAnyOrder(AnomalyDetectorsIndex.jobResultsAliasedName(job.getId()),
191-
AnomalyDetectorsIndex.resultsWriteAlias(job.getId())));
192+
assertThat(getAliases(customIndex), containsInAnyOrder(
193+
AnomalyDetectorsIndex.jobResultsAliasedName(job.getId()),
194+
AnomalyDetectorsIndex.resultsWriteAlias(job.getId())
195+
));
192196
}
193197

194198
@AwaitsFix(bugUrl ="https://github.com/elastic/elasticsearch/issues/40134")
@@ -366,12 +370,14 @@ private Map<String, Object> getIndexMappingProperties(String index) {
366370
}
367371

368372
private Set<String> getAliases(String index) {
369-
GetAliasesResponse getAliasesResponse = client().admin().indices().getAliases(
370-
new GetAliasesRequest().indices(index)).actionGet();
373+
GetAliasesResponse getAliasesResponse = client().admin().indices().getAliases(new GetAliasesRequest().indices(index)).actionGet();
371374
ImmutableOpenMap<String, List<AliasMetaData>> aliases = getAliasesResponse.getAliases();
372375
assertThat(aliases.containsKey(index), is(true));
373-
List<AliasMetaData> aliasMetaData = aliases.get(index);
374-
return aliasMetaData.stream().map(AliasMetaData::alias).collect(Collectors.toSet());
376+
List<AliasMetaData> aliasMetaDataList = aliases.get(index);
377+
for (AliasMetaData aliasMetaData : aliasMetaDataList) {
378+
assertThat("Anomalies aliases should be hidden but are not: " + aliases, aliasMetaData.isHidden(), is(true));
379+
}
380+
return aliasMetaDataList.stream().map(AliasMetaData::alias).collect(Collectors.toSet());
375381
}
376382

377383
private List<Calendar> getCalendars(String jobId) throws Exception {

x-pack/plugin/src/test/resources/rest-api-spec/test/ml/custom_all_field.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ setup:
148148

149149
- do:
150150
search:
151+
expand_wildcards: all
151152
rest_total_hits_as_int: true
152153
body: { query: { bool: { must: [
153154
{ query_string: { query: "result_type:record"} },

x-pack/plugin/src/test/resources/rest-api-spec/test/ml/index_layout.yml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,13 @@ setup:
100100
index: ".ml-state-000001"
101101
- is_true: ''
102102

103+
- do:
104+
headers:
105+
Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser
106+
indices.exists_alias:
107+
name: ".ml-state-write"
108+
- is_true: ''
109+
103110
- do:
104111
headers:
105112
Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser
@@ -439,6 +446,13 @@ setup:
439446
index: ".ml-state-000001"
440447
- is_true: ''
441448

449+
- do:
450+
headers:
451+
Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser
452+
indices.exists_alias:
453+
name: ".ml-state-write"
454+
- is_true: ''
455+
442456
- do:
443457
headers:
444458
Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser
@@ -681,6 +695,13 @@ setup:
681695
index: ".ml-state-000001"
682696
- is_true: ''
683697

698+
- do:
699+
headers:
700+
Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser
701+
indices.exists_alias:
702+
name: ".ml-state-write"
703+
- is_true: ''
704+
684705
- do:
685706
headers:
686707
Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser

x-pack/plugin/src/test/resources/rest-api-spec/test/ml/jobs_crud.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
- do:
7171
indices.get_alias:
7272
name: ".ml-anomalies-.write-job-crud-test-apis"
73-
- match: { \.ml-anomalies-shared.aliases.\.ml-anomalies-\.write-job-crud-test-apis: {} }
73+
- match: { \.ml-anomalies-shared.aliases.\.ml-anomalies-\.write-job-crud-test-apis: { is_hidden: true } }
7474

7575
- do:
7676
ml.delete_job:

0 commit comments

Comments
 (0)