|
@@ -17,9 +17,11 @@ import org.elasticsearch.client.internal.Client;
|
|
|
import org.elasticsearch.cluster.AckedClusterStateUpdateTask;
|
|
|
import org.elasticsearch.cluster.ClusterState;
|
|
|
import org.elasticsearch.cluster.ClusterStateUpdateTask;
|
|
|
+import org.elasticsearch.cluster.ProjectState;
|
|
|
import org.elasticsearch.cluster.block.ClusterBlockException;
|
|
|
import org.elasticsearch.cluster.block.ClusterBlockLevel;
|
|
|
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
|
|
|
+import org.elasticsearch.cluster.metadata.ProjectId;
|
|
|
import org.elasticsearch.cluster.metadata.ProjectMetadata;
|
|
|
import org.elasticsearch.cluster.metadata.RepositoriesMetadata;
|
|
|
import org.elasticsearch.cluster.project.ProjectResolver;
|
|
@@ -114,49 +116,47 @@ public class TransportPutLifecycleAction extends TransportMasterNodeAction<PutLi
|
|
|
|
|
|
LifecyclePolicy.validatePolicyName(request.getPolicy().getName());
|
|
|
|
|
|
- {
|
|
|
- ProjectMetadata projectMetadata = projectResolver.getProjectMetadata(state);
|
|
|
- IndexLifecycleMetadata lifecycleMetadata = projectMetadata.custom(IndexLifecycleMetadata.TYPE, IndexLifecycleMetadata.EMPTY);
|
|
|
- LifecyclePolicyMetadata existingPolicy = lifecycleMetadata.getPolicyMetadatas().get(request.getPolicy().getName());
|
|
|
- // Make the request a no-op if the policy and filtered headers match exactly
|
|
|
- if (isNoopUpdate(existingPolicy, request.getPolicy(), filteredHeaders)) {
|
|
|
- listener.onResponse(AcknowledgedResponse.TRUE);
|
|
|
- return;
|
|
|
- }
|
|
|
+ ProjectMetadata projectMetadata = projectResolver.getProjectMetadata(state);
|
|
|
+ IndexLifecycleMetadata lifecycleMetadata = projectMetadata.custom(IndexLifecycleMetadata.TYPE, IndexLifecycleMetadata.EMPTY);
|
|
|
+ LifecyclePolicyMetadata existingPolicy = lifecycleMetadata.getPolicyMetadatas().get(request.getPolicy().getName());
|
|
|
+ // Make the request a no-op if the policy and filtered headers match exactly
|
|
|
+ if (isNoopUpdate(existingPolicy, request.getPolicy(), filteredHeaders)) {
|
|
|
+ listener.onResponse(AcknowledgedResponse.TRUE);
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
submitUnbatchedTask(
|
|
|
"put-lifecycle-" + request.getPolicy().getName(),
|
|
|
- new UpdateLifecyclePolicyTask(request, listener, licenseState, filteredHeaders, xContentRegistry, client, projectResolver)
|
|
|
+ new UpdateLifecyclePolicyTask(projectMetadata.id(), request, listener, licenseState, filteredHeaders, xContentRegistry, client)
|
|
|
);
|
|
|
}
|
|
|
|
|
|
public static class UpdateLifecyclePolicyTask extends AckedClusterStateUpdateTask {
|
|
|
+ private final ProjectId projectId;
|
|
|
private final PutLifecycleRequest request;
|
|
|
private final XPackLicenseState licenseState;
|
|
|
private final Map<String, String> filteredHeaders;
|
|
|
private final NamedXContentRegistry xContentRegistry;
|
|
|
private final Client client;
|
|
|
private final boolean verboseLogging;
|
|
|
- private final ProjectResolver projectResolver;
|
|
|
|
|
|
public UpdateLifecyclePolicyTask(
|
|
|
+ ProjectId projectId,
|
|
|
PutLifecycleRequest request,
|
|
|
ActionListener<AcknowledgedResponse> listener,
|
|
|
XPackLicenseState licenseState,
|
|
|
Map<String, String> filteredHeaders,
|
|
|
NamedXContentRegistry xContentRegistry,
|
|
|
- Client client,
|
|
|
- ProjectResolver projectResolver
|
|
|
+ Client client
|
|
|
) {
|
|
|
super(request, listener);
|
|
|
+ this.projectId = projectId;
|
|
|
this.request = request;
|
|
|
this.licenseState = licenseState;
|
|
|
this.filteredHeaders = filteredHeaders;
|
|
|
this.xContentRegistry = xContentRegistry;
|
|
|
this.client = client;
|
|
|
this.verboseLogging = true;
|
|
|
- this.projectResolver = projectResolver;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -166,37 +166,35 @@ public class TransportPutLifecycleAction extends TransportMasterNodeAction<PutLi
|
|
|
* It disables verbose logging and has no filtered headers.
|
|
|
*/
|
|
|
UpdateLifecyclePolicyTask(
|
|
|
+ ProjectId projectId,
|
|
|
PutLifecycleRequest request,
|
|
|
XPackLicenseState licenseState,
|
|
|
NamedXContentRegistry xContentRegistry,
|
|
|
- Client client,
|
|
|
- ProjectResolver projectResolver
|
|
|
+ Client client
|
|
|
) {
|
|
|
super(request, null);
|
|
|
+ this.projectId = projectId;
|
|
|
this.request = request;
|
|
|
this.licenseState = licenseState;
|
|
|
this.filteredHeaders = Collections.emptyMap();
|
|
|
this.xContentRegistry = xContentRegistry;
|
|
|
this.client = client;
|
|
|
this.verboseLogging = false;
|
|
|
- this.projectResolver = projectResolver;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public ClusterState execute(ClusterState currentState) throws Exception {
|
|
|
- ProjectMetadata currentProjectMetadata = projectResolver.getProjectMetadata(currentState);
|
|
|
- final IndexLifecycleMetadata currentMetadata = currentProjectMetadata.custom(
|
|
|
- IndexLifecycleMetadata.TYPE,
|
|
|
- IndexLifecycleMetadata.EMPTY
|
|
|
- );
|
|
|
+ public ClusterState execute(ClusterState clusterState) throws Exception {
|
|
|
+ var projectState = clusterState.projectState(projectId);
|
|
|
+ final IndexLifecycleMetadata currentMetadata = projectState.metadata()
|
|
|
+ .custom(IndexLifecycleMetadata.TYPE, IndexLifecycleMetadata.EMPTY);
|
|
|
final LifecyclePolicyMetadata existingPolicyMetadata = currentMetadata.getPolicyMetadatas().get(request.getPolicy().getName());
|
|
|
|
|
|
// Double-check for no-op in the state update task, in case it was changed/reset in the meantime
|
|
|
if (isNoopUpdate(existingPolicyMetadata, request.getPolicy(), filteredHeaders)) {
|
|
|
- return currentState;
|
|
|
+ return clusterState;
|
|
|
}
|
|
|
|
|
|
- validatePrerequisites(request.getPolicy(), currentState, currentProjectMetadata, licenseState);
|
|
|
+ validatePrerequisites(request.getPolicy(), projectState, licenseState);
|
|
|
|
|
|
long nextVersion = (existingPolicyMetadata == null) ? 1L : existingPolicyMetadata.getVersion() + 1L;
|
|
|
SortedMap<String, LifecyclePolicyMetadata> newPolicies = new TreeMap<>(currentMetadata.getPolicyMetadatas());
|
|
@@ -214,11 +212,11 @@ public class TransportPutLifecycleAction extends TransportMasterNodeAction<PutLi
|
|
|
logger.info("updating index lifecycle policy [{}]", request.getPolicy().getName());
|
|
|
}
|
|
|
}
|
|
|
- IndexLifecycleMetadata newMetadata = new IndexLifecycleMetadata(newPolicies, currentILMMode(currentProjectMetadata));
|
|
|
- ProjectMetadata newProjectMetadata = ProjectMetadata.builder(currentProjectMetadata)
|
|
|
+ IndexLifecycleMetadata newMetadata = new IndexLifecycleMetadata(newPolicies, currentILMMode(projectState.metadata()));
|
|
|
+ ProjectMetadata newProjectMetadata = ProjectMetadata.builder(projectState.metadata())
|
|
|
.putCustom(IndexLifecycleMetadata.TYPE, newMetadata)
|
|
|
.build();
|
|
|
- ClusterState nonRefreshedState = ClusterState.builder(currentState).putProjectMetadata(newProjectMetadata).build();
|
|
|
+ ClusterState nonRefreshedState = ClusterState.builder(clusterState).putProjectMetadata(newProjectMetadata).build();
|
|
|
if (oldPolicy == null) {
|
|
|
return nonRefreshedState;
|
|
|
} else {
|
|
@@ -231,7 +229,7 @@ public class TransportPutLifecycleAction extends TransportMasterNodeAction<PutLi
|
|
|
lifecyclePolicyMetadata,
|
|
|
licenseState
|
|
|
);
|
|
|
- return ClusterState.builder(currentState).putProjectMetadata(refreshedProjectMetadata).build();
|
|
|
+ return ClusterState.builder(clusterState).putProjectMetadata(refreshedProjectMetadata).build();
|
|
|
} catch (Exception e) {
|
|
|
logger.warn(() -> "unable to refresh indices phase JSON for updated policy [" + oldPolicy.getName() + "]", e);
|
|
|
// Revert to the non-refreshed state
|
|
@@ -266,15 +264,9 @@ public class TransportPutLifecycleAction extends TransportMasterNodeAction<PutLi
|
|
|
* repositories exist, and that any referenced SLM policies exist.
|
|
|
*
|
|
|
* @param policy The lifecycle policy
|
|
|
- * @param state The cluster state
|
|
|
- * @param projectMetadata The project metadata
|
|
|
+ * @param state The project state
|
|
|
*/
|
|
|
- private static void validatePrerequisites(
|
|
|
- LifecyclePolicy policy,
|
|
|
- ClusterState state,
|
|
|
- ProjectMetadata projectMetadata,
|
|
|
- XPackLicenseState licenseState
|
|
|
- ) {
|
|
|
+ private static void validatePrerequisites(LifecyclePolicy policy, ProjectState state, XPackLicenseState licenseState) {
|
|
|
List<Phase> phasesWithSearchableSnapshotActions = policy.getPhases()
|
|
|
.values()
|
|
|
.stream()
|
|
@@ -295,7 +287,7 @@ public class TransportPutLifecycleAction extends TransportMasterNodeAction<PutLi
|
|
|
for (Phase phase : phasesWithSearchableSnapshotActions) {
|
|
|
SearchableSnapshotAction action = (SearchableSnapshotAction) phase.getActions().get(SearchableSnapshotAction.NAME);
|
|
|
String repository = action.getSnapshotRepository();
|
|
|
- if (RepositoriesMetadata.get(state).repository(repository) == null) {
|
|
|
+ if (RepositoriesMetadata.get(state.cluster()).repository(repository) == null) {
|
|
|
throw new IllegalArgumentException(
|
|
|
"no such repository ["
|
|
|
+ repository
|
|
@@ -319,7 +311,8 @@ public class TransportPutLifecycleAction extends TransportMasterNodeAction<PutLi
|
|
|
for (Phase phase : phasesWithWaitForSnapshotActions) {
|
|
|
WaitForSnapshotAction action = (WaitForSnapshotAction) phase.getActions().get(WaitForSnapshotAction.NAME);
|
|
|
String slmPolicy = action.getPolicy();
|
|
|
- if (projectMetadata.custom(SnapshotLifecycleMetadata.TYPE, SnapshotLifecycleMetadata.EMPTY)
|
|
|
+ if (state.metadata()
|
|
|
+ .custom(SnapshotLifecycleMetadata.TYPE, SnapshotLifecycleMetadata.EMPTY)
|
|
|
.getSnapshotConfigurations()
|
|
|
.get(slmPolicy) == null) {
|
|
|
throw new IllegalArgumentException(
|