From ed584bf928e2c83cea57b7b2966956777b147bad Mon Sep 17 00:00:00 2001 From: jonmv Date: Mon, 15 May 2023 12:02:17 +0200 Subject: Add submission timestamp for prod packages, and show in detail API --- .../integration/deployment/ApplicationVersion.java | 25 ++++++++++++++++------ .../controller/deployment/RevisionHistory.java | 2 +- .../hosted/controller/deployment/Submission.java | 12 +++++------ .../persistence/ApplicationSerializer.java | 5 ++++- .../restapi/application/ApplicationApiHandler.java | 4 ++-- .../application/JobControllerApiHandlerHelper.java | 1 + .../vespa/hosted/controller/ControllerTest.java | 4 ++-- .../controller/deployment/DeploymentContext.java | 2 +- .../controller/maintenance/JobRunnerTest.java | 17 +++++++++------ .../persistence/ApplicationSerializerTest.java | 4 +++- .../responses/deployment-overview-2.json | 9 +++++--- .../application/responses/deployment-overview.json | 12 +++++++---- 12 files changed, 63 insertions(+), 34 deletions(-) diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/ApplicationVersion.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/ApplicationVersion.java index eb2005bf268..29e1d494ffc 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/ApplicationVersion.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/deployment/ApplicationVersion.java @@ -35,12 +35,14 @@ public class ApplicationVersion implements Comparable { private final boolean hasPackage; private final boolean shouldSkip; private final Optional description; + private final Optional submittedAt; private final int risk; public ApplicationVersion(RevisionId id, Optional source, Optional authorEmail, Optional compileVersion, Optional allowedMajor, Optional buildTime, Optional sourceUrl, Optional commit, Optional bundleHash, - Optional obsoleteAt, boolean hasPackage, boolean shouldSkip, Optional description, int risk) { + Optional obsoleteAt, boolean hasPackage, boolean shouldSkip, Optional description, + Optional submittedAt, int risk) { if (commit.isPresent() && commit.get().length() > 128) throw new IllegalArgumentException("Commit may not be longer than 128 characters"); @@ -64,6 +66,7 @@ public class ApplicationVersion implements Comparable { this.hasPackage = hasPackage; this.shouldSkip = shouldSkip; this.description = description; + this.submittedAt = requireNonNull(submittedAt); this.risk = requireAtLeast(risk, "application build risk", 0); } @@ -73,15 +76,18 @@ public class ApplicationVersion implements Comparable { /** Creates a minimal version for a development build. */ public static ApplicationVersion forDevelopment(RevisionId id, Optional compileVersion, Optional allowedMajor) { - return new ApplicationVersion(id, Optional.empty(), Optional.empty(), compileVersion, allowedMajor, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), true, false, Optional.empty(), 0); + return new ApplicationVersion(id, Optional.empty(), Optional.empty(), compileVersion, allowedMajor, Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), true, false, + Optional.empty(), Optional.empty(), 0); } /** Creates a version from a completed build, an author email, and build metadata. */ public static ApplicationVersion forProduction(RevisionId id, Optional source, Optional authorEmail, Optional compileVersion, Optional allowedMajor, Optional buildTime, Optional sourceUrl, - Optional commit, Optional bundleHash, Optional description, int risk) { + Optional commit, Optional bundleHash, Optional description, Instant submittedAt, int risk) { return new ApplicationVersion(id, source, authorEmail, compileVersion, allowedMajor, buildTime, - sourceUrl, commit, bundleHash, Optional.empty(), true, false, description, risk); + sourceUrl, commit, bundleHash, Optional.empty(), true, false, + description, Optional.of(submittedAt), risk); } /** Returns a unique identifier for this version or "unknown" if version is not known */ @@ -140,12 +146,12 @@ public class ApplicationVersion implements Comparable { /** Returns a copy of this without a package stored. */ public ApplicationVersion withoutPackage() { - return new ApplicationVersion(id, source, authorEmail, compileVersion, allowedMajor, buildTime, sourceUrl, commit, bundleHash, obsoleteAt, false, shouldSkip, description, risk); + return new ApplicationVersion(id, source, authorEmail, compileVersion, allowedMajor, buildTime, sourceUrl, commit, bundleHash, obsoleteAt, false, shouldSkip, description, submittedAt, risk); } /** Returns a copy of this which is obsolete now. */ public ApplicationVersion obsoleteAt(Instant now) { - return new ApplicationVersion(id, source, authorEmail, compileVersion, allowedMajor, buildTime, sourceUrl, commit, bundleHash, Optional.of(now), hasPackage, shouldSkip, description, risk); + return new ApplicationVersion(id, source, authorEmail, compileVersion, allowedMajor, buildTime, sourceUrl, commit, bundleHash, Optional.of(now), hasPackage, shouldSkip, description, submittedAt, risk); } /** Returns the instant at which this became obsolete, i.e., no longer relevant for automated deployments. */ @@ -160,7 +166,7 @@ public class ApplicationVersion implements Comparable { /** Returns a copy of this which will not be rolled out to production. */ public ApplicationVersion skipped() { - return new ApplicationVersion(id, source, authorEmail, compileVersion, allowedMajor, buildTime, sourceUrl, commit, bundleHash, obsoleteAt, hasPackage, true, description, risk); + return new ApplicationVersion(id, source, authorEmail, compileVersion, allowedMajor, buildTime, sourceUrl, commit, bundleHash, obsoleteAt, hasPackage, true, description, submittedAt, risk); } /** Whether we still have the package for this revision. */ @@ -178,6 +184,11 @@ public class ApplicationVersion implements Comparable { return description; } + /** Instant at which this version was submitted to the build system. */ + public Optional submittedAt() { + return submittedAt; + } + /** The assumed risk of rolling out this revision, relative to the previous. */ public int risk() { return risk; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/RevisionHistory.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/RevisionHistory.java index 272417ba0ac..72fff51d6b2 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/RevisionHistory.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/RevisionHistory.java @@ -93,7 +93,7 @@ public class RevisionHistory { // Fallback for when an application version isn't known for the given key. private static ApplicationVersion revisionOf(RevisionId id) { - return new ApplicationVersion(id, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), false, false, Optional.empty(), 0); + return new ApplicationVersion(id, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), false, false, Optional.empty(), Optional.empty(), 0); } /** Returns the production {@link ApplicationVersion} with this revision ID. */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/Submission.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/Submission.java index 6c9de2fd584..e59b4eb0a07 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/Submission.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/Submission.java @@ -5,8 +5,8 @@ import com.yahoo.vespa.hosted.controller.api.integration.deployment.RevisionId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.SourceRevision; import com.yahoo.vespa.hosted.controller.application.pkg.ApplicationPackage; +import java.time.Instant; import java.util.Optional; -import java.util.OptionalInt; import static com.yahoo.vespa.hosted.controller.application.pkg.ApplicationPackage.calculateHash; @@ -21,23 +21,22 @@ public class Submission { private final Optional source; private final Optional authorEmail; private final Optional description; + private final Instant now; private final int risk; public Submission(ApplicationPackage applicationPackage, byte[] testPackage, Optional sourceUrl, - Optional source, Optional authorEmail, Optional description, int risk) { + Optional source, Optional authorEmail, Optional description, + Instant now, int risk) { this.applicationPackage = applicationPackage; this.testPackage = testPackage; this.sourceUrl = sourceUrl; this.source = source; this.authorEmail = authorEmail; this.description = description; + this.now = now; this.risk = risk; } - public static Submission basic(ApplicationPackage applicationPackage, byte[] testPackage) { - return new Submission(applicationPackage, testPackage, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), 0); - } - public ApplicationVersion toApplicationVersion(long number) { return ApplicationVersion.forProduction(RevisionId.forProduction(number), source, @@ -49,6 +48,7 @@ public class Submission { source.map(SourceRevision::commit), Optional.of(applicationPackage.bundleHash() + calculateHash(testPackage)), description, + now, risk); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java index e5006ab9785..9890a5b361b 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java @@ -116,6 +116,7 @@ public class ApplicationSerializer { private static final String branchField = "branchField"; private static final String commitField = "commitField"; private static final String descriptionField = "description"; + private static final String submittedAtField = "submittedAt"; private static final String riskField = "risk"; private static final String authorEmailField = "authorEmailField"; private static final String deployedDirectlyField = "deployedDirectly"; @@ -271,6 +272,7 @@ public class ApplicationSerializer { object.setBool(hasPackageField, applicationVersion.hasPackage()); object.setBool(shouldSkipField, applicationVersion.shouldSkip()); applicationVersion.description().ifPresent(description -> object.setString(descriptionField, description)); + applicationVersion.submittedAt().ifPresent(at -> object.setLong(submittedAtField, at.toEpochMilli())); if (applicationVersion.risk() != 0) object.setLong(riskField, applicationVersion.risk()); applicationVersion.bundleHash().ifPresent(bundleHash -> object.setString(bundleHashField, bundleHash)); } @@ -496,11 +498,12 @@ public class ApplicationSerializer { boolean hasPackage = object.field(hasPackageField).asBool(); boolean shouldSkip = object.field(shouldSkipField).asBool(); Optional description = SlimeUtils.optionalString(object.field(descriptionField)); + Optional submittedAt = SlimeUtils.optionalInstant(object.field(submittedAtField)); int risk = (int) object.field(riskField).asLong(); Optional bundleHash = SlimeUtils.optionalString(object.field(bundleHashField)); return new ApplicationVersion(id, sourceRevision, authorEmail, compileVersion, allowedMajor, buildTime, - sourceUrl, commit, bundleHash, obsoleteAt, hasPackage, shouldSkip, description, risk); + sourceUrl, commit, bundleHash, obsoleteAt, hasPackage, shouldSkip, description, submittedAt, risk); } private Optional sourceRevisionFromSlime(Inspector object) { 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 f7cca7d1015..f911bde9535 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 @@ -3070,7 +3070,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { ApplicationPackage applicationPackage = new ApplicationPackage(dataParts.get(APPLICATION_ZIP), true, controller.system().isPublic()); byte[] testPackage = dataParts.getOrDefault(APPLICATION_TEST_ZIP, new byte[0]); - Submission submission = new Submission(applicationPackage, testPackage, sourceUrl, sourceRevision, authorEmail, description, risk); + Submission submission = new Submission(applicationPackage, testPackage, sourceUrl, sourceRevision, authorEmail, description, controller.clock().instant(), risk); TenantName tenantName = TenantName.from(tenant); controller.applications().verifyPlan(tenantName); @@ -3089,7 +3089,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { JobControllerApiHandlerHelper.submitResponse(controller.jobController(), TenantAndApplicationId.from(tenant, application), new Submission(ApplicationPackage.deploymentRemoval(), new byte[0], Optional.empty(), - Optional.empty(), Optional.empty(), Optional.empty(), 0), + Optional.empty(), Optional.empty(), Optional.empty(), controller.clock().instant(), 0), 0); return new MessageResponse("All deployments removed"); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java index 7f2b8c8a924..2f93ce999cd 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java @@ -416,6 +416,7 @@ class JobControllerApiHandlerHelper { version.description().ifPresent(description -> versionObject.setString("description", description)); if (version.risk() != 0) versionObject.setLong("risk", version.risk()); versionObject.setBool("deployable", version.isDeployable()); + version.submittedAt().ifPresent(submittedAt -> versionObject.setLong("submittedAt", submittedAt.toEpochMilli())); } static void toSlime(Cursor versionObject, ApplicationVersion version) { diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java index 04c8c46e1ef..693a74f8651 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java @@ -109,7 +109,7 @@ public class ControllerTest { context.submit(applicationPackage); RevisionId id = RevisionId.forProduction(1); Version compileVersion = new Version("6.1"); - assertEquals(new ApplicationVersion(id, Optional.of(DeploymentContext.defaultSourceRevision), Optional.of("a@b"), Optional.of(compileVersion), Optional.empty(), Optional.of(Instant.ofEpochSecond(1)), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), true, false, Optional.empty(), 0), + assertEquals(new ApplicationVersion(id, Optional.of(DeploymentContext.defaultSourceRevision), Optional.of("a@b"), Optional.of(compileVersion), Optional.empty(), Optional.of(Instant.ofEpochSecond(1)), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), true, false, Optional.empty(), Optional.empty(), 0), context.application().revisions().get(context.instance().change().revision().get()), "Application version is known from completion of initial job"); context.runJob(systemTest); @@ -1339,7 +1339,7 @@ public class ControllerTest { ApplicationPackage applicationPackage = ApplicationPackageBuilder.fromDeploymentXml(deploymentXml); byte[] testPackage = ApplicationPackage.filesZip(Map.of("tests/staging-test/foo.json", new byte[0])); var app = tester.newDeploymentContext(); - tester.jobs().submit(app.application().id(), Submission.basic(applicationPackage, testPackage), 1); + tester.jobs().submit(app.application().id(), new Submission(applicationPackage, testPackage, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Instant.EPOCH, 0), 1); assertEquals(List.of(new Notification(tester.clock().instant(), Type.testPackage, Level.warning, diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java index d32ec03469e..da982fa67a8 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java @@ -318,7 +318,7 @@ public class DeploymentContext { .projectId() .orElse(1000); // These are really set through submission, so just pick one if it hasn't been set. var testerpackage = new byte[]{ (byte) (salt >> 56), (byte) (salt >> 48), (byte) (salt >> 40), (byte) (salt >> 32), (byte) (salt >> 24), (byte) (salt >> 16), (byte) (salt >> 8), (byte) salt }; - lastSubmission = jobs.submit(applicationId, new Submission(applicationPackage, testerpackage, Optional.empty(), sourceRevision, Optional.of("a@b"), Optional.empty(), risk), projectId).id(); + lastSubmission = jobs.submit(applicationId, new Submission(applicationPackage, testerpackage, Optional.empty(), sourceRevision, Optional.of("a@b"), Optional.empty(), tester.clock().instant(), risk), projectId).id(); return this; } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/JobRunnerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/JobRunnerTest.java index f761c605f9d..b0fe2867ab7 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/JobRunnerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/JobRunnerTest.java @@ -24,6 +24,7 @@ import com.yahoo.vespa.hosted.controller.integration.MetricsMock; import org.junit.jupiter.api.Test; import java.time.Duration; +import java.time.Instant; import java.util.Collections; import java.util.EnumMap; import java.util.List; @@ -92,7 +93,7 @@ public class JobRunnerTest { TenantAndApplicationId appId = tester.createApplication("tenant", "real", "default").id(); ApplicationId id = appId.defaultInstance(); byte[] testPackageBytes = new byte[0]; - jobs.submit(appId, Submission.basic(applicationPackage, testPackageBytes), 2); + jobs.submit(appId, submission(applicationPackage, testPackageBytes), 2); start(jobs, id, systemTest); try { start(jobs, id, systemTest); @@ -128,7 +129,7 @@ public class JobRunnerTest { TenantAndApplicationId appId = tester.createApplication("tenant", "real", "default").id(); ApplicationId id = appId.defaultInstance(); byte[] testPackageBytes = new byte[0]; - jobs.submit(appId, Submission.basic(applicationPackage, testPackageBytes), 2); + jobs.submit(appId, submission(applicationPackage, testPackageBytes), 2); Supplier run = () -> jobs.last(id, systemTest).get(); start(jobs, id, systemTest); @@ -236,7 +237,7 @@ public class JobRunnerTest { TenantAndApplicationId appId = tester.createApplication("tenant", "real", "default").id(); ApplicationId id = appId.defaultInstance(); byte[] testPackageBytes = new byte[0]; - jobs.submit(appId, Submission.basic(applicationPackage, testPackageBytes), 2); + jobs.submit(appId, submission(applicationPackage, testPackageBytes), 2); RunId runId = new RunId(id, systemTest, 1); start(jobs, id, systemTest); @@ -276,7 +277,7 @@ public class JobRunnerTest { ApplicationId instanceId = appId.defaultInstance(); JobId jobId = new JobId(instanceId, systemTest); byte[] testPackageBytes = new byte[0]; - jobs.submit(appId, Submission.basic(applicationPackage, testPackageBytes), 2); + jobs.submit(appId, submission(applicationPackage, testPackageBytes), 2); assertFalse(jobs.lastSuccess(jobId).isPresent()); for (int i = 0; i < jobs.historyLength(); i++) { @@ -372,7 +373,7 @@ public class JobRunnerTest { TenantAndApplicationId appId = tester.createApplication("tenant", "real", "default").id(); ApplicationId id = appId.defaultInstance(); byte[] testPackageBytes = new byte[0]; - jobs.submit(appId, Submission.basic(applicationPackage, testPackageBytes), 2); + jobs.submit(appId, submission(applicationPackage, testPackageBytes), 2); start(jobs, id, systemTest); tester.clock().advance(JobRunner.jobTimeout.plus(Duration.ofSeconds(1))); @@ -390,7 +391,7 @@ public class JobRunnerTest { TenantAndApplicationId appId = tester.createApplication("tenant", "real", "default").id(); ApplicationId id = appId.defaultInstance(); byte[] testPackageBytes = new byte[0]; - jobs.submit(appId, Submission.basic(applicationPackage, testPackageBytes), 2); + jobs.submit(appId, submission(applicationPackage, testPackageBytes), 2); for (Step step : JobProfile.of(systemTest).steps()) outcomes.put(step, running); @@ -475,4 +476,8 @@ public class JobRunnerTest { }; } + private static Submission submission(ApplicationPackage applicationPackage, byte[] testPackage) { + return new Submission(applicationPackage, testPackage, Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Instant.EPOCH, 0); + } + } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java index b71d3cf838b..69b473dce87 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java @@ -105,13 +105,14 @@ public class ApplicationSerializerTest { true, false, Optional.of("~(˘▾˘)~"), + Optional.of(Instant.ofEpochMilli(496)), 3); assertEquals("https://github/org/repo/tree/commit1", applicationVersion1.sourceUrl().get()); RevisionId id = RevisionId.forDevelopment(31, new JobId(id1, DeploymentContext.productionUsEast3)); SourceRevision source = new SourceRevision("repo1", "branch1", "commit1"); Version compileVersion = Version.fromString("6.3.1"); - ApplicationVersion applicationVersion2 = new ApplicationVersion(id, Optional.of(source), Optional.of("a@b"), Optional.of(compileVersion), Optional.empty(), Optional.of(Instant.ofEpochMilli(496)), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), true, false, Optional.empty(), 0); + ApplicationVersion applicationVersion2 = new ApplicationVersion(id, Optional.of(source), Optional.of("a@b"), Optional.of(compileVersion), Optional.empty(), Optional.of(Instant.ofEpochMilli(496)), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), true, false, Optional.empty(), Optional.empty(), 0); Instant activityAt = Instant.parse("2018-06-01T10:15:30.00Z"); deployments.add(new Deployment(zone1, CloudAccount.empty, applicationVersion1.id(), Version.fromString("1.2.3"), Instant.ofEpochMilli(3), DeploymentMetrics.none, DeploymentActivity.none, QuotaUsage.none, OptionalDouble.empty())); @@ -179,6 +180,7 @@ public class ApplicationSerializerTest { assertEquals(original.revisions().last().get().hasPackage(), serialized.revisions().last().get().hasPackage()); assertEquals(original.revisions().last().get().shouldSkip(), serialized.revisions().last().get().shouldSkip()); assertEquals(original.revisions().last().get().description(), serialized.revisions().last().get().description()); + assertEquals(original.revisions().last().get().submittedAt(), serialized.revisions().last().get().submittedAt()); assertEquals(original.revisions().last().get().risk(), serialized.revisions().last().get().risk()); assertEquals(original.revisions().withPackage(), serialized.revisions().withPackage()); assertEquals(original.revisions().production(), serialized.revisions().production()); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview-2.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview-2.json index b103b579166..19b3d5dc2d7 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview-2.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview-2.json @@ -1266,21 +1266,24 @@ "compileVersion": "6.1.0", "sourceUrl": "repository1/tree/commit1", "commit": "commit1", - "deployable": true + "deployable": true, + "submittedAt": 14403000 }, { "build": 2, "compileVersion": "6.1.0", "sourceUrl": "repository1/tree/commit1", "commit": "commit1", - "deployable": true + "deployable": true, + "submittedAt": 1000 }, { "build": 1, "compileVersion": "6.1.0", "sourceUrl": "repository1/tree/commit1", "commit": "commit1", - "deployable": true + "deployable": true, + "submittedAt": 0 } ] } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview.json index 500f66a7cdb..1d115049b35 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview.json @@ -706,7 +706,8 @@ "commit": "commit1", "description": "my best commit yet", "risk": 9001, - "deployable": true + "deployable": true, + "submittedAt": 1600000000000 }, { "build": 3, @@ -715,7 +716,8 @@ "commit": "commit1", "description": "my best commit yet", "risk": 9001, - "deployable": false + "deployable": false, + "submittedAt": 1600000000000 }, { "build": 2, @@ -724,7 +726,8 @@ "commit": "commit1", "description": "my best commit yet", "risk": 9001, - "deployable": false + "deployable": false, + "submittedAt": 1600000000000 }, { "build": 1, @@ -733,7 +736,8 @@ "commit": "commit1", "description": "my best commit yet", "risk": 9001, - "deployable": true + "deployable": true, + "submittedAt": 1600000000000 } ] } -- cgit v1.2.3