package it.dockins.dockerslaves; import hudson.Extension; import hudson.model.AbstractProject; import hudson.model.Node; import hudson.model.Queue; import hudson.model.queue.CauseOfBlockage; import hudson.model.queue.QueueTaskDispatcher; import it.dockins.dockerslaves.spec.ContainerSetDefinition; import jenkins.model.Jenkins; /** * Responsible for allowing tasks to go into buildable state. */ @Extension public class ProvisionScheduler extends QueueTaskDispatcher { @Override public CauseOfBlockage canRun(Queue.Item item) { if (item.task instanceof AbstractProject) { AbstractProject job = (AbstractProject) item.task; ContainerSetDefinition def = (ContainerSetDefinition) job.getProperty(ContainerSetDefinition.class); if (def == null) { return null; } int slaveCount = 0; DockerSlaves plugin = DockerSlaves.get(); for (Node node : Jenkins.getActiveInstance().getNodes()) { if (node instanceof DockerSlave) { if (((DockerSlave)node).getQueueItemId() == item.getId()) { return null; } slaveCount++; } } if (slaveCount >= plugin.getMaxSlaves()) { return new WaitForADockerSlot(); } else { return null; } } else { return null; } } static final class WaitForADockerSlot extends CauseOfBlockage { private WaitForADockerSlot() { } public String getShortDescription() { return "Waiting for a Docker slot"; } } }