Start container support.
Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/commit/d89c61b3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/tree/d89c61b3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/diff/d89c61b3 Branch: refs/heads/docker Commit: d89c61b3b3b81d07336c888bb60b9873b450b411 Parents: f8dc664 Author: Nadeesh Dilanga <[email protected]> Authored: Mon Jul 11 00:53:41 2016 -0400 Committer: Nadeesh Dilanga <[email protected]> Committed: Mon Jul 11 00:53:41 2016 -0400 ---------------------------------------------------------------------- .../activities/docker/DockerActivity.java | 15 ++++++--- .../docker/DockerContainerConfiguration.java | 11 ++++-- .../DockerContainerConfigurationImpl.java | 35 ++++++++++++++------ .../taverna/activities/docker/RemoteClient.java | 19 ++++++++--- .../docker/test/DockerActivityTest.java | 30 ++++++++++++----- 5 files changed, 80 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/d89c61b3/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerActivity.java ---------------------------------------------------------------------- diff --git a/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerActivity.java b/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerActivity.java index 1a42ac0..a80e02a 100644 --- a/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerActivity.java +++ b/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerActivity.java @@ -61,9 +61,9 @@ public class DockerActivity extends AbstractAsynchronousActivity<JsonNode> { public static final String LIST_CONTAINERS = "list-containers"; - public static final String OUT_CONTAINER_ID = "container-id"; + public static final String CONTAINER_ID = "container-id"; - public static final String OUT_IMAGE_ID = "container-id"; + public static final String OUT_IMAGE_ID = "image-id"; public static final String OUT_IMAGE_AUTHOR = "image-author"; @@ -71,6 +71,8 @@ public class DockerActivity extends AbstractAsynchronousActivity<JsonNode> { public static final String IN_IMAGE_NAME = "image-name"; + public static final String IN_CONTAINER_START_CMD = "cnt-start-cmd"; + public static final String RESPONSE_BODY_KEY = "response_body"; private static Logger LOG = Logger.getLogger(DockerActivity.class); @@ -111,7 +113,7 @@ public class DockerActivity extends AbstractAsynchronousActivity<JsonNode> { outJson = factory.objectNode(); CreateContainerResponse response = remoteClient.createContainer(); - ((ObjectNode)outJson).put(OUT_CONTAINER_ID, response.getId()); + ((ObjectNode)outJson).put(CONTAINER_ID, response.getId()); } else if (INSPECT.equalsIgnoreCase(action)) { @@ -131,7 +133,12 @@ public class DockerActivity extends AbstractAsynchronousActivity<JsonNode> { } } else if (START_CONTAINER.equalsIgnoreCase(action)) { - //TODO + + String id = getRenderedParam(referenceService, context, map.get(CONTAINER_ID)); + remoteClient.startContainer(id); + outJson = factory.objectNode(); + ((ObjectNode)outJson).put("started", id); + } else if (STOP_CONTAINER.equalsIgnoreCase(action)) { // TODO http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/d89c61b3/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerContainerConfiguration.java ---------------------------------------------------------------------- diff --git a/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerContainerConfiguration.java b/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerContainerConfiguration.java index 77e5204..9ec6186 100644 --- a/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerContainerConfiguration.java +++ b/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerContainerConfiguration.java @@ -18,16 +18,23 @@ */ package org.apache.taverna.activities.docker; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.Ports; + public interface DockerContainerConfiguration { public String getName(); public String getImage(); - public String getCmd(); + public String[] getCmd(); public DockerRemoteConfig getDockerRemoteConfig(); - //TODO add all remaining getters + public ExposedPort[] getExposedPorts(); + + public Ports.Binding[] getBindings(); + + //TODO add all remaining getters } http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/d89c61b3/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerContainerConfigurationImpl.java ---------------------------------------------------------------------- diff --git a/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerContainerConfigurationImpl.java b/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerContainerConfigurationImpl.java index dc335ff..5a2fe52 100644 --- a/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerContainerConfigurationImpl.java +++ b/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/DockerContainerConfigurationImpl.java @@ -27,12 +27,9 @@ import org.apache.taverna.configuration.Configurable; import org.apache.taverna.configuration.ConfigurationManager; import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; -public class DockerContainerConfigurationImpl extends AbstractConfigurable implements DockerContainerConfiguration{ +public class DockerContainerConfigurationImpl extends AbstractConfigurable implements DockerContainerConfiguration{ /** * String Values @@ -84,6 +81,8 @@ public class DockerContainerConfigurationImpl extends AbstractConfigurable impl public static final String CMD = "cmd"; + public static final String CMD_DELIMITER = ","; + public static final String ENTRY_POINT = "entrypoint"; /** @@ -217,8 +216,8 @@ public class DockerContainerConfigurationImpl extends AbstractConfigurable impl return ENV; } - public String getCmd() { - return this.getInternalPropertyMap().get(CMD); + public String[] getCmd() { + return this.getInternalPropertyMap().get(CMD).split(CMD_DELIMITER); } public String getEntryPoint() { @@ -229,16 +228,30 @@ public class DockerContainerConfigurationImpl extends AbstractConfigurable impl return VOLUMES; } - public String getBindings() { - return BINDINGS; + public Ports.Binding[] getBindings() { + String bindingsStr = this.getInternalPropertyMap().get(BINDINGS); + List<Ports.Binding> bindingList = new ArrayList<Ports.Binding>(); + if(bindingsStr != null) { + for(String bind : bindingsStr.split(",")){ + bindingList.add(Ports.Binding.bindPort(Integer.valueOf(bind))); + } + } + return bindingList.toArray(new Ports.Binding[0]); } public String getAliases() { return ALIASES; } - public String getExposedPorts() { - return EXPOSED_PORTS; + public ExposedPort[] getExposedPorts() { + String exposedPortStr = this.getInternalPropertyMap().get(EXPOSED_PORTS); + List<ExposedPort> exposedPortList = new ArrayList<ExposedPort>(); + if(exposedPortStr != null){ + for(String portStr: exposedPortStr.split(",")){ + exposedPortList.add(ExposedPort.tcp(Integer.valueOf(portStr))); + } + } + return exposedPortList.toArray(new ExposedPort[0]); } public String getLabels() { http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/d89c61b3/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/RemoteClient.java ---------------------------------------------------------------------- diff --git a/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/RemoteClient.java b/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/RemoteClient.java index 2f1d4c3..aeabc58 100644 --- a/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/RemoteClient.java +++ b/taverna-docker-activity/src/main/java/org/apache/taverna/activities/docker/RemoteClient.java @@ -23,9 +23,7 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectImageResponse; -import com.github.dockerjava.api.model.Container; -import com.github.dockerjava.api.model.Info; -import com.github.dockerjava.api.model.SearchItem; +import com.github.dockerjava.api.model.*; import com.github.dockerjava.core.DockerClientBuilder; import com.github.dockerjava.core.DockerClientConfig; import org.apache.log4j.Logger; @@ -102,8 +100,8 @@ public class RemoteClient { /** * @param containerId To be start */ - public void startContainer(String containerId){ - dockerClient.startContainerCmd(containerId).exec(); + public Void startContainer( String containerId){ + return dockerClient.startContainerCmd(containerId).exec(); } /** @@ -121,10 +119,21 @@ public class RemoteClient { return dockerClient.searchImagesCmd(term).exec(); } + + public void deleteContainer(String id){ + dockerClient.removeContainerCmd(id).exec(); + } + private CreateContainerCmd buildCreateContainerCmd(){ CreateContainerCmd createCmd = dockerClient.createContainerCmd(containerConfig.getImage()); createCmd.withCmd(containerConfig.getCmd()); createCmd.withName(containerConfig.getName()); + Ports portBindings = new Ports(); + for(int i=0; i< containerConfig.getBindings().length; i++){ + portBindings.bind(containerConfig.getExposedPorts()[i], containerConfig.getBindings()[i]); + } + createCmd.withExposedPorts(containerConfig.getExposedPorts()); + createCmd.withPortBindings(portBindings); return createCmd; } http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/d89c61b3/taverna-docker-activity/src/test/java/org/apache/taverna/activities/docker/test/DockerActivityTest.java ---------------------------------------------------------------------- diff --git a/taverna-docker-activity/src/test/java/org/apache/taverna/activities/docker/test/DockerActivityTest.java b/taverna-docker-activity/src/test/java/org/apache/taverna/activities/docker/test/DockerActivityTest.java index 657576a..89af8bd 100755 --- a/taverna-docker-activity/src/test/java/org/apache/taverna/activities/docker/test/DockerActivityTest.java +++ b/taverna-docker-activity/src/test/java/org/apache/taverna/activities/docker/test/DockerActivityTest.java @@ -47,20 +47,16 @@ public class DockerActivityTest { private ObjectNode activityConfiguration; private DockerContainerConfigurationImpl containerConfiguration; - - - public static void main(String[] args) throws Exception { - DockerActivityTest test = new DockerActivityTest(); - test.setup(); - test.testListContainers(); - } + @Before public void setup() throws Exception { activityConfiguration = JsonNodeFactory.instance.objectNode(); containerConfiguration = new DockerContainerConfigurationImpl(new TestConfigurationManager()); - containerConfiguration.getInternalPropertyMap().put(DockerContainerConfigurationImpl.CMD,"env"); + containerConfiguration.getInternalPropertyMap().put(DockerContainerConfigurationImpl.CMD,"python,app.py"); + containerConfiguration.getInternalPropertyMap().put(DockerContainerConfigurationImpl.EXPOSED_PORTS, "5000"); + containerConfiguration.getInternalPropertyMap().put(DockerContainerConfigurationImpl.BINDINGS, "32772"); DockerRemoteConfig remoteConfig = new DockerRemoteConfig(); remoteConfig.setDockerHost("tcp://192.168.99.100:2376"); @@ -146,6 +142,24 @@ public class DockerActivityTest { Assert.assertNotNull(outputs.get(DockerActivity.RESPONSE_BODY_KEY)); } + @Test + public void testStartContainer() throws Exception { + String id = "9e7a5252c1a948149c4e0ca6b4ef7945c9ef11b27cfa251b37abc7d43391680d"; + DockerActivity activity = new DockerActivity(containerConfiguration); + activity.configure(activityConfiguration); + Map<String,Object> inputs = new HashMap<String,Object>(); + inputs.put(DockerActivity.ACTION, DockerActivity.START_CONTAINER); + inputs.put(DockerActivity.CONTAINER_ID, id); + inputs.put(DockerActivity.IN_CONTAINER_START_CMD, "python app.py"); + + Map<String, Class<?>> expectedOutputs = new HashMap<String, Class<?>>(); + expectedOutputs.put(DockerActivity.RESPONSE_BODY_KEY, String.class); + + Map<String,Object> outputs = ActivityInvoker.invokeAsyncActivity(activity, inputs, expectedOutputs); + System.out.println(outputs.get(DockerActivity.RESPONSE_BODY_KEY)); + Assert.assertNotNull(outputs.get(DockerActivity.RESPONSE_BODY_KEY)); + } + private Container getContainerFromName(List<Container> list, String name){ for(Container container:list){ if(container.getNames()[0].endsWith(name)){
