diff --git a/README.md b/README.md index 76075d2f..a51128f7 100644 --- a/README.md +++ b/README.md @@ -1,116 +1,3 @@ -# docker-java - -Java API client for [Docker](http://docs.docker.io/ "Docker") - -Supports a subset of the Docker Client API v1.11, Docker Server version 0.11 - -Developer forum for [docker-java](https://groups.google.com/forum/?hl=de#!forum/docker-java-dev "docker-java") - -## Build with Maven - -###### Prerequisites: - -* Java 1.6+ -* Maven 3.0.5 -* Docker daemon running - -Maven will run tests during build process. Tests are using localhost instance of Docker, make sure that -you have Docker running for tests to work or just turn off tests. - -If you don't have Docker running locally, you can skip tests with -DskipTests flag set to true: - - $ mvn clean install -DskipTests=true - - -By default Docker server is using UNIX sockets for communication with the Docker client, however docker-java -client uses TCP/IP to connect to the Docker server, so you will need to make sure that your Docker server is -listening on TCP port. To allow Docker server to use TCP add the following line to /etc/default/docker - - DOCKER_OPTS="-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock" - -More details setting up docket server can be found in official documentation: http://docs.docker.io/en/latest/use/basics/ - -Now make sure that docker is up: - - $ docker -H tcp://127.0.0.1:4243 version - - Client version: 0.8.1 - Go version (client): go1.2 - Git commit (client): a1598d1 - Server version: 0.8.1 - Git commit (server): a1598d1 - Go version (server): go1.2 - Last stable version: 0.8.1 - -Run build with tests: - - $ mvn clean install - -## Docker-Java maven dependency: - - - com.kpelykh - docker-java - 0.8.1 - - - -## Example code snippets: - - DockerClient dockerClient = new DockerClient("http://localhost:4243"); - -###### Get Docker info: - - Info info = dockerClient.info(); - System.out.print(info); - -###### Search Docker repository: - - List dockerSearch = dockerClient.search("busybox"); - System.out.println("Search returned" + dockerSearch.toString()); - -###### Create new Docker container, wait for its start and stop it: - - ContainerConfig containerConfig = new ContainerConfig(); - containerConfig.setImage("busybox"); - containerConfig.setCmd(new String[] {"touch", "/test"}); - ContainerCreateResponse container = dockerClient.createContainer(containerConfig); - - dockerClient.startContainer(container.id); - - dockerClient.waitContainer(container.id); - - dockerClient.stopContainer(container.id); - - -##### Support for UNIX sockets: - - Support for UNIX socket should appear in docker-java pretty soon. I'm working on its integration. - -##### Docker Builder: - -To use Docker Builder, as described on page http://docs.docker.io/en/latest/use/builder/, -user dockerClient.build(baseDir), where baseDir is a path to folder containing Dockerfile. - - - File baseDir = new File("~/kpelykh/docker/netcat"); - - ClientResponse response = dockerClient.build(baseDir); - - StringWriter logwriter = new StringWriter(); - - try { - LineIterator itr = IOUtils.lineIterator(response.getEntityInputStream(), "UTF-8"); - while (itr.hasNext()) { - String line = itr.next(); - logwriter.write(line); - LOG.info(line); - } - } finally { - IOUtils.closeQuietly(response.getEntityInputStream()); - } - - - -For additional examples, please look at [DockerClientTest.java](https://github.com/kpelykh/docker-java/blob/master/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java "DockerClientTest.java") +This project has moved to https://github.com/docker-java/docker-java +-------------------------------------------------------------------- diff --git a/src/main/java/com/kpelykh/docker/client/Config.java b/src/main/java/com/kpelykh/docker/client/Config.java new file mode 100644 index 00000000..f6e59d76 --- /dev/null +++ b/src/main/java/com/kpelykh/docker/client/Config.java @@ -0,0 +1,57 @@ +package com.kpelykh.docker.client; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URI; +import java.util.Properties; + +class Config { + URI url; + String version, username, password, email; + + private Config() { + } + + static Config createConfig() throws DockerException { + final Properties p = new Properties(); + + try { + p.load(Config.class.getResourceAsStream("/docker.io.properties")); + } catch (IOException e) { + throw new DockerException(e); + } + + final File file = new File(System.getProperty("user.home"), ".docker.io.properties"); + + if (file.isFile()) { + try { + final FileInputStream in = new FileInputStream(file); + try { + p.load(in); + } finally { + in.close(); + } + } catch (IOException e) { + throw new DockerException(e); + } + } + + for (String s : new String[]{"url", "version", "username", "password", "email"}) { + final String key = "docker.io." + s; + if (System.getProperties().keySet().contains(key)) { + p.setProperty(key, System.getProperty(key)); + } + } + + final Config c = new Config(); + + c.url = URI.create(p.getProperty("docker.io.url")); + c.version = p.getProperty("docker.io.version"); + c.username = p.getProperty("docker.io.username"); + c.password = p.getProperty("docker.io.password"); + c.email = p.getProperty("docker.io.email"); + + return c; + } +} diff --git a/src/main/java/com/kpelykh/docker/client/DockerClient.java b/src/main/java/com/kpelykh/docker/client/DockerClient.java index 93d71d15..101d7209 100644 --- a/src/main/java/com/kpelykh/docker/client/DockerClient.java +++ b/src/main/java/com/kpelykh/docker/client/DockerClient.java @@ -52,22 +52,31 @@ public class DockerClient { private static final Logger LOGGER = LoggerFactory.getLogger(DockerClient.class); - private static DockerClient instance; - private Client client; + private Client client; private String restEndpointUrl; private AuthConfig authConfig; - public DockerClient() { - this("http://localhost:4243"); + public DockerClient() throws DockerException { + this(Config.createConfig()); } - public DockerClient(String serverUrl) { - restEndpointUrl = serverUrl + "/v1.11"; + public DockerClient(String serverUrl) throws DockerException { + this(configWithServerUrl(serverUrl)); + } + + private static Config configWithServerUrl(String serverUrl) throws DockerException { + final Config c = Config.createConfig(); + c.url = URI.create(serverUrl); + return c; + } + + private DockerClient(Config config) { + restEndpointUrl = config.url + "/v" + config.version; ClientConfig clientConfig = new DefaultClientConfig(); //clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); SchemeRegistry schemeRegistry = new SchemeRegistry(); - schemeRegistry.register(new Scheme("http", 4243, PlainSocketFactory.getSocketFactory())); + schemeRegistry.register(new Scheme("http", config.url.getPort(), PlainSocketFactory.getSocketFactory())); schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory())); PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry); @@ -99,7 +108,7 @@ public void setCredentials(String username, String password, String email) { } authConfig = new AuthConfig(); authConfig.setUsername(username); - authConfig.setPassword(password); + authConfig.setPassword(password); authConfig.setEmail(email); } @@ -107,7 +116,6 @@ public void setCredentials(String username, String password, String email) { * Authenticate with the server, useful for checking authentication. */ public void auth() throws DockerException { - checkAuthConfig(); try { client.resource(restEndpointUrl + "/auth") .header("Content-Type", MediaType.APPLICATION_JSON) @@ -126,18 +134,28 @@ private String registryAuth() throws DockerException { } } - private AuthConfig authConfig() throws DockerException { - checkAuthConfig(); - return authConfig; - } + public AuthConfig authConfig() throws DockerException { + return authConfig != null + ? authConfig + : authConfigFromProperties(); + } - private void checkAuthConfig() throws DockerException { - if (authConfig == null) { - throw new DockerException("authentication credentials required"); - } - } + private static AuthConfig authConfigFromProperties() throws DockerException { + final AuthConfig a = new AuthConfig(); - /** + a.setUsername(Config.createConfig().username); + a.setPassword(Config.createConfig().password); + a.setEmail(Config.createConfig().email); + + if (a.getUsername() == null) {throw new IllegalStateException("username is null");} + if (a.getPassword() == null) {throw new IllegalStateException("password is null");} + if (a.getEmail() == null) {throw new IllegalStateException("email is null");} + + return a; + } + + + /** * * MISC API * * */ @@ -172,6 +190,19 @@ public Version version() throws DockerException { } } } + + + public int ping() throws DockerException { + WebResource webResource = client.resource(restEndpointUrl + "/_ping"); + + try { + LOGGER.trace("GET: {}", webResource); + ClientResponse resp = webResource.get(ClientResponse.class); + return resp.getStatus(); + } catch (UniformInterfaceException exception) { + throw new DockerException(exception); + } + } /** @@ -215,6 +246,9 @@ public ClientResponse pull(String repository, String tag, String registry) throw } } } + + + /** * @return The output slurped into a string. @@ -259,6 +293,36 @@ private String name(String name) { return name.contains("/") ? name : authConfig.getUsername(); } + /** + * Tag an image into a repository + * + * @param image the local image to tag (either a name or an id) + * @param repository the repository to tag in + * @param tag any tag for this image + * @param force (not documented) + * @return the HTTP status code (201 for success) + */ + public int tag(String image, String repository, String tag, boolean force) throws DockerException { + Preconditions.checkNotNull(image, "image was not specified"); + Preconditions.checkNotNull(repository, "repository was not specified"); + Preconditions.checkNotNull(tag, " tag was not provided"); + + MultivaluedMap params = new MultivaluedMapImpl(); + params.add("repo", repository); + params.add("tag", tag); + params.add("force", String.valueOf(force)); + + WebResource webResource = client.resource(restEndpointUrl + "/images/" + image + "/tag").queryParams(params); + + try { + LOGGER.trace("POST: {}", webResource); + ClientResponse resp = webResource.post(ClientResponse.class); + return resp.getStatus(); + } catch (UniformInterfaceException exception) { + throw new DockerException(exception); + } + } + /** * Create an image by importing the given stream of a tar file. * diff --git a/src/main/java/com/kpelykh/docker/client/model/ContainerConfig.java b/src/main/java/com/kpelykh/docker/client/model/ContainerConfig.java index d0865ae0..27a1d7e3 100644 --- a/src/main/java/com/kpelykh/docker/client/model/ContainerConfig.java +++ b/src/main/java/com/kpelykh/docker/client/model/ContainerConfig.java @@ -285,7 +285,7 @@ public String toString() { ", privileged=" + privileged + ", workingDir='" + workingDir + '\'' + ", domainName='" + domainName + '\'' + - ", onBuild='" + onBuild + '\'' + + ", onBuild='" + Arrays.toString(onBuild) + '\'' + '}'; } } diff --git a/src/main/java/com/kpelykh/docker/client/model/ContainerInspectResponse.java b/src/main/java/com/kpelykh/docker/client/model/ContainerInspectResponse.java index 555842e7..d686f9eb 100644 --- a/src/main/java/com/kpelykh/docker/client/model/ContainerInspectResponse.java +++ b/src/main/java/com/kpelykh/docker/client/model/ContainerInspectResponse.java @@ -33,7 +33,7 @@ public class ContainerInspectResponse { private ContainerState state; @JsonProperty("Image") - private String image; + private String imageId; @JsonProperty("NetworkSettings") private NetworkSettings networkSettings; @@ -119,12 +119,12 @@ public void setState(ContainerState state) { this.state = state; } - public String getImage() { - return image; + public String getImageId() { + return imageId; } - public void setImage(String image) { - this.image = image; + public void setImageId(String image) { + this.imageId = image; } public NetworkSettings getNetworkSettings() { diff --git a/src/main/java/com/kpelykh/docker/client/model/ImageInspectResponse.java b/src/main/java/com/kpelykh/docker/client/model/ImageInspectResponse.java index a7b4409e..3514670c 100644 --- a/src/main/java/com/kpelykh/docker/client/model/ImageInspectResponse.java +++ b/src/main/java/com/kpelykh/docker/client/model/ImageInspectResponse.java @@ -22,7 +22,7 @@ public class ImageInspectResponse { @JsonProperty("container_config") private ContainerConfig containerConfig; - @JsonProperty("Size") private int size; + @JsonProperty("Size") private long size; @JsonProperty("docker_version") private String dockerVersion; @@ -76,11 +76,11 @@ public void setContainerConfig(ContainerConfig containerConfig) { this.containerConfig = containerConfig; } - public int getSize() { + public long getSize() { return size; } - public void setSize(int size) { + public void setSize(long size) { this.size = size; } diff --git a/src/main/resources/docker.io.properties b/src/main/resources/docker.io.properties new file mode 100644 index 00000000..0ce162bd --- /dev/null +++ b/src/main/resources/docker.io.properties @@ -0,0 +1,2 @@ +docker.io.url=http://localhost:4243 +docker.io.version=1.11 \ No newline at end of file diff --git a/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java b/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java index eb9bcf73..d8313ca4 100644 --- a/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java +++ b/src/test/java/com/kpelykh/docker/client/test/AbstractDockerClientTest.java @@ -1,18 +1,17 @@ package com.kpelykh.docker.client.test; -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; - +import com.kpelykh.docker.client.DockerClient; +import com.kpelykh.docker.client.DockerException; +import com.sun.jersey.api.client.ClientResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.ITestResult; -import com.kpelykh.docker.client.DockerClient; -import com.kpelykh.docker.client.DockerException; -import com.sun.jersey.api.client.ClientResponse; +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; public abstract class AbstractDockerClientTest extends Assert { @@ -31,8 +30,11 @@ public void beforeTest() throws DockerException { LOG.info("Connecting to Docker server at " + url); dockerClient = new DockerClient(url); - LOG.info("Creating image 'busybox'"); - dockerClient.pull("busybox"); + LOG.info("Pulling image 'busybox'"); + // need to block until image is pulled completely + logResponseStream(dockerClient.pull("busybox")); + + assertNotNull(dockerClient); LOG.info("======================= END OF BEFORETEST =======================\n\n"); @@ -76,28 +78,15 @@ public void afterMethod(ITestResult result) { result.getName()); } - protected String logResponseStream(ClientResponse response) throws IOException { - String responseString = DockerClient.asString(response); + protected String logResponseStream(ClientResponse response) { + String responseString; + try { + responseString = DockerClient.asString(response); + } catch (IOException e) { + throw new RuntimeException(e); + } LOG.info("Container log: {}", responseString); return responseString; } - - private String getProperty(String name) { - String property = System.getProperty(name); - 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."); - return property; - } - - protected String getUsername() { - return getProperty("docker.io.username"); - } - - protected String getPassword() { - return getProperty("docker.io.password"); - } - - protected String getEmail() { - return getProperty("docker.io.email"); - } } diff --git a/src/test/java/com/kpelykh/docker/client/test/DockerClientAuthTest.java b/src/test/java/com/kpelykh/docker/client/test/DockerClientAuthTest.java index 6fe6e999..8c7fc4fa 100644 --- a/src/test/java/com/kpelykh/docker/client/test/DockerClientAuthTest.java +++ b/src/test/java/com/kpelykh/docker/client/test/DockerClientAuthTest.java @@ -1,25 +1,20 @@ package com.kpelykh.docker.client.test; -import static org.hamcrest.MatcherAssert.assertThat; - -import java.lang.reflect.Method; -import java.util.ArrayList; +import com.kpelykh.docker.client.DockerException; +import com.sun.jersey.api.client.UniformInterfaceException; import org.hamcrest.Matchers; import org.testng.ITestResult; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; +import org.testng.annotations.*; -import com.kpelykh.docker.client.DockerException; -import com.sun.jersey.api.client.UniformInterfaceException; +import java.lang.reflect.Method; + +import static org.hamcrest.MatcherAssert.assertThat; public class DockerClientAuthTest extends AbstractDockerClientTest { @BeforeTest - public void beforeTest() throws DockerException { + public void beforeTest() throws DockerException { super.beforeTest(); } @AfterTest @@ -36,21 +31,21 @@ public void beforeMethod(Method method) { public void afterMethod(ITestResult result) { super.afterMethod(result); } - + @Test public void testAuth() throws Exception { - dockerClient.setCredentials(getUsername(), getPassword(), getEmail()); dockerClient.auth(); } @Test public void testAuthInvalid() throws Exception { - dockerClient.setCredentials(getUsername(), getPassword(), getEmail()); + System.setProperty("docker.io.password", "garbage"); try { dockerClient.auth(); + fail(); } catch (DockerException e) { assertThat(e.getCause(), Matchers.instanceOf(UniformInterfaceException.class)); - assertEquals(401, ((UniformInterfaceException) e.getCause()).getResponse().getStatus()); + assertEquals(((UniformInterfaceException) e.getCause()).getResponse().getStatus(), 401); } } } diff --git a/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java b/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java index 2267e766..f6af3823 100644 --- a/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java +++ b/src/test/java/com/kpelykh/docker/client/test/DockerClientTest.java @@ -25,10 +25,12 @@ import java.net.DatagramSocket; import java.net.ServerSocket; import java.util.List; +import java.util.Random; import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.RandomUtils; import org.hamcrest.Matcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -151,6 +153,14 @@ public void testImages() throws DockerException { @Test public void testListContainers() throws DockerException { + + String testImage = "hackmann/empty"; + + LOG.info("Pulling image 'hackmann/empty'"); + // need to block until image is pulled completely + logResponseStream(dockerClient.pull(testImage)); + tmpImgs.add(testImage); + List containers = dockerClient.listContainers(true); assertThat(containers, notNullValue()); LOG.info("Container List: {}", containers); @@ -158,18 +168,30 @@ public void testListContainers() throws DockerException { int size = containers.size(); ContainerConfig containerConfig = new ContainerConfig(); - containerConfig.setImage("busybox"); + containerConfig.setImage(testImage); containerConfig.setCmd(new String[] { "echo" }); ContainerCreateResponse container1 = dockerClient .createContainer(containerConfig); + assertThat(container1.getId(), not(isEmptyString())); + + ContainerInspectResponse containerInspectResponse = dockerClient.inspectContainer(container1.getId()); + + assertThat(containerInspectResponse.getConfig().getImage(), is(equalTo(testImage))); + + dockerClient.startContainer(container1.getId()); tmpContainers.add(container1.getId()); LOG.info("container id: " + container1.getId()); - List containers2 = dockerClient.listContainers(true); + List containers2 = dockerClient.listContainers(true); + + for(Container container: containers2) { + LOG.info("listContainer: id=" + container.getId() +" image=" + container.getImage()); + } + assertThat(size + 1, is(equalTo(containers2.size()))); Matcher matcher = hasItem(hasField("id", startsWith(container1.getId()))); assertThat(containers2, matcher); @@ -179,12 +201,12 @@ public void testListContainers() throws DockerException { assertThat(filteredContainers.size(), is(equalTo(1))); for(Container container: filteredContainers) { - LOG.info("container: " + container); + LOG.info("filteredContainer: " + container.getImage()); } Container container2 = filteredContainers.get(0); assertThat(container2.getCommand(), not(isEmptyString())); - assertThat(container2.getImage(), equalTo("busybox:latest")); + assertThat(container2.getImage(), equalTo(testImage + ":latest")); } /* @@ -232,7 +254,7 @@ public void testStartContainer() throws DockerException { assertThat(containerInspectResponse.getId(), startsWith(container.getId())); - assertThat(containerInspectResponse.getImage(), not(isEmptyString())); + assertThat(containerInspectResponse.getImageId(), not(isEmptyString())); assertThat(containerInspectResponse.getState(), is(notNullValue())); assertThat(containerInspectResponse.getState().running, is(true)); @@ -549,6 +571,16 @@ public void testRemoveImage() throws DockerException, InterruptedException { assertThat(containers, matcher); } + @Test + public void testTagImage() throws DockerException, InterruptedException { + String tag = String.valueOf(RandomUtils.nextInt(Integer.MAX_VALUE)); + + Integer result = dockerClient.tag("busybox:latest", "docker-java/busybox", tag, false); + assertThat(result, equalTo(Integer.valueOf(201))); + + dockerClient.removeImage("docker-java/busybox:" + tag); + } + /* * * ################ ## MISC TESTS ## ################ diff --git a/src/test/java/com/kpelykh/docker/client/test/DockerPushTest.java b/src/test/java/com/kpelykh/docker/client/test/DockerPushTest.java index b5709f96..7e6d88a9 100644 --- a/src/test/java/com/kpelykh/docker/client/test/DockerPushTest.java +++ b/src/test/java/com/kpelykh/docker/client/test/DockerPushTest.java @@ -1,27 +1,20 @@ package com.kpelykh.docker.client.test; -import static com.kpelykh.docker.client.DockerClient.asString; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.isEmptyString; -import static org.hamcrest.Matchers.not; - -import java.lang.reflect.Method; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.ITestResult; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.Test; - import com.kpelykh.docker.client.DockerException; import com.kpelykh.docker.client.model.CommitConfig; import com.kpelykh.docker.client.model.ContainerConfig; import com.kpelykh.docker.client.model.ContainerCreateResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.ITestResult; +import org.testng.annotations.*; + +import java.lang.reflect.Method; + +import static com.kpelykh.docker.client.DockerClient.asString; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; // delete here : https://index.docker.io/u/alexec/busybox/delete/ public class DockerPushTest extends AbstractDockerClientTest { @@ -29,9 +22,12 @@ public class DockerPushTest extends AbstractDockerClientTest { public static final Logger LOG = LoggerFactory .getLogger(DockerPushTest.class); + String username; + @BeforeTest public void beforeTest() throws DockerException { super.beforeTest(); + username = dockerClient.authConfig().getUsername(); } @AfterTest public void afterTest() { @@ -47,10 +43,10 @@ public void beforeMethod(Method method) { public void afterMethod(ITestResult result) { super.afterMethod(result); } - + @Test public void testPushLatest() throws Exception { - setUpCredentials(); + ContainerConfig containerConfig = new ContainerConfig(); containerConfig.setImage("busybox"); @@ -67,26 +63,22 @@ public void testPushLatest() throws Exception { LOG.info("Commiting container: {}", container.toString()); CommitConfig commitConfig = new CommitConfig(container.getId()); - commitConfig.setRepo(getUsername() + "/busybox"); - - String imageId = dockerClient - .commit(commitConfig); + + commitConfig.setRepo(username + "/busybox"); - logResponseStream(dockerClient.push(getUsername() + "/busybox")); + String imageId = dockerClient.commit(commitConfig); + + logResponseStream(dockerClient.push(username + "/busybox")); dockerClient.removeImage(imageId); - assertThat(asString(dockerClient.pull(getUsername() + "/busybox")), not(containsString("404"))); + assertThat(asString(dockerClient.pull(username + "/busybox")), not(containsString("404"))); } @Test public void testNotExistentImage() throws Exception { - setUpCredentials(); - assertThat(logResponseStream(dockerClient.push(getUsername() + "/xxx")), containsString("error")); - } - private void setUpCredentials() { - dockerClient.setCredentials(getUsername(), getPassword(), getEmail()); + assertThat(logResponseStream(dockerClient.push(username + "/xxx")), containsString("error")); }