X Tutup
Skip to content

Commit bb96b53

Browse files
committed
Implemented Device parser
1 parent 0a1b34c commit bb96b53

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

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

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,30 @@
11
package com.github.dockerjava.api.model;
22

33
import static com.google.common.base.Preconditions.checkNotNull;
4+
import static org.apache.commons.lang.BooleanUtils.isFalse;
5+
import static org.apache.commons.lang.BooleanUtils.isNotFalse;
6+
import static org.apache.commons.lang.BooleanUtils.isNotTrue;
7+
import static org.apache.commons.lang.StringUtils.isEmpty;
48

9+
import com.google.common.collect.Maps;
10+
import com.google.common.collect.Sets;
11+
import org.apache.commons.lang.BooleanUtils;
12+
import org.apache.commons.lang.StringUtils;
513
import org.apache.commons.lang.builder.EqualsBuilder;
614
import org.apache.commons.lang.builder.HashCodeBuilder;
715

816
import com.fasterxml.jackson.annotation.JsonInclude;
917
import com.fasterxml.jackson.annotation.JsonInclude.Include;
1018
import com.fasterxml.jackson.annotation.JsonProperty;
1119

20+
import javax.annotation.Nonnull;
21+
import java.util.HashMap;
22+
import java.util.HashSet;
23+
import java.util.Map;
24+
import java.util.Set;
25+
import java.util.regex.Matcher;
26+
import java.util.regex.Pattern;
27+
1228
@JsonInclude(Include.NON_NULL)
1329
public class Device {
1430

@@ -45,6 +61,66 @@ public String getPathOnHost() {
4561
return pathOnHost;
4662
}
4763

64+
@Nonnull
65+
public static Device parse(@Nonnull String deviceStr) {
66+
String src = "";
67+
String dst = "";
68+
String permissions = "rwm";
69+
final String[] arr = deviceStr.split(":");
70+
switch (arr.length) {
71+
case 3: {
72+
permissions = arr[2];
73+
}
74+
case 2: {
75+
if (validDeviceMode(arr[1])) {
76+
permissions = arr[1];
77+
} else {
78+
dst = arr[1];
79+
}
80+
}
81+
case 1: {
82+
src = arr[0];
83+
break;
84+
}
85+
default: {
86+
throw new IllegalArgumentException("invalid device specification: " + deviceStr);
87+
}
88+
}
89+
90+
if (isEmpty(dst)) {
91+
dst = src;
92+
}
93+
94+
return new Device(permissions, dst, src);
95+
}
96+
97+
/**
98+
* ValidDeviceMode checks if the mode for device is valid or not.
99+
* Valid mode is a composition of r (read), w (write), and m (mknod).
100+
*
101+
* @link https://github.com/docker/docker/blob/6b4a46f28266031ce1a1315f17fb69113a06efe1/runconfig/opts/parse.go#L796
102+
*/
103+
private static boolean validDeviceMode(String deviceMode) {
104+
Map<String, Boolean> validModes = new HashMap<>(3);
105+
validModes.put("r", true);
106+
validModes.put("w", true);
107+
validModes.put("m", true);
108+
109+
if (isEmpty(deviceMode)) {
110+
return false;
111+
}
112+
113+
for (char ch : deviceMode.toCharArray()) {
114+
final String mode = String.valueOf(ch);
115+
if (isNotTrue(validModes.get(mode))) {
116+
return false; // wrong mode
117+
}
118+
validModes.put(mode, false);
119+
}
120+
121+
return true;
122+
}
123+
48124
@Override
49125
public boolean equals(Object obj) {
50126
if (obj instanceof Device) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.github.dockerjava.api.model;
2+
3+
import org.testng.annotations.Test;
4+
5+
import static org.hamcrest.MatcherAssert.assertThat;
6+
import static org.hamcrest.Matchers.is;
7+
import static org.testng.Assert.*;
8+
9+
/**
10+
* @author Kanstantsin Shautsou
11+
*/
12+
public class DeviceTest {
13+
//TODO create matcher
14+
@Test
15+
public void testParse() throws Exception {
16+
final Device device = Device.parse("/dev/sda:/dev/xvdc:r");
17+
assertThat(device.getPathOnHost(), is("/dev/sda"));
18+
assertThat(device.getPathInContainer(), is("/dev/xvdc"));
19+
assertThat(device.getcGroupPermissions(), is("r"));
20+
}
21+
22+
}

0 commit comments

Comments
 (0)
X Tutup