From 2f125888b9eb8fff672e80e4714d0ff29c50c6ff Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Wed, 17 Dec 2014 18:23:59 +0100 Subject: [PATCH 1/2] Change serialization of RestartPolicy.noRestart() The Docker CLI uses "" as the name for the --restart no policy. --- .../dockerjava/api/model/RestartPolicy.java | 2 +- .../model/RestartPolicy_SerializingTest.java | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java index 936a5b819..0ce3b0ed4 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -23,7 +23,7 @@ public class RestartPolicy { private int maximumRetryCount = 0; @JsonProperty("Name") - private String name = "no"; + private String name = ""; public RestartPolicy() { } diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java new file mode 100644 index 000000000..7b13a3958 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_SerializingTest.java @@ -0,0 +1,41 @@ +package com.github.dockerjava.api.model; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Compares serialization results of various {@link RestartPolicy}s with + * what Docker (as of 1.3.3) actually sends when executing + * docker run --restart xxx. + */ +public class RestartPolicy_SerializingTest { + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Test // --restart no + public void noRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.noRestart()); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"\"}"); + } + + @Test // --restart always + public void alwaysRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.alwaysRestart()); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"always\"}"); + } + + @Test // --restart on-failure + public void onFailureRestart() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(0)); + assertEquals(json, "{\"MaximumRetryCount\":0,\"Name\":\"on-failure\"}"); + } + + @Test // --restart on-failure:2 + public void onFailureRestartWithCount() throws Exception { + String json = objectMapper.writeValueAsString(RestartPolicy.onFailureRestart(2)); + assertEquals(json, "{\"MaximumRetryCount\":2,\"Name\":\"on-failure\"}"); + } + +} From fc6429be2dd8b0248819bf3fa741dc2487b7bd5a Mon Sep 17 00:00:00 2001 From: Harald Albers Date: Wed, 17 Dec 2014 18:52:59 +0100 Subject: [PATCH 2/2] Parser and toString for RestartPolicy --- .../dockerjava/api/model/RestartPolicy.java | 74 +++++++++++++++++-- .../api/model/RestartPolicy_ParsingTest.java | 40 ++++++++++ .../api/model/RestartPolicy_toStringTest.java | 25 +++++++ 3 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java create mode 100644 src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java diff --git a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java index 0ce3b0ed4..5cdcb70bc 100644 --- a/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java +++ b/src/main/java/com/github/dockerjava/api/model/RestartPolicy.java @@ -9,10 +9,17 @@ /** * Container restart policy * - * no – Do not restart the container if it dies. (default) - * on-failure – Restart the container if it exits with a non-zero exit code. - * Can also accept an optional maximum restart count (e.g. on-failure:5). - * always – Always restart the container no matter what exit code is returned. + *
+ *
no
+ *
Do not restart the container if it dies. (default)
+ * + *
on-failure
+ *
Restart the container if it exits with a non-zero exit code. + * Can also accept an optional maximum restart count (e.g. on-failure:5).
+ * + *
always
+ *
Always restart the container no matter what exit code is returned.
+ *
* * @author marcus * @@ -33,15 +40,27 @@ private RestartPolicy(int maximumRetryCount, String name) { this.maximumRetryCount = maximumRetryCount; this.name = name; } - + + /** + * Do not restart the container if it dies. (default) + */ public static RestartPolicy noRestart() { return new RestartPolicy(); } - + + /** + * Always restart the container no matter what exit code is returned. + */ public static RestartPolicy alwaysRestart() { return new RestartPolicy(0, "always"); } - + + /** + * Restart the container if it exits with a non-zero exit code. + * + * @param maximumRetryCount the maximum number of restarts. + * Set to 0 for unlimited retries. + */ public static RestartPolicy onFailureRestart(int maximumRetryCount) { return new RestartPolicy(maximumRetryCount, "on-failure"); } @@ -54,6 +73,47 @@ public String getName() { return name; } + /** + * Parses a textual restart polixy specification (as used by the Docker CLI) + * to a {@link RestartPolicy}. + * + * @param serialized the specification, e.g. on-failure:2 + * @return a {@link RestartPolicy} matching the specification + * @throws IllegalArgumentException if the specification cannot be parsed + */ + public static RestartPolicy parse(String serialized) throws IllegalArgumentException { + try { + String[] parts = serialized.split(":"); + String name = parts[0]; + if ("no".equals(name)) + return noRestart(); + if ("always".equals(name)) + return alwaysRestart(); + if ("on-failure".equals(name)) { + int count = 0; + if (parts.length == 2) { + count = Integer.parseInt(parts[1]); + } + return onFailureRestart(count); + } + throw new IllegalArgumentException(); + } catch (Exception e) { + throw new IllegalArgumentException("Error parsing RestartPolicy '" + serialized + "'"); + } + } + + /** + * Returns a string representation of this {@link RestartPolicy}. + * The format is name[:count], like the argument in {@link #parse(String)}. + * + * @return a string representation of this {@link RestartPolicy} + */ + @Override + public String toString() { + String result = name.isEmpty() ? "no" : name; + return maximumRetryCount > 0 ? result + ":" + maximumRetryCount : result; + } + @Override public boolean equals(Object obj) { if (obj instanceof RestartPolicy) { diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java new file mode 100644 index 000000000..04823db24 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_ParsingTest.java @@ -0,0 +1,40 @@ +package com.github.dockerjava.api.model; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.Test; + +public class RestartPolicy_ParsingTest { + + @Test + public void noRestart() throws Exception { + assertEquals(RestartPolicy.parse("no"), RestartPolicy.noRestart()); + } + + @Test + public void alwaysRestart() throws Exception { + assertEquals(RestartPolicy.parse("always"), RestartPolicy.alwaysRestart()); + } + + @Test + public void onFailureRestart() throws Exception { + assertEquals(RestartPolicy.parse("on-failure"), RestartPolicy.onFailureRestart(0)); + } + + @Test + public void onFailureRestartWithCount() throws Exception { + assertEquals(RestartPolicy.parse("on-failure:2"), RestartPolicy.onFailureRestart(2)); + } + + @Test(expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'nonsense'") + public void illegalSyntax() throws Exception { + RestartPolicy.parse("nonsense"); + } + + @Test(expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = "Error parsing RestartPolicy 'on-failure:X'") + public void illegalRetryCount() throws Exception { + RestartPolicy.parse("on-failure:X"); + } +} diff --git a/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java new file mode 100644 index 000000000..a52441d63 --- /dev/null +++ b/src/test/java/com/github/dockerjava/api/model/RestartPolicy_toStringTest.java @@ -0,0 +1,25 @@ +package com.github.dockerjava.api.model; + +import static org.testng.Assert.assertEquals; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class RestartPolicy_toStringTest { + + @DataProvider(name = "input") + public Object[][] restartPolicies() { + return new Object[][] { + { "no" }, + { "always" }, + { "on-failure" }, + { "on-failure:2" } + }; + } + + @Test(dataProvider = "input") + public void serializationWithoutCount(String policy) throws Exception { + assertEquals(RestartPolicy.parse(policy).toString(), policy); + } + +}