diff options
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() { |