package com.nirima.jenkins.plugins.docker.launcher; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.InspectContainerResponse; import com.nirima.jenkins.plugins.docker.DockerTemplate; import com.nirima.jenkins.plugins.docker.DockerTemplateBase; import hudson.model.TaskListener; import hudson.slaves.ComputerLauncher; import hudson.slaves.DelegatingComputerLauncher; import hudson.slaves.SlaveComputer; import shaded.com.google.common.annotations.Beta; import java.io.IOException; /** * Crappy wrapper... On one hand we need store UI configuration, * on other have valid configured launcher that different for host/port/etc for any slave. * <p/> * like {@link DelegatingComputerLauncher} */ @Beta public abstract class DockerComputerLauncher extends ComputerLauncher { protected ComputerLauncher launcher; /** * Return valid configured launcher that will be used for launching slave */ public abstract ComputerLauncher getPreparedLauncher(String cloudId, DockerTemplate dockerTemplate, InspectContainerResponse ir); /** * Contribute container parameters needed for launcher. * i.e. port for exposing, command to run, etc. */ public abstract void appendContainerConfig(DockerTemplate dockerTemplate, CreateContainerCmd createContainerCmd) throws IOException; /** * Wait until slave is up and ready for connection. */ public boolean waitUp(String cloudId, DockerTemplate dockerTemplate, InspectContainerResponse containerInspect) { if (!containerInspect.getState().getRunning()) { throw new IllegalStateException("Container '" + containerInspect.getId() + "' is not running!"); } return true; } public ComputerLauncher getLauncher() { if (launcher == null) { throw new IllegalStateException("Launcher must not be null"); } return launcher; } public void setLauncher(ComputerLauncher launcher) { this.launcher = launcher; } @Override public void launch(SlaveComputer computer, TaskListener listener) throws IOException, InterruptedException { getLauncher().launch(computer, listener); } @Override public void afterDisconnect(SlaveComputer computer, TaskListener listener) { getLauncher().afterDisconnect(computer, listener); } @Override public void beforeDisconnect(SlaveComputer computer, TaskListener listener) { getLauncher().beforeDisconnect(computer, listener); } }