Skip to content

Commit

Permalink
Implement hidden aliases (elastic#52547)
Browse files Browse the repository at this point in the history
This commit introduces hidden aliases. These are similar to hidden
indices, in that they are not visible by default, unless explicitly
specified by name or by indicating that hidden indices/aliases are
desired.

The new alias property, `is_hidden` is implemented similarly to
`is_write_index`, except that it must be consistent across all indices
with a given alias - that is, all indices with a given alias must
specify the alias as either hidden, or all specify it as non-hidden,
either explicitly or by omitting the `is_hidden` property.
  • Loading branch information
gwbrown committed Mar 4, 2020
1 parent 302980e commit 0dbfa25
Show file tree
Hide file tree
Showing 21 changed files with 839 additions and 58 deletions.
7 changes: 7 additions & 0 deletions docs/reference/indices/aliases.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,13 @@ include::{docdir}/rest-api/common-parms.asciidoc[tag=index-alias-filter]
+
See <<filtered>> for an example.

`is_hidden`::
(Optional, boolean)
If `true`, the alias will be excluded from wildcard expressions by default,
unless overriden in the request using the `expand_wildcards` parameter,
similar to <<index-hidden,hidden indices>>. This property must be set to the
same value on all indices that share an alias. Defaults to `false`.

`is_write_index`::
(Optional, boolean)
If `true`, assigns the index as an alias's write index.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ public class Alias implements Writeable, ToXContentFragment {
private static final ParseField INDEX_ROUTING = new ParseField("index_routing", "indexRouting", "index-routing");
private static final ParseField SEARCH_ROUTING = new ParseField("search_routing", "searchRouting", "search-routing");
private static final ParseField IS_WRITE_INDEX = new ParseField("is_write_index");
private static final ParseField IS_HIDDEN = new ParseField("is_hidden");

private String name;

Expand All @@ -65,6 +66,9 @@ public class Alias implements Writeable, ToXContentFragment {
@Nullable
private Boolean writeIndex;

@Nullable
private Boolean isHidden;

public Alias(StreamInput in) throws IOException {
name = in.readString();
filter = in.readOptionalString();
Expand All @@ -75,6 +79,10 @@ public Alias(StreamInput in) throws IOException {
} else {
writeIndex = null;
}
writeIndex = in.readOptionalBoolean();
if (in.getVersion().onOrAfter(Version.V_7_7_0)) {
isHidden = in.readOptionalBoolean();
}
}

public Alias(String name) {
Expand Down Expand Up @@ -194,6 +202,21 @@ public Alias writeIndex(@Nullable Boolean writeIndex) {
return this;
}

/**
* @return whether this alias is hidden or not
*/
public Boolean isHidden() {
return isHidden;
}

/**
* Sets whether this alias is hidden
*/
public Alias isHidden(@Nullable Boolean isHidden) {
this.isHidden = isHidden;
return this;
}

@Override
public void writeTo(StreamOutput out) throws IOException {
out.writeString(name);
Expand All @@ -203,6 +226,10 @@ public void writeTo(StreamOutput out) throws IOException {
if (out.getVersion().onOrAfter(Version.V_6_4_0)) {
out.writeOptionalBoolean(writeIndex);
}
out.writeOptionalBoolean(writeIndex);
if (out.getVersion().onOrAfter(Version.V_7_7_0)) {
out.writeOptionalBoolean(isHidden);
}
}

/**
Expand Down Expand Up @@ -235,6 +262,8 @@ public static Alias fromXContent(XContentParser parser) throws IOException {
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
if (IS_WRITE_INDEX.match(currentFieldName, parser.getDeprecationHandler())) {
alias.writeIndex(parser.booleanValue());
} else if (IS_HIDDEN.match(currentFieldName, parser.getDeprecationHandler())) {
alias.isHidden(parser.booleanValue());
}
}
}
Expand Down Expand Up @@ -264,6 +293,10 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws

builder.field(IS_WRITE_INDEX.getPreferredName(), writeIndex);

if (isHidden != null) {
builder.field(IS_HIDDEN.getPreferredName(), isHidden);
}

builder.endObject();
return builder;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ public static class AliasActions implements AliasesRequest, Writeable, ToXConten
private static final ParseField INDEX_ROUTING = new ParseField("index_routing", "indexRouting", "index-routing");
private static final ParseField SEARCH_ROUTING = new ParseField("search_routing", "searchRouting", "search-routing");
private static final ParseField IS_WRITE_INDEX = new ParseField("is_write_index");
private static final ParseField IS_HIDDEN = new ParseField("is_hidden");

private static final ParseField ADD = new ParseField("add");
private static final ParseField REMOVE = new ParseField("remove");
Expand Down Expand Up @@ -193,6 +194,7 @@ private static ObjectParser<AliasActions, Void> parser(String name, Supplier<Ali
ADD_PARSER.declareField(AliasActions::indexRouting, XContentParser::text, INDEX_ROUTING, ValueType.INT);
ADD_PARSER.declareField(AliasActions::searchRouting, XContentParser::text, SEARCH_ROUTING, ValueType.INT);
ADD_PARSER.declareField(AliasActions::writeIndex, XContentParser::booleanValue, IS_WRITE_INDEX, ValueType.BOOLEAN);
ADD_PARSER.declareField(AliasActions::isHidden, XContentParser::booleanValue, IS_HIDDEN, ValueType.BOOLEAN);
}
private static final ObjectParser<AliasActions, Void> REMOVE_PARSER = parser(REMOVE.getPreferredName(), AliasActions::remove);
private static final ObjectParser<AliasActions, Void> REMOVE_INDEX_PARSER = parser(REMOVE_INDEX.getPreferredName(),
Expand Down Expand Up @@ -231,6 +233,7 @@ private static ObjectParser<AliasActions, Void> parser(String name, Supplier<Ali
private String indexRouting;
private String searchRouting;
private Boolean writeIndex;
private Boolean isHidden;

public AliasActions(AliasActions.Type type) {
this.type = type;
Expand All @@ -250,9 +253,13 @@ public AliasActions(StreamInput in) throws IOException {
if (in.getVersion().onOrAfter(Version.V_6_4_0)) {
writeIndex = in.readOptionalBoolean();
}
if (in.getVersion().onOrAfter(Version.V_7_7_0)) { //TODO fix for backport of https://github.com/elastic/elasticsearch/pull/52547
isHidden = in.readOptionalBoolean();
}
if (in.getVersion().onOrAfter(Version.V_7_0_0)) {
originalAliases = in.readStringArray();
}

}

@Override
Expand All @@ -267,6 +274,9 @@ public void writeTo(StreamOutput out) throws IOException {
if (out.getVersion().onOrAfter(Version.V_6_4_0)) {
out.writeOptionalBoolean(writeIndex);
}
if (out.getVersion().onOrAfter(Version.V_7_7_0)) { //TODO fix for backport https://github.com/elastic/elasticsearch/pull/52547
out.writeOptionalBoolean(isHidden);
}
if (out.getVersion().onOrAfter(Version.V_7_0_0)) {
out.writeStringArray(originalAliases);
}
Expand Down Expand Up @@ -442,6 +452,18 @@ public Boolean writeIndex() {
return writeIndex;
}

public AliasActions isHidden(Boolean isHidden) {
if (type != AliasActions.Type.ADD) {
throw new IllegalArgumentException("[" + IS_HIDDEN.getPreferredName() + "] is unsupported for [" + type + "]");
}
this.isHidden = isHidden;
return this;
}

public Boolean isHidden() {
return isHidden;
}

@Override
public String[] aliases() {
return aliases;
Expand Down Expand Up @@ -500,6 +522,9 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
if (null != writeIndex) {
builder.field(IS_WRITE_INDEX.getPreferredName(), writeIndex);
}
if (null != isHidden) {
builder.field(IS_HIDDEN.getPreferredName(), isHidden);
}
builder.endObject();
builder.endObject();
return builder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ protected void masterOperation(final IndicesAliasesRequest request, final Cluste
case ADD:
for (String alias : concreteAliases(action, state.metaData(), index.getName())) {
finalActions.add(new AliasAction.Add(index.getName(), alias, action.filter(), action.indexRouting(),
action.searchRouting(), action.writeIndex()));
action.searchRouting(), action.writeIndex(), action.isHidden()));
}
break;
case REMOVE:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,11 +214,11 @@ static List<AliasAction> rolloverAliasToNewIndex(String oldIndex, String newInde
boolean explicitWriteIndex) {
if (explicitWriteIndex) {
return unmodifiableList(Arrays.asList(
new AliasAction.Add(newIndex, request.getAlias(), null, null, null, true),
new AliasAction.Add(oldIndex, request.getAlias(), null, null, null, false)));
new AliasAction.Add(newIndex, request.getAlias(), null, null, null, true, null),
new AliasAction.Add(oldIndex, request.getAlias(), null, null, null, false, null)));
} else {
return unmodifiableList(Arrays.asList(
new AliasAction.Add(newIndex, request.getAlias(), null, null, null, null),
new AliasAction.Add(newIndex, request.getAlias(), null, null, null, null, null),
new AliasAction.Remove(oldIndex, request.getAlias())));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,13 @@ public static class Add extends AliasAction {
@Nullable
private final Boolean writeIndex;

@Nullable final Boolean isHidden;

/**
* Build the operation.
*/
public Add(String index, String alias, @Nullable String filter, @Nullable String indexRouting,
@Nullable String searchRouting, @Nullable Boolean writeIndex) {
public Add(String index, String alias, @Nullable String filter, @Nullable String indexRouting, @Nullable String searchRouting,
@Nullable Boolean writeIndex, @Nullable Boolean isHidden) {
super(index);
if (false == Strings.hasText(alias)) {
throw new IllegalArgumentException("[alias] is required");
Expand All @@ -99,6 +101,7 @@ public Add(String index, String alias, @Nullable String filter, @Nullable String
this.indexRouting = indexRouting;
this.searchRouting = searchRouting;
this.writeIndex = writeIndex;
this.isHidden = isHidden;
}

/**
Expand All @@ -112,6 +115,11 @@ public Boolean writeIndex() {
return writeIndex;
}

@Nullable
public Boolean isHidden() {
return isHidden;
}

@Override
boolean removeIndex() {
return false;
Expand All @@ -122,7 +130,7 @@ boolean apply(NewAliasValidator aliasValidator, MetaData.Builder metadata, Index
aliasValidator.validate(alias, indexRouting, filter, writeIndex);

AliasMetaData newAliasMd = AliasMetaData.newAliasMetaDataBuilder(alias).filter(filter).indexRouting(indexRouting)
.searchRouting(searchRouting).writeIndex(writeIndex).build();
.searchRouting(searchRouting).writeIndex(writeIndex).isHidden(isHidden).build();

// Check if this alias already exists
AliasMetaData currentAliasMd = index.getAliases().get(alias);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

import static java.util.Collections.emptySet;
Expand All @@ -60,7 +61,11 @@ public class AliasMetaData extends AbstractDiffable<AliasMetaData> implements To
@Nullable
private final Boolean writeIndex;

private AliasMetaData(String alias, CompressedXContent filter, String indexRouting, String searchRouting, Boolean writeIndex) {
@Nullable
private final Boolean isHidden;

private AliasMetaData(String alias, CompressedXContent filter, String indexRouting, String searchRouting, Boolean writeIndex,
@Nullable Boolean isHidden) {
this.alias = alias;
this.filter = filter;
this.indexRouting = indexRouting;
Expand All @@ -71,10 +76,12 @@ private AliasMetaData(String alias, CompressedXContent filter, String indexRouti
searchRoutingValues = emptySet();
}
this.writeIndex = writeIndex;
this.isHidden = isHidden;
}

private AliasMetaData(AliasMetaData aliasMetaData, String alias) {
this(alias, aliasMetaData.filter(), aliasMetaData.indexRouting(), aliasMetaData.searchRouting(), aliasMetaData.writeIndex());
this(alias, aliasMetaData.filter(), aliasMetaData.indexRouting(), aliasMetaData.searchRouting(), aliasMetaData.writeIndex(),
aliasMetaData.isHidden);
}

public String alias() {
Expand Down Expand Up @@ -121,6 +128,11 @@ public Boolean writeIndex() {
return writeIndex;
}

@Nullable
public Boolean isHidden() {
return isHidden;
}

public static Builder builder(String alias) {
return new Builder(alias);
}
Expand All @@ -143,11 +155,12 @@ public boolean equals(Object o) {

final AliasMetaData that = (AliasMetaData) o;

if (alias != null ? !alias.equals(that.alias) : that.alias != null) return false;
if (filter != null ? !filter.equals(that.filter) : that.filter != null) return false;
if (indexRouting != null ? !indexRouting.equals(that.indexRouting) : that.indexRouting != null) return false;
if (searchRouting != null ? !searchRouting.equals(that.searchRouting) : that.searchRouting != null) return false;
if (writeIndex != null ? writeIndex != that.writeIndex : that.writeIndex != null) return false;
if (Objects.equals(alias, that.alias) == false) return false;
if (Objects.equals(filter, that.filter) == false) return false;
if (Objects.equals(indexRouting, that.indexRouting) == false) return false;
if (Objects.equals(searchRouting, that.searchRouting) == false) return false;
if (Objects.equals(writeIndex, that.writeIndex) == false) return false;
if (Objects.equals(isHidden, that.isHidden) == false) return false;

return true;
}
Expand Down Expand Up @@ -187,6 +200,10 @@ public void writeTo(StreamOutput out) throws IOException {
if (out.getVersion().onOrAfter(Version.V_6_4_0)) {
out.writeOptionalBoolean(writeIndex());
}

if (out.getVersion().onOrAfter(Version.V_7_7_0)) {
out.writeOptionalBoolean(isHidden);
}
}

public AliasMetaData(StreamInput in) throws IOException {
Expand All @@ -213,6 +230,12 @@ public AliasMetaData(StreamInput in) throws IOException {
} else {
writeIndex = null;
}

if (in.getVersion().onOrAfter(Version.V_7_7_0)) {
isHidden = in.readOptionalBoolean();
} else {
isHidden = null;
}
}

public static Diff<AliasMetaData> readDiffFrom(StreamInput in) throws IOException {
Expand Down Expand Up @@ -243,6 +266,8 @@ public static class Builder {
@Nullable
private Boolean writeIndex;

@Nullable
private Boolean isHidden;

public Builder(String alias) {
this.alias = alias;
Expand Down Expand Up @@ -300,8 +325,13 @@ public Builder writeIndex(@Nullable Boolean writeIndex) {
return this;
}

public Builder isHidden(@Nullable Boolean isHidden) {
this.isHidden = isHidden;
return this;
}

public AliasMetaData build() {
return new AliasMetaData(alias, filter, indexRouting, searchRouting, writeIndex);
return new AliasMetaData(alias, filter, indexRouting, searchRouting, writeIndex, isHidden);
}

public static void toXContent(AliasMetaData aliasMetaData, XContentBuilder builder, ToXContent.Params params) throws IOException {
Expand All @@ -327,6 +357,10 @@ public static void toXContent(AliasMetaData aliasMetaData, XContentBuilder build
builder.field("is_write_index", aliasMetaData.writeIndex());
}

if (aliasMetaData.isHidden != null) {
builder.field("is_hidden", aliasMetaData.isHidden());
}

builder.endObject();
}

Expand Down Expand Up @@ -366,6 +400,8 @@ public static AliasMetaData fromXContent(XContentParser parser) throws IOExcepti
} else if (token == XContentParser.Token.VALUE_BOOLEAN) {
if ("is_write_index".equals(currentFieldName)) {
builder.writeIndex(parser.booleanValue());
} else if ("is_hidden".equals(currentFieldName)) {
builder.isHidden(parser.booleanValue());
}
}
}
Expand Down
Loading

0 comments on commit 0dbfa25

Please sign in to comment.