diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/slm/SnapshotLifecycleMetadata.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/slm/SnapshotLifecycleMetadata.java index 71e33f9c8d7..8ce7b4c8b60 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/slm/SnapshotLifecycleMetadata.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/slm/SnapshotLifecycleMetadata.java @@ -62,7 +62,7 @@ public class SnapshotLifecycleMetadata implements XPackMetaDataCustom { throw new IllegalArgumentException("ordered " + POLICIES_FIELD.getPreferredName() + " are not supported"); }, POLICIES_FIELD); PARSER.declareString(ConstructingObjectParser.constructorArg(), OPERATION_MODE_FIELD); - PARSER.declareObject(ConstructingObjectParser.constructorArg(), (v, o) -> SnapshotLifecycleStats.parse(v), STATS_FIELD); + PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), (v, o) -> SnapshotLifecycleStats.parse(v), STATS_FIELD); } private final Map snapshotConfigurations; @@ -74,7 +74,7 @@ public class SnapshotLifecycleMetadata implements XPackMetaDataCustom { SnapshotLifecycleStats slmStats) { this.snapshotConfigurations = new HashMap<>(snapshotConfigurations); this.operationMode = operationMode; - this.slmStats = slmStats; + this.slmStats = slmStats != null ? slmStats : new SnapshotLifecycleStats(); } public SnapshotLifecycleMetadata(StreamInput in) throws IOException { diff --git a/x-pack/qa/full-cluster-restart/src/test/java/org/elasticsearch/xpack/restart/FullClusterRestartIT.java b/x-pack/qa/full-cluster-restart/src/test/java/org/elasticsearch/xpack/restart/FullClusterRestartIT.java index a2ff126298a..87c17f19110 100644 --- a/x-pack/qa/full-cluster-restart/src/test/java/org/elasticsearch/xpack/restart/FullClusterRestartIT.java +++ b/x-pack/qa/full-cluster-restart/src/test/java/org/elasticsearch/xpack/restart/FullClusterRestartIT.java @@ -10,9 +10,16 @@ import org.elasticsearch.Version; import org.elasticsearch.client.Request; import org.elasticsearch.client.Response; import org.elasticsearch.client.ResponseException; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.util.concurrent.ThreadContext; +import org.elasticsearch.common.xcontent.DeprecationHandler; +import org.elasticsearch.common.xcontent.NamedXContentRegistry; import org.elasticsearch.common.xcontent.ObjectPath; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.common.xcontent.support.XContentMapValues; import org.elasticsearch.rest.RestStatus; import org.elasticsearch.rest.action.document.RestGetAction; @@ -21,6 +28,8 @@ import org.elasticsearch.rest.action.search.RestSearchAction; import org.elasticsearch.test.StreamsUtils; import org.elasticsearch.test.rest.ESRestTestCase; import org.elasticsearch.upgrades.AbstractFullClusterRestartTestCase; +import org.elasticsearch.xpack.core.slm.SnapshotLifecyclePolicy; +import org.elasticsearch.xpack.slm.SnapshotLifecycleStats; import org.hamcrest.Matcher; import org.junit.Before; @@ -28,6 +37,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; +import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Map; @@ -293,6 +303,39 @@ public class FullClusterRestartIT extends AbstractFullClusterRestartTestCase { assertRollUpJob("rollup-job-test"); } } + + public void testSlmStats() throws IOException { + SnapshotLifecyclePolicy slmPolicy = new SnapshotLifecyclePolicy("test-policy", "test-policy", "* * * 31 FEB ? *", "test-repo", + Collections.singletonMap("indices", Collections.singletonList("*")), null); + if (isRunningAgainstOldCluster() && getOldClusterVersion().onOrAfter(Version.V_7_4_0)) { + Request createRepoRequest = new Request("PUT", "_snapshot/test-repo"); + String repoCreateJson = "{" + + " \"type\": \"fs\"," + + " \"settings\": {" + + " \"location\": \"test-repo\"" + + " }" + + "}"; + createRepoRequest.setJsonEntity(repoCreateJson); + Request createSlmPolicyRequest = new Request("PUT", "_slm/policy/test-policy"); + try (XContentBuilder builder = JsonXContent.contentBuilder()) { + String createSlmPolicyJson = Strings.toString(slmPolicy.toXContent(builder, null)); + createSlmPolicyRequest.setJsonEntity(createSlmPolicyJson); + } + + client().performRequest(createRepoRequest); + client().performRequest(createSlmPolicyRequest); + } + + if (isRunningAgainstOldCluster() == false || getOldClusterVersion().onOrAfter(Version.V_7_5_0)) { + Response response = client().performRequest(new Request("GET", "_slm/stats")); + XContentType xContentType = XContentType.fromMediaTypeOrFormat(response.getEntity().getContentType().getValue()); + try (XContentParser parser = xContentType.xContent().createParser(NamedXContentRegistry.EMPTY, + DeprecationHandler.THROW_UNSUPPORTED_OPERATION, response.getEntity().getContent())) { + assertEquals(new SnapshotLifecycleStats(), SnapshotLifecycleStats.parse(parser)); + } + } + + } public void testRollupIDSchemeAfterRestart() throws Exception { assumeTrue("Rollup can be tested with 6.3.0 and onwards", getOldClusterVersion().onOrAfter(Version.V_6_3_0));