diff options
3 files changed, 39 insertions, 9 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/BuildService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/BuildService.java index e9fa196d44e..bb2de87796b 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/BuildService.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/BuildService.java @@ -16,10 +16,25 @@ public interface BuildService { void trigger(BuildJob buildJob); /** - * Returns whether the given job is currently running. + * Returns the state of the given job in the build service. */ - // TODO jvenstad: Change to enum State { idle, running, queued, disabled } - boolean isRunning(BuildJob buildJob); + JobState stateOf(BuildJob buildJob); + + enum JobState { + + /** Job is not running, and may be triggered. */ + idle, + + /** Job is already running, and will be queued if triggered now. */ + running, + + /** Job is running and queued and will automatically be started again after it finishes its current run. */ + queued, + + /** Job is disabled, i.e., it can not be triggered. */ + disabled + + } class BuildJob { diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockBuildService.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockBuildService.java index 9219619dc9e..a8320f56fff 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockBuildService.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockBuildService.java @@ -9,6 +9,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static com.yahoo.vespa.hosted.controller.api.integration.BuildService.JobState.idle; +import static com.yahoo.vespa.hosted.controller.api.integration.BuildService.JobState.running; + /** * @author jvenstad */ @@ -22,8 +25,8 @@ public class MockBuildService extends AbstractComponent implements BuildService } @Override - public boolean isRunning(BuildJob buildJob) { - return jobs.contains(buildJob); + public JobState stateOf(BuildJob buildJob) { + return jobs.contains(buildJob) ? running : idle; } /** List all running jobs. */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java index 510260434a2..72de9a211dd 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java @@ -11,6 +11,7 @@ import com.yahoo.vespa.hosted.controller.ApplicationController; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.LockedApplication; import com.yahoo.vespa.hosted.controller.api.integration.BuildService; +import com.yahoo.vespa.hosted.controller.api.integration.BuildService.JobState; import com.yahoo.vespa.hosted.controller.application.ApplicationList; import com.yahoo.vespa.hosted.controller.application.ApplicationVersion; import com.yahoo.vespa.hosted.controller.application.Change; @@ -28,6 +29,7 @@ import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; @@ -43,6 +45,9 @@ import static com.yahoo.config.provision.Environment.prod; import static com.yahoo.config.provision.Environment.staging; import static com.yahoo.config.provision.Environment.test; import static com.yahoo.vespa.hosted.controller.api.integration.BuildService.BuildJob; +import static com.yahoo.vespa.hosted.controller.api.integration.BuildService.JobState.disabled; +import static com.yahoo.vespa.hosted.controller.api.integration.BuildService.JobState.queued; +import static com.yahoo.vespa.hosted.controller.api.integration.BuildService.JobState.running; import static com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobType.component; import static com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobType.stagingTest; import static com.yahoo.vespa.hosted.controller.application.DeploymentJobs.JobType.systemTest; @@ -222,11 +227,18 @@ public class DeploymentTrigger { .flatMap(List::stream); } - /** Returns whether the given job is currently running; false if completed since last triggered, asking the build service othewise. */ + /** Returns whether the given job is currently running; false if completed since last triggered, asking the build service otherwise. */ public boolean isRunning(Application application, JobType jobType) { return ! application.deploymentJobs().statusOf(jobType) - .flatMap(job -> job.lastCompleted().map(run -> run.at().isAfter(job.lastTriggered().get().at()))).orElse(false) - && buildService.isRunning(BuildJob.of(application.id(), application.deploymentJobs().projectId().getAsLong(), jobType.jobName())); + .flatMap(job -> job.lastCompleted().map(run -> run.at().isAfter(job.lastTriggered().get().at()))) + .orElse(false) + && jobStateIsAmong(application, jobType, running, queued); + } + + private boolean jobStateIsAmong(Application application, JobType jobType, JobState state, JobState... states) { + return EnumSet.of(state, states).contains(buildService.stateOf(BuildJob.of(application.id(), + application.deploymentJobs().projectId().getAsLong(), + jobType.jobName()))); } public List<JobType> forceTrigger(ApplicationId applicationId, JobType jobType) { @@ -411,7 +423,7 @@ public class DeploymentTrigger { private boolean canTrigger(Job job) { Application application = applications().require(job.applicationId()); - if (isRunning(application, job.jobType)) + if (isRunning(application, job.jobType) || jobStateIsAmong(application, job.jobType, disabled)) return false; if (successOn(application, job.jobType, job.target).filter(run -> sourcesMatchIfPresent(job.target, run)).isPresent()) |