Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 68 additions & 8 deletions src/main/java/com/github/dockerjava/api/model/RestartPolicy.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.
* <dl>
* <dt>no</dt>
* <dd>Do not restart the container if it dies. (default)</dd>
*
* <dt>on-failure</dt>
* <dd>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).<dd>
*
* <dt>always</dt>
* <dd>Always restart the container no matter what exit code is returned.<dd>
* </dl>
*
* @author marcus
*
Expand All @@ -23,7 +30,7 @@ public class RestartPolicy {
private int maximumRetryCount = 0;

@JsonProperty("Name")
private String name = "no";
private String name = "";

public RestartPolicy() {
}
Expand All @@ -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 <code>0</code> for unlimited retries.
*/
public static RestartPolicy onFailureRestart(int maximumRetryCount) {
return new RestartPolicy(maximumRetryCount, "on-failure");
}
Expand All @@ -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. <code>on-failure:2</code>
* @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 <code>name[:count]</code>, 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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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");
}
}
Original file line number Diff line number Diff line change
@@ -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
* <code>docker run --restart xxx</code>.
*/
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\"}");
}

}
Original file line number Diff line number Diff line change
@@ -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);
}

}