summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/BuildService.java21
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockBuildService.java7
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java20
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())