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)){

Reply via email to