Skip to content

Commit 7ea37fe

Browse files
authored
Add next_execution to SLM policy metadata (#41221)
* Add next_execution to SLM policy metadata This adds the next time a snapshot lifecycle policy will be executed when retriving a policy's metadata, for example: ```json GET /_ilm/snapshot?human { "production" : { "version" : 1, "modified_date" : "2019-04-15T21:16:21.865Z", "modified_date_millis" : 1555362981865, "policy" : { "name" : "<production-snap-{now/d}>", "schedule" : "*/30 * * * * ?", "repository" : "repo", "config" : { "indices" : [ "foo-*", "important" ], "ignore_unavailable" : true, "include_global_state" : false } }, "next_execution" : "2019-04-15T21:16:30.000Z", "next_execution_millis" : 1555362990000 }, "other" : { "version" : 1, "modified_date" : "2019-04-15T21:12:19.959Z", "modified_date_millis" : 1555362739959, "policy" : { "name" : "<other-snap-{now/d}>", "schedule" : "0 30 2 * * ?", "repository" : "repo", "config" : { "indices" : [ "other" ], "ignore_unavailable" : false, "include_global_state" : true } }, "next_execution" : "2019-04-16T02:30:00.000Z", "next_execution_millis" : 1555381800000 } } ``` Relates to #38461 * Fix and enhance tests * Figured out how to Cron
1 parent ead7146 commit 7ea37fe

File tree

5 files changed

+33
-30
lines changed

5 files changed

+33
-30
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/snapshotlifecycle/SnapshotLifecyclePolicy.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ public Map<String, Object> getConfig() {
113113
return this.configuration;
114114
}
115115

116+
public long calculateNextExecution() {
117+
final Cron schedule = new Cron(this.schedule);
118+
return schedule.getNextValidTimeAfter(System.currentTimeMillis());
119+
}
120+
116121
public ActionRequestValidationException validate() {
117122
ActionRequestValidationException err = new ActionRequestValidationException();
118123

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/snapshotlifecycle/SnapshotLifecyclePolicyItem.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,18 @@ public boolean equals(Object obj) {
112112
@Override
113113
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
114114
builder.startObject(policy.getId());
115-
builder.field("version", version);
116-
builder.timeField("modified_date_millis", "modified_date", modifiedDate);
117-
builder.field("policy", policy);
115+
builder.field(SnapshotLifecyclePolicyMetadata.VERSION.getPreferredName(), version);
116+
builder.timeField(SnapshotLifecyclePolicyMetadata.MODIFIED_DATE_MILLIS.getPreferredName(),
117+
SnapshotLifecyclePolicyMetadata.MODIFIED_DATE.getPreferredName(), modifiedDate);
118+
builder.field(SnapshotLifecyclePolicyMetadata.POLICY.getPreferredName(), policy);
118119
if (lastSuccess != null) {
119-
builder.field("last_success", lastSuccess);
120+
builder.field(SnapshotLifecyclePolicyMetadata.LAST_SUCCESS.getPreferredName(), lastSuccess);
120121
}
121122
if (lastFailure != null) {
122-
builder.field("last_failure", lastFailure);
123+
builder.field(SnapshotLifecyclePolicyMetadata.LAST_FAILURE.getPreferredName(), lastFailure);
123124
}
125+
builder.timeField(SnapshotLifecyclePolicyMetadata.NEXT_EXECUTION_MILLIS.getPreferredName(),
126+
SnapshotLifecyclePolicyMetadata.NEXT_EXECUTION.getPreferredName(), policy.calculateNextExecution());
124127
builder.endObject();
125128
return builder;
126129
}

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/snapshotlifecycle/SnapshotLifecyclePolicyMetadata.java

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@
1919
import org.elasticsearch.common.xcontent.XContentParser;
2020

2121
import java.io.IOException;
22-
import java.time.Instant;
23-
import java.time.ZoneOffset;
24-
import java.time.ZonedDateTime;
2522
import java.util.HashMap;
2623
import java.util.Map;
2724
import java.util.Objects;
@@ -38,10 +35,12 @@ public class SnapshotLifecyclePolicyMetadata extends AbstractDiffable<SnapshotLi
3835
static final ParseField POLICY = new ParseField("policy");
3936
static final ParseField HEADERS = new ParseField("headers");
4037
static final ParseField VERSION = new ParseField("version");
38+
static final ParseField MODIFIED_DATE_MILLIS = new ParseField("modified_date_millis");
4139
static final ParseField MODIFIED_DATE = new ParseField("modified_date");
42-
static final ParseField MODIFIED_DATE_STRING = new ParseField("modified_date_string");
4340
static final ParseField LAST_SUCCESS = new ParseField("last_success");
4441
static final ParseField LAST_FAILURE = new ParseField("last_failure");
42+
static final ParseField NEXT_EXECUTION_MILLIS = new ParseField("next_execution_millis");
43+
static final ParseField NEXT_EXECUTION = new ParseField("next_execution");
4544

4645
private final SnapshotLifecyclePolicy policy;
4746
private final Map<String, String> headers;
@@ -57,8 +56,8 @@ public class SnapshotLifecyclePolicyMetadata extends AbstractDiffable<SnapshotLi
5756
new ConstructingObjectParser<>("snapshot_policy_metadata",
5857
a -> {
5958
SnapshotLifecyclePolicy policy = (SnapshotLifecyclePolicy) a[0];
60-
SnapshotInvocationRecord lastSuccess = (SnapshotInvocationRecord) a[5];
61-
SnapshotInvocationRecord lastFailure = (SnapshotInvocationRecord) a[6];
59+
SnapshotInvocationRecord lastSuccess = (SnapshotInvocationRecord) a[4];
60+
SnapshotInvocationRecord lastFailure = (SnapshotInvocationRecord) a[5];
6261

6362
return builder()
6463
.setPolicy(policy)
@@ -74,8 +73,7 @@ public class SnapshotLifecyclePolicyMetadata extends AbstractDiffable<SnapshotLi
7473
PARSER.declareObject(ConstructingObjectParser.constructorArg(), SnapshotLifecyclePolicy::parse, POLICY);
7574
PARSER.declareField(ConstructingObjectParser.constructorArg(), XContentParser::mapStrings, HEADERS, ObjectParser.ValueType.OBJECT);
7675
PARSER.declareLong(ConstructingObjectParser.constructorArg(), VERSION);
77-
PARSER.declareLong(ConstructingObjectParser.constructorArg(), MODIFIED_DATE);
78-
PARSER.declareString(ConstructingObjectParser.constructorArg(), MODIFIED_DATE_STRING);
76+
PARSER.declareLong(ConstructingObjectParser.constructorArg(), MODIFIED_DATE_MILLIS);
7977
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), SnapshotInvocationRecord::parse, LAST_SUCCESS);
8078
PARSER.declareObject(ConstructingObjectParser.optionalConstructorArg(), SnapshotInvocationRecord::parse, LAST_FAILURE);
8179
}
@@ -151,18 +149,6 @@ public long getModifiedDate() {
151149
return modifiedDate;
152150
}
153151

154-
private String dateToDateString(Long date) {
155-
if (Objects.isNull(date)) {
156-
return null;
157-
}
158-
ZonedDateTime dateTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(date), ZoneOffset.UTC);
159-
return dateTime.toString();
160-
}
161-
162-
public String getModifiedDateString() {
163-
return dateToDateString(modifiedDate);
164-
}
165-
166152
public SnapshotInvocationRecord getLastSuccess() {
167153
return lastSuccess;
168154
}
@@ -177,8 +163,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
177163
builder.field(POLICY.getPreferredName(), policy);
178164
builder.field(HEADERS.getPreferredName(), headers);
179165
builder.field(VERSION.getPreferredName(), version);
180-
builder.field(MODIFIED_DATE.getPreferredName(), modifiedDate);
181-
builder.field(MODIFIED_DATE_STRING.getPreferredName(), getModifiedDateString());
166+
builder.timeField(MODIFIED_DATE_MILLIS.getPreferredName(), MODIFIED_DATE.getPreferredName(), modifiedDate);
182167
if (Objects.nonNull(lastSuccess)) {
183168
builder.field(LAST_SUCCESS.getPreferredName(), lastSuccess);
184169
}

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/snapshotlifecycle/SnapshotLifecyclePolicyMetadataTests.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ protected Writeable.Reader<SnapshotLifecyclePolicyMetadata> instanceReader() {
4747

4848
@Override
4949
protected SnapshotLifecyclePolicyMetadata mutateInstance(SnapshotLifecyclePolicyMetadata instance) throws IOException {
50-
switch (between(0, 4)) {
50+
switch (between(0, 5)) {
5151
case 0:
5252
return SnapshotLifecyclePolicyMetadata.builder(instance)
5353
.setPolicy(randomValueOtherThan(instance.getPolicy(), () -> createRandomPolicy(randomAlphaOfLength(10))))
@@ -58,14 +58,18 @@ protected SnapshotLifecyclePolicyMetadata mutateInstance(SnapshotLifecyclePolicy
5858
.build();
5959
case 2:
6060
return SnapshotLifecyclePolicyMetadata.builder(instance)
61-
.setHeaders(randomValueOtherThan(instance.getHeaders(), SnapshotLifecyclePolicyMetadataTests::randomHeaders))
61+
.setModifiedDate(randomValueOtherThan(instance.getModifiedDate(), ESTestCase::randomNonNegativeLong))
6262
.build();
6363
case 3:
64+
return SnapshotLifecyclePolicyMetadata.builder(instance)
65+
.setHeaders(randomValueOtherThan(instance.getHeaders(), SnapshotLifecyclePolicyMetadataTests::randomHeaders))
66+
.build();
67+
case 4:
6468
return SnapshotLifecyclePolicyMetadata.builder(instance)
6569
.setLastSuccess(randomValueOtherThan(instance.getLastSuccess(),
6670
SnapshotInvocationRecordTests::randomSnapshotInvocationRecord))
6771
.build();
68-
case 4:
72+
case 5:
6973
return SnapshotLifecyclePolicyMetadata.builder(instance)
7074
.setLastFailure(randomValueOtherThan(instance.getLastFailure(),
7175
SnapshotInvocationRecordTests::randomSnapshotInvocationRecord))

x-pack/plugin/ilm/src/test/java/org/elasticsearch/xpack/snapshotlifecycle/SnapshotLifecyclePolicyTests.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Map;
1919

2020
import static org.hamcrest.Matchers.containsInAnyOrder;
21+
import static org.hamcrest.Matchers.equalTo;
2122
import static org.hamcrest.Matchers.greaterThan;
2223
import static org.hamcrest.Matchers.startsWith;
2324

@@ -43,6 +44,11 @@ public void testNameGeneration() {
4344
assertThat(p.generateSnapshotName(context), startsWith("name-2019-03-15.21:09:00-"));
4445
}
4546

47+
public void testNextExecutionTime() {
48+
SnapshotLifecyclePolicy p = new SnapshotLifecyclePolicy("id", "name", "0 1 2 3 4 ? 2099", "repo", Collections.emptyMap());
49+
assertThat(p.calculateNextExecution(), equalTo(4078864860000L));
50+
}
51+
4652
public void testValidation() {
4753
SnapshotLifecyclePolicy policy = new SnapshotLifecyclePolicy("a,b", "<my, snapshot-{now/M}>",
4854
"* * * * * L", " ", Collections.emptyMap());

0 commit comments

Comments
 (0)