diff options
author | Jon Marius Venstad <jonmv@users.noreply.github.com> | 2019-01-25 14:55:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-25 14:55:39 +0100 |
commit | f513ad17ce91fd6beeab36608f2616cf742e8d58 (patch) | |
tree | 1b5cf44ce924ffe04eea51dab317c4a0f8997054 /controller-server | |
parent | 3d3887c87c3c8cc36f4531a6ccfc9b71cd353ee7 (diff) | |
parent | 0534c1018cf48540331ea2e0aed8ef9b6cd14717 (diff) |
Merge pull request #8188 from vespa-engine/andreer/redeploy-with-existing-versions
enable manually redeploying without specifying versions
Diffstat (limited to 'controller-server')
2 files changed, 61 insertions, 2 deletions
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 1d02a25bde5..c1b7f965135 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 @@ -880,9 +880,31 @@ public class ApplicationApiHandler extends LoggingRequestHandler { applicationPackage = Optional.of(controller.applications().getApplicationPackage(controller.applications().require(applicationId), applicationVersion.get())); } + + boolean deployDirectly = deployOptions.field("deployDirectly").asBool(); + Optional<Version> vespaVersion = optional("vespaVersion", deployOptions).map(Version::new); + + if(deployDirectly && !applicationPackage.isPresent() && !applicationVersion.isPresent() && !vespaVersion.isPresent()) { + // Redeploy the existing deployment with the same versions. + Optional<Deployment> deployment = controller.applications().get(applicationId) + .map(Application::deployments) + .flatMap(deployments -> Optional.ofNullable(deployments.get(zone))); + + if(!deployment.isPresent()) + throw new IllegalArgumentException("Can't redeploy application, no deployment currently exist"); + + ApplicationVersion version = deployment.get().applicationVersion(); + if(version.isUnknown()) + throw new IllegalArgumentException("Can't redeploy application, application version is unknown"); + + applicationVersion = Optional.of(version); + vespaVersion = Optional.of(deployment.get().version()); + applicationPackage = Optional.of(controller.applications().getApplicationPackage(controller.applications().require(applicationId), applicationVersion.get())); + } + // TODO: get rid of the json object - DeployOptions deployOptionsJsonClass = new DeployOptions(deployOptions.field("deployDirectly").asBool(), - optional("vespaVersion", deployOptions).map(Version::new), + DeployOptions deployOptionsJsonClass = new DeployOptions(deployDirectly, + vespaVersion, deployOptions.field("ignoreValidationErrors").asBool(), deployOptions.field("deployCurrentVersion").asBool()); ActivateResult result = controller.applications().deploy(applicationId, 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 6e98fd04f9f..38dd6877703 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 @@ -1131,6 +1131,43 @@ public class ApplicationApiTest extends ControllerContainerTest { new File("deploy-result.json")); } + @Test + public void redeployment_succeeds_when_not_specifying_versions_or_application_package() { + // Setup + addUserToHostedOperatorRole(HostedAthenzIdentities.from(HOSTED_VESPA_OPERATOR)); + tester.computeVersionStatus(); + + ApplicationPackage applicationPackage = new ApplicationPackageBuilder() + .upgradePolicy("default") + .athenzIdentity(com.yahoo.config.provision.AthenzDomain.from("domain1"), com.yahoo.config.provision.AthenzService.from("service")) + .environment(Environment.prod) + .region("us-west-1") + .build(); + long screwdriverProjectId = 123; + ScrewdriverId screwdriverId = new ScrewdriverId(Long.toString(screwdriverProjectId)); + + createAthenzDomainWithAdmin(ATHENZ_TENANT_DOMAIN, USER_ID); + + Application application = controllerTester.createApplication(ATHENZ_TENANT_DOMAIN.getName(), "tenant1", "application1"); + controllerTester.authorize(ATHENZ_TENANT_DOMAIN, screwdriverId, ApplicationAction.deploy, application); + + // Allow systemtest to succeed by notifying completion of system test + controllerTester.jobCompletion(JobType.component) + .application(application.id()) + .projectId(screwdriverProjectId) + .uploadArtifact(applicationPackage) + .submit(); + tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/environment/test/region/us-east-1/instance/default/", POST) + .data(createApplicationDeployData(applicationPackage, false)) + .screwdriverIdentity(screwdriverId), + new File("deploy-result.json")); + + tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/environment/test/region/us-east-1/instance/default/", POST) + .data(createApplicationDeployData(Optional.empty(), true)) + .userIdentity(HOSTED_VESPA_OPERATOR), + new File("deploy-result.json")); + } + @Test public void testJobStatusReporting() { |