X Tutup
Skip to content

Commit ca611c1

Browse files
committed
Merge pull request #137 from docker-java/volumesfrom
Multiple volumesFrom option when creating a container
2 parents a19dc6b + 48ba911 commit ca611c1

File tree

11 files changed

+220
-37
lines changed

11 files changed

+220
-37
lines changed

src/main/java/com/github/dockerjava/api/command/CreateContainerCmd.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.github.dockerjava.api.model.ExposedPort;
77
import com.github.dockerjava.api.model.HostConfig;
88
import com.github.dockerjava.api.model.Volume;
9+
import com.github.dockerjava.api.model.VolumeFrom;
910

1011
public interface CreateContainerCmd extends DockerCmd<CreateContainerResponse>{
1112

@@ -93,9 +94,9 @@ public interface CreateContainerCmd extends DockerCmd<CreateContainerResponse>{
9394

9495
public CreateContainerCmd withVolumes(Volume... volumes);
9596

96-
public String[] getVolumesFrom();
97+
public VolumeFrom[] getVolumesFrom();
9798

98-
public CreateContainerCmd withVolumesFrom(String... volumesFrom);
99+
public CreateContainerCmd withVolumesFrom(VolumeFrom... volumesFrom);
99100

100101
public HostConfig getHostConfig();
101102

src/main/java/com/github/dockerjava/api/model/AccessMode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ public enum AccessMode {
1616
*/
1717
public static final AccessMode DEFAULT = rw;
1818

19+
1920
}

src/main/java/com/github/dockerjava/api/model/Bind.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.github.dockerjava.api.model;
22

3-
import static com.github.dockerjava.api.model.AccessMode.ro;
4-
import static com.github.dockerjava.api.model.AccessMode.rw;
3+
54

65
import org.apache.commons.lang.builder.EqualsBuilder;
76
import org.apache.commons.lang.builder.HashCodeBuilder;
@@ -29,14 +28,6 @@ public Bind(String path, Volume volume, AccessMode accessMode) {
2928
this.accessMode = accessMode;
3029
}
3130

32-
/**
33-
* @deprecated use {@link #Bind(String, Volume, AccessMode)}
34-
*/
35-
@Deprecated
36-
public Bind(String path, Volume volume, boolean readOnly) {
37-
this(path, volume, readOnly ? ro : rw);
38-
}
39-
4031
public String getPath() {
4132
return path;
4233
}
@@ -49,13 +40,6 @@ public AccessMode getAccessMode() {
4940
return accessMode;
5041
}
5142

52-
/**
53-
* @deprecated use {@link #getAccessMode()}
54-
*/
55-
@Deprecated
56-
public boolean isReadOnly() {
57-
return ro.equals(accessMode);
58-
}
5943

6044
/**
6145
* Parses a bind mount specification to a {@link Bind}.

src/main/java/com/github/dockerjava/api/model/HostConfig.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class HostConfig {
3333
private String[] dnsSearch;
3434

3535
@JsonProperty("VolumesFrom")
36-
private String[] volumesFrom;
36+
private VolumesFrom volumesFrom;
3737

3838
@JsonProperty("ContainerIDFile")
3939
private String containerIDFile;
@@ -57,7 +57,7 @@ public HostConfig() {
5757
}
5858

5959
public HostConfig(String[] binds, Links links, LxcConf[] lxcConf, Ports portBindings, boolean publishAllPorts,
60-
boolean privileged, String[] dns, String[] dnsSearch, String[] volumesFrom, String containerIDFile,
60+
boolean privileged, String[] dns, String[] dnsSearch, VolumesFrom volumesFrom, String containerIDFile,
6161
Capability[] capAdd, Capability[] capDrop, RestartPolicy restartPolicy, String networkMode, Device[] devices) {
6262
this.binds = binds;
6363
this.links = links;
@@ -100,7 +100,7 @@ public String[] getDns() {
100100
return dns;
101101
}
102102

103-
public String[] getVolumesFrom() {
103+
public VolumesFrom getVolumesFrom() {
104104
return volumesFrom;
105105
}
106106

@@ -168,7 +168,7 @@ public void setDnsSearch(String[] dnsSearch) {
168168
this.dnsSearch = dnsSearch;
169169
}
170170

171-
public void setVolumesFrom(String[] volumesFrom) {
171+
public void setVolumesFrom(VolumesFrom volumesFrom) {
172172
this.volumesFrom = volumesFrom;
173173
}
174174

src/main/java/com/github/dockerjava/api/model/Volume.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,23 @@ public class Volume {
3030

3131
private String path;
3232

33-
private boolean readWrite = true;
33+
private AccessMode accessMode = AccessMode.rw;
3434

3535
public Volume(String path) {
3636
this.path = path;
3737
}
38+
39+
public Volume(String path, AccessMode accessMode) {
40+
this.path = path;
41+
this.accessMode = accessMode;
42+
}
3843

3944
public String getPath() {
4045
return path;
4146
}
4247

43-
public boolean isReadWrite() {
44-
return readWrite;
48+
public AccessMode getAccessMode() {
49+
return accessMode;
4550
}
4651

4752
public static Volume parse(String serialized) {
@@ -64,15 +69,15 @@ public String toString() {
6469
public boolean equals(Object obj) {
6570
if (obj instanceof Volume) {
6671
Volume other = (Volume) obj;
67-
return new EqualsBuilder().append(path, other.getPath()).append(readWrite, other.isReadWrite())
72+
return new EqualsBuilder().append(path, other.getPath()).append(accessMode, other.getAccessMode())
6873
.isEquals();
6974
} else
7075
return super.equals(obj);
7176
}
7277

7378
@Override
7479
public int hashCode() {
75-
return new HashCodeBuilder().append(path).append(readWrite).toHashCode();
80+
return new HashCodeBuilder().append(path).append(accessMode).toHashCode();
7681
}
7782

7883
public static class Serializer extends JsonSerializer<Volume> {
@@ -84,7 +89,7 @@ public void serialize(Volume volume, JsonGenerator jsonGen,
8489

8590
jsonGen.writeStartObject();
8691
jsonGen.writeFieldName(volume.getPath());
87-
jsonGen.writeString(Boolean.toString(volume.isReadWrite()));
92+
jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false));
8893
jsonGen.writeEndObject();
8994
}
9095

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import org.apache.commons.lang.builder.EqualsBuilder;
4+
import org.apache.commons.lang.builder.HashCodeBuilder;
5+
6+
public class VolumeFrom {
7+
8+
private String container;
9+
10+
private AccessMode accessMode;
11+
12+
public VolumeFrom(String container) {
13+
this(container, AccessMode.DEFAULT);
14+
}
15+
16+
public VolumeFrom(String container, AccessMode accessMode) {
17+
this.container = container;
18+
this.accessMode = accessMode;
19+
}
20+
21+
public String getContainer() {
22+
return container;
23+
}
24+
25+
public AccessMode getAccessMode() {
26+
return accessMode;
27+
}
28+
29+
30+
/**
31+
* Parses a volume from specification to a {@link VolumeFrom}.
32+
*
33+
* @param serialized the specification, e.g. <code>container:ro</code>
34+
* @return a {@link VolumeFrom} matching the specification
35+
* @throws IllegalArgumentException if the specification cannot be parsed
36+
*/
37+
public static VolumeFrom parse(String serialized) {
38+
try {
39+
String[] parts = serialized.split(":");
40+
switch (parts.length) {
41+
case 1: {
42+
return new VolumeFrom(parts[0]);
43+
}
44+
case 2: {
45+
return new VolumeFrom(parts[0], AccessMode.valueOf(parts[1]));
46+
}
47+
48+
default: {
49+
throw new IllegalArgumentException();
50+
}
51+
}
52+
} catch (Exception e) {
53+
throw new IllegalArgumentException("Error parsing Bind '" + serialized
54+
+ "'");
55+
}
56+
}
57+
58+
@Override
59+
public boolean equals(Object obj) {
60+
if (obj instanceof VolumeFrom) {
61+
VolumeFrom other = (VolumeFrom) obj;
62+
return new EqualsBuilder().append(container, other.getContainer())
63+
.append(accessMode, other.getAccessMode()).isEquals();
64+
} else
65+
return super.equals(obj);
66+
}
67+
68+
@Override
69+
public int hashCode() {
70+
return new HashCodeBuilder().append(container)
71+
.append(accessMode).toHashCode();
72+
}
73+
74+
/**
75+
* Returns a string representation of this {@link VolumeFrom} suitable
76+
* for inclusion in a JSON message.
77+
* The format is <code>&lt;container&gt;:&lt;access mode&gt;</code>,
78+
* like the argument in {@link #parse(String)}.
79+
*
80+
* @return a string representation of this {@link VolumeFrom}
81+
*/
82+
@Override
83+
public String toString() {
84+
return container + ":" + accessMode.toString();
85+
}
86+
87+
}

src/main/java/com/github/dockerjava/api/model/Volumes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void serialize(Volumes volumes, JsonGenerator jsonGen,
4848
jsonGen.writeStartObject();
4949
for (Volume volume : volumes.getVolumes()) {
5050
jsonGen.writeFieldName(volume.getPath());
51-
jsonGen.writeString(Boolean.toString(volume.isReadWrite()));
51+
jsonGen.writeString(Boolean.toString(volume.getAccessMode().equals(AccessMode.rw) ? true: false));
5252
}
5353
jsonGen.writeEndObject();
5454
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import java.io.IOException;
4+
import java.util.ArrayList;
5+
import java.util.Iterator;
6+
import java.util.List;
7+
8+
import com.fasterxml.jackson.core.JsonGenerator;
9+
import com.fasterxml.jackson.core.JsonParser;
10+
import com.fasterxml.jackson.core.JsonProcessingException;
11+
import com.fasterxml.jackson.core.ObjectCodec;
12+
import com.fasterxml.jackson.databind.DeserializationContext;
13+
import com.fasterxml.jackson.databind.JsonDeserializer;
14+
import com.fasterxml.jackson.databind.JsonNode;
15+
import com.fasterxml.jackson.databind.JsonSerializer;
16+
import com.fasterxml.jackson.databind.SerializerProvider;
17+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
18+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
19+
20+
@JsonSerialize(using = VolumesFrom.Serializer.class)
21+
@JsonDeserialize(using = VolumesFrom.Deserializer.class)
22+
public class VolumesFrom {
23+
24+
private VolumeFrom[] volumesFrom;
25+
26+
public VolumesFrom(VolumeFrom... volumesFrom) {
27+
this.volumesFrom = volumesFrom;
28+
}
29+
30+
public VolumeFrom[] getVolumesFrom() {
31+
return volumesFrom;
32+
}
33+
34+
public static class Serializer extends JsonSerializer<VolumesFrom> {
35+
36+
@Override
37+
public void serialize(VolumesFrom volumesFrom, JsonGenerator jsonGen,
38+
SerializerProvider serProvider) throws IOException,
39+
JsonProcessingException {
40+
41+
//
42+
jsonGen.writeStartArray();
43+
for (VolumeFrom bind : volumesFrom.getVolumesFrom()) {
44+
jsonGen.writeString(bind.toString());
45+
}
46+
jsonGen.writeEndArray();
47+
//
48+
}
49+
50+
}
51+
52+
public static class Deserializer extends JsonDeserializer<VolumesFrom> {
53+
@Override
54+
public VolumesFrom deserialize(JsonParser jsonParser,
55+
DeserializationContext deserializationContext)
56+
throws IOException, JsonProcessingException {
57+
58+
List<VolumeFrom> volumesFrom = new ArrayList<VolumeFrom>();
59+
ObjectCodec oc = jsonParser.getCodec();
60+
JsonNode node = oc.readTree(jsonParser);
61+
for (Iterator<JsonNode> it = node.iterator(); it.hasNext();) {
62+
JsonNode field = it.next();
63+
volumesFrom.add(VolumeFrom.parse(field.asText()));
64+
}
65+
return new VolumesFrom(volumesFrom.toArray(new VolumeFrom[0]));
66+
}
67+
}
68+
69+
}

src/main/java/com/github/dockerjava/core/command/CreateContainerCmdImpl.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
import com.github.dockerjava.api.model.ExposedPorts;
1616
import com.github.dockerjava.api.model.HostConfig;
1717
import com.github.dockerjava.api.model.Volume;
18+
import com.github.dockerjava.api.model.VolumeFrom;
1819
import com.github.dockerjava.api.model.Volumes;
20+
import com.github.dockerjava.api.model.VolumesFrom;
1921

2022

2123
/**
@@ -303,13 +305,13 @@ public CreateContainerCmdImpl withVolumes(Volume... volumes) {
303305
}
304306

305307
@Override
306-
public String[] getVolumesFrom() {
307-
return hostConfig.getVolumesFrom();
308+
public VolumeFrom[] getVolumesFrom() {
309+
return hostConfig.getVolumesFrom() == null ? new VolumeFrom[0] : hostConfig.getVolumesFrom().getVolumesFrom();
308310
}
309311

310312
@Override
311-
public CreateContainerCmdImpl withVolumesFrom(String... volumesFrom) {
312-
this.hostConfig.setVolumesFrom(volumesFrom);
313+
public CreateContainerCmdImpl withVolumesFrom(VolumeFrom... volumesFrom) {
314+
this.hostConfig.setVolumesFrom(new VolumesFrom(volumesFrom));
313315
return this;
314316
}
315317

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import static org.testng.Assert.assertEquals;
4+
5+
import java.util.Map;
6+
7+
import org.testng.annotations.Test;
8+
9+
import com.fasterxml.jackson.databind.ObjectMapper;
10+
import com.github.dockerjava.api.model.Ports.Binding;
11+
12+
public class VolumeFrom_SerializingTest {
13+
private final ObjectMapper objectMapper = new ObjectMapper();
14+
private final String json =
15+
"[\"container1:ro\",\"container2:rw\"]";
16+
@Test
17+
public void deserializing() throws Exception {
18+
VolumesFrom volumesFrom = objectMapper.readValue(json, VolumesFrom.class);
19+
20+
VolumesFrom expected = new VolumesFrom(new VolumeFrom("container1", AccessMode.ro), new VolumeFrom("container2", AccessMode.rw));
21+
22+
assertEquals(volumesFrom.getVolumesFrom(), expected.getVolumesFrom());
23+
}
24+
25+
@Test
26+
public void serializing() throws Exception {
27+
VolumesFrom volumesFrom = new VolumesFrom(new VolumeFrom("container1", AccessMode.ro), new VolumeFrom("container2", AccessMode.rw));
28+
29+
assertEquals(objectMapper.writeValueAsString(volumesFrom), json);
30+
}
31+
32+
33+
}

0 commit comments

Comments
 (0)
X Tutup