From e90692017b5888ac7dbe9d5b79b030267c285808 Mon Sep 17 00:00:00 2001 From: Przemyslaw Witek Date: Thu, 5 Mar 2020 11:41:51 +0100 Subject: [PATCH 1/6] Make ml index aliases hidden --- .../core/ml/annotations/AnnotationIndex.java | 8 ++-- .../xpack/core/ml/utils/MlIndexAndAlias.java | 4 +- .../ml/integration/DeleteExpiredDataIT.java | 2 + .../xpack/ml/integration/MlJobIT.java | 42 +++++++++++-------- .../ml/action/TransportDeleteJobAction.java | 2 +- .../job/persistence/JobResultsProvider.java | 13 ++++-- .../test/ml/custom_all_field.yml | 1 + .../rest-api-spec/test/ml/index_layout.yml | 21 ++++++++++ .../rest-api-spec/test/ml/jobs_crud.yml | 2 +- 9 files changed, 67 insertions(+), 28 deletions(-) diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/annotations/AnnotationIndex.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/annotations/AnnotationIndex.java index 2ef467562929b..131a1053519a7 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/annotations/AnnotationIndex.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/annotations/AnnotationIndex.java @@ -44,9 +44,11 @@ public static void createAnnotationsIndexIfNecessary(Settings settings, Client c final ActionListener finalListener) { final ActionListener createAliasListener = ActionListener.wrap(success -> { - final IndicesAliasesRequest request = client.admin().indices().prepareAliases() - .addAlias(INDEX_NAME, READ_ALIAS_NAME) - .addAlias(INDEX_NAME, WRITE_ALIAS_NAME).request(); + final IndicesAliasesRequest request = + client.admin().indices().prepareAliases() + .addAliasAction(IndicesAliasesRequest.AliasActions.add().index(INDEX_NAME).alias(READ_ALIAS_NAME).isHidden(true)) + .addAliasAction(IndicesAliasesRequest.AliasActions.add().index(INDEX_NAME).alias(WRITE_ALIAS_NAME).isHidden(true)) + .request(); executeAsyncWithOrigin(client.threadPool().getThreadContext(), ML_ORIGIN, request, ActionListener.wrap(r -> finalListener.onResponse(r.isAcknowledged()), finalListener::onFailure), client.admin().indices()::aliases); diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAlias.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAlias.java index 2c3aba673c6d0..9a246183cfa18 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAlias.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAlias.java @@ -136,7 +136,7 @@ private static void createFirstConcreteIndex(Client client, .indices() .prepareCreate(index); if (addAlias) { - requestBuilder.addAlias(new Alias(alias)); + requestBuilder.addAlias(new Alias(alias).isHidden(true)); } CreateIndexRequest request = requestBuilder.request(); @@ -166,7 +166,7 @@ private static void updateWriteAlias(Client client, IndicesAliasesRequestBuilder requestBuilder = client.admin() .indices() .prepareAliases() - .addAlias(newIndex, alias); + .addAliasAction(IndicesAliasesRequest.AliasActions.add().index(newIndex).alias(alias).isHidden(true)); if (currentIndex != null) { requestBuilder.removeAlias(currentIndex, alias); } diff --git a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/DeleteExpiredDataIT.java b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/DeleteExpiredDataIT.java index ca0c99eb4b421..b85e578d0564c 100644 --- a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/DeleteExpiredDataIT.java +++ b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/DeleteExpiredDataIT.java @@ -183,6 +183,7 @@ public void testDeleteExpiredData() throws Exception { retainAllSnapshots("snapshots-retention-with-retain"); long totalModelSizeStatsBeforeDelete = client().prepareSearch("*") + .setIndicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN_CLOSED_HIDDEN) .setQuery(QueryBuilders.termQuery("result_type", "model_size_stats")) .get().getHits().getTotalHits().value; long totalNotificationsCountBeforeDelete = @@ -231,6 +232,7 @@ public void testDeleteExpiredData() throws Exception { assertThat(getModelSnapshots("results-and-snapshots-retention").size(), equalTo(1)); long totalModelSizeStatsAfterDelete = client().prepareSearch("*") + .setIndicesOptions(IndicesOptions.LENIENT_EXPAND_OPEN_CLOSED_HIDDEN) .setQuery(QueryBuilders.termQuery("result_type", "model_size_stats")) .get().getHits().getTotalHits().value; long totalNotificationsCountAfterDelete = diff --git a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java index bc22667ef9418..4e492d1e3e54d 100644 --- a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java +++ b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java @@ -194,15 +194,17 @@ public void testCreateJobsWithIndexNameOption() throws Exception { // appear immediately so wait here. assertBusy(() -> { try { - String aliasesResponse = EntityUtils.toString(client().performRequest(new Request("GET", "/_aliases")).getEntity()); - assertThat(aliasesResponse, - containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName("custom-" + indexName) + "\":{\"aliases\":{")); + String aliasesResponse = getAliases(); + assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName("custom-" + indexName) + + "\":{\"aliases\":{")); assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId1) - + "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId1 + "\",\"boost\":1.0}}}}")); - assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId1) + "\":{}")); + + "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId1 + "\",\"boost\":1.0}}},\"is_hidden\":true}")); + assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId1) + + "\":{\"is_hidden\":true}")); assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId2) - + "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId2 + "\",\"boost\":1.0}}}}")); - assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId2) + "\":{}")); + + "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId2 + "\",\"boost\":1.0}}},\"is_hidden\":true}")); + assertThat(aliasesResponse, containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId2) + + "\":{\"is_hidden\":true}")); } catch (ResponseException e) { throw new AssertionError(e); } @@ -270,7 +272,7 @@ public void testCreateJobsWithIndexNameOption() throws Exception { client().performRequest(new Request("DELETE", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId1)); // check that indices still exist, but no longer have job1 entries and aliases are gone - responseAsString = EntityUtils.toString(client().performRequest(new Request("GET", "/_aliases")).getEntity()); + responseAsString = getAliases(); assertThat(responseAsString, not(containsString(AnomalyDetectorsIndex.jobResultsAliasedName(jobId1)))); assertThat(responseAsString, containsString(AnomalyDetectorsIndex.jobResultsAliasedName(jobId2))); //job2 still exists @@ -286,7 +288,7 @@ public void testCreateJobsWithIndexNameOption() throws Exception { // Delete the second job and verify aliases are gone, and original concrete/custom index is gone client().performRequest(new Request("DELETE", MachineLearning.BASE_PATH + "anomaly_detectors/" + jobId2)); - responseAsString = EntityUtils.toString(client().performRequest(new Request("GET", "/_aliases")).getEntity()); + responseAsString = getAliases(); assertThat(responseAsString, not(containsString(AnomalyDetectorsIndex.jobResultsAliasedName(jobId2)))); refreshAllIndices(); @@ -596,8 +598,9 @@ public void testDeleteJobAfterMissingAliases() throws Exception { assertBusy(() -> { try { String aliases = EntityUtils.toString(client().performRequest(new Request("GET", "/_cat/aliases")).getEntity()); - assertThat(aliases, containsString(readAliasName)); - assertThat(aliases, containsString(writeAliasName)); + // TODO: Uncomment these assertions once /_cat/aliases API accepts expand_wildcards parameter + //assertThat(aliases, containsString(readAliasName)); + //assertThat(aliases, containsString(writeAliasName)); } catch (ResponseException e) { throw new AssertionError(e); } @@ -626,6 +629,7 @@ public void testMultiIndexDelete() throws Exception { extraIndex1.setJsonEntity("{\n" + " \"aliases\" : {\n" + " \"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId)+ "\" : {\n" + + " \"is_hidden\" : true,\n" + " \"filter\" : {\n" + " \"term\" : {\"" + Job.ID + "\" : \"" + jobId + "\" }\n" + " }\n" + @@ -637,6 +641,7 @@ public void testMultiIndexDelete() throws Exception { extraIndex2.setJsonEntity("{\n" + " \"aliases\" : {\n" + " \"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId)+ "\" : {\n" + + " \"is_hidden\" : true,\n" + " \"filter\" : {\n" + " \"term\" : {\"" + Job.ID + "\" : \"" + jobId + "\" }\n" + " }\n" + @@ -784,6 +789,9 @@ public void testDelete_multipleRequest() throws Exception { assertNull(recreationException.get().getMessage(), recreationException.get()); } + String expectedReadAliasString = "\"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId) + + "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId + "\",\"boost\":1.0}}},\"is_hidden\":true}"; + String expectedWriteAliasString = "\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId) + "\":{\"is_hidden\":true}"; try { // The idea of the code above is that the deletion is sufficiently time-consuming that // all threads enter the deletion call before the first one exits it. Usually this happens, @@ -796,9 +804,8 @@ public void testDelete_multipleRequest() throws Exception { // if there's been a race between deletion and recreation these are what will be missing. String aliases = getAliases(); - assertThat(aliases, containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId) - + "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId + "\",\"boost\":1.0}}}}")); - assertThat(aliases, containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId) + "\":{}")); + assertThat(aliases, containsString(expectedReadAliasString)); + assertThat(aliases, containsString(expectedWriteAliasString)); } catch (ResponseException missingJobException) { @@ -807,16 +814,15 @@ public void testDelete_multipleRequest() throws Exception { // The job aliases should be deleted String aliases = getAliases(); - assertThat(aliases, not(containsString("\"" + AnomalyDetectorsIndex.jobResultsAliasedName(jobId) - + "\":{\"filter\":{\"term\":{\"job_id\":{\"value\":\"" + jobId + "\",\"boost\":1.0}}}}"))); - assertThat(aliases, not(containsString("\"" + AnomalyDetectorsIndex.resultsWriteAlias(jobId) + "\":{}"))); + assertThat(aliases, not(containsString(expectedReadAliasString))); + assertThat(aliases, not(containsString(expectedWriteAliasString))); } assertEquals(numThreads, recreationGuard.get()); } private String getAliases() throws IOException { - Response response = client().performRequest(new Request("GET", "/_aliases")); + Response response = client().performRequest(new Request("GET", "/_aliases?expand_wildcards=all")); return EntityUtils.toString(response.getEntity()); } diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteJobAction.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteJobAction.java index bb47caed2349d..2a5d35ce7f26a 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteJobAction.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/action/TransportDeleteJobAction.java @@ -489,7 +489,7 @@ private void deleteAliases(ParentTaskAssigningClient parentTaskClient, String jo // first find the concrete indices associated with the aliases GetAliasesRequest aliasesRequest = new GetAliasesRequest().aliases(readAliasName, writeAliasName) - .indicesOptions(IndicesOptions.lenientExpandOpen()); + .indicesOptions(IndicesOptions.lenientExpandOpenHidden()); executeAsyncWithOrigin(parentTaskClient.threadPool().getThreadContext(), ML_ORIGIN, aliasesRequest, ActionListener.wrap( getAliasesResponse -> { diff --git a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProvider.java b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProvider.java index 48e8fc9ecdaa2..1f332b5d538d1 100644 --- a/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProvider.java +++ b/x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/persistence/JobResultsProvider.java @@ -282,9 +282,16 @@ public void createJobResultIndex(Job job, ClusterState state, final ActionListen final String indexName = tempIndexName; ActionListener indexAndMappingsListener = ActionListener.wrap(success -> { - final IndicesAliasesRequest request = client.admin().indices().prepareAliases() - .addAlias(indexName, readAliasName, QueryBuilders.termQuery(Job.ID.getPreferredName(), job.getId())) - .addAlias(indexName, writeAliasName).request(); + final IndicesAliasesRequest request = + client.admin().indices().prepareAliases() + .addAliasAction( + IndicesAliasesRequest.AliasActions.add() + .index(indexName) + .alias(readAliasName) + .isHidden(true) + .filter(QueryBuilders.termQuery(Job.ID.getPreferredName(), job.getId()))) + .addAliasAction(IndicesAliasesRequest.AliasActions.add().index(indexName).alias(writeAliasName).isHidden(true)) + .request(); executeAsyncWithOrigin(client.threadPool().getThreadContext(), ML_ORIGIN, request, ActionListener.wrap(r -> finalListener.onResponse(true), finalListener::onFailure), client.admin().indices()::aliases); diff --git a/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/custom_all_field.yml b/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/custom_all_field.yml index bb8245a8e7eb4..f6bf53fb289db 100644 --- a/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/custom_all_field.yml +++ b/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/custom_all_field.yml @@ -148,6 +148,7 @@ setup: - do: search: + expand_wildcards: all rest_total_hits_as_int: true body: { query: { bool: { must: [ { query_string: { query: "result_type:record"} }, diff --git a/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/index_layout.yml b/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/index_layout.yml index 6774ae8b455cd..2b8a9063b4ad3 100644 --- a/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/index_layout.yml +++ b/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/index_layout.yml @@ -100,6 +100,13 @@ setup: index: ".ml-state-000001" - is_true: '' + - do: + headers: + Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser + indices.exists_alias: + name: ".ml-state-write" + - is_true: '' + - do: headers: Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser @@ -439,6 +446,13 @@ setup: index: ".ml-state-000001" - is_true: '' + - do: + headers: + Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser + indices.exists_alias: + name: ".ml-state-write" + - is_true: '' + - do: headers: Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser @@ -681,6 +695,13 @@ setup: index: ".ml-state-000001" - is_true: '' + - do: + headers: + Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser + indices.exists_alias: + name: ".ml-state-write" + - is_true: '' + - do: headers: Authorization: "Basic eF9wYWNrX3Jlc3RfdXNlcjp4LXBhY2stdGVzdC1wYXNzd29yZA==" # run as x_pack_rest_user, i.e. the test setup superuser diff --git a/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/jobs_crud.yml b/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/jobs_crud.yml index 445ab11b04288..7b365dbe92dc2 100644 --- a/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/jobs_crud.yml +++ b/x-pack/plugin/src/test/resources/rest-api-spec/test/ml/jobs_crud.yml @@ -70,7 +70,7 @@ - do: indices.get_alias: name: ".ml-anomalies-.write-job-crud-test-apis" - - match: { \.ml-anomalies-shared.aliases.\.ml-anomalies-\.write-job-crud-test-apis: {} } + - match: { \.ml-anomalies-shared.aliases.\.ml-anomalies-\.write-job-crud-test-apis: { is_hidden: true } } - do: ml.delete_job: From 709d4a76b72a59de9179fa634c098d88e5656afa Mon Sep 17 00:00:00 2001 From: Przemyslaw Witek Date: Thu, 12 Mar 2020 13:36:27 +0100 Subject: [PATCH 2/6] Fix compile errors in tests --- .../elasticsearch/xpack/ml/integration/DeleteExpiredDataIT.java | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/DeleteExpiredDataIT.java b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/DeleteExpiredDataIT.java index b85e578d0564c..017c11f4b3b10 100644 --- a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/DeleteExpiredDataIT.java +++ b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/DeleteExpiredDataIT.java @@ -10,6 +10,7 @@ import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.action.update.UpdateAction; import org.elasticsearch.action.update.UpdateRequest; From 7eb0a099069c4cf5bf07eee9c140a8f6d4a99e4a Mon Sep 17 00:00:00 2001 From: Przemyslaw Witek Date: Thu, 12 Mar 2020 13:50:43 +0100 Subject: [PATCH 3/6] Get rid of unnecessary `expand_aliases` parameter --- .../java/org/elasticsearch/xpack/ml/integration/MlJobIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java index 4e492d1e3e54d..a28f7bf7f0854 100644 --- a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java +++ b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java @@ -822,7 +822,7 @@ public void testDelete_multipleRequest() throws Exception { } private String getAliases() throws IOException { - Response response = client().performRequest(new Request("GET", "/_aliases?expand_wildcards=all")); + Response response = client().performRequest(new Request("GET", "/_aliases")); return EntityUtils.toString(response.getEntity()); } From 99f280ee8a9d8bce41fbdf464d00164dbb7ab271 Mon Sep 17 00:00:00 2001 From: Przemyslaw Witek Date: Mon, 16 Mar 2020 08:59:26 +0100 Subject: [PATCH 4/6] Uncomment assertions as /_cat/aliases API now accepts expand_wildcards parameter --- .../java/org/elasticsearch/xpack/ml/integration/MlJobIT.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java index a28f7bf7f0854..62b05bbcd81f4 100644 --- a/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java +++ b/x-pack/plugin/ml/qa/native-multi-node-tests/src/test/java/org/elasticsearch/xpack/ml/integration/MlJobIT.java @@ -598,9 +598,8 @@ public void testDeleteJobAfterMissingAliases() throws Exception { assertBusy(() -> { try { String aliases = EntityUtils.toString(client().performRequest(new Request("GET", "/_cat/aliases")).getEntity()); - // TODO: Uncomment these assertions once /_cat/aliases API accepts expand_wildcards parameter - //assertThat(aliases, containsString(readAliasName)); - //assertThat(aliases, containsString(writeAliasName)); + assertThat(aliases, containsString(readAliasName)); + assertThat(aliases, containsString(writeAliasName)); } catch (ResponseException e) { throw new AssertionError(e); } From b68885ced6b58c98e0a6add6ff2f8fc86a8af94a Mon Sep 17 00:00:00 2001 From: Przemyslaw Witek Date: Mon, 16 Mar 2020 09:40:33 +0100 Subject: [PATCH 5/6] Fix unit tests --- .../action/admin/indices/alias/IndicesAliasesRequest.java | 6 ++++-- .../xpack/core/ml/utils/MlIndexAndAliasTests.java | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java b/server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java index 39f9d7239f5ce..8c794845ac552 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java @@ -536,6 +536,7 @@ public String toString() { + ",indexRouting=" + indexRouting + ",searchRouting=" + searchRouting + ",writeIndex=" + writeIndex + + ",isHidden=" + isHidden + "]"; } @@ -553,12 +554,13 @@ public boolean equals(Object obj) { && Objects.equals(routing, other.routing) && Objects.equals(indexRouting, other.indexRouting) && Objects.equals(searchRouting, other.searchRouting) - && Objects.equals(writeIndex, other.writeIndex); + && Objects.equals(writeIndex, other.writeIndex) + && Objects.equals(isHidden, other.isHidden); } @Override public int hashCode() { - return Objects.hash(type, indices, aliases, filter, routing, indexRouting, searchRouting, writeIndex); + return Objects.hash(type, indices, aliases, filter, routing, indexRouting, searchRouting, writeIndex, isHidden); } } diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java index 850d197aa6d8b..8fb31b9a37b25 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java @@ -157,7 +157,7 @@ public void testCreateStateIndexAndAliasIfNecessary_WriteAliasAlreadyExistsAndPo assertThat( indicesAliasesRequest.getAliasActions(), contains( - AliasActions.add().alias(TEST_INDEX_ALIAS).index(FIRST_CONCRETE_INDEX), + AliasActions.add().alias(TEST_INDEX_ALIAS).index(FIRST_CONCRETE_INDEX).isHidden(true), AliasActions.remove().alias(TEST_INDEX_ALIAS).index(LEGACY_INDEX_WITHOUT_SUFFIX))); } @@ -175,7 +175,7 @@ private void assertMlStateWriteAliasAddedToMostRecentMlStateIndex(List e IndicesAliasesRequest indicesAliasesRequest = aliasesRequestCaptor.getValue(); assertThat( indicesAliasesRequest.getAliasActions(), - contains(AliasActions.add().alias(TEST_INDEX_ALIAS).index(expectedWriteIndexName))); + contains(AliasActions.add().alias(TEST_INDEX_ALIAS).index(expectedWriteIndexName).isHidden(true))); } public void testCreateStateIndexAndAliasIfNecessary_WriteAliasDoesNotExistButInitialStateIndexExists() { From 52479521583c5233153846127e8b12ebc3d69128 Mon Sep 17 00:00:00 2001 From: Przemyslaw Witek Date: Tue, 17 Mar 2020 13:37:39 +0100 Subject: [PATCH 6/6] Add assertions verifying that aliases are hidden --- .../indices/alias/IndicesAliasesRequest.java | 6 ++--- .../core/ml/utils/MlIndexAndAliasTests.java | 4 ++-- .../ml/integration/AnnotationIndexIT.java | 5 +++++ .../ml/integration/JobResultsProviderIT.java | 22 ++++++++++++------- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java b/server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java index 8c794845ac552..39f9d7239f5ce 100644 --- a/server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java +++ b/server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java @@ -536,7 +536,6 @@ public String toString() { + ",indexRouting=" + indexRouting + ",searchRouting=" + searchRouting + ",writeIndex=" + writeIndex - + ",isHidden=" + isHidden + "]"; } @@ -554,13 +553,12 @@ public boolean equals(Object obj) { && Objects.equals(routing, other.routing) && Objects.equals(indexRouting, other.indexRouting) && Objects.equals(searchRouting, other.searchRouting) - && Objects.equals(writeIndex, other.writeIndex) - && Objects.equals(isHidden, other.isHidden); + && Objects.equals(writeIndex, other.writeIndex); } @Override public int hashCode() { - return Objects.hash(type, indices, aliases, filter, routing, indexRouting, searchRouting, writeIndex, isHidden); + return Objects.hash(type, indices, aliases, filter, routing, indexRouting, searchRouting, writeIndex); } } diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java index 8fb31b9a37b25..eb745423177d8 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/utils/MlIndexAndAliasTests.java @@ -114,7 +114,7 @@ public void testCreateStateIndexAndAliasIfNecessary_CleanState() { CreateIndexRequest createRequest = createRequestCaptor.getValue(); assertThat(createRequest.index(), equalTo(FIRST_CONCRETE_INDEX)); - assertThat(createRequest.aliases(), equalTo(Collections.singleton(new Alias(TEST_INDEX_ALIAS)))); + assertThat(createRequest.aliases(), equalTo(Collections.singleton(new Alias(TEST_INDEX_ALIAS).isHidden(true)))); } private void assertNoClientInteractionsWhenWriteAliasAlreadyExists(String indexName) { @@ -205,7 +205,7 @@ public void testCreateStateIndexAndAliasIfNecessary_WriteAliasDoesNotExistButLeg CreateIndexRequest createRequest = createRequestCaptor.getValue(); assertThat(createRequest.index(), equalTo(FIRST_CONCRETE_INDEX)); - assertThat(createRequest.aliases(), equalTo(Collections.singleton(new Alias(TEST_INDEX_ALIAS)))); + assertThat(createRequest.aliases(), equalTo(Collections.singleton(new Alias(TEST_INDEX_ALIAS).isHidden(true)))); } public void testIndexNameComparator() { diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/integration/AnnotationIndexIT.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/integration/AnnotationIndexIT.java index 585bfd8545678..40494ce71d885 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/integration/AnnotationIndexIT.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/integration/AnnotationIndexIT.java @@ -19,6 +19,8 @@ import java.util.List; +import static org.hamcrest.Matchers.is; + public class AnnotationIndexIT extends MlSingleNodeTestCase { @Override @@ -72,6 +74,9 @@ private int numberOfAnnotationsAliases() { .getAliases(); if (aliases != null) { for (ObjectObjectCursor> entry : aliases) { + for (AliasMetaData aliasMetaData : entry.value) { + assertThat("Annotations aliases should be hidden but are not: " + aliases, aliasMetaData.isHidden(), is(true)); + } count += entry.value.size(); } } diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/integration/JobResultsProviderIT.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/integration/JobResultsProviderIT.java index f7806f1be9758..5e0fb7ce03e70 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/integration/JobResultsProviderIT.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/integration/JobResultsProviderIT.java @@ -142,8 +142,10 @@ public void testPutJob_CreatesResultsIndex() { assertThat(mappingProperties.keySet(), hasItem("by_field_1")); // Check aliases have been created - assertThat(getAliases(sharedResultsIndex), containsInAnyOrder(AnomalyDetectorsIndex.jobResultsAliasedName(job1.getId()), - AnomalyDetectorsIndex.resultsWriteAlias(job1.getId()))); + assertThat(getAliases(sharedResultsIndex), containsInAnyOrder( + AnomalyDetectorsIndex.jobResultsAliasedName(job1.getId()), + AnomalyDetectorsIndex.resultsWriteAlias(job1.getId()) + )); // Now let's create a second job to test things work when the index exists already assertThat(mappingProperties.keySet(), not(hasItem("by_field_2"))); @@ -187,8 +189,10 @@ public void testPutJob_WithCustomResultsIndex() { assertThat(mappingProperties.keySet(), hasItem("by_field")); // Check aliases have been created - assertThat(getAliases(customIndex), containsInAnyOrder(AnomalyDetectorsIndex.jobResultsAliasedName(job.getId()), - AnomalyDetectorsIndex.resultsWriteAlias(job.getId()))); + assertThat(getAliases(customIndex), containsInAnyOrder( + AnomalyDetectorsIndex.jobResultsAliasedName(job.getId()), + AnomalyDetectorsIndex.resultsWriteAlias(job.getId()) + )); } @AwaitsFix(bugUrl ="https://github.com/elastic/elasticsearch/issues/40134") @@ -366,12 +370,14 @@ private Map getIndexMappingProperties(String index) { } private Set getAliases(String index) { - GetAliasesResponse getAliasesResponse = client().admin().indices().getAliases( - new GetAliasesRequest().indices(index)).actionGet(); + GetAliasesResponse getAliasesResponse = client().admin().indices().getAliases(new GetAliasesRequest().indices(index)).actionGet(); ImmutableOpenMap> aliases = getAliasesResponse.getAliases(); assertThat(aliases.containsKey(index), is(true)); - List aliasMetaData = aliases.get(index); - return aliasMetaData.stream().map(AliasMetaData::alias).collect(Collectors.toSet()); + List aliasMetaDataList = aliases.get(index); + for (AliasMetaData aliasMetaData : aliasMetaDataList) { + assertThat("Anomalies aliases should be hidden but are not: " + aliases, aliasMetaData.isHidden(), is(true)); + } + return aliasMetaDataList.stream().map(AliasMetaData::alias).collect(Collectors.toSet()); } private List getCalendars(String jobId) throws Exception {