Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Docker auth config #1138

Merged
merged 5 commits into from Aug 5, 2016
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 15 additions & 0 deletions SingularityExecutor/pom.xml
Expand Up @@ -109,6 +109,21 @@
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
Expand Up @@ -221,6 +221,9 @@ public class SingularityExecutorConfiguration extends BaseRunnerConfiguration {
@JsonProperty
private int maxDockerPullAttempts = 2;

@JsonProperty
private Optional<SingularityExecutorDockerAuthConfig> dockerAuthConfig = Optional.absent();

@JsonProperty
private ThreadCheckerType threadCheckerType = ThreadCheckerType.PS;

Expand Down Expand Up @@ -639,6 +642,14 @@ public void setMaxDockerPullAttempts(int maxDockerPullAttempts) {
this.maxDockerPullAttempts = maxDockerPullAttempts;
}

public Optional<SingularityExecutorDockerAuthConfig> getDockerAuthConfig() {
return dockerAuthConfig;
}

public void setDockerAuthConfig(Optional<SingularityExecutorDockerAuthConfig> dockerAuthConfig) {
this.dockerAuthConfig = dockerAuthConfig;
}

public ThreadCheckerType getThreadCheckerType() {
return threadCheckerType;
}
Expand Down
@@ -0,0 +1,42 @@
package com.hubspot.singularity.executor.config;

public class SingularityExecutorDockerAuthConfig {

private String username;
private String password;
private String email;
private String serverAddress;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getServerAddress() {
return serverAddress;
}

public void setServerAddress(String serverAddress) {
this.serverAddress = serverAddress;
}

}
Expand Up @@ -19,7 +19,9 @@
import com.ning.http.client.AsyncHttpClientConfig;
import com.ning.http.client.extra.ThrottleRequestFilter;
import com.spotify.docker.client.DefaultDockerClient;
import com.spotify.docker.client.DefaultDockerClient.Builder;
import com.spotify.docker.client.DockerClient;
import com.spotify.docker.client.messages.AuthConfig;

public class SingularityExecutorModule extends AbstractModule {

Expand Down Expand Up @@ -99,10 +101,22 @@ public Handlebars providesHandlebars() {
@Provides
@Singleton
public DockerClient providesDockerClient(SingularityExecutorConfiguration configuration) {
return DefaultDockerClient.builder()
Builder dockerClientBuilder = DefaultDockerClient.builder()
.uri(URI.create("unix://localhost/var/run/docker.sock"))
.connectionPoolSize(configuration.getDockerClientConnectionPoolSize())
.build();
.connectionPoolSize(configuration.getDockerClientConnectionPoolSize());

if(configuration.getDockerAuthConfig().isPresent()) {
SingularityExecutorDockerAuthConfig authConfig = configuration.getDockerAuthConfig().get();

dockerClientBuilder.authConfig(AuthConfig.builder()
.email(authConfig.getEmail())
.username(authConfig.getUsername())
.password(authConfig.getPassword())
.serverAddress(authConfig.getServerAddress())
.build());
}

return dockerClientBuilder.build();
}

@Provides
Expand Down
@@ -0,0 +1,56 @@
package com.hubspot.singularity.executor.config;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;

import java.io.File;
import java.lang.reflect.Field;

import javax.validation.Validator;

import org.junit.Test;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Optional;
import com.google.common.base.Throwables;
import com.hubspot.singularity.runner.base.config.SingularityRunnerBaseModule;
import com.hubspot.singularity.runner.base.config.SingularityRunnerConfigurationProvider;

public class SingularityExecutorConfigurationTest {

@Test
public void itLoadsDockerAuthConfig() {
SingularityExecutorConfiguration config = loadConfig("config/executor-conf-dockerauth.yaml");

assertThat(config.getDockerAuthConfig().isPresent()).isTrue();
assertThat(config.getDockerAuthConfig().get().getUsername()).isEqualTo("dockeruser");
assertThat(config.getDockerAuthConfig().get().getPassword()).isEqualTo("dockerpassword");
assertThat(config.getDockerAuthConfig().get().getServerAddress()).isEqualTo("https://private.docker.registry/path");
}

private SingularityExecutorConfiguration loadConfig(String file) {
try {
ObjectMapper mapper = new SingularityRunnerBaseModule(null).providesYamlMapper();
Validator validator = mock(Validator.class);

Field mapperField = SingularityRunnerConfigurationProvider.class.getDeclaredField("objectMapper");
mapperField.setAccessible(true);

Field validatorField = SingularityRunnerConfigurationProvider.class.getDeclaredField("validator");
validatorField.setAccessible(true);

SingularityRunnerConfigurationProvider<SingularityExecutorConfiguration> configProvider = new SingularityRunnerConfigurationProvider<>(
SingularityExecutorConfiguration.class,
Optional.of(new File(getClass().getClassLoader().getResource(file).toURI()).getAbsolutePath()));

mapperField.set(configProvider, mapper);
validatorField.set(configProvider, validator);

return configProvider.get();
}
catch(Exception e) {
throw Throwables.propagate(e);
}
}

}
@@ -0,0 +1,6 @@
executor:

dockerAuthConfig:
username: dockeruser
password: dockerpassword
serverAddress: https://private.docker.registry/path