diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2020-11-25 10:34:14 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2020-11-25 10:34:14 +0100 |
commit | a66caff88371e789a3ad8078505bf562149ac57e (patch) | |
tree | def0647cd47ad8f0f23d276b83f8c97871eded9e | |
parent | 286ff1b50c40b50ab59ea2487e66c1cfae258384 (diff) |
Extended reindexing status in controller
4 files changed, 71 insertions, 8 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/ApplicationReindexing.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/ApplicationReindexing.java index 8d002640156..b6c7899aef1 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/ApplicationReindexing.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/ApplicationReindexing.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.controller.api.integration.configserver; import java.time.Instant; import java.util.Map; import java.util.Objects; +import java.util.Optional; import static java.util.Objects.requireNonNull; @@ -115,31 +116,69 @@ public class ApplicationReindexing { public static class Status { private final Instant readyAt; + private final Instant startedAt; + private final Instant endedAt; + private final State state; + private final String message; + private final String progress; + + public Status(Instant readyAt, Instant startedAt, Instant endedAt, State state, String message, String progress) { + this.readyAt = readyAt; + this.startedAt = startedAt; + this.endedAt = endedAt; + this.state = state; + this.message = message; + this.progress = progress; + } public Status(Instant readyAt) { - this.readyAt = requireNonNull(readyAt); + this(readyAt, null, null, null, null, null); } - public Instant readyAt() { return readyAt; } + public Optional<Instant> readyAt() { return Optional.ofNullable(readyAt); } + public Optional<Instant> startedAt() { return Optional.ofNullable(startedAt); } + public Optional<Instant> endedAt() { return Optional.ofNullable(endedAt); } + public Optional<State> state() { return Optional.ofNullable(state); } + public Optional<String> message() { return Optional.ofNullable(message); } + public Optional<String> progress() { return Optional.ofNullable(progress); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Status status = (Status) o; - return readyAt.equals(status.readyAt); + return Objects.equals(readyAt, status.readyAt) && + Objects.equals(startedAt, status.startedAt) && + Objects.equals(endedAt, status.endedAt) && + state == status.state && + Objects.equals(message, status.message) && + Objects.equals(progress, status.progress); } @Override public int hashCode() { - return Objects.hash(readyAt); + return Objects.hash(readyAt, startedAt, endedAt, state, message, progress); } @Override public String toString() { - return "ready at " + readyAt; + return "Status{" + + "readyAt=" + readyAt + + ", startedAt=" + startedAt + + ", endedAt=" + endedAt + + ", state=" + state + + ", message='" + message + '\'' + + ", progress='" + progress + '\'' + + '}'; } } + + public enum State { + + PENDING, RUNNING, FAILED, SUCCESSFUL; + + } + } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index 740a70fc6d1..29e9ec53577 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -1595,7 +1595,22 @@ public class ApplicationApiHandler extends LoggingRequestHandler { } void setStatus(Cursor statusObject, ApplicationReindexing.Status status) { - statusObject.setLong("readyAtMillis", status.readyAt().toEpochMilli()); + status.readyAt().ifPresent(readyAt -> statusObject.setLong("readyAtMillis", readyAt.toEpochMilli())); + status.startedAt().ifPresent(startedAt -> statusObject.setLong("startedAtMillis", startedAt.toEpochMilli())); + status.endedAt().ifPresent(endedAt -> statusObject.setLong("endedAtMillis", endedAt.toEpochMilli())); + status.state().map(ApplicationApiHandler::toString).ifPresent(state -> statusObject.setString("state", state)); + status.message().ifPresent(message -> statusObject.setString("message", message)); + status.progress().ifPresent(progress -> statusObject.setString("progress", progress)); + } + + private static String toString(ApplicationReindexing.State state) { + switch (state) { + case PENDING: return "pending"; + case RUNNING: return "running"; + case FAILED: return "failed"; + case SUCCESSFUL: return "successful"; + default: return null; + } } /** Enables reindexing of an application in a zone. */ diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java index 27b739160fc..4bd321f9926 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java @@ -13,6 +13,7 @@ import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.zone.ZoneId; +import com.yahoo.documentapi.ProgressToken; import com.yahoo.vespa.flags.json.FlagData; import com.yahoo.vespa.hosted.controller.api.application.v4.model.ClusterMetrics; import com.yahoo.vespa.hosted.controller.api.application.v4.model.DeploymentData; @@ -430,9 +431,17 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer Map.of("cluster", new ApplicationReindexing.Cluster(new Status(Instant.ofEpochMilli(234)), Map.of("type", 100L), - Map.of("type", new Status(Instant.ofEpochMilli(345))))))); + Map.of("type", new Status(Instant.ofEpochMilli(345), + Instant.ofEpochMilli(456), + Instant.ofEpochMilli(567), + ApplicationReindexing.State.FAILED, + "(#`д´)ノ", + new ProgressToken().serializeToString())))))); + + } + @Override public void disableReindexing(DeploymentId deployment) { } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java index 5e98ac0d3ee..ad4f2297a8b 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java @@ -608,7 +608,7 @@ public class ApplicationApiTest extends ControllerContainerTest { // GET to get reindexing status tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/instance/instance1/environment/prod/region/us-central-1/reindexing", GET) .userIdentity(USER_ID), - "{\"enabled\":true,\"status\":{\"readyAtMillis\":123},\"clusters\":[{\"name\":\"cluster\",\"status\":{\"readyAtMillis\":234},\"pending\":[{\"type\":\"type\",\"requiredGeneration\":100}],\"ready\":[{\"type\":\"type\",\"readyAtMillis\":345}]}]}"); + "{\"enabled\":true,\"status\":{\"readyAtMillis\":123},\"clusters\":[{\"name\":\"cluster\",\"status\":{\"readyAtMillis\":234},\"pending\":[{\"type\":\"type\",\"requiredGeneration\":100}],\"ready\":[{\"type\":\"type\",\"readyAtMillis\":345,\"startedAtMillis\":456,\"endedAtMillis\":567,\"state\":\"failed\",\"message\":\"(#`д´)ノ\",\"progress\":\"AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}]}]}"); // POST a 'restart application' command tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/environment/prod/region/us-central-1/instance/instance1/restart", POST) |