Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3fcf3d7

Browse files
author
alex.collins
committed
added support for a single centralized configuration
1 parent 921fd58 commit 3fcf3d7

File tree

7 files changed

+136
-91
lines changed

7 files changed

+136
-91
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.kpelykh.docker.client;
2+
3+
import java.io.File;
4+
import java.io.FileInputStream;
5+
import java.io.IOException;
6+
import java.net.URI;
7+
import java.util.Properties;
8+
9+
class Config {
10+
URI url;
11+
String version, username, password, email;
12+
13+
private Config() {
14+
}
15+
16+
static Config createConfig() throws DockerException {
17+
final Properties p = new Properties();
18+
19+
try {
20+
p.load(DockerClient.class.getResourceAsStream("/docker.io.properties"));
21+
} catch (IOException e) {
22+
throw new DockerException(e);
23+
}
24+
25+
for (String s : new String[]{"url", "version", "username", "password", "email"}) {
26+
final String key = "docker.io." + s;
27+
if (System.getProperties().keySet().contains(key)) {
28+
p.setProperty(key, System.getProperty(key));
29+
}
30+
}
31+
32+
final File file = new File(System.getProperty("user.name"), ".docker.io.properties");
33+
System.out.println(file);
34+
if (file.isFile()) {
35+
try {
36+
final FileInputStream in = new FileInputStream(file);
37+
try {
38+
p.load(in);
39+
} finally {
40+
in.close();
41+
}
42+
} catch (IOException e) {
43+
throw new DockerException(e);
44+
}
45+
}
46+
47+
final Config c = new Config();
48+
49+
c.url = URI.create(p.getProperty("docker.io.url"));
50+
c.version = p.getProperty("docker.io.version");
51+
c.username = p.getProperty("docker.io.username");
52+
c.password = p.getProperty("docker.io.password");
53+
c.email = p.getProperty("docker.io.email");
54+
55+
return c;
56+
}
57+
}

src/main/java/com/kpelykh/docker/client/DockerClient.java

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import java.io.IOException;
3838
import java.io.InputStream;
3939
import java.io.StringWriter;
40+
import java.net.URI;
4041
import java.util.ArrayList;
4142
import java.util.List;
4243
import java.util.UUID;
@@ -50,22 +51,31 @@ public class DockerClient {
5051

5152
private static final Logger LOGGER = LoggerFactory.getLogger(DockerClient.class);
5253

53-
private static DockerClient instance;
54-
private Client client;
54+
private Client client;
5555
private String restEndpointUrl;
5656
private AuthConfig authConfig;
5757

58-
public DockerClient() {
59-
this("http://localhost:4243");
58+
public DockerClient() throws DockerException {
59+
this(Config.createConfig());
6060
}
6161

62-
public DockerClient(String serverUrl) {
63-
restEndpointUrl = serverUrl + "/v1.11";
62+
public DockerClient(String serverUrl) throws DockerException {
63+
this(configWithServerUrl(serverUrl));
64+
}
65+
66+
private static Config configWithServerUrl(String serverUrl) throws DockerException {
67+
final Config c = Config.createConfig();
68+
c.url = URI.create(serverUrl);
69+
return c;
70+
}
71+
72+
private DockerClient(Config config) {
73+
restEndpointUrl = config.url + "/v" + config.version;
6474
ClientConfig clientConfig = new DefaultClientConfig();
6575
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
6676

6777
SchemeRegistry schemeRegistry = new SchemeRegistry();
68-
schemeRegistry.register(new Scheme("http", 4243, PlainSocketFactory.getSocketFactory()));
78+
schemeRegistry.register(new Scheme("http", config.url.getPort(), PlainSocketFactory.getSocketFactory()));
6979
schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));
7080

7181
PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);
@@ -105,7 +115,6 @@ public void setCredentials(String username, String password, String email) {
105115
* Authenticate with the server, useful for checking authentication.
106116
*/
107117
public void auth() throws DockerException {
108-
checkAuthConfig();
109118
try {
110119
client.resource(restEndpointUrl + "/auth")
111120
.header("Content-Type", MediaType.APPLICATION_JSON)
@@ -124,18 +133,28 @@ private String registryAuth() throws DockerException {
124133
}
125134
}
126135

127-
private AuthConfig authConfig() throws DockerException {
128-
checkAuthConfig();
129-
return authConfig;
130-
}
136+
public AuthConfig authConfig() throws DockerException {
137+
return authConfig != null
138+
? authConfig
139+
: authConfigFromProperties();
140+
}
131141

132-
private void checkAuthConfig() throws DockerException {
133-
if (authConfig == null) {
134-
throw new DockerException("authentication credentials required");
135-
}
136-
}
142+
private static AuthConfig authConfigFromProperties() throws DockerException {
143+
final AuthConfig a = new AuthConfig();
137144

138-
/**
145+
a.setUsername(Config.createConfig().username);
146+
a.setPassword(Config.createConfig().password);
147+
a.setEmail(Config.createConfig().email);
148+
149+
if (a.getUsername() == null) {throw new IllegalStateException("username is null");}
150+
if (a.getPassword() == null) {throw new IllegalStateException("password is null");}
151+
if (a.getEmail() == null) {throw new IllegalStateException("email is null");}
152+
153+
return a;
154+
}
155+
156+
157+
/**
139158
* * MISC API
140159
* *
141160
*/

src/main/java/com/kpelykh/docker/client/model/ContainerConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ public String toString() {
285285
", privileged=" + privileged +
286286
", workingDir='" + workingDir + '\'' +
287287
", domainName='" + domainName + '\'' +
288-
", onBuild='" + onBuild + '\'' +
288+
", onBuild='" + Arrays.toString(onBuild) + '\'' +
289289
'}';
290290
}
291291
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
docker.io.url=http://localhost:4243
2+
docker.io.version=1.11

src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package com.kpelykh.docker.client.test;
22

3-
import java.io.IOException;
4-
import java.lang.reflect.Method;
5-
import java.util.ArrayList;
6-
import java.util.List;
7-
3+
import com.kpelykh.docker.client.DockerClient;
4+
import com.kpelykh.docker.client.DockerException;
5+
import com.sun.jersey.api.client.ClientResponse;
86
import org.slf4j.Logger;
97
import org.slf4j.LoggerFactory;
108
import org.testng.Assert;
119
import org.testng.ITestResult;
1210

13-
import com.kpelykh.docker.client.DockerClient;
14-
import com.kpelykh.docker.client.DockerException;
15-
import com.sun.jersey.api.client.ClientResponse;
11+
import java.io.IOException;
12+
import java.lang.reflect.Method;
13+
import java.util.ArrayList;
14+
import java.util.List;
1615

1716
public abstract class AbstractDockerClientTest extends Assert {
1817

@@ -81,23 +80,5 @@ protected String logResponseStream(ClientResponse response) throws IOException {
8180
LOG.info("Container log: {}", responseString);
8281
return responseString;
8382
}
84-
85-
private String getProperty(String name) {
86-
String property = System.getProperty(name);
87-
if(property == null || property.isEmpty()) throw new RuntimeException("Need to configure '" + name + "' property to run the test. Use command line option -D"+ name +"=... to do so.");
88-
return property;
89-
}
90-
91-
protected String getUsername() {
92-
return getProperty("docker.io.username");
93-
}
94-
95-
protected String getPassword() {
96-
return getProperty("docker.io.password");
97-
}
98-
99-
protected String getEmail() {
100-
return getProperty("docker.io.email");
101-
}
10283

10384
}
Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
package com.kpelykh.docker.client.test;
22

3-
import static org.hamcrest.MatcherAssert.assertThat;
4-
5-
import java.lang.reflect.Method;
6-
import java.util.ArrayList;
7-
3+
import com.kpelykh.docker.client.DockerException;
4+
import com.sun.jersey.api.client.UniformInterfaceException;
85
import org.hamcrest.Matchers;
96
import org.testng.ITestResult;
10-
import org.testng.annotations.AfterMethod;
11-
import org.testng.annotations.AfterTest;
12-
import org.testng.annotations.BeforeMethod;
13-
import org.testng.annotations.BeforeTest;
14-
import org.testng.annotations.Test;
7+
import org.testng.annotations.*;
158

16-
import com.kpelykh.docker.client.DockerException;
17-
import com.sun.jersey.api.client.UniformInterfaceException;
9+
import java.lang.reflect.Method;
10+
11+
import static org.hamcrest.MatcherAssert.assertThat;
1812

1913
public class DockerClientAuthTest extends AbstractDockerClientTest {
2014

@@ -36,21 +30,21 @@ public void beforeMethod(Method method) {
3630
public void afterMethod(ITestResult result) {
3731
super.afterMethod(result);
3832
}
39-
33+
4034
@Test
4135
public void testAuth() throws Exception {
42-
dockerClient.setCredentials(getUsername(), getPassword(), getEmail());
4336
dockerClient.auth();
4437
}
4538

4639
@Test
4740
public void testAuthInvalid() throws Exception {
48-
dockerClient.setCredentials(getUsername(), getPassword(), getEmail());
41+
System.setProperty("docker.io.password", "garbage");
4942
try {
5043
dockerClient.auth();
44+
fail();
5145
} catch (DockerException e) {
5246
assertThat(e.getCause(), Matchers.instanceOf(UniformInterfaceException.class));
53-
assertEquals(401, ((UniformInterfaceException) e.getCause()).getResponse().getStatus());
47+
assertEquals(((UniformInterfaceException) e.getCause()).getResponse().getStatus(), 401);
5448
}
5549
}
5650
}

src/test/java/com/kpelykh/docker/client/test/DockerPushTest.java

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,33 @@
11
package com.kpelykh.docker.client.test;
22

33

4-
import static com.kpelykh.docker.client.DockerClient.asString;
5-
import static org.hamcrest.MatcherAssert.assertThat;
6-
import static org.hamcrest.Matchers.containsString;
7-
import static org.hamcrest.Matchers.isEmptyString;
8-
import static org.hamcrest.Matchers.not;
9-
10-
import java.lang.reflect.Method;
11-
12-
import org.slf4j.Logger;
13-
import org.slf4j.LoggerFactory;
14-
import org.testng.ITestResult;
15-
import org.testng.annotations.AfterMethod;
16-
import org.testng.annotations.AfterTest;
17-
import org.testng.annotations.BeforeMethod;
18-
import org.testng.annotations.BeforeTest;
19-
import org.testng.annotations.Test;
20-
214
import com.kpelykh.docker.client.DockerException;
225
import com.kpelykh.docker.client.model.CommitConfig;
236
import com.kpelykh.docker.client.model.ContainerConfig;
247
import com.kpelykh.docker.client.model.ContainerCreateResponse;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
import org.testng.ITestResult;
11+
import org.testng.annotations.*;
12+
13+
import java.lang.reflect.Method;
14+
15+
import static com.kpelykh.docker.client.DockerClient.asString;
16+
import static org.hamcrest.MatcherAssert.assertThat;
17+
import static org.hamcrest.Matchers.*;
2518

2619
// delete here : https://index.docker.io/u/alexec/busybox/delete/
2720
public class DockerPushTest extends AbstractDockerClientTest {
2821

2922
public static final Logger LOG = LoggerFactory
3023
.getLogger(DockerPushTest.class);
3124

25+
String username;
26+
3227
@BeforeTest
3328
public void beforeTest() throws DockerException {
3429
super.beforeTest();
30+
username = dockerClient.authConfig().getUsername();
3531
}
3632
@AfterTest
3733
public void afterTest() {
@@ -47,10 +43,10 @@ public void beforeMethod(Method method) {
4743
public void afterMethod(ITestResult result) {
4844
super.afterMethod(result);
4945
}
50-
46+
5147
@Test
5248
public void testPushLatest() throws Exception {
53-
setUpCredentials();
49+
5450

5551
ContainerConfig containerConfig = new ContainerConfig();
5652
containerConfig.setImage("busybox");
@@ -67,26 +63,22 @@ public void testPushLatest() throws Exception {
6763

6864
LOG.info("Commiting container: {}", container.toString());
6965
CommitConfig commitConfig = new CommitConfig(container.getId());
70-
commitConfig.setRepo(getUsername() + "/busybox");
71-
72-
String imageId = dockerClient
73-
.commit(commitConfig);
66+
67+
commitConfig.setRepo(username + "/busybox");
7468

75-
logResponseStream(dockerClient.push(getUsername() + "/busybox"));
69+
String imageId = dockerClient.commit(commitConfig);
70+
71+
logResponseStream(dockerClient.push(username + "/busybox"));
7672

7773
dockerClient.removeImage(imageId);
7874

79-
assertThat(asString(dockerClient.pull(getUsername() + "/busybox")), not(containsString("404")));
75+
assertThat(asString(dockerClient.pull(username + "/busybox")), not(containsString("404")));
8076
}
8177

8278
@Test
8379
public void testNotExistentImage() throws Exception {
84-
setUpCredentials();
85-
assertThat(logResponseStream(dockerClient.push(getUsername() + "/xxx")), containsString("error"));
86-
}
8780

88-
private void setUpCredentials() {
89-
dockerClient.setCredentials(getUsername(), getPassword(), getEmail());
81+
assertThat(logResponseStream(dockerClient.push(username + "/xxx")), containsString("error"));
9082
}
9183

9284

0 commit comments

Comments
 (0)