forked from arquillian/arquillian-cube
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BindingUtil.java
93 lines (72 loc) · 3.58 KB
/
BindingUtil.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package org.arquillian.cube.docker.impl.util;
import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;
import org.arquillian.cube.docker.impl.docker.DockerClientExecutor;
import org.arquillian.cube.spi.Binding;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.model.ContainerConfig;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.HostConfig;
public final class BindingUtil {
public static final String PORTS_SEPARATOR = "->";
private static final String NO_GATEWAY = null;
private BindingUtil() {
}
public static Binding binding(DockerClientExecutor executor, String cubeId) {
InspectContainerResponse inspectResponse = executor.getDockerClient().inspectContainerCmd( cubeId ).exec();
String dockerIp = getDockerServerIp(executor);
Binding binding = new Binding(dockerIp);
HostConfig hostConfig = inspectResponse.getHostConfig();
if(hostConfig.getPortBindings() != null) {
for (Entry<ExposedPort, com.github.dockerjava.api.model.Ports.Binding[]> bind : hostConfig.getPortBindings()
.getBindings().entrySet()) {
com.github.dockerjava.api.model.Ports.Binding[] allBindings = bind.getValue();
for (com.github.dockerjava.api.model.Ports.Binding bindings : allBindings) {
binding.addPortBinding(bind.getKey().getPort(), bindings.getHostPort());
}
}
} else {
ContainerConfig connectionConfig = inspectResponse.getConfig();
for(ExposedPort port : connectionConfig.getExposedPorts()) {
binding.addPortBinding(port.getPort(), -1);
}
}
return binding;
}
private static String getDockerServerIp(DockerClientExecutor executor) {
return executor.getDockerServerIp();
}
public static Binding binding(Map<String, Object> cubeConfiguration) {
Binding binding = new Binding(NO_GATEWAY);
if (cubeConfiguration.containsKey("portBindings")) {
@SuppressWarnings("unchecked")
Collection<String> cubePortBindings = (Collection<String>) cubeConfiguration.get("portBindings");
for (String cubePortBinding : cubePortBindings) {
String[] elements = cubePortBinding.split(PORTS_SEPARATOR);
if (elements.length == 1) {
int positionOfProtocolSeparator = elements[0].indexOf("/");
String bindingPortValue = elements[0];
if(positionOfProtocolSeparator > -1) {
//means that the protocol part is also set.
bindingPortValue = elements[0].substring(0, positionOfProtocolSeparator);
}
int exposedPort = Integer.parseInt(bindingPortValue);
binding.addPortBinding(exposedPort, exposedPort);
} else {
if (elements.length == 2) {
int exposedPort;
if(elements[1].indexOf("/") > -1) {
exposedPort = Integer.parseInt(elements[1].substring(0, elements[1].indexOf("/")));
} else {
exposedPort = Integer.parseInt(elements[1]);
}
int port = Integer.parseInt(elements[0]);
binding.addPortBinding(exposedPort, port);
}
}
}
}
return binding;
}
}