diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-07-16 13:40:25 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-07-16 13:45:25 +0200 |
commit | 9fdac26d4032aef2ba491c69238c8fc039727e05 (patch) | |
tree | eae0fc8f8926c1bb176056f2ce4a6082a256eaa6 | |
parent | ed66c3239ed498be526b1e7543d2d768beca3910 (diff) |
Handle lookup of application version of direct deployments
4 files changed, 110 insertions, 13 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/Versions.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/Versions.java index bef61dda875..068a41ed92c 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/Versions.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/Versions.java @@ -131,18 +131,21 @@ public class Versions { return change.platform().get(); return max(change.platform(), deployment.map(Deployment::version)) - .orElse(application.oldestDeployedPlatform() - .orElse(defaultVersion)); + .orElseGet(() -> application.oldestDeployedPlatform().orElse(defaultVersion)); } private static ApplicationVersion targetApplication(Application application, Change change, Optional<Deployment> deployment) { return max(change.application(), deployment.map(Deployment::applicationVersion)) - .orElse(application.oldestDeployedApplication() - .orElse(application.deploymentJobs().jobStatus().get(JobType.component) - .lastSuccess() - .get() - .application())); + .orElseGet(() -> defaultApplicationVersion(application)); + } + + private static ApplicationVersion defaultApplicationVersion(Application application) { + return application.oldestDeployedApplication() + .orElseGet(() -> Optional.ofNullable(application.deploymentJobs().jobStatus().get(JobType.component)) + .flatMap(JobStatus::lastSuccess) + .map(JobStatus.JobRun::application) + .orElse(ApplicationVersion.unknown)); } private static <T extends Comparable<T>> Optional<T> max(Optional<T> o1, Optional<T> o2) { diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalDeploymentTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalDeploymentTester.java index a992ce1e3de..6725e05dd6d 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalDeploymentTester.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalDeploymentTester.java @@ -34,6 +34,7 @@ import static com.yahoo.vespa.hosted.controller.deployment.RunStatus.aborted; import static com.yahoo.vespa.hosted.controller.deployment.Step.Status.unfinished; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; public class InternalDeploymentTester { @@ -171,7 +172,7 @@ public class InternalDeploymentTester { .findAny() .orElseThrow(() -> new AssertionError(type + " is not among the active: " + jobs.active())); assertFalse(run.hasFailed()); - assertFalse(run.status() == aborted); + assertNotSame(aborted, run.status()); ZoneId zone = type.zone(tester.controller().system()); DeploymentId deployment = new DeploymentId(appId, zone); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java index 616db640132..614df953ca9 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java @@ -2,11 +2,13 @@ package com.yahoo.vespa.hosted.controller.restapi.application; import com.yahoo.component.Version; +import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.container.jdisc.HttpResponse; +import com.yahoo.vespa.hosted.controller.api.application.v4.model.DeployOptions; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; -import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationVersion; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; +import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder; import com.yahoo.vespa.hosted.controller.deployment.InternalDeploymentTester; import org.json.JSONException; import org.json.JSONObject; @@ -134,12 +136,24 @@ public class JobControllerApiHandlerHelperTest { assertResponse(JobControllerApiHandlerHelper.jobTypeResponse(tester.tester().controller(), appId, URI.create("https://some.url:43/root")), "dev-overview.json"); } + @Test + public void testResponsesWithDirectDeployment() { + var tester = new InternalDeploymentTester(); + tester.clock().setInstant(Instant.EPOCH); + var region = "us-west-1"; + var applicationPackage = new ApplicationPackageBuilder().region(region).build(); + // Deploy directly to production zone, like integration tests. + tester.tester().controller().applications().deploy(tester.app().id(), ZoneId.from("prod", region), + Optional.of(applicationPackage), + new DeployOptions(true, Optional.empty(), + false, false)); + assertResponse(JobControllerApiHandlerHelper.jobTypeResponse(tester.tester().controller(), appId, URI.create("https://some.url:43/root/")), + "jobs-direct-deployment.json"); + } + private void compare(HttpResponse response, String expected) throws JSONException, IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); response.render(baos); - - System.err.println(baos); - JSONObject actualJSON = new JSONObject(new String(baos.toByteArray())); JSONObject expectedJSON = new JSONObject(expected); assertEquals(expectedJSON.toString(), actualJSON.toString()); @@ -148,7 +162,7 @@ public class JobControllerApiHandlerHelperTest { private void assertResponse(HttpResponse response, String fileName) { try { Path path = Paths.get("src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/").resolve(fileName); - String expected = new String(Files.readAllBytes(path)); + String expected = Files.readString(path); compare(response, expected); } catch (Exception e) { throw new RuntimeException(e); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/jobs-direct-deployment.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/jobs-direct-deployment.json new file mode 100644 index 00000000000..5535e286dcd --- /dev/null +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/jobs-direct-deployment.json @@ -0,0 +1,79 @@ +{ + "devJobs": {}, + "deployments": [ + { + "us-west-1": { + "at": 0, + "application": { + "hash": "unknown" + }, + "verified": false, + "platform": "6.1" + } + } + ], + "lastVersions": {}, + "deploying": {}, + "jobs": { + "staging-test": { + "runs": [ + { + "reason": "Testing for productionUsWest1", + "wantedPlatform": "6.1", + "currentPlatform": "6.1", + "wantedApplication": { + "hash": "unknown" + }, + "currentApplication": { + "hash": "unknown" + }, + "tasks": { + "capacity": "running" + }, + "status": "pending" + } + ], + "url": "https://some.url:43/root/staging-test" + }, + "system-test": { + "runs": [ + { + "reason": "Testing for productionUsWest1", + "wantedPlatform": "6.1", + "currentPlatform": "6.1", + "wantedApplication": { + "hash": "unknown" + }, + "currentApplication": { + "hash": "unknown" + }, + "tasks": { + "capacity": "running" + }, + "status": "pending" + } + ], + "url": "https://some.url:43/root/system-test" + }, + "us-west-1": { + "runs": [ + { + "wantedPlatform": "6.1", + "currentPlatform": "6.1", + "wantedApplication": { + "hash": "unknown" + }, + "currentApplication": { + "hash": "unknown" + }, + "tasks": { + "staging-test": "pending", + "system-test": "pending" + }, + "status": "pending" + } + ], + "url": "https://some.url:43/root/production-us-west-1" + } + } +} |