summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java26
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java37
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() {