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.java24
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiTest.java11
2 files changed, 34 insertions, 1 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 1046737d860..ed16c86c94e 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
@@ -1776,15 +1776,37 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler {
/** Trigger deployment to the last known application package for the given application. */
private HttpResponse deployApplication(String tenantName, String applicationName, String instanceName, HttpRequest request) {
ApplicationId id = ApplicationId.from(tenantName, applicationName, instanceName);
+ Inspector buildField = toSlime(request.getData()).get().field("build");
+ long build = buildField.valid() ? buildField.asLong() : -1;
+
StringBuilder response = new StringBuilder();
controller.applications().lockApplicationOrThrow(TenantAndApplicationId.from(id), application -> {
- Change change = Change.of(application.get().latestVersion().get());
+ ApplicationVersion version = build == -1 ? application.get().latestVersion().get()
+ : getApplicationVersion(application.get(), build);
+ Change change = Change.of(version);
controller.applications().deploymentTrigger().forceChange(id, change);
response.append("Triggered ").append(change).append(" for ").append(id);
});
return new MessageResponse(response.toString());
}
+ private ApplicationVersion getApplicationVersion(Application application, Long build) {
+ // Check whether this is the latest version, and possibly return that.
+ // Otherwise, look through historic runs for a proper ApplicationVersion.
+ return application.latestVersion()
+ .filter(version -> version.buildNumber().stream().anyMatch(build::equals))
+ .or(() -> controller.jobController().deploymentStatus(application).jobs()
+ .asList().stream()
+ .flatMap(job -> job.runs().values().stream())
+ .map(run -> run.versions().targetApplication())
+ .filter(version -> version.buildNumber().stream().anyMatch(build::equals))
+ .findAny())
+ .filter(version -> controller.applications().applicationStore().hasBuild(application.id().tenant(),
+ application.id().application(),
+ build))
+ .orElseThrow(() -> new IllegalArgumentException("Build number '" + build + "' was not found"));
+ }
+
/** Cancel ongoing change for given application, e.g., everything with {"cancel":"all"} */
private HttpResponse cancelDeploy(String tenantName, String applicationName, String instanceName, String choice) {
ApplicationId id = ApplicationId.from(tenantName, applicationName, instanceName);
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 afd67824ee8..8b8a7fc0c62 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
@@ -525,6 +525,17 @@ public class ApplicationApiTest extends ControllerContainerTest {
.userIdentity(USER_ID),
new File("proton-metrics.json"));
+ // POST a roll-out of the latest application
+ tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/instance/instance1/deploying/application", POST)
+ .userIdentity(USER_ID),
+ "{\"message\":\"Triggered application change to 1.0.1-commit1 for tenant1.application1.instance1\"}");
+
+ // POST a roll-out of a given revision
+ tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/instance/instance1/deploying/application", POST)
+ .data("{ \"build\": 1 }")
+ .userIdentity(USER_ID),
+ "{\"message\":\"Triggered application change to 1.0.1-commit1 for tenant1.application1.instance1\"}");
+
// DELETE (cancel) ongoing change
tester.assertResponse(request("/application/v4/tenant/tenant1/application/application1/instance/instance1/deploying", DELETE)
.userIdentity(HOSTED_VESPA_OPERATOR),