-
Notifications
You must be signed in to change notification settings - Fork 25.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Create data stream aliases from template #73867
Changes from 26 commits
52c9402
ebdbce5
cc8c7c4
5d21f2f
738b9e6
b0848d6
36847c8
0aebdb4
49968e4
001b0d5
39973f6
991a36b
e12bd60
1399903
59e57af
0f5c6a9
43e1d5f
45cc1f5
86dc1f3
f75425b
4edd676
3b70768
f3a97c8
77e2a32
8d1e1e7
33f2359
833677a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -504,7 +504,8 @@ private ClusterState applyCreateIndexRequestWithV2Template(final ClusterState cu | |
logger.debug("applying create index request using composable template [{}]", templateName); | ||
|
||
ComposableIndexTemplate template = currentState.getMetadata().templatesV2().get(templateName); | ||
if (request.dataStreamName() == null && template.getDataStreamTemplate() != null) { | ||
final boolean isDataStream = template.getDataStreamTemplate() != null; | ||
if (isDataStream && request.dataStreamName() == null) { | ||
throw new IllegalArgumentException("cannot create index with name [" + request.index() + | ||
"], because it matches with template [" + templateName + "] that creates data streams only, " + | ||
"use create data stream api instead"); | ||
|
@@ -519,14 +520,28 @@ private ClusterState applyCreateIndexRequestWithV2Template(final ClusterState cu | |
int routingNumShards = getIndexNumberOfRoutingShards(aggregatedIndexSettings, null); | ||
IndexMetadata tmpImd = buildAndValidateTemporaryIndexMetadata(aggregatedIndexSettings, request, routingNumShards); | ||
|
||
return applyCreateIndexWithTemporaryService(currentState, request, silent, null, tmpImd, mappings, | ||
indexService -> resolveAndValidateAliases(request.index(), request.aliases(), | ||
MetadataIndexTemplateService.resolveAliases(currentState.metadata(), templateName), currentState.metadata(), | ||
// the context is only used for validation so it's fine to pass fake values for the | ||
// shard id and the current timestamp | ||
aliasValidator, xContentRegistry, indexService.newSearchExecutionContext(0, 0, null, () -> 0L, null, emptyMap()), | ||
indexService.dateMathExpressionResolverAt(request.getNameResolvedAt())), | ||
Collections.singletonList(templateName), metadataTransformer); | ||
return applyCreateIndexWithTemporaryService( | ||
currentState, | ||
request, | ||
silent, | ||
null, | ||
tmpImd, | ||
mappings, | ||
indexService -> resolveAndValidateAliases( | ||
request.index(), | ||
// data stream aliases are created separately in MetadataCreateDataStreamService::createDataStream | ||
isDataStream ? Set.of() : request.aliases(), | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe add a comment here that data stream aliases are created elsewhere? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks, @martijnvg. I've made those changes. |
||
isDataStream ? List.of() : MetadataIndexTemplateService.resolveAliases(currentState.metadata(), templateName), | ||
currentState.metadata(), | ||
aliasValidator, | ||
xContentRegistry, | ||
// the context is used ony for validation so it's fine to pass fake values for the shard id and the current timestamp | ||
indexService.newSearchExecutionContext(0, 0, null, () -> 0L, null, emptyMap()), | ||
indexService.dateMathExpressionResolverAt(request.getNameResolvedAt()) | ||
), | ||
Collections.singletonList(templateName), | ||
metadataTransformer | ||
); | ||
} | ||
|
||
private ClusterState applyCreateIndexRequestForSystemDataStream(final ClusterState currentState, | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,12 +23,15 @@ | |
import org.elasticsearch.indices.SystemIndices.Feature; | ||
import org.elasticsearch.test.ESTestCase; | ||
|
||
import java.util.ArrayList; | ||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Map; | ||
|
||
import static org.elasticsearch.cluster.metadata.DataStreamTestHelper.createFirstBackingIndex; | ||
import static org.elasticsearch.cluster.metadata.DataStreamTestHelper.createTimestampField; | ||
import static org.elasticsearch.cluster.metadata.DataStreamTestHelper.generateMapping; | ||
import static org.hamcrest.Matchers.arrayContainingInAnyOrder; | ||
import static org.hamcrest.Matchers.containsString; | ||
import static org.hamcrest.Matchers.equalTo; | ||
import static org.hamcrest.Matchers.is; | ||
|
@@ -66,6 +69,41 @@ public void testCreateDataStream() throws Exception { | |
assertThat(newState.metadata().index(DataStream.getDefaultBackingIndexName(dataStreamName, 1)).isSystem(), is(false)); | ||
} | ||
|
||
public void testCreateDataStreamWithAliasFromTemplate() throws Exception { | ||
final MetadataCreateIndexService metadataCreateIndexService = getMetadataCreateIndexService(); | ||
final String dataStreamName = "my-data-stream"; | ||
final int aliasCount = randomIntBetween(0, 3); | ||
Map<String, AliasMetadata> aliases = new HashMap<>(aliasCount); | ||
for (int k = 0; k < aliasCount; k++) { | ||
final String aliasName = randomAlphaOfLength(6); | ||
aliases.put(aliasName, AliasMetadata.newAliasMetadataBuilder(aliasName).build()); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe also test the case here with aliases with write data streams and filter? (Either by randomly adding and asserting it or a new test) |
||
} | ||
ComposableIndexTemplate template = new ComposableIndexTemplate.Builder() | ||
.indexPatterns(List.of(dataStreamName + "*")) | ||
.dataStreamTemplate(new DataStreamTemplate()) | ||
.template(new Template(null, null, aliases)) | ||
.build(); | ||
ClusterState cs = ClusterState.builder(new ClusterName("_name")) | ||
.metadata(Metadata.builder().put("template", template).build()) | ||
.build(); | ||
CreateDataStreamClusterStateUpdateRequest req = | ||
new CreateDataStreamClusterStateUpdateRequest(dataStreamName, TimeValue.ZERO, TimeValue.ZERO); | ||
ClusterState newState = MetadataCreateDataStreamService.createDataStream(metadataCreateIndexService, cs, req); | ||
assertThat(newState.metadata().dataStreams().size(), equalTo(1)); | ||
assertThat(newState.metadata().dataStreams().get(dataStreamName).getName(), equalTo(dataStreamName)); | ||
assertThat(newState.metadata().dataStreams().get(dataStreamName).isSystem(), is(false)); | ||
assertThat(newState.metadata().dataStreams().get(dataStreamName).isHidden(), is(false)); | ||
assertThat(newState.metadata().dataStreams().get(dataStreamName).isReplicated(), is(false)); | ||
assertThat(newState.metadata().dataStreamAliases().size(), is(aliasCount)); | ||
assertThat(newState.metadata().dataStreamAliases().values().stream().map(DataStreamAlias::getName).toArray(), | ||
arrayContainingInAnyOrder (new ArrayList<>(aliases.keySet()).toArray())); | ||
assertThat(newState.metadata().index(DataStream.getDefaultBackingIndexName(dataStreamName, 1)), notNullValue()); | ||
assertThat(newState.metadata().index(DataStream.getDefaultBackingIndexName(dataStreamName, 1)).getAliases().size(), is(0)); | ||
assertThat(newState.metadata().index(DataStream.getDefaultBackingIndexName(dataStreamName, 1)).getSettings().get("index.hidden"), | ||
equalTo("true")); | ||
assertThat(newState.metadata().index(DataStream.getDefaultBackingIndexName(dataStreamName, 1)).isSystem(), is(false)); | ||
} | ||
|
||
public void testCreateSystemDataStream() throws Exception { | ||
final MetadataCreateIndexService metadataCreateIndexService = getMetadataCreateIndexService(); | ||
final String dataStreamName = ".system-data-stream"; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe enhance this log line with the fact that aliases were created as well (if template has aliases)?