Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 11 additions & 9 deletions src/main/java/com/github/dockerjava/core/DockerClientConfig.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package com.github.dockerjava.core;

import static com.google.common.base.Preconditions.checkNotNull;
import com.github.dockerjava.api.DockerClientException;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.AuthConfigurations;
import com.github.dockerjava.core.NameParser.HostnameReposName;
import com.github.dockerjava.core.NameParser.ReposTag;

import java.io.File;
import java.io.FileInputStream;
Expand All @@ -12,11 +16,7 @@
import java.util.Map;
import java.util.Properties;

import com.github.dockerjava.api.DockerClientException;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.AuthConfigurations;
import com.github.dockerjava.core.NameParser.HostnameReposName;
import com.github.dockerjava.core.NameParser.ReposTag;
import static com.google.common.base.Preconditions.checkNotNull;

public class DockerClientConfig implements Serializable {

Expand Down Expand Up @@ -66,14 +66,16 @@ public class DockerClientConfig implements Serializable {

private URI uri;

private final String version, username, password, email, serverAddress, dockerCfgPath;
private final String username, password, email, serverAddress, dockerCfgPath;

private final RemoteApiVersion version;

private final SSLConfig sslConfig;

DockerClientConfig(URI uri, String version, String username, String password, String email, String serverAddress,
String dockerCfgPath, SSLConfig sslConfig) {
this.uri = uri;
this.version = version;
this.version = RemoteApiVersion.parseConfigWithDefault(version);
this.username = username;
this.password = password;
this.email = email;
Expand Down Expand Up @@ -209,7 +211,7 @@ public void setUri(URI uri) {
this.uri = uri;
}

public String getVersion() {
public RemoteApiVersion getVersion() {
return version;
}

Expand Down
34 changes: 12 additions & 22 deletions src/main/java/com/github/dockerjava/core/DockerClientImpl.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
package com.github.dockerjava.core;

import static com.google.common.base.Preconditions.checkNotNull;

import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.AttachContainerCmd;
import com.github.dockerjava.api.command.AuthCmd;
Expand Down Expand Up @@ -46,7 +39,6 @@
import com.github.dockerjava.api.command.VersionCmd;
import com.github.dockerjava.api.command.WaitContainerCmd;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.AuthConfigurations;
import com.github.dockerjava.api.model.Identifier;
import com.github.dockerjava.core.command.AttachContainerCmdImpl;
import com.github.dockerjava.core.command.AuthCmdImpl;
Expand Down Expand Up @@ -85,6 +77,13 @@
import com.github.dockerjava.core.command.VersionCmdImpl;
import com.github.dockerjava.core.command.WaitContainerCmdImpl;

import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import static com.google.common.base.Preconditions.checkNotNull;

/**
* @author Konstantin Pelykh ([email protected])
*
Expand Down Expand Up @@ -332,28 +331,19 @@ public CommitCmd commitCmd(String containerId) {

@Override
public BuildImageCmd buildImageCmd() {
return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec()));
return new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec());
}

@Override
public BuildImageCmd buildImageCmd(File dockerFileOrFolder) {
return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(),
dockerFileOrFolder));
return new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(),
dockerFileOrFolder);
}

@Override
public BuildImageCmd buildImageCmd(InputStream tarInputStream) {
return augmentBuildImageCmd(new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(),
tarInputStream));
}

private BuildImageCmd augmentBuildImageCmd(BuildImageCmd buildImageCmd) {
final AuthConfigurations authConfigurations = dockerClientConfig.getAuthConfigurations();
if (!authConfigurations.getConfigs().isEmpty()) {
buildImageCmd.withBuildAuthConfigs(authConfigurations);
}

return buildImageCmd;
return new BuildImageCmdImpl(getDockerCmdExecFactory().createBuildImageCmdExec(),
tarInputStream);
}

@Override
Expand Down
111 changes: 111 additions & 0 deletions src/main/java/com/github/dockerjava/core/RemoteApiVersion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package com.github.dockerjava.core;

import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* Bean to encapsulate the version of the Docker Remote API (REST API)
* <p>
* Contains the minor and major version of the API as well as operations to compare API versions.
*
* @author Marcus Thiesen
*/
public class RemoteApiVersion {

public static final RemoteApiVersion VERSION_1_19 = RemoteApiVersion.create(1, 19);
private static final Pattern VERSION_REGEX = Pattern.compile("v?(\\d+)\\.(\\d+)");
private static final RemoteApiVersion UNKNOWN_VERSION = new RemoteApiVersion(0, 0) {

@Override
public boolean isGreaterOrEqual(final RemoteApiVersion other) {
return false;
}

@Override
public String toString() {
return MoreObjects.toStringHelper(this).addValue("UNKNOWN_VERSION").toString();
}

@Override
public String asWebPathPart() {
return "";
}
};
private final int major;
private final int minor;
private RemoteApiVersion(final int major, final int minor) {
this.major = major;
this.minor = minor;
}

public static RemoteApiVersion create(final int major, final int minor) {
Preconditions.checkArgument(major > 0, "Major version must be bigger than 0 but is " + major);
Preconditions.checkArgument(minor > 0, "Minor version must be bigger than 0 but is " + minor);
return new RemoteApiVersion(major, minor);
}

public static RemoteApiVersion unknown() {
return UNKNOWN_VERSION;
}

public static RemoteApiVersion parseConfig(final String version) {
Preconditions.checkArgument(version != null, "Version must not be null");
final Matcher matcher = VERSION_REGEX.matcher(version);
if (matcher.matches()) {
return create(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)));
}
throw new IllegalArgumentException(version + " can not be parsed");
}

public static RemoteApiVersion parseConfigWithDefault(final String version) {
if (Strings.isNullOrEmpty(version)) {
return UNKNOWN_VERSION;
}

try {
return parseConfig(version);
} catch (IllegalArgumentException e) {
return UNKNOWN_VERSION;
}
}

public boolean isGreaterOrEqual(final RemoteApiVersion other) {
if (major >= other.major) {
if (minor >= other.minor) {
return true;
}
}
return false;
}

@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final RemoteApiVersion that = (RemoteApiVersion) o;
return Objects.equal(major, that.major) &&
Objects.equal(minor, that.minor);
}

@Override
public int hashCode() {
return Objects.hashCode(major, minor);
}

@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("major", major)
.add("minor", minor)
.toString();
}

public String asWebPathPart() {
return "v" + major + "." + minor;
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package com.github.dockerjava.jaxrs;

import java.io.Closeable;
import java.io.IOException;

import javax.ws.rs.client.WebTarget;

import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.AsyncDockerCmd;
import com.github.dockerjava.api.command.DockerCmdAsyncExec;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier;

import javax.ws.rs.client.WebTarget;
import java.io.Closeable;
import java.io.IOException;

public abstract class AbstrAsyncDockerCmdExec<CMD_T extends AsyncDockerCmd<CMD_T, A_RES_T>, A_RES_T> extends
AbstrDockerCmdExec implements DockerCmdAsyncExec<CMD_T, A_RES_T> {

public AbstrAsyncDockerCmdExec(WebTarget baseResource) {
super(baseResource);
public AbstrAsyncDockerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
super(baseResource, dockerClientConfig);
}

@Override
Expand Down
35 changes: 24 additions & 11 deletions src/main/java/com/github/dockerjava/jaxrs/AbstrDockerCmdExec.java
Original file line number Diff line number Diff line change
@@ -1,30 +1,37 @@
package com.github.dockerjava.jaxrs;

import static com.google.common.base.Preconditions.checkNotNull;

import java.io.IOException;

import javax.ws.rs.client.WebTarget;

import org.apache.commons.codec.binary.Base64;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.api.model.AuthConfigurations;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.RemoteApiVersion;
import org.apache.commons.codec.binary.Base64;

import javax.ws.rs.client.WebTarget;
import java.io.IOException;

import static com.google.common.base.Preconditions.checkNotNull;

public abstract class AbstrDockerCmdExec {

private WebTarget baseResource;
private final DockerClientConfig dockerClientConfig;
private final WebTarget baseResource;

public AbstrDockerCmdExec(WebTarget baseResource) {
public AbstrDockerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
checkNotNull(baseResource, "baseResource was not specified");
checkNotNull(dockerClientConfig, "dockerClientConfig was not specified");
this.baseResource = baseResource;
this.dockerClientConfig = dockerClientConfig;
}

protected WebTarget getBaseResource() {
return baseResource;
}

protected AuthConfigurations getBuildAuthConfigs() {
return dockerClientConfig.getAuthConfigurations();
}

protected String registryAuth(AuthConfig authConfig) {
try {
return Base64.encodeBase64String(new ObjectMapper().writeValueAsString(authConfig).getBytes());
Expand All @@ -35,7 +42,13 @@ protected String registryAuth(AuthConfig authConfig) {

protected String registryConfigs(AuthConfigurations authConfigs) {
try {
String json = new ObjectMapper().writeValueAsString(authConfigs.getConfigs());
final String json;
if (dockerClientConfig.getVersion().isGreaterOrEqual(RemoteApiVersion.VERSION_1_19)) {
json = new ObjectMapper().writeValueAsString(authConfigs.getConfigs());
} else {
json = new ObjectMapper().writeValueAsString(authConfigs);
}

return Base64.encodeBase64String(json.getBytes());
} catch (IOException e) {
throw new RuntimeException(e);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
package com.github.dockerjava.jaxrs;

import java.io.IOException;

import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.WebTarget;

import com.github.dockerjava.api.DockerException;
import com.github.dockerjava.api.command.DockerCmd;
import com.github.dockerjava.api.command.DockerCmdSyncExec;
import com.github.dockerjava.core.DockerClientConfig;

import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.WebTarget;

public abstract class AbstrSyncDockerCmdExec<CMD_T extends DockerCmd<RES_T>, RES_T> extends AbstrDockerCmdExec
implements DockerCmdSyncExec<CMD_T, RES_T> {

public AbstrSyncDockerCmdExec(WebTarget baseResource) {
super(baseResource);
public AbstrSyncDockerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
super(baseResource, dockerClientConfig);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
package com.github.dockerjava.jaxrs;

import javax.ws.rs.client.WebTarget;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.AttachContainerCmd;
import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.async.FrameStreamProcessor;
import com.github.dockerjava.jaxrs.async.AbstractCallbackNotifier;
import com.github.dockerjava.jaxrs.async.POSTCallbackNotifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ws.rs.client.WebTarget;

public class AttachContainerCmdExec extends AbstrAsyncDockerCmdExec<AttachContainerCmd, Frame> implements
AttachContainerCmd.Exec {

private static final Logger LOGGER = LoggerFactory.getLogger(AttachContainerCmdExec.class);

public AttachContainerCmdExec(WebTarget baseResource) {
super(baseResource);
public AttachContainerCmdExec(WebTarget baseResource, DockerClientConfig dockerClientConfig) {
super(baseResource, dockerClientConfig);
}

@Override
Expand Down
Loading