diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2021-11-29 16:29:03 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2021-11-29 16:29:03 +0100 |
commit | dec042baccbac2e2c8f01c1e808cc686e00bca4a (patch) | |
tree | 6ea55494699a5cc826e5574269da08a938d8622f /controller-server/src/main/java | |
parent | 974b223bb6a99865bc9a72e39d2fe86568564179 (diff) |
Accept optional build to roll out
Diffstat (limited to 'controller-server/src/main/java')
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java | 24 |
1 files changed, 23 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); |