Skip to content

Commit 4031670

Browse files
Fix remove alias with must_exist
Remove alias now parses the must_exist flag and results in a 404 (not found), if the index does not have the alias. Closes elastic#62642 Relates elastic#58100 Co-Authored-By: Luca Cavanna <[email protected]>
1 parent 978fd51 commit 4031670

File tree

7 files changed

+109
-9
lines changed

7 files changed

+109
-9
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
---
2+
"Remove alias with must_exist":
3+
- do:
4+
indices.create:
5+
index: test_index
6+
7+
- do:
8+
indices.update_aliases:
9+
body:
10+
actions:
11+
- add:
12+
index: test_index
13+
aliases: test_alias1
14+
- do:
15+
indices.exists_alias:
16+
name: test_alias1
17+
- is_true: ''
18+
19+
- do:
20+
indices.update_aliases:
21+
body:
22+
actions:
23+
- remove:
24+
index: test_index
25+
alias: test_alias1
26+
must_exist: true
27+
- add:
28+
index: test_index
29+
alias: test_alias2
30+
- do:
31+
indices.exists_alias:
32+
name: test_alias1
33+
- is_false: ''
34+
- do:
35+
indices.exists_alias:
36+
name: test_alias2
37+
- is_true: ''
38+
39+
- do:
40+
catch: missing
41+
indices.update_aliases:
42+
body:
43+
actions:
44+
- remove:
45+
index: test_index
46+
alias: test_alias1
47+
must_exist: true
48+
- add:
49+
index: test_index
50+
alias: test_alias3
51+
- do:
52+
indices.exists_alias:
53+
name: test_alias3
54+
- is_false: ''
55+
56+
---
57+
"Alias must_exist only on remove":
58+
- do:
59+
indices.create:
60+
index: test_index
61+
62+
- do:
63+
catch: bad_request
64+
indices.update_aliases:
65+
body:
66+
actions:
67+
- add:
68+
index: test_index
69+
aliases: test_alias1
70+
must_exist: true
71+
72+
- do:
73+
catch: bad_request
74+
indices.update_aliases:
75+
body:
76+
actions:
77+
- remove_index:
78+
index: test_index
79+
must_exist: true

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ private static ObjectParser<AliasActions, Void> parser(String name, Supplier<Ali
177177
}
178178

179179
private static final ObjectParser<AliasActions, Void> ADD_PARSER = parser(ADD.getPreferredName(), AliasActions::add);
180+
private static final ObjectParser<AliasActions, Void> REMOVE_PARSER = parser(REMOVE.getPreferredName(), AliasActions::remove);
181+
private static final ObjectParser<AliasActions, Void> REMOVE_INDEX_PARSER = parser(REMOVE_INDEX.getPreferredName(),
182+
AliasActions::removeIndex);
180183
static {
181184
ADD_PARSER.declareObject(AliasActions::filter, (parser, m) -> {
182185
try {
@@ -191,11 +194,8 @@ private static ObjectParser<AliasActions, Void> parser(String name, Supplier<Ali
191194
ADD_PARSER.declareField(AliasActions::searchRouting, XContentParser::text, SEARCH_ROUTING, ValueType.INT);
192195
ADD_PARSER.declareField(AliasActions::writeIndex, XContentParser::booleanValue, IS_WRITE_INDEX, ValueType.BOOLEAN);
193196
ADD_PARSER.declareField(AliasActions::isHidden, XContentParser::booleanValue, IS_HIDDEN, ValueType.BOOLEAN);
194-
ADD_PARSER.declareField(AliasActions::mustExist, XContentParser::booleanValue, MUST_EXIST, ValueType.BOOLEAN);
197+
REMOVE_PARSER.declareField(AliasActions::mustExist, XContentParser::booleanValue, MUST_EXIST, ValueType.BOOLEAN);
195198
}
196-
private static final ObjectParser<AliasActions, Void> REMOVE_PARSER = parser(REMOVE.getPreferredName(), AliasActions::remove);
197-
private static final ObjectParser<AliasActions, Void> REMOVE_INDEX_PARSER = parser(REMOVE_INDEX.getPreferredName(),
198-
AliasActions::removeIndex);
199199

200200
/**
201201
* Parser for any one {@link AliasAction}.
@@ -524,6 +524,9 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
524524
if (null != isHidden) {
525525
builder.field(IS_HIDDEN.getPreferredName(), isHidden);
526526
}
527+
if (null != mustExist) {
528+
builder.field(MUST_EXIST.getPreferredName(), mustExist);
529+
}
527530
builder.endObject();
528531
builder.endObject();
529532
return builder;
@@ -544,6 +547,7 @@ public String toString() {
544547
+ ",indexRouting=" + indexRouting
545548
+ ",searchRouting=" + searchRouting
546549
+ ",writeIndex=" + writeIndex
550+
+ ",mustExist=" + mustExist
547551
+ "]";
548552
}
549553

@@ -562,12 +566,13 @@ public boolean equals(Object obj) {
562566
&& Objects.equals(indexRouting, other.indexRouting)
563567
&& Objects.equals(searchRouting, other.searchRouting)
564568
&& Objects.equals(writeIndex, other.writeIndex)
565-
&& Objects.equals(isHidden, other.isHidden);
569+
&& Objects.equals(isHidden, other.isHidden)
570+
&& Objects.equals(mustExist, other.mustExist);
566571
}
567572

568573
@Override
569574
public int hashCode() {
570-
return Objects.hash(type, indices, aliases, filter, routing, indexRouting, searchRouting, writeIndex, isHidden);
575+
return Objects.hash(type, indices, aliases, filter, routing, indexRouting, searchRouting, writeIndex, isHidden, mustExist);
571576
}
572577
}
573578

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ private static String[] concreteAliases(AliasActions action, Metadata metadata,
171171
finalAliases.add(aliasMeta.alias());
172172
}
173173
}
174+
if (finalAliases.isEmpty() && action.mustExist() != null && action.mustExist()) {
175+
return action.aliases();
176+
}
174177
return finalAliases.toArray(new String[finalAliases.size()]);
175178
} else {
176179
//for ADD and REMOVE_INDEX we just return the current aliases

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.cluster.metadata;
2121

22+
import org.elasticsearch.ResourceNotFoundException;
2223
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
2324
import org.elasticsearch.common.Nullable;
2425
import org.elasticsearch.common.Strings;
@@ -179,8 +180,8 @@ boolean removeIndex() {
179180
@Override
180181
boolean apply(NewAliasValidator aliasValidator, Metadata.Builder metadata, IndexMetadata index) {
181182
if (false == index.getAliases().containsKey(alias)) {
182-
if (mustExist != null && mustExist.booleanValue()) {
183-
throw new IllegalArgumentException("required alias [" + alias + "] does not exist");
183+
if (mustExist != null && mustExist) {
184+
throw new ResourceNotFoundException("required alias [" + alias + "] does not exist");
184185
}
185186
return false;
186187
}

server/src/test/java/org/elasticsearch/action/admin/indices/alias/AliasActionsTests.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ public void testParseAddDefaultRouting() throws IOException {
216216
public void testParseRemove() throws IOException {
217217
String[] indices = generateRandomStringArray(10, 5, false, false);
218218
String[] aliases = generateRandomStringArray(10, 5, false, false);
219+
Boolean mustExist = null;
219220
XContentBuilder b = XContentBuilder.builder(randomFrom(XContentType.values()).xContent());
220221
b.startObject();
221222
{
@@ -231,6 +232,10 @@ public void testParseRemove() throws IOException {
231232
} else {
232233
b.field("alias", aliases[0]);
233234
}
235+
if (randomBoolean()) {
236+
mustExist = randomBoolean();
237+
b.field("must_exist", mustExist);
238+
}
234239
}
235240
b.endObject();
236241
}
@@ -241,6 +246,7 @@ public void testParseRemove() throws IOException {
241246
assertEquals(AliasActions.Type.REMOVE, action.actionType());
242247
assertThat(action.indices(), equalTo(indices));
243248
assertThat(action.aliases(), equalTo(aliases));
249+
assertThat(action.mustExist(), equalTo(mustExist));
244250
}
245251
}
246252

server/src/test/java/org/elasticsearch/cluster/metadata/MetadataIndexAliasesServiceTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.cluster.metadata;
2121

22+
import org.elasticsearch.ResourceNotFoundException;
2223
import org.elasticsearch.Version;
2324
import org.elasticsearch.cluster.ClusterName;
2425
import org.elasticsearch.cluster.ClusterState;
@@ -138,7 +139,7 @@ public void testMustExist() {
138139

139140
// Show that removing non-existing alias with mustExist == true fails
140141
final ClusterState finalCS = after;
141-
final IllegalArgumentException iae = expectThrows(IllegalArgumentException.class,
142+
final ResourceNotFoundException iae = expectThrows(ResourceNotFoundException.class,
142143
() -> service.applyAliasActions(finalCS, singletonList(new AliasAction.Remove(index, "test_2", true))));
143144
assertThat(iae.getMessage(), containsString("required alias [test_2] does not exist"));
144145
}

test/framework/src/main/java/org/elasticsearch/index/alias/RandomAliasActionsGenerator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ public static AliasActions randomAliasAction(boolean useStringAsFilter) {
5454
}
5555
action.indices(indices);
5656
}
57+
if (action.actionType() == AliasActions.Type.REMOVE) {
58+
if (randomBoolean()) {
59+
action.mustExist(randomBoolean());
60+
}
61+
}
5762
if (action.actionType() != AliasActions.Type.REMOVE_INDEX) {
5863
if (randomBoolean()) {
5964
action.alias(randomAlphaOfLength(5));

0 commit comments

Comments
 (0)