/** * DeployMan # Thomas Uhrig (Stuttgart, 2014) # www.tuhrig.de */ package de.tuhrig.deployman.docker; import java.io.IOException; import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; import org.apache.log4j.Logger; import com.amazonaws.services.ec2.model.Instance; import com.github.dockerjava.client.DockerClient; import com.github.dockerjava.client.DockerException; import com.github.dockerjava.client.model.Container; import com.github.dockerjava.client.model.Image; import com.github.dockerjava.client.model.Info; import com.sun.jersey.api.client.ClientResponse; import de.tuhrig.deployman.aws.Ec2; import de.tuhrig.deployman.interfaces.WebInterface; import static de.tuhrig.deployman.DeployMan.*; /** * @author tuhrig */ public class DockerRemoteClient { private static final Logger log = Logger.getLogger(WebInterface.class.getName()); private static final String DOCKER_PORT = "4243"; //$NON-NLS-1$ private static final String COLON = ":"; //$NON-NLS-1$ private static final String HTTP = "http://"; //$NON-NLS-1$ // public void printImages( String instanceId ) // { // try // { // String result = new SshClient().runCommand( instanceId, "sudo docker images" ); //$NON-NLS-1$ // // console.write( result ); // console.newLine(); // } // catch ( JSchException | IOException e ) // { // console.write( "Cannot list Docker images" ); //$NON-NLS-1$ // e.printStackTrace(); // } // } public DockerClient getDockerClientForInstance(String instanceId) throws DockerException { Instance instance = new Ec2().getEC2InstanceById(instanceId); String dockerUrl = HTTP + instance.getPublicIpAddress() + COLON + DOCKER_PORT; log.info("Get Docker client for " + dockerUrl); //$NON-NLS-1$ return new DockerClient(dockerUrl); } public void stopContainer(String instanceId, String containerId) { try { DockerClient dockerClient = getDockerClientForInstance(instanceId); dockerClient.stopContainerCmd(containerId); } catch (DockerException e) { console.exception(e, "Cannot stop Docker container"); //$NON-NLS-1$ } } public void removeContainer(String instanceId, String containerId) { try { DockerClient dockerClient = getDockerClientForInstance(instanceId); dockerClient.removeContainerCmd(containerId); } catch (DockerException e) { console.exception(e, "Cannot remove Docker container"); //$NON-NLS-1$ } } public void startContainer(String instanceId, String containerId) { try { DockerClient dockerClient = getDockerClientForInstance(instanceId); dockerClient.startContainerCmd(containerId); } catch (DockerException e) { console.exception(e, "Cannot start Docker container"); //$NON-NLS-1$ } } public DockerContainer getContainer(String instanceId, String containerId) { DockerContainer container = new DockerContainer(); container.setLog(getLogOfContainer(instanceId, containerId)); container.setId(containerId); return container; } public String getLogOfContainer(String instanceId, String containerId) { try { DockerClient dockerClient = getDockerClientForInstance(instanceId); ClientResponse response = dockerClient.logContainerCmd(containerId).withStdOut().withStdErr().exec(); StringBuilder builder = new StringBuilder(); try { LineIterator itr = IOUtils.lineIterator(response.getEntityInputStream(), "UTF-8"); //$NON-NLS-1$ while (itr.hasNext()) { String line = itr.next(); builder.append(line); builder.append(NL); } } finally { IOUtils.closeQuietly(response.getEntityInputStream()); } return builder.toString(); } catch (DockerException | IOException e) { console.exception(e, "Cannot get Docker log"); //$NON-NLS-1$ } return "no log available"; //$NON-NLS-1$ } public void printImages(String instanceId) { console.write("List Docker images of " + instanceId); //$NON-NLS-1$ try { DockerClient dockerClient = getDockerClientForInstance(instanceId); List<Image> images = dockerClient.listImagesCmd().exec(); console.printImages(images); } catch (DockerException e) { console.exception(e, "Cannot print Docker information"); //$NON-NLS-1$ } } public void printInfo(String instanceId) { console.write("Docker info of " + instanceId); //$NON-NLS-1$ try { DockerClient dockerClient = getDockerClientForInstance(instanceId); Info info = dockerClient.infoCmd().exec(); console.printDockerInfo(info); } catch (DockerException e) { console.exception(e, "Cannot print Docker information"); //$NON-NLS-1$ } } public void printContainers(String instanceId) { console.write("Docker containers of " + instanceId); //$NON-NLS-1$ try { DockerClient dockerClient = getDockerClientForInstance(instanceId); List<Container> containers = dockerClient.listContainersCmd().exec(); console.printContainers(containers); } catch (DockerException e) { console.exception(e, "Cannot print Docker containers"); //$NON-NLS-1$ } } }