Skip to content

Commit a1eaac0

Browse files
committed
added ssh module for testing
1 parent 8ecdcb6 commit a1eaac0

7 files changed

Lines changed: 136 additions & 36 deletions

File tree

docker-java-transport-ssh/src/main/java/com/github/dockerjava/jsch/SSHSocketFactory.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.jcraft.jsch.ChannelExec;
88
import com.jcraft.jsch.JSchException;
99
import com.jcraft.jsch.Session;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
1012

1113
import javax.net.SocketFactory;
1214
import java.io.IOException;
@@ -20,6 +22,8 @@
2022

2123
public class SSHSocketFactory extends SocketFactory {
2224

25+
private static Logger logger = LoggerFactory.getLogger(SSHSocketFactory.class);
26+
2327
private final Session session;
2428
private final SSHDockerConfig config;
2529
private Container socatContainer;
@@ -67,21 +71,26 @@ public boolean isConnected() {
6771
private void connect(int timeout) throws IOException {
6872
try {
6973
if (config.isUseTcp()) {
70-
channel = session.getStreamForwarder("127.0.0.1", config.getTcpPort() != null ? config.getTcpPort() : 2375);
74+
final int port = config.getTcpPort() != null ? config.getTcpPort() : 2375;
75+
channel = session.getStreamForwarder("127.0.0.1", port);
76+
logger.debug("Using channel direct-tcpip with 127.0.0.1:{}", port);
7177
} else if (config.isUseSocat() || unixSocketOnWindows()) {
7278
// forward docker socket via socat
7379
socatContainer = SocatHandler.startSocat(session);
7480
final ContainerPort containerPort = socatContainer.getPorts()[0];
7581
Objects.requireNonNull(containerPort);
7682
channel = session.getStreamForwarder(containerPort.getIp(), containerPort.getPublicPort());
83+
logger.debug("Using channel direct-tcpip with socat on port {}", containerPort.getPublicPort());
7784
} else if (config.isUseSocket()) {
7885
// directly forward docker socket
7986
channel = session.openChannel("direct-streamlocal@openssh.com");
8087
((ChannelDirectStreamLocal) channel).setSocketPath(config.getSocketPath());
88+
logger.debug("Using channel direct-streamlocal on {}", config.getSocketPath());
8189
} else {
8290
// only 18.09 and up
8391
channel = session.openChannel("exec");
8492
((ChannelExec) channel).setCommand("docker system dial-stdio");
93+
logger.debug("Using dialer command");
8594
}
8695

8796
inputStream = channel.getInputStream();

docker-java-transport-ssh/src/main/java/com/github/dockerjava/jsch/SsshWithOKDockerHttpClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,10 @@ private SsshWithOKDockerHttpClient(
192192

193193
URI dockerHost = dockerClientConfig.getDockerHost();
194194

195-
this.session = connectSSH(dockerHost, connectTimeout != null ? connectTimeout : 0);
196-
197195
if ("ssh".equals(dockerHost.getScheme())) {
198196

197+
this.session = connectSSH(dockerHost, connectTimeout != null ? connectTimeout : 0);
198+
199199
final SSHSocketFactory socketFactory = new SSHSocketFactory(session, sshDockerConfig);
200200

201201
clientBuilder.socketFactory(socketFactory);

docker-java-transport-ssh/src/test/java/com/github/dockerjava/jsch/SocatHandlerTest.java renamed to docker-java-transport-ssh/src/test/java/com/github/dockerjava/jsch/SocatHandlerIT.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.junit.jupiter.api.AfterEach;
1111
import org.junit.jupiter.api.BeforeAll;
1212
import org.junit.jupiter.api.Timeout;
13+
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
1314

1415
import java.io.BufferedReader;
1516
import java.io.File;
@@ -37,7 +38,8 @@
3738
* PreferredAuthentications publickey
3839
* </pre>
3940
*/
40-
class SocatHandlerTest {
41+
@EnabledIfEnvironmentVariable(named = "DOCKER_HOST", matches = "ssh://.*")
42+
class SocatHandlerIT {
4143

4244
private static Session session;
4345
private Container container;
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.github.dockerjava.jsch;
2+
3+
import com.github.dockerjava.core.DefaultDockerClientConfig;
4+
import com.github.dockerjava.core.DockerClientImpl;
5+
import com.github.dockerjava.core.DockerHttpClient;
6+
import com.jcraft.jsch.JSchException;
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
9+
10+
import java.io.IOException;
11+
12+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
13+
14+
@EnabledIfEnvironmentVariable(named = "DOCKER_HOST", matches = "ssh://.*")
15+
class SsshWithOKDockerHttpClientIT {
16+
17+
@Test
18+
void pingViaDialer() throws IOException, JSchException {
19+
20+
final DefaultDockerClientConfig dockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder()
21+
.withDockerHost("ssh://junit-host")
22+
.build();
23+
24+
try (final DockerHttpClient dockerHttpClient = new SsshWithOKDockerHttpClient.Factory().dockerClientConfig(dockerClientConfig).build()) {
25+
26+
final DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig)
27+
.withHttpClient(dockerHttpClient);
28+
29+
assertDoesNotThrow(() -> dockerClient.pingCmd().exec());
30+
}
31+
}
32+
33+
@Test
34+
void pingViaSocket() throws IOException, JSchException {
35+
36+
final DefaultDockerClientConfig dockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder()
37+
.withDockerHost("ssh://junit-host")
38+
.build();
39+
40+
try (final DockerHttpClient dockerHttpClient = new SsshWithOKDockerHttpClient.Factory()
41+
.useSocket()
42+
.dockerClientConfig(dockerClientConfig).build()) {
43+
44+
final DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig)
45+
.withHttpClient(dockerHttpClient);
46+
47+
assertDoesNotThrow(() -> dockerClient.pingCmd().exec());
48+
}
49+
}
50+
51+
@Test
52+
void pingViaSocat() throws IOException, JSchException {
53+
54+
final DefaultDockerClientConfig dockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder()
55+
.withDockerHost("ssh://junit-host")
56+
.build();
57+
58+
try (final DockerHttpClient dockerHttpClient = new SsshWithOKDockerHttpClient.Factory()
59+
.useSocat()
60+
.dockerClientConfig(dockerClientConfig)
61+
.build()) {
62+
63+
final DockerClientImpl dockerClient = DockerClientImpl.getInstance(dockerClientConfig)
64+
.withHttpClient(dockerHttpClient);
65+
66+
assertDoesNotThrow(() -> dockerClient.pingCmd().exec());
67+
}
68+
}
69+
}

docker-java-transport-ssh/src/test/java/com/github/dockerjava/jsch/SsshWithOKDockerHttpClientTest.java

Lines changed: 0 additions & 30 deletions
This file was deleted.

docker-java/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@
5151
<version>${project.version}</version>
5252
<scope>test</scope>
5353
</dependency>
54+
<dependency>
55+
<groupId>${project.groupId}</groupId>
56+
<artifactId>docker-java-transport-ssh</artifactId>
57+
<version>${project.version}</version>
58+
<scope>test</scope>
59+
</dependency>
60+
5461
<dependency>
5562
<groupId>ch.qos.logback</groupId>
5663
<artifactId>logback-core</artifactId>

docker-java/src/test/java/com/github/dockerjava/cmd/CmdIT.java

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,24 @@
22

33
import com.github.dockerjava.api.command.DelegatingDockerCmdExecFactory;
44
import com.github.dockerjava.api.command.DockerCmdExecFactory;
5+
import com.github.dockerjava.core.DefaultDockerClientConfig;
56
import com.github.dockerjava.core.DefaultDockerCmdExecFactory;
67
import com.github.dockerjava.core.DockerClientConfig;
78
import com.github.dockerjava.core.DockerClientConfigAware;
89
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
910
import com.github.dockerjava.jaxrs.JerseyDockerCmdExecFactory;
11+
import com.github.dockerjava.jsch.SsshWithOKDockerHttpClient;
1012
import com.github.dockerjava.junit.DockerRule;
1113
import com.github.dockerjava.junit.category.Integration;
1214
import com.github.dockerjava.netty.NettyDockerCmdExecFactory;
1315
import com.github.dockerjava.okhttp.OkHttpDockerCmdExecFactory;
16+
import com.jcraft.jsch.JSchException;
1417
import org.junit.Rule;
1518
import org.junit.experimental.categories.Category;
1619
import org.junit.runner.RunWith;
1720
import org.junit.runners.Parameterized;
1821

22+
import java.io.IOException;
1923
import java.util.Arrays;
2024

2125
/**
@@ -25,6 +29,41 @@
2529
@RunWith(Parameterized.class)
2630
public abstract class CmdIT {
2731
public enum FactoryType {
32+
SSH(true) {
33+
@Override
34+
public DockerCmdExecFactory createExecFactory() {
35+
class FakeFactory extends DelegatingDockerCmdExecFactory implements DockerClientConfigAware {
36+
37+
private DefaultDockerCmdExecFactory dockerCmdExecFactory;
38+
39+
@Override
40+
public final DockerCmdExecFactory getDockerCmdExecFactory() {
41+
return dockerCmdExecFactory;
42+
}
43+
44+
@Override
45+
public void init(DockerClientConfig dockerClientConfig) {
46+
47+
final DefaultDockerClientConfig defaultDockerClientConfig = DefaultDockerClientConfig.createDefaultConfigBuilder()
48+
.withDockerHost("ssh://junit-host")
49+
.build();
50+
51+
try {
52+
dockerCmdExecFactory = new DefaultDockerCmdExecFactory(
53+
new SsshWithOKDockerHttpClient.Factory()
54+
.dockerClientConfig(defaultDockerClientConfig)
55+
.build(),
56+
defaultDockerClientConfig.getObjectMapper()
57+
);
58+
} catch (IOException | JSchException e) {
59+
throw new RuntimeException(e);
60+
}
61+
dockerCmdExecFactory.init(defaultDockerClientConfig);
62+
}
63+
}
64+
return new FakeFactory();
65+
}
66+
},
2867
NETTY(true) {
2968
@Override
3069
public DockerCmdExecFactory createExecFactory() {
@@ -91,7 +130,11 @@ public boolean supportsStdinAttach() {
91130

92131
@Parameterized.Parameters(name = "{index}:{0}")
93132
public static Iterable<FactoryType> data() {
94-
return Arrays.asList(FactoryType.values());
133+
if (System.getenv("DOCKER_HOST").matches("ssh://.*")) {
134+
return Arrays.asList(FactoryType.values()).subList(0, 1);
135+
} else {
136+
return Arrays.asList(FactoryType.values()).subList(1, FactoryType.values().length);
137+
}
95138
}
96139

97140
@Parameterized.Parameter
@@ -102,6 +145,6 @@ public FactoryType getFactoryType() {
102145
}
103146

104147
@Rule
105-
public DockerRule dockerRule = new DockerRule( this);
148+
public DockerRule dockerRule = new DockerRule(this);
106149

107150
}

0 commit comments

Comments
 (0)