Start container support and test case.
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/f8dc6643 Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/tree/f8dc6643 Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/diff/f8dc6643 Branch: refs/heads/docker Commit: f8dc66432b386a8818598fe807dc2cadc212188c Parents: 158a32f Author: Nadeesh Dilanga <[email protected]> Authored: Wed Jul 6 22:50:29 2016 -0400 Committer: Nadeesh Dilanga <[email protected]> Committed: Wed Jul 6 22:50:29 2016 -0400 ---------------------------------------------------------------------- .../activities/docker/DockerActivity.java | 70 ++++++++++++++------ .../docker/test/DockerActivityTest.java | 20 +++++- 2 files changed, 66 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/f8dc6643/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 873a12a..1a42ac0 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 @@ -20,10 +20,13 @@ package org.apache.taverna.activities.docker; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ContainerNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectImageResponse; +import com.github.dockerjava.api.model.Container; import org.apache.log4j.Logger; import org.apache.taverna.invocation.InvocationContext; import org.apache.taverna.reference.ErrorDocument; @@ -34,6 +37,7 @@ import org.apache.taverna.workflowmodel.processor.activity.ActivityConfiguration import org.apache.taverna.workflowmodel.processor.activity.AsynchronousActivityCallback; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -78,7 +82,7 @@ public class DockerActivity extends AbstractAsynchronousActivity<JsonNode> { @Override public void configure(JsonNode json) throws ActivityConfigurationException { - this.json = json; + this.json = json; } @Override @@ -96,37 +100,48 @@ public class DockerActivity extends AbstractAsynchronousActivity<JsonNode> { T2Reference responseBodyRef = null; InvocationContext context = callback.getContext(); ReferenceService referenceService = context.getReferenceService(); - String action = getRenderedParam(referenceService,context, map.get(ACTION)); + String action = getRenderedParam(referenceService, context, map.get(ACTION)); JsonNodeFactory factory = new ObjectMapper().getNodeFactory(); - ObjectNode outJson = factory.objectNode(); + ContainerNode outJson = null; RemoteClient remoteClient = new RemoteClient(containerConfiguration); - if (CREATE_CONTAINER.equalsIgnoreCase(action)) { - CreateContainerResponse response = remoteClient.createContainer(); - System.out.println("+++++" + response.toString()); - outJson.put(OUT_CONTAINER_ID, response.getId()); + if (CREATE_CONTAINER.equalsIgnoreCase(action)) { - } else if (INSPECT.equalsIgnoreCase(action)) { + outJson = factory.objectNode(); + CreateContainerResponse response = remoteClient.createContainer(); + ((ObjectNode)outJson).put(OUT_CONTAINER_ID, response.getId()); - String imageName = getRenderedParam(referenceService, context, map.get(IN_IMAGE_NAME)); - InspectImageResponse response = remoteClient.inspect(imageName); - outJson.put(OUT_IMAGE_ID, response.getId()); - outJson.put(OUT_IMAGE_AUTHOR, response.getAuthor()); - outJson.put(OUT_IMAGE_CONTAINER, response.getContainer()); + } else if (INSPECT.equalsIgnoreCase(action)) { - } else if (LIST_CONTAINERS.equalsIgnoreCase(action)) { + outJson = factory.objectNode(); + String imageName = getRenderedParam(referenceService, context, map.get(IN_IMAGE_NAME)); + InspectImageResponse response = remoteClient.inspect(imageName); + ((ObjectNode)outJson).put(OUT_IMAGE_ID, response.getId()); + ((ObjectNode)outJson).put(OUT_IMAGE_AUTHOR, response.getAuthor()); + ((ObjectNode)outJson).put(OUT_IMAGE_CONTAINER, response.getContainer()); - // TODO + } else if (LIST_CONTAINERS.equalsIgnoreCase(action)) { - } else if (START_CONTAINER.equalsIgnoreCase(action)) { - // TODO - } else if (STOP_CONTAINER.equalsIgnoreCase(action)) { - // TODO + List<Container> containerList = remoteClient.listContainers(); + outJson = factory.arrayNode(); + for(Container container:containerList){ + ((ArrayNode)outJson).add(createOutputJson(container,factory.objectNode())); } - //TODO add any more supporting actions - responseBodyRef = referenceService.register(outJson.toString(), 0, true, context); + + } else if (START_CONTAINER.equalsIgnoreCase(action)) { + //TODO + } else if (STOP_CONTAINER.equalsIgnoreCase(action)) { + + // TODO + + } else { + // Creates empty node + outJson = factory.objectNode(); + } + + responseBodyRef = referenceService.register(outJson.toString(), 0, true, context); outputs.put(RESPONSE_BODY_KEY, responseBodyRef); callback.receiveResult(outputs, new int[0]); @@ -135,8 +150,19 @@ public class DockerActivity extends AbstractAsynchronousActivity<JsonNode> { } - private String getRenderedParam(ReferenceService referenceService, InvocationContext context, T2Reference key){ + private String getRenderedParam(ReferenceService referenceService, InvocationContext context, T2Reference key) { return (String) referenceService.renderIdentifier(key, String.class, context); } + + private JsonNode createOutputJson(Container container, ObjectNode out){ + out.put("id",container.getId()); + out.put("command",container.getCommand()); + out.put("created",container.getCreated()); + out.put("image",container.getImage()); + out.put("image-id",container.getImageId()); + out.put("status",container.getStatus()); + out.put("network-mode",container.getHostConfig().getNetworkMode()); + return out; + } } http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/f8dc6643/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 8b095cf..657576a 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 @@ -52,7 +52,7 @@ public class DockerActivityTest { public static void main(String[] args) throws Exception { DockerActivityTest test = new DockerActivityTest(); test.setup(); - test.testCreateContainer(); + test.testListContainers(); } @Before @@ -97,7 +97,7 @@ public class DockerActivityTest { } /** - * Tests a simple script (String output = input + "_returned") to ensure the script is invoked correctly. + * Creates container with a given container configuration * @throws Exception */ @Test @@ -130,6 +130,22 @@ public class DockerActivityTest { } + @Test + public void testListContainers() throws Exception { + DockerActivity activity = new DockerActivity(containerConfiguration); + activity.configure(activityConfiguration); + + Map<String,Object> inputs = new HashMap<String,Object>(); + inputs.put(DockerActivity.ACTION, DockerActivity.LIST_CONTAINERS); + + 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)){
