Skip to content

Commit 10ffb93

Browse files
authored
Create data stream aliases from component templates (#75956)
1 parent 11a5676 commit 10ffb93

File tree

4 files changed

+94
-14
lines changed

4 files changed

+94
-14
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,9 @@ static ClusterState createDataStream(MetadataCreateIndexService metadataCreateIn
221221
Metadata.Builder builder = Metadata.builder(currentState.metadata()).put(newDataStream);
222222

223223
List<String> aliases = new ArrayList<>();
224-
if (template.template() != null && template.template().aliases() != null) {
225-
for (var alias : template.template().aliases().values()) {
224+
var resolvedAliases = MetadataIndexTemplateService.resolveAliases(currentState.metadata(), template);
225+
for (var resolvedAliasMap : resolvedAliases) {
226+
for (var alias : resolvedAliasMap.values()) {
226227
aliases.add(alias.getAlias());
227228
builder.put(alias.getAlias(), dataStreamName, alias.writeIndex(), alias.filter() == null ? null : alias.filter().string());
228229
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ private ClusterState applyCreateIndexRequestForSystemDataStream(final ClusterSta
577577

578578
return applyCreateIndexWithTemporaryService(currentState, request, silent, null, tmpImd, mappings,
579579
indexService -> resolveAndValidateAliases(request.index(), request.aliases(),
580-
MetadataIndexTemplateService.resolveAliases(template, componentTemplates, null), currentState.metadata(),
580+
MetadataIndexTemplateService.resolveAliases(template, componentTemplates), currentState.metadata(),
581581
// the context is only used for validation so it's fine to pass fake values for the
582582
// shard id and the current timestamp
583583
aliasValidator, xContentRegistry, indexService.newSearchExecutionContext(0, 0, null, () -> 0L, null, emptyMap()),

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,25 +1112,31 @@ public static List<Map<String, AliasMetadata>> resolveAliases(final List<IndexTe
11121112
}
11131113

11141114
/**
1115-
* Resolve the given v2 template into an ordered list of aliases
1115+
* Resolve the given v2 template name into an ordered list of aliases
11161116
*/
11171117
public static List<Map<String, AliasMetadata>> resolveAliases(final Metadata metadata, final String templateName) {
11181118
final ComposableIndexTemplate template = metadata.templatesV2().get(templateName);
11191119
assert template != null : "attempted to resolve aliases for a template [" + templateName +
11201120
"] that did not exist in the cluster state";
1121+
return resolveAliases(metadata, template);
1122+
}
1123+
1124+
/**
1125+
* Resolve the given v2 template into an ordered list of aliases
1126+
*/
1127+
static List<Map<String, AliasMetadata>> resolveAliases(final Metadata metadata, final ComposableIndexTemplate template) {
11211128
if (template == null) {
11221129
return List.of();
11231130
}
11241131
final Map<String, ComponentTemplate> componentTemplates = metadata.componentTemplates();
1125-
return resolveAliases(template, componentTemplates, templateName);
1132+
return resolveAliases(template, componentTemplates);
11261133
}
11271134

11281135
/**
11291136
* Resolve the given v2 template and component templates into an ordered list of aliases
11301137
*/
11311138
static List<Map<String, AliasMetadata>> resolveAliases(final ComposableIndexTemplate template,
1132-
final Map<String, ComponentTemplate> componentTemplates,
1133-
@Nullable String templateName) {
1139+
final Map<String, ComponentTemplate> componentTemplates) {
11341140
Objects.requireNonNull(template, "attempted to resolve aliases for a null template");
11351141
Objects.requireNonNull(componentTemplates, "attempted to resolve aliases with null component templates");
11361142
List<Map<String, AliasMetadata>> aliases = template.composedOf().stream()

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

Lines changed: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.elasticsearch.cluster.ClusterState;
1515
import org.elasticsearch.cluster.metadata.ComposableIndexTemplate.DataStreamTemplate;
1616
import org.elasticsearch.cluster.metadata.MetadataCreateDataStreamService.CreateDataStreamClusterStateUpdateRequest;
17+
import org.elasticsearch.common.Strings;
1718
import org.elasticsearch.common.settings.Settings;
1819
import org.elasticsearch.core.TimeValue;
1920
import org.elasticsearch.indices.ExecutorNames;
@@ -75,13 +76,8 @@ public void testCreateDataStreamWithAliasFromTemplate() throws Exception {
7576
final int aliasCount = randomIntBetween(0, 3);
7677
Map<String, AliasMetadata> aliases = new HashMap<>(aliasCount);
7778
for (int k = 0; k < aliasCount; k++) {
78-
final String aliasName = randomAlphaOfLength(6);
79-
var builder = AliasMetadata.newAliasMetadataBuilder(aliasName);
80-
if (randomBoolean()) {
81-
builder.filter(Map.of("term", Map.of("user", Map.of("value", randomAlphaOfLength(5)))));
82-
}
83-
builder.writeIndex(randomBoolean());
84-
aliases.put(aliasName, builder.build());
79+
final AliasMetadata am = randomAlias(null);
80+
aliases.put(am.alias(), am);
8581
}
8682
ComposableIndexTemplate template = new ComposableIndexTemplate.Builder()
8783
.indexPatterns(List.of(dataStreamName + "*"))
@@ -118,6 +114,83 @@ public void testCreateDataStreamWithAliasFromTemplate() throws Exception {
118114
assertThat(newState.metadata().index(DataStream.getDefaultBackingIndexName(dataStreamName, 1)).isSystem(), is(false));
119115
}
120116

117+
public void testCreateDataStreamWithAliasFromComponentTemplate() throws Exception {
118+
final MetadataCreateIndexService metadataCreateIndexService = getMetadataCreateIndexService();
119+
final String dataStreamName = "my-data-stream";
120+
final int componentTemplateCount = randomIntBetween(0, 3);
121+
final int aliasCount = randomIntBetween(0, 3);
122+
int totalAliasCount = aliasCount;
123+
Map<String, AliasMetadata> aliases = new HashMap<>();
124+
for (int k = 0; k < aliasCount; k++) {
125+
final AliasMetadata am = randomAlias(null);
126+
aliases.put(am.alias(), am);
127+
}
128+
129+
List<String> ctNames = new ArrayList<>();
130+
List<Map<String, AliasMetadata>> allAliases = new ArrayList<>();
131+
var metadataBuilder = Metadata.builder();
132+
final List<ComponentTemplate> componentTemplates = new ArrayList<>(componentTemplateCount);
133+
for (int k = 0; k < componentTemplateCount; k++) {
134+
final String ctName = randomAlphaOfLength(5);
135+
ctNames.add(ctName);
136+
final int ctAliasCount = randomIntBetween(0, 3);
137+
totalAliasCount += ctAliasCount;
138+
final var ctAliasMap = new HashMap<String, AliasMetadata>(ctAliasCount);
139+
allAliases.add(ctAliasMap);
140+
for (int m = 0; m < ctAliasCount; m++) {
141+
final AliasMetadata am = randomAlias(ctName);
142+
ctAliasMap.put(am.alias(), am);
143+
}
144+
metadataBuilder.put(ctName, new ComponentTemplate(new Template(null, null, ctAliasMap), null, null));
145+
}
146+
allAliases.add(aliases);
147+
148+
ComposableIndexTemplate template = new ComposableIndexTemplate.Builder()
149+
.indexPatterns(List.of(dataStreamName + "*"))
150+
.dataStreamTemplate(new DataStreamTemplate())
151+
.template(new Template(null, null, aliases))
152+
.componentTemplates(ctNames)
153+
.build();
154+
155+
ClusterState cs = ClusterState.builder(new ClusterName("_name"))
156+
.metadata(metadataBuilder.put("template", template).build())
157+
.build();
158+
CreateDataStreamClusterStateUpdateRequest req =
159+
new CreateDataStreamClusterStateUpdateRequest(dataStreamName, TimeValue.ZERO, TimeValue.ZERO);
160+
ClusterState newState = MetadataCreateDataStreamService.createDataStream(metadataCreateIndexService, cs, req);
161+
assertThat(newState.metadata().dataStreams().size(), equalTo(1));
162+
assertThat(newState.metadata().dataStreams().get(dataStreamName).getName(), equalTo(dataStreamName));
163+
assertThat(newState.metadata().dataStreams().get(dataStreamName).isSystem(), is(false));
164+
assertThat(newState.metadata().dataStreams().get(dataStreamName).isHidden(), is(false));
165+
assertThat(newState.metadata().dataStreams().get(dataStreamName).isReplicated(), is(false));
166+
assertThat(newState.metadata().dataStreamAliases().size(), is(totalAliasCount));
167+
for (var aliasMap : allAliases) {
168+
for (var alias : aliasMap.values()) {
169+
var actualAlias = newState.metadata().dataStreamAliases().get(alias.alias());
170+
assertThat(actualAlias, is(notNullValue()));
171+
assertThat(actualAlias.getName(), equalTo(alias.alias()));
172+
assertThat(actualAlias.getFilter(), equalTo(alias.filter()));
173+
assertThat(actualAlias.getWriteDataStream(), equalTo(alias.writeIndex() ? dataStreamName : null));
174+
}
175+
}
176+
177+
assertThat(newState.metadata().index(DataStream.getDefaultBackingIndexName(dataStreamName, 1)), notNullValue());
178+
assertThat(newState.metadata().index(DataStream.getDefaultBackingIndexName(dataStreamName, 1)).getAliases().size(), is(0));
179+
assertThat(newState.metadata().index(DataStream.getDefaultBackingIndexName(dataStreamName, 1)).getSettings().get("index.hidden"),
180+
equalTo("true"));
181+
assertThat(newState.metadata().index(DataStream.getDefaultBackingIndexName(dataStreamName, 1)).isSystem(), is(false));
182+
}
183+
184+
private static AliasMetadata randomAlias(String prefix) {
185+
final String aliasName = (Strings.isNullOrEmpty(prefix) ? "" : prefix + "-") + randomAlphaOfLength(6);
186+
var builder = AliasMetadata.newAliasMetadataBuilder(aliasName);
187+
if (randomBoolean()) {
188+
builder.filter(Map.of("term", Map.of("user", Map.of("value", randomAlphaOfLength(5)))));
189+
}
190+
builder.writeIndex(randomBoolean());
191+
return builder.build();
192+
}
193+
121194
public void testCreateSystemDataStream() throws Exception {
122195
final MetadataCreateIndexService metadataCreateIndexService = getMetadataCreateIndexService();
123196
final String dataStreamName = ".system-data-stream";

0 commit comments

Comments
 (0)