container stop, delete feature.
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/c46c9b5a Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/tree/c46c9b5a Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/diff/c46c9b5a Branch: refs/heads/docker Commit: c46c9b5a1260a2a2af9f117ffb82729857b9c270 Parents: 7f1c728 Author: Nadeesh Dilanga <[email protected]> Authored: Sun Jul 17 16:47:19 2016 -0400 Committer: Nadeesh Dilanga <[email protected]> Committed: Sun Jul 17 16:47:19 2016 -0400 ---------------------------------------------------------------------- .../activities/docker/DockerActivity.java | 61 +++++++++++++++++-- .../docker/test/DockerActivityTest.java | 63 ++++++++++++++++---- 2 files changed, 108 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/c46c9b5a/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 a80e02a..4ac2acf 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 @@ -57,12 +57,16 @@ public class DockerActivity extends AbstractAsynchronousActivity<JsonNode> { public static final String START_CONTAINER = "start-container"; + public static final String DELETE_CONTAINER = "delete-container"; + public static final String STOP_CONTAINER = "stop-container"; public static final String LIST_CONTAINERS = "list-containers"; public static final String CONTAINER_ID = "container-id"; + public static final String CONTAINER_NAME = "container-name"; + public static final String OUT_IMAGE_ID = "image-id"; public static final String OUT_IMAGE_AUTHOR = "image-author"; @@ -134,14 +138,42 @@ public class DockerActivity extends AbstractAsynchronousActivity<JsonNode> { } else if (START_CONTAINER.equalsIgnoreCase(action)) { - String id = getRenderedParam(referenceService, context, map.get(CONTAINER_ID)); - remoteClient.startContainer(id); - outJson = factory.objectNode(); - ((ObjectNode)outJson).put("started", id); + String name = getRenderedParam(referenceService, context, map.get(CONTAINER_NAME)); + Container container = getContainerFromName(remoteClient, name); + if(!isStarted(container)) { + remoteClient.startContainer(container.getId()); + outJson = factory.objectNode(); + ((ObjectNode) outJson).put("started", container.getId()); + } else { + outJson = factory.objectNode(); + ((ObjectNode) outJson).put("already-started", container.getId()); + } } else if (STOP_CONTAINER.equalsIgnoreCase(action)) { - // TODO + String name = getRenderedParam(referenceService, context, map.get(CONTAINER_NAME)); + Container container = getContainerFromName(remoteClient, name); + if(isStarted(container)) { + remoteClient.stopContainer(container.getId()); + outJson = factory.objectNode(); + ((ObjectNode) outJson).put("stopped", container.getId()); + } else { + outJson = factory.objectNode(); + ((ObjectNode) outJson).put("already-stopped", container.getId()); + } + + } else if (DELETE_CONTAINER.equalsIgnoreCase(action)) { + + String name = getRenderedParam(referenceService, context, map.get(CONTAINER_NAME)); + Container container = getContainerFromName(remoteClient, name); + if(container != null) { + remoteClient.deleteContainer(container.getId()); + outJson = factory.objectNode(); + ((ObjectNode) outJson).put("deleted", container.getId()); + } else { + outJson = factory.objectNode(); + ((ObjectNode) outJson).put("container-not-found", name); + } } else { // Creates empty node @@ -172,4 +204,23 @@ public class DockerActivity extends AbstractAsynchronousActivity<JsonNode> { out.put("network-mode",container.getHostConfig().getNetworkMode()); return out; } + + private boolean isStarted(Container container){ + return container.getStatus() != null + && container.getStatus().startsWith("Up"); + } + + private Container getContainerFromName(RemoteClient remoteClient, String containerName){ + List<Container> containerList = remoteClient.listContainers(); + for(Container container : containerList){ + if(container.getNames().length > 0){ + for(String name : container.getNames()){ + if(name.endsWith(containerName)){ + return container; + } + } + } + } + return null; + } } http://git-wip-us.apache.org/repos/asf/incubator-taverna-common-activities/blob/c46c9b5a/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 79f5d48..751c247 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 @@ -51,7 +51,11 @@ public class DockerActivityTest { public static final String DOCKER_REGISTRY = "https://registry-1.docker.io/v2"; - + public static void main(String[] args) throws Exception { + DockerActivityTest activityTest = new DockerActivityTest(); + activityTest.setup(); + activityTest.testAll(); + } @Before public void setup() throws Exception { @@ -75,12 +79,20 @@ public class DockerActivityTest { } + @Test + public void testAll() throws Exception { +// testCreateContainer(); + testInspectImage(); +// testListContainers(); +// testStartContainer(); +// testStopContainer(); +// testDeleteContainer(); + } - /** - * Tests a simple script (String output = input + "_returned") to ensure the script is invoked correctly. - * @throws Exception - */ - @Test + /** + * Tests a simple script (String output = input + "_returned") to ensure the script is invoked correctly. + * @throws Exception + */ public void testInspectImage() throws Exception { containerConfiguration.getInternalPropertyMap().put(DockerContainerConfiguration.IMAGE,IMAGE_NAME); DockerActivity activity = new DockerActivity(containerConfiguration); @@ -102,7 +114,6 @@ public class DockerActivityTest { * Creates container with a given container configuration * @throws Exception */ - @Test public void testCreateContainer() throws Exception { RemoteClient remoteClient = new RemoteClient(containerConfiguration); Container container = getContainerFromName(remoteClient.listContainers(), CONTAINER_NAME); @@ -133,7 +144,6 @@ public class DockerActivityTest { } - @Test public void testListContainers() throws Exception { DockerActivity activity = new DockerActivity(containerConfiguration); activity.configure(activityConfiguration); @@ -149,14 +159,45 @@ 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.CONTAINER_NAME, CONTAINER_NAME); + 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)); + } + + public void testStopContainer() throws Exception { + DockerActivity activity = new DockerActivity(containerConfiguration); + activity.configure(activityConfiguration); + Map<String,Object> inputs = new HashMap<String,Object>(); + inputs.put(DockerActivity.ACTION, DockerActivity.STOP_CONTAINER); + inputs.put(DockerActivity.CONTAINER_NAME, CONTAINER_NAME); + 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)); + } + + + public void testDeleteContainer() throws Exception { + DockerActivity activity = new DockerActivity(containerConfiguration); + activity.configure(activityConfiguration); + Map<String,Object> inputs = new HashMap<String,Object>(); + inputs.put(DockerActivity.ACTION, DockerActivity.DELETE_CONTAINER); + inputs.put(DockerActivity.CONTAINER_NAME, CONTAINER_NAME); inputs.put(DockerActivity.IN_CONTAINER_START_CMD, "python app.py"); Map<String, Class<?>> expectedOutputs = new HashMap<String, Class<?>>();
