Skip to content

Commit

Permalink
Operator/index templates (#90143)
Browse files Browse the repository at this point in the history
Adds support for /_index_template/ and 
/_component_template/ in file based settings.

Co-authored-by: Andrei Dan <andrei.dan@elastic.co>
  • Loading branch information
grcevski and andreidan committed Oct 14, 2022
1 parent f9db305 commit 9b0363e
Show file tree
Hide file tree
Showing 11 changed files with 2,222 additions and 32 deletions.
5 changes: 5 additions & 0 deletions docs/changelog/90143.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
pr: 90143
summary: Operator/index templates
area: Infra/Core
type: enhancement
issues: []

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
package org.elasticsearch.action.admin.indices.template.delete;

import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.indices.template.reservedstate.ReservedComposableIndexTemplateAction;
import org.elasticsearch.action.support.ActionFilters;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.support.master.AcknowledgedTransportMasterNodeAction;
Expand All @@ -23,6 +24,11 @@
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;

import java.util.Arrays;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

public class TransportDeleteComponentTemplateAction extends AcknowledgedTransportMasterNodeAction<DeleteComponentTemplateAction.Request> {

private final MetadataIndexTemplateService indexTemplateService;
Expand Down Expand Up @@ -63,4 +69,16 @@ protected void masterOperation(
) {
indexTemplateService.removeComponentTemplate(request.names(), request.masterNodeTimeout(), state, listener);
}

@Override
public Optional<String> reservedStateHandlerName() {
return Optional.of(ReservedComposableIndexTemplateAction.NAME);
}

@Override
public Set<String> modifiedKeys(DeleteComponentTemplateAction.Request request) {
return Arrays.stream(request.names())
.map(n -> ReservedComposableIndexTemplateAction.reservedComponentName(n))
.collect(Collectors.toSet());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
package org.elasticsearch.action.admin.indices.template.delete;

import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.indices.template.reservedstate.ReservedComposableIndexTemplateAction;
import org.elasticsearch.action.support.ActionFilters;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.support.master.AcknowledgedTransportMasterNodeAction;
Expand All @@ -23,6 +24,11 @@
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;

import java.util.Arrays;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

public class TransportDeleteComposableIndexTemplateAction extends AcknowledgedTransportMasterNodeAction<
DeleteComposableIndexTemplateAction.Request> {

Expand Down Expand Up @@ -64,4 +70,16 @@ protected void masterOperation(
) {
indexTemplateService.removeIndexTemplateV2(request.names(), request.masterNodeTimeout(), listener);
}

@Override
public Optional<String> reservedStateHandlerName() {
return Optional.of(ReservedComposableIndexTemplateAction.NAME);
}

@Override
public Set<String> modifiedKeys(DeleteComposableIndexTemplateAction.Request request) {
return Arrays.stream(request.names())
.map(n -> ReservedComposableIndexTemplateAction.reservedComposableIndexName(n))
.collect(Collectors.toSet());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
package org.elasticsearch.action.admin.indices.template.put;

import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.indices.template.reservedstate.ReservedComposableIndexTemplateAction;
import org.elasticsearch.action.support.ActionFilters;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.support.master.AcknowledgedTransportMasterNodeAction;
Expand All @@ -28,6 +29,9 @@
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;

import java.util.Optional;
import java.util.Set;

public class TransportPutComponentTemplateAction extends AcknowledgedTransportMasterNodeAction<PutComponentTemplateAction.Request> {

private final MetadataIndexTemplateService indexTemplateService;
Expand Down Expand Up @@ -62,14 +66,10 @@ protected ClusterBlockException checkBlock(PutComponentTemplateAction.Request re
return state.blocks().globalBlockedException(ClusterBlockLevel.METADATA_WRITE);
}

@Override
protected void masterOperation(
Task task,
final PutComponentTemplateAction.Request request,
final ClusterState state,
final ActionListener<AcknowledgedResponse> listener
public static ComponentTemplate normalizeComponentTemplate(
ComponentTemplate componentTemplate,
IndexScopedSettings indexScopedSettings
) {
ComponentTemplate componentTemplate = request.componentTemplate();
Template template = componentTemplate.template();
// Normalize the index settings if necessary
if (template.settings() != null) {
Expand All @@ -79,6 +79,18 @@ protected void masterOperation(
template = new Template(settings, template.mappings(), template.aliases());
componentTemplate = new ComponentTemplate(template, componentTemplate.version(), componentTemplate.metadata());
}

return componentTemplate;
}

@Override
protected void masterOperation(
Task task,
final PutComponentTemplateAction.Request request,
final ClusterState state,
final ActionListener<AcknowledgedResponse> listener
) {
ComponentTemplate componentTemplate = normalizeComponentTemplate(request.componentTemplate(), indexScopedSettings);
indexTemplateService.putComponentTemplate(
request.cause(),
request.create(),
Expand All @@ -88,4 +100,14 @@ protected void masterOperation(
listener
);
}

@Override
public Optional<String> reservedStateHandlerName() {
return Optional.of(ReservedComposableIndexTemplateAction.NAME);
}

@Override
public Set<String> modifiedKeys(PutComponentTemplateAction.Request request) {
return Set.of(ReservedComposableIndexTemplateAction.reservedComponentName(request.name()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
package org.elasticsearch.action.admin.indices.template.put;

import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.indices.template.reservedstate.ReservedComposableIndexTemplateAction;
import org.elasticsearch.action.support.ActionFilters;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.support.master.AcknowledgedTransportMasterNodeAction;
Expand All @@ -18,12 +19,21 @@
import org.elasticsearch.cluster.metadata.ComposableIndexTemplate;
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
import org.elasticsearch.cluster.metadata.MetadataIndexTemplateService;
import org.elasticsearch.cluster.metadata.ReservedStateMetadata;
import org.elasticsearch.cluster.service.ClusterService;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.tasks.Task;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.transport.TransportService;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import static org.elasticsearch.core.Strings.format;

public class TransportPutComposableIndexTemplateAction extends AcknowledgedTransportMasterNodeAction<
PutComposableIndexTemplateAction.Request> {

Expand Down Expand Up @@ -63,6 +73,7 @@ protected void masterOperation(
final ClusterState state,
final ActionListener<AcknowledgedResponse> listener
) {
verifyIfUsingReservedComponentTemplates(request, state);
ComposableIndexTemplate indexTemplate = request.indexTemplate();
indexTemplateService.putIndexTemplateV2(
request.cause(),
Expand All @@ -73,4 +84,40 @@ protected void masterOperation(
listener
);
}

public static void verifyIfUsingReservedComponentTemplates(
final PutComposableIndexTemplateAction.Request request,
final ClusterState state
) {
ComposableIndexTemplate indexTemplate = request.indexTemplate();
Set<String> composedOfKeys = indexTemplate.composedOf()
.stream()
.map(c -> ReservedComposableIndexTemplateAction.reservedComponentName(c))
.collect(Collectors.toSet());

List<String> errors = new ArrayList<>();

for (ReservedStateMetadata metadata : state.metadata().reservedStateMetadata().values()) {
Set<String> conflicts = metadata.conflicts(ReservedComposableIndexTemplateAction.NAME, composedOfKeys);
if (conflicts.isEmpty() == false) {
errors.add(format("[%s] is reserved by [%s]", String.join(", ", conflicts), metadata.namespace()));
}
}

if (errors.isEmpty() == false) {
throw new IllegalArgumentException(
format("Failed to process request [%s] with errors: [%s]", request, String.join(", ", errors))
);
}
}

@Override
public Optional<String> reservedStateHandlerName() {
return Optional.of(ReservedComposableIndexTemplateAction.NAME);
}

@Override
public Set<String> modifiedKeys(PutComposableIndexTemplateAction.Request request) {
return Set.of(ReservedComposableIndexTemplateAction.reservedComposableIndexName(request.name()));
}
}

0 comments on commit 9b0363e

Please sign in to comment.