Skip to content

Commit f950745

Browse files
committed
Do not return all indices if a specific alias is requested via get aliases api.
If a get alias api call requests a specific alias pattern then indices not having any matching aliases should not be included in the response. This is a second attempt to fix this (first attempt was elastic#28294). The reason that the first attempt was reverted is because when xpack security is enabled then index expression (like * or _all) are resolved prior to when a request is processed in the get aliases transport action, then `MetaData#findAliases` can't know whether requested all where requested since it was already expanded in concrete alias names. This change replaces aliases(...) replaceAliases(...) method on AliasesRequests class and leave the aliases(...) method on subclasses. So there is a distinction between when xpack security replaces aliases and a user setting aliases via the transport or high level http client. Closes elastic#27763
1 parent 5d94003 commit f950745

File tree

7 files changed

+71
-40
lines changed

7 files changed

+71
-40
lines changed

server/src/main/java/org/elasticsearch/action/AliasesRequest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,11 @@ public interface AliasesRequest extends IndicesRequest.Replaceable {
3333
String[] aliases();
3434

3535
/**
36-
* Sets the array of aliases that the action relates to
36+
* Replaces the aliases that the action relates to
37+
*
38+
* This is an internal method.
3739
*/
38-
AliasesRequest aliases(String... aliases);
40+
void replaceAliases(String... aliases);
3941

4042
/**
4143
* Returns true if wildcards expressions among aliases should be resolved, false otherwise

server/src/main/java/org/elasticsearch/action/admin/indices/alias/IndicesAliasesRequest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,6 @@ public AliasActions index(String index) {
302302
/**
303303
* Aliases to use with this action.
304304
*/
305-
@Override
306305
public AliasActions aliases(String... aliases) {
307306
if (type == AliasActions.Type.REMOVE_INDEX) {
308307
throw new IllegalArgumentException("[aliases] is unsupported for [" + type + "]");
@@ -428,6 +427,11 @@ public String[] aliases() {
428427
return aliases;
429428
}
430429

430+
@Override
431+
public void replaceAliases(String... aliases) {
432+
this.aliases = aliases;
433+
}
434+
431435
@Override
432436
public boolean expandAliasesWildcards() {
433437
//remove operations support wildcards among aliases, add operations don't

server/src/main/java/org/elasticsearch/action/admin/indices/alias/get/GetAliasesRequest.java

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.elasticsearch.action.admin.indices.alias.get;
2020

21+
import org.elasticsearch.Version;
2122
import org.elasticsearch.action.ActionRequestValidationException;
2223
import org.elasticsearch.action.AliasesRequest;
2324
import org.elasticsearch.action.support.IndicesOptions;
@@ -27,20 +28,18 @@
2728
import org.elasticsearch.common.io.stream.StreamOutput;
2829

2930
import java.io.IOException;
31+
import java.util.Objects;
3032

3133
public class GetAliasesRequest extends MasterNodeReadRequest<GetAliasesRequest> implements AliasesRequest {
3234

3335
private String[] indices = Strings.EMPTY_ARRAY;
3436
private String[] aliases = Strings.EMPTY_ARRAY;
35-
3637
private IndicesOptions indicesOptions = IndicesOptions.strictExpand();
38+
private boolean aliasesProvided = false;
3739

38-
public GetAliasesRequest(String[] aliases) {
39-
this.aliases = aliases;
40-
}
41-
42-
public GetAliasesRequest(String alias) {
43-
this.aliases = new String[]{alias};
40+
public GetAliasesRequest(String... aliases) {
41+
this.aliases = Objects.requireNonNull(aliases);
42+
this.aliasesProvided = aliases.length != 0;
4443
}
4544

4645
public GetAliasesRequest() {
@@ -51,6 +50,9 @@ public GetAliasesRequest(StreamInput in) throws IOException {
5150
indices = in.readStringArray();
5251
aliases = in.readStringArray();
5352
indicesOptions = IndicesOptions.readIndicesOptions(in);
53+
if (in.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
54+
aliasesProvided = in.readBoolean();
55+
}
5456
}
5557

5658
@Override
@@ -59,6 +61,9 @@ public void writeTo(StreamOutput out) throws IOException {
5961
out.writeStringArray(indices);
6062
out.writeStringArray(aliases);
6163
indicesOptions.writeIndicesOptions(out);
64+
if (out.getVersion().onOrAfter(Version.V_7_0_0_alpha1)) {
65+
out.writeBoolean(aliasesProvided);
66+
}
6267
}
6368

6469
@Override
@@ -67,9 +72,9 @@ public GetAliasesRequest indices(String... indices) {
6772
return this;
6873
}
6974

70-
@Override
7175
public GetAliasesRequest aliases(String... aliases) {
72-
this.aliases = aliases;
76+
this.aliases = Objects.requireNonNull(aliases);
77+
this.aliasesProvided = aliases.length != 0;
7378
return this;
7479
}
7580

@@ -88,6 +93,19 @@ public String[] aliases() {
8893
return aliases;
8994
}
9095

96+
@Override
97+
public void replaceAliases(String... aliases) {
98+
this.aliases = aliases;
99+
}
100+
101+
/**
102+
* @return Whether aliases that where originally provided by the user via {@link #aliases(String...)} or
103+
* {@link #GetAliasesRequest(String...)}. If this is not the case and there are aliases then
104+
*/
105+
boolean isAliasesProvided() {
106+
return aliasesProvided;
107+
}
108+
91109
@Override
92110
public boolean expandAliasesWildcards() {
93111
return true;

server/src/main/java/org/elasticsearch/action/admin/indices/alias/get/TransportGetAliasesAction.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.elasticsearch.action.admin.indices.alias.get;
2020

21+
import com.carrotsearch.hppc.ObjectHashSet;
2122
import org.elasticsearch.action.ActionListener;
2223
import org.elasticsearch.action.support.ActionFilters;
2324
import org.elasticsearch.action.support.master.TransportMasterNodeReadAction;
@@ -27,12 +28,14 @@
2728
import org.elasticsearch.cluster.metadata.AliasMetaData;
2829
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
2930
import org.elasticsearch.cluster.service.ClusterService;
31+
import org.elasticsearch.common.collect.HppcMaps;
3032
import org.elasticsearch.common.collect.ImmutableOpenMap;
3133
import org.elasticsearch.common.inject.Inject;
3234
import org.elasticsearch.common.settings.Settings;
3335
import org.elasticsearch.threadpool.ThreadPool;
3436
import org.elasticsearch.transport.TransportService;
3537

38+
import java.util.Collections;
3639
import java.util.List;
3740

3841
public class TransportGetAliasesAction extends TransportMasterNodeReadAction<GetAliasesRequest, GetAliasesResponse> {
@@ -63,6 +66,16 @@ protected GetAliasesResponse newResponse() {
6366
protected void masterOperation(GetAliasesRequest request, ClusterState state, ActionListener<GetAliasesResponse> listener) {
6467
String[] concreteIndices = indexNameExpressionResolver.concreteIndexNames(state, request);
6568
ImmutableOpenMap<String, List<AliasMetaData>> result = state.metaData().findAliases(request.aliases(), concreteIndices);
66-
listener.onResponse(new GetAliasesResponse(result));
69+
70+
// in case all aliases are requested then it is desired to return the concrete index with no aliases (#25114):
71+
ImmutableOpenMap.Builder<String, List<AliasMetaData>> mapBuilder = ImmutableOpenMap.builder(result);
72+
Iterable<String> intersection = HppcMaps.intersection(ObjectHashSet.from(concreteIndices), state.metaData().indices().keys());
73+
for (String index : intersection) {
74+
if (result.get(index) == null && request.isAliasesProvided() == false) {
75+
mapBuilder.put(index, Collections.emptyList());
76+
}
77+
}
78+
79+
listener.onResponse(new GetAliasesResponse(mapBuilder.build()));
6780
}
6881
}

server/src/main/java/org/elasticsearch/cluster/metadata/MetaData.java

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ public ImmutableOpenMap<String, List<AliasMetaData>> findAliases(final String[]
263263
return ImmutableOpenMap.of();
264264
}
265265

266-
boolean matchAllAliases = matchAllAliases(aliases);
266+
boolean matchAllAliases = Strings.isAllOrWildcard(aliases);
267267
ImmutableOpenMap.Builder<String, List<AliasMetaData>> mapBuilder = ImmutableOpenMap.builder();
268268
Iterable<String> intersection = HppcMaps.intersection(ObjectHashSet.from(concreteIndices), indices.keys());
269269
for (String index : intersection) {
@@ -276,24 +276,15 @@ public ImmutableOpenMap<String, List<AliasMetaData>> findAliases(final String[]
276276
}
277277
}
278278

279-
if (!filteredValues.isEmpty()) {
279+
if (filteredValues.isEmpty() == false) {
280280
// Make the list order deterministic
281281
CollectionUtil.timSort(filteredValues, Comparator.comparing(AliasMetaData::alias));
282+
mapBuilder.put(index, Collections.unmodifiableList(filteredValues));
282283
}
283-
mapBuilder.put(index, Collections.unmodifiableList(filteredValues));
284284
}
285285
return mapBuilder.build();
286286
}
287287

288-
private static boolean matchAllAliases(final String[] aliases) {
289-
for (String alias : aliases) {
290-
if (alias.equals(ALL)) {
291-
return true;
292-
}
293-
}
294-
return aliases.length == 0;
295-
}
296-
297288
/**
298289
* Checks if at least one of the specified aliases exists in the specified concrete indices. Wildcards are supported in the
299290
* alias names for partial matches.

server/src/test/java/org/elasticsearch/aliases/IndexAliasesIT.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -570,24 +570,20 @@ public void testIndicesGetAliases() throws Exception {
570570
logger.info("--> getting alias1");
571571
GetAliasesResponse getResponse = admin().indices().prepareGetAliases("alias1").get();
572572
assertThat(getResponse, notNullValue());
573-
assertThat(getResponse.getAliases().size(), equalTo(5));
573+
assertThat(getResponse.getAliases().size(), equalTo(1));
574574
assertThat(getResponse.getAliases().get("foobar").size(), equalTo(1));
575575
assertThat(getResponse.getAliases().get("foobar").get(0), notNullValue());
576576
assertThat(getResponse.getAliases().get("foobar").get(0).alias(), equalTo("alias1"));
577577
assertThat(getResponse.getAliases().get("foobar").get(0).getFilter(), nullValue());
578578
assertThat(getResponse.getAliases().get("foobar").get(0).getIndexRouting(), nullValue());
579579
assertThat(getResponse.getAliases().get("foobar").get(0).getSearchRouting(), nullValue());
580-
assertTrue(getResponse.getAliases().get("test").isEmpty());
581-
assertTrue(getResponse.getAliases().get("test123").isEmpty());
582-
assertTrue(getResponse.getAliases().get("foobarbaz").isEmpty());
583-
assertTrue(getResponse.getAliases().get("bazbar").isEmpty());
584580
AliasesExistResponse existsResponse = admin().indices().prepareAliasesExist("alias1").get();
585581
assertThat(existsResponse.exists(), equalTo(true));
586582

587583
logger.info("--> getting all aliases that start with alias*");
588584
getResponse = admin().indices().prepareGetAliases("alias*").get();
589585
assertThat(getResponse, notNullValue());
590-
assertThat(getResponse.getAliases().size(), equalTo(5));
586+
assertThat(getResponse.getAliases().size(), equalTo(1));
591587
assertThat(getResponse.getAliases().get("foobar").size(), equalTo(2));
592588
assertThat(getResponse.getAliases().get("foobar").get(0), notNullValue());
593589
assertThat(getResponse.getAliases().get("foobar").get(0).alias(), equalTo("alias1"));
@@ -599,10 +595,6 @@ public void testIndicesGetAliases() throws Exception {
599595
assertThat(getResponse.getAliases().get("foobar").get(1).getFilter(), nullValue());
600596
assertThat(getResponse.getAliases().get("foobar").get(1).getIndexRouting(), nullValue());
601597
assertThat(getResponse.getAliases().get("foobar").get(1).getSearchRouting(), nullValue());
602-
assertTrue(getResponse.getAliases().get("test").isEmpty());
603-
assertTrue(getResponse.getAliases().get("test123").isEmpty());
604-
assertTrue(getResponse.getAliases().get("foobarbaz").isEmpty());
605-
assertTrue(getResponse.getAliases().get("bazbar").isEmpty());
606598
existsResponse = admin().indices().prepareAliasesExist("alias*").get();
607599
assertThat(existsResponse.exists(), equalTo(true));
608600

@@ -687,13 +679,12 @@ public void testIndicesGetAliases() throws Exception {
687679
logger.info("--> getting f* for index *bar");
688680
getResponse = admin().indices().prepareGetAliases("f*").addIndices("*bar").get();
689681
assertThat(getResponse, notNullValue());
690-
assertThat(getResponse.getAliases().size(), equalTo(2));
682+
assertThat(getResponse.getAliases().size(), equalTo(1));
691683
assertThat(getResponse.getAliases().get("foobar").get(0), notNullValue());
692684
assertThat(getResponse.getAliases().get("foobar").get(0).alias(), equalTo("foo"));
693685
assertThat(getResponse.getAliases().get("foobar").get(0).getFilter(), nullValue());
694686
assertThat(getResponse.getAliases().get("foobar").get(0).getIndexRouting(), nullValue());
695687
assertThat(getResponse.getAliases().get("foobar").get(0).getSearchRouting(), nullValue());
696-
assertTrue(getResponse.getAliases().get("bazbar").isEmpty());
697688
existsResponse = admin().indices().prepareAliasesExist("f*")
698689
.addIndices("*bar").get();
699690
assertThat(existsResponse.exists(), equalTo(true));
@@ -702,14 +693,13 @@ public void testIndicesGetAliases() throws Exception {
702693
logger.info("--> getting f* for index *bac");
703694
getResponse = admin().indices().prepareGetAliases("foo").addIndices("*bac").get();
704695
assertThat(getResponse, notNullValue());
705-
assertThat(getResponse.getAliases().size(), equalTo(2));
696+
assertThat(getResponse.getAliases().size(), equalTo(1));
706697
assertThat(getResponse.getAliases().get("foobar").size(), equalTo(1));
707698
assertThat(getResponse.getAliases().get("foobar").get(0), notNullValue());
708699
assertThat(getResponse.getAliases().get("foobar").get(0).alias(), equalTo("foo"));
709700
assertThat(getResponse.getAliases().get("foobar").get(0).getFilter(), nullValue());
710701
assertThat(getResponse.getAliases().get("foobar").get(0).getIndexRouting(), nullValue());
711702
assertThat(getResponse.getAliases().get("foobar").get(0).getSearchRouting(), nullValue());
712-
assertTrue(getResponse.getAliases().get("bazbar").isEmpty());
713703
existsResponse = admin().indices().prepareAliasesExist("foo")
714704
.addIndices("*bac").get();
715705
assertThat(existsResponse.exists(), equalTo(true));
@@ -727,6 +717,19 @@ public void testIndicesGetAliases() throws Exception {
727717
.addIndices("foobar").get();
728718
assertThat(existsResponse.exists(), equalTo(true));
729719

720+
for (String aliasName : new String[]{null, "_all", "*"}) {
721+
logger.info("--> getting {} alias for index foobar", aliasName);
722+
getResponse = aliasName != null ? admin().indices().prepareGetAliases(aliasName).addIndices("foobar").get() :
723+
admin().indices().prepareGetAliases().addIndices("foobar").get();
724+
assertThat(getResponse, notNullValue());
725+
assertThat(getResponse.getAliases().size(), equalTo(1));
726+
assertThat(getResponse.getAliases().get("foobar").size(), equalTo(4));
727+
assertThat(getResponse.getAliases().get("foobar").get(0).alias(), equalTo("alias1"));
728+
assertThat(getResponse.getAliases().get("foobar").get(1).alias(), equalTo("alias2"));
729+
assertThat(getResponse.getAliases().get("foobar").get(2).alias(), equalTo("bac"));
730+
assertThat(getResponse.getAliases().get("foobar").get(3).alias(), equalTo("foo"));
731+
}
732+
730733
// alias at work again
731734
logger.info("--> getting * for index *bac");
732735
getResponse = admin().indices().prepareGetAliases("*").addIndices("*bac").get();

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/IndicesAndAliasesResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ ResolvedIndices resolveIndicesAndAliases(IndicesRequest indicesRequest, MetaData
200200
if (aliasesRequest.expandAliasesWildcards()) {
201201
List<String> aliases = replaceWildcardsWithAuthorizedAliases(aliasesRequest.aliases(),
202202
loadAuthorizedAliases(authorizedIndices.get(), metaData));
203-
aliasesRequest.aliases(aliases.toArray(new String[aliases.size()]));
203+
aliasesRequest.replaceAliases(aliases.toArray(new String[aliases.size()]));
204204
}
205205
if (indicesReplacedWithNoIndices) {
206206
if (indicesRequest instanceof GetAliasesRequest == false) {

0 commit comments

Comments
 (0)