IndexNameExpressionResolver::dataStreamNames should support exclusions
This commit is contained in:
parent
9268b25789
commit
90c8d3fc9d
|
@ -58,14 +58,12 @@ import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
import java.util.stream.StreamSupport;
|
import java.util.stream.StreamSupport;
|
||||||
|
|
||||||
import static java.util.Collections.unmodifiableList;
|
|
||||||
|
|
||||||
public class IndexNameExpressionResolver {
|
public class IndexNameExpressionResolver {
|
||||||
|
|
||||||
private final DateMathExpressionResolver dateMathExpressionResolver = new DateMathExpressionResolver();
|
private final DateMathExpressionResolver dateMathExpressionResolver = new DateMathExpressionResolver();
|
||||||
private final List<ExpressionResolver> expressionResolvers = unmodifiableList(Arrays.asList(
|
private final WildcardExpressionResolver wildcardExpressionResolver = new WildcardExpressionResolver();
|
||||||
dateMathExpressionResolver,
|
private final List<ExpressionResolver> expressionResolvers =
|
||||||
new WildcardExpressionResolver()));
|
org.elasticsearch.common.collect.List.of(dateMathExpressionResolver, wildcardExpressionResolver);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Same as {@link #concreteIndexNames(ClusterState, IndicesOptions, String...)}, but the index expressions and options
|
* Same as {@link #concreteIndexNames(ClusterState, IndicesOptions, String...)}, but the index expressions and options
|
||||||
|
@ -114,10 +112,16 @@ public class IndexNameExpressionResolver {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> dataStreamNames(ClusterState state, IndicesOptions options, String... indexExpressions) {
|
public List<String> dataStreamNames(ClusterState state, IndicesOptions options, String... indexExpressions) {
|
||||||
Context context = new Context(state, options, false, false, true);
|
Context context = new Context(state, options, false, false, true, true);
|
||||||
return Arrays.stream(indexExpressions)
|
if (indexExpressions == null || indexExpressions.length == 0) {
|
||||||
.flatMap(expression -> WildcardExpressionResolver.matches(context, state.metadata(), expression).values().stream())
|
indexExpressions = new String[]{"*"};
|
||||||
.filter(i -> i.getType() == IndexAbstraction.Type.DATA_STREAM)
|
}
|
||||||
|
|
||||||
|
List<String> dataStreams = wildcardExpressionResolver.resolve(context, Arrays.asList(indexExpressions));
|
||||||
|
return ((dataStreams == null) ? org.elasticsearch.common.collect.List.<String>of() : dataStreams).stream()
|
||||||
|
.map(x -> state.metadata().getIndicesLookup().get(x))
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.filter(ia -> ia.getType() == IndexAbstraction.Type.DATA_STREAM)
|
||||||
.map(IndexAbstraction::getName)
|
.map(IndexAbstraction::getName)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
@ -157,7 +161,7 @@ public class IndexNameExpressionResolver {
|
||||||
* indices options in the context don't allow such a case.
|
* indices options in the context don't allow such a case.
|
||||||
*/
|
*/
|
||||||
public Index[] concreteIndices(ClusterState state, IndicesRequest request, long startTime) {
|
public Index[] concreteIndices(ClusterState state, IndicesRequest request, long startTime) {
|
||||||
Context context = new Context(state, request.indicesOptions(), startTime, false, false, request.includeDataStreams());
|
Context context = new Context(state, request.indicesOptions(), startTime, false, false, request.includeDataStreams(), false);
|
||||||
return concreteIndices(context, request.indices());
|
return concreteIndices(context, request.indices());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -647,6 +651,7 @@ public class IndexNameExpressionResolver {
|
||||||
private final boolean preserveAliases;
|
private final boolean preserveAliases;
|
||||||
private final boolean resolveToWriteIndex;
|
private final boolean resolveToWriteIndex;
|
||||||
private final boolean includeDataStreams;
|
private final boolean includeDataStreams;
|
||||||
|
private final boolean preserveDataStreams;
|
||||||
|
|
||||||
Context(ClusterState state, IndicesOptions options) {
|
Context(ClusterState state, IndicesOptions options) {
|
||||||
this(state, options, System.currentTimeMillis());
|
this(state, options, System.currentTimeMillis());
|
||||||
|
@ -654,21 +659,27 @@ public class IndexNameExpressionResolver {
|
||||||
|
|
||||||
Context(ClusterState state, IndicesOptions options, boolean preserveAliases, boolean resolveToWriteIndex,
|
Context(ClusterState state, IndicesOptions options, boolean preserveAliases, boolean resolveToWriteIndex,
|
||||||
boolean includeDataStreams) {
|
boolean includeDataStreams) {
|
||||||
this(state, options, System.currentTimeMillis(), preserveAliases, resolveToWriteIndex, includeDataStreams);
|
this(state, options, System.currentTimeMillis(), preserveAliases, resolveToWriteIndex, includeDataStreams, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Context(ClusterState state, IndicesOptions options, boolean preserveAliases, boolean resolveToWriteIndex,
|
||||||
|
boolean includeDataStreams, boolean preserveDataStreams) {
|
||||||
|
this(state, options, System.currentTimeMillis(), preserveAliases, resolveToWriteIndex, includeDataStreams, preserveDataStreams);
|
||||||
}
|
}
|
||||||
|
|
||||||
Context(ClusterState state, IndicesOptions options, long startTime) {
|
Context(ClusterState state, IndicesOptions options, long startTime) {
|
||||||
this(state, options, startTime, false, false, false);
|
this(state, options, startTime, false, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Context(ClusterState state, IndicesOptions options, long startTime,
|
protected Context(ClusterState state, IndicesOptions options, long startTime, boolean preserveAliases, boolean resolveToWriteIndex,
|
||||||
boolean preserveAliases, boolean resolveToWriteIndex, boolean includeDataStreams) {
|
boolean includeDataStreams, boolean preserveDataStreams) {
|
||||||
this.state = state;
|
this.state = state;
|
||||||
this.options = options;
|
this.options = options;
|
||||||
this.startTime = startTime;
|
this.startTime = startTime;
|
||||||
this.preserveAliases = preserveAliases;
|
this.preserveAliases = preserveAliases;
|
||||||
this.resolveToWriteIndex = resolveToWriteIndex;
|
this.resolveToWriteIndex = resolveToWriteIndex;
|
||||||
this.includeDataStreams = includeDataStreams;
|
this.includeDataStreams = includeDataStreams;
|
||||||
|
this.preserveDataStreams = preserveDataStreams;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ClusterState getState() {
|
public ClusterState getState() {
|
||||||
|
@ -703,6 +714,10 @@ public class IndexNameExpressionResolver {
|
||||||
public boolean includeDataStreams() {
|
public boolean includeDataStreams() {
|
||||||
return includeDataStreams;
|
return includeDataStreams;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isPreserveDataStreams() {
|
||||||
|
return preserveDataStreams;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private interface ExpressionResolver {
|
private interface ExpressionResolver {
|
||||||
|
@ -942,7 +957,9 @@ public class IndexNameExpressionResolver {
|
||||||
expand.add(meta.getIndex().getName());
|
expand.add(meta.getIndex().getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (context.isPreserveDataStreams() && indexAbstraction.getType() == IndexAbstraction.Type.DATA_STREAM) {
|
||||||
|
expand.add(indexAbstraction.getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1960,14 +1960,14 @@ public class IndexNameExpressionResolverTests extends ESTestCase {
|
||||||
Arrays.sort(result, Comparator.comparing(Index::getName));
|
Arrays.sort(result, Comparator.comparing(Index::getName));
|
||||||
assertThat(result.length, equalTo(2));
|
assertThat(result.length, equalTo(2));
|
||||||
assertThat(result[0].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream1, 2)));
|
assertThat(result[0].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream1, 2)));
|
||||||
assertThat(result[1].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream2, 2)));;
|
assertThat(result[1].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream2, 2)));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
Index[] result = indexNameExpressionResolver.concreteIndices(state, indicesOptions, true, "*");
|
Index[] result = indexNameExpressionResolver.concreteIndices(state, indicesOptions, true, "*");
|
||||||
Arrays.sort(result, Comparator.comparing(Index::getName));
|
Arrays.sort(result, Comparator.comparing(Index::getName));
|
||||||
assertThat(result.length, equalTo(2));
|
assertThat(result.length, equalTo(2));
|
||||||
assertThat(result[0].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream1, 2)));
|
assertThat(result[0].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream1, 2)));
|
||||||
assertThat(result[1].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream2, 2)));;
|
assertThat(result[1].getName(), equalTo(DataStream.getDefaultBackingIndexName(dataStream2, 2)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2027,6 +2027,9 @@ public class IndexNameExpressionResolverTests extends ESTestCase {
|
||||||
List<String> names = indexNameExpressionResolver.dataStreamNames(state, IndicesOptions.lenientExpand(), "log*");
|
List<String> names = indexNameExpressionResolver.dataStreamNames(state, IndicesOptions.lenientExpand(), "log*");
|
||||||
assertEquals(Collections.singletonList(dataStream1), names);
|
assertEquals(Collections.singletonList(dataStream1), names);
|
||||||
|
|
||||||
|
names = indexNameExpressionResolver.dataStreamNames(state, IndicesOptions.lenientExpand(), dataStream1);
|
||||||
|
assertEquals(Collections.singletonList(dataStream1), names);
|
||||||
|
|
||||||
names = indexNameExpressionResolver.dataStreamNames(state, IndicesOptions.lenientExpand(), "other*");
|
names = indexNameExpressionResolver.dataStreamNames(state, IndicesOptions.lenientExpand(), "other*");
|
||||||
assertEquals(Collections.singletonList(dataStream2), names);
|
assertEquals(Collections.singletonList(dataStream2), names);
|
||||||
|
|
||||||
|
@ -2038,5 +2041,11 @@ public class IndexNameExpressionResolverTests extends ESTestCase {
|
||||||
|
|
||||||
names = indexNameExpressionResolver.dataStreamNames(state, IndicesOptions.lenientExpand(), index3.getIndex().getName());
|
names = indexNameExpressionResolver.dataStreamNames(state, IndicesOptions.lenientExpand(), index3.getIndex().getName());
|
||||||
assertThat(names, empty());
|
assertThat(names, empty());
|
||||||
|
|
||||||
|
names = indexNameExpressionResolver.dataStreamNames(state, IndicesOptions.lenientExpand(), "*", "-logs-foobar");
|
||||||
|
assertThat(names, containsInAnyOrder(dataStream2));
|
||||||
|
|
||||||
|
names = indexNameExpressionResolver.dataStreamNames(state, IndicesOptions.lenientExpand(), "*", "-*");
|
||||||
|
assertThat(names, empty());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -132,7 +132,7 @@ public class GenerateSnapshotNameStep extends ClusterStateActionStep {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResolverContext(long startTime) {
|
public ResolverContext(long startTime) {
|
||||||
super(null, null, startTime, false, false, false);
|
super(null, null, startTime, false, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue