Skip to content

Commit

Permalink
Allow to override the registry for a Docker instance
Browse files Browse the repository at this point in the history
  • Loading branch information
gartens committed Jul 25, 2023
1 parent 99194ca commit 4d7cd88
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 44 deletions.
27 changes: 13 additions & 14 deletions config/src/main/java/org/polypheny/db/config/ConfigDocker.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,37 +40,31 @@ public class ConfigDocker extends ConfigObject {
private String alias;
@Getter
@Setter
private String registry;
@Getter
@Setter
private int port;


public ConfigDocker( String host, String alias ) {
this( idBuilder.getAndIncrement(), host, alias, COMMUNICATION_PORT );
}


public ConfigDocker( String host ) {
this( idBuilder.getAndIncrement(), host, host, COMMUNICATION_PORT );
}


public ConfigDocker( String host, int port ) {
this( idBuilder.getAndIncrement(), host, host, port );
this( idBuilder.getAndIncrement(), host, alias, "", COMMUNICATION_PORT );
}


public ConfigDocker( String host, String alias, int port ) {
this( idBuilder.getAndIncrement(), host, alias, port );
public ConfigDocker( String host, String alias, String registry, int port ) {
this( idBuilder.getAndIncrement(), host, alias, registry, port );
}


public ConfigDocker( int id, String host, String alias, int port ) {
public ConfigDocker( int id, String host, String alias, String registry, int port ) {
super( "dockerConfig" + id );
this.id = id;
if ( idBuilder.get() <= id ) {
idBuilder.set( id + 1 );
}
this.host = host;
this.alias = alias;
this.registry = registry;
this.port = port;
this.webUiFormType = WebUiFormType.DOCKER_INSTANCE;
}
Expand All @@ -86,6 +80,7 @@ public static ConfigDocker fromMap( Map<String, Object> value ) {
newId.intValue(),
(String) value.get( "host" ),
(String) value.get( "alias" ),
(String) value.getOrDefault( "registry", "" ),
((Double) value.getOrDefault( "port", (double) COMMUNICATION_PORT )).intValue()
);
}
Expand All @@ -96,6 +91,7 @@ public Map<String, Object> toMap() {
m.put( "id", (double) id );
m.put( "host", host );
m.put( "alias", alias );
m.put( "registry", registry );
m.put( "port", (double) port );
return m;
}
Expand All @@ -107,6 +103,7 @@ public Map<String, String> getSettings() {
settings.put( "id", String.valueOf( id ) );
settings.put( "host", host );
settings.put( "alias", alias );
settings.put( "registry", registry );
settings.put( "port", String.valueOf( port ) );

return settings;
Expand Down Expand Up @@ -168,6 +165,7 @@ public static Map<String, Object> parseConfigToMap( com.typesafe.config.Config c
confMap.put( "id", conf.getDouble( "id" ) );
confMap.put( "host", conf.getString( "host" ) );
confMap.put( "alias", conf.getString( "alias" ) );
confMap.put( "registry", conf.getString( "registry" ) );
if ( conf.hasPath( "port" ) ) {
confMap.put( "port", conf.getDouble( "port" ) );
}
Expand All @@ -193,6 +191,7 @@ public boolean equals( Object o ) {
ConfigDocker that = (ConfigDocker) o;
return host.equals( that.host ) &&
alias.equals( that.alias ) &&
registry.equals( that.registry ) &&
port == that.port;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -680,9 +680,10 @@ public void configDocker() {

String url = "test";
String alias = "name";
ConfigDocker c = new ConfigDocker( 0, url, alias, 7001 );
ConfigDocker c = new ConfigDocker( 0, url, alias, "docker.io", 7001 );
Assert.assertEquals( c.getAlias(), alias );
Assert.assertEquals( c.getHost(), url );
Assert.assertEquals( c.getRegistry(), "docker.io" );
Assert.assertEquals( 7001, c.getPort() );

cm.registerConfig( c );
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/java/org/polypheny/db/docker/AutoDocker.java
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ public boolean doAutoConnect() {
return false;
}
} else {
DockerSetupResult res = DockerSetupHelper.newDockerInstance( "localhost", "localhost", false );
DockerSetupResult res = DockerSetupHelper.newDockerInstance( "localhost", "localhost", "", false );

if ( res.isSuccess() ) {
return true;
Expand Down
26 changes: 16 additions & 10 deletions core/src/main/java/org/polypheny/db/docker/DockerInstance.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ public final class DockerInstance {
private String host;
@Getter
private String alias;
private String registry;
private final int port;
private Set<String> uuids = new HashSet<>();

Expand All @@ -75,10 +76,11 @@ private enum Status {
}


DockerInstance( Integer instanceId, String host, String alias, int port ) {
DockerInstance( Integer instanceId, String host, String alias, String registry, int port ) {
log.info( "New Docker instance with ID " + instanceId );
this.host = host;
this.alias = alias;
this.registry = registry;
this.port = port;
this.instanceId = instanceId;
this.dockerInstanceUuid = null;
Expand Down Expand Up @@ -189,6 +191,7 @@ public Map<String, Object> getMap() {
"id", instanceId,
"host", host,
"alias", alias,
"registry", registry,
"connected", isConnected()
);
}
Expand Down Expand Up @@ -253,7 +256,7 @@ boolean hasContainers() throws IOException {
}


void updateConfig( String host, String alias ) {
void updateConfig( String host, String alias, String registry ) {
synchronized ( this ) {
if ( !this.host.equals( host ) ) {
client.close();
Expand All @@ -266,6 +269,7 @@ void updateConfig( String host, String alias ) {
}
}
this.alias = alias;
this.registry = registry;
}
}

Expand Down Expand Up @@ -296,13 +300,6 @@ public class ContainerBuilder {


private ContainerBuilder( String imageName, String uniqueName ) {
String registry = RuntimeConfig.DOCKER_CONTAINER_REGISTRY.getString();
if ( registry.equals( "" ) || registry.endsWith( "/" ) ) {
imageName = registry + imageName;
} else {
imageName = registry + "/" + imageName;
}

this.imageName = imageName;
this.uniqueName = uniqueName;
}
Expand All @@ -328,7 +325,16 @@ public ContainerBuilder withCommand( List<String> cmd ) {

public DockerContainer createAndStart() throws IOException {
synchronized ( DockerInstance.this ) {
String uuid = client.createAndStartContainer( DockerContainer.getPhysicalUniqueName( uniqueName ), imageName, exposedPorts, initCommand, environmentVariables, List.of() );
final String registry = DockerInstance.this.registry.equals( "" ) ? RuntimeConfig.DOCKER_CONTAINER_REGISTRY.getString() : DockerInstance.this.registry;

final String imageNameWithRegistry;
if ( registry.equals( "" ) || registry.endsWith( "/" ) ) {
imageNameWithRegistry = registry + imageName;
} else {
imageNameWithRegistry = registry + "/" + imageName;
}

String uuid = client.createAndStartContainer( DockerContainer.getPhysicalUniqueName( uniqueName ), imageNameWithRegistry, exposedPorts, initCommand, environmentVariables, List.of() );
uuids.add( uuid );
return new DockerContainer( uuid, uniqueName );
}
Expand Down
13 changes: 7 additions & 6 deletions core/src/main/java/org/polypheny/db/docker/DockerManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public final class DockerManager {

public static DockerManager getInstance() {
if ( !INSTANCE.initialized.getAndSet( true ) ) {
RuntimeConfig.DOCKER_INSTANCES.getList( ConfigDocker.class ).forEach( c -> INSTANCE.addDockerInstance( c.getHost(), c.getAlias(), c.getPort(), c ) );
RuntimeConfig.DOCKER_INSTANCES.getList( ConfigDocker.class ).forEach( c -> INSTANCE.addDockerInstance( c.getHost(), c.getAlias(), c.getRegistry(), c.getPort(), c ) );
}

return INSTANCE;
Expand Down Expand Up @@ -81,7 +81,7 @@ public boolean hasAlias( String alias ) {
/**
* Returns the id of the new DockerInstance for host, or if it already exists the id for that.
*/
void addDockerInstance( String host, String alias, int port, @Nullable ConfigDocker existingConfig ) {
void addDockerInstance( String host, String alias, String registry, int port, @Nullable ConfigDocker existingConfig ) {
synchronized ( this ) {
if ( hasHost( host ) ) {
throw new RuntimeException( "There is already a docker instance connected to " + host );
Expand All @@ -93,16 +93,16 @@ void addDockerInstance( String host, String alias, int port, @Nullable ConfigDoc
if ( configDocker == null ) {
// TODO: racy, someone else could modify runtime/dockerInstances elsewhere
List<ConfigDocker> configList = RuntimeConfig.DOCKER_INSTANCES.getList( ConfigDocker.class );
configDocker = new ConfigDocker( host, alias, port );
configDocker = new ConfigDocker( host, alias, registry, port );
configList.add( configDocker );
ConfigManager.getInstance().getConfig( "runtime/dockerInstances" ).setConfigObjectList( configList.stream().map( ConfigDocker::toMap ).collect( Collectors.toList() ), ConfigDocker.class );
}
dockerInstances.put( configDocker.getId(), new DockerInstance( configDocker.getId(), host, alias, port ) );
dockerInstances.put( configDocker.getId(), new DockerInstance( configDocker.getId(), host, alias, registry, port ) );
}
}


void updateDockerInstance( int id, String host, String alias ) {
void updateDockerInstance( int id, String host, String alias, String registry ) {
synchronized ( this ) {
DockerInstance dockerInstance = getInstanceById( id ).orElseThrow( () -> new RuntimeException( "No docker instance with id " + id ) );
if ( !dockerInstance.getHost().equals( host ) && dockerInstances.values().stream().anyMatch( d -> d.getHost().equals( host ) ) ) {
Expand All @@ -112,7 +112,7 @@ void updateDockerInstance( int id, String host, String alias ) {
throw new RuntimeException( "There is already a docker instance with alias " + alias );
}

dockerInstance.updateConfig( host, alias );
dockerInstance.updateConfig( host, alias, registry );

listener.forEach( c -> c.onConfigChange( null ) );

Expand All @@ -122,6 +122,7 @@ void updateDockerInstance( int id, String host, String alias ) {
if ( c.id == id ) {
c.setHost( host );
c.setAlias( alias );
c.setRegistry( registry );
}
} );
ConfigManager.getInstance().getConfig( "runtime/dockerInstances" ).setConfigObjectList( configs.stream().map( ConfigDocker::toMap ).collect( Collectors.toList() ), ConfigDocker.class );
Expand Down
16 changes: 6 additions & 10 deletions core/src/main/java/org/polypheny/db/docker/DockerSetupHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ private static void tryConnectDirectly( String hostname ) throws IOException {
}


public static DockerSetupResult newDockerInstance( String hostname, String alias, boolean startHandshake ) {
public static DockerSetupResult newDockerInstance( String hostname, String alias, String registry, boolean startHandshake ) {
if ( hostname.equals( "" ) ) {
return new DockerSetupResult( "hostname must not be empty" );
}
Expand All @@ -62,15 +62,15 @@ public static DockerSetupResult newDockerInstance( String hostname, String alias

try {
tryConnectDirectly( hostname );
DockerManager.getInstance().addDockerInstance( hostname, alias, ConfigDocker.COMMUNICATION_PORT, null );
DockerManager.getInstance().addDockerInstance( hostname, alias, registry, ConfigDocker.COMMUNICATION_PORT, null );
return new DockerSetupResult( true );
} catch ( IOException e ) {
return new DockerSetupResult( HandshakeManager.getInstance()
.newHandshake(
hostname,
ConfigDocker.COMMUNICATION_PORT,
ConfigDocker.HANDSHAKE_PORT,
() -> DockerManager.getInstance().addDockerInstance( hostname, alias, ConfigDocker.COMMUNICATION_PORT, null ),
() -> DockerManager.getInstance().addDockerInstance( hostname, alias, registry, ConfigDocker.COMMUNICATION_PORT, null ),
startHandshake
) );
}
Expand All @@ -96,7 +96,7 @@ public static DockerUpdateResult updateDockerInstance( int id, String hostname,
DockerInstance dockerInstance = maybeDockerInstance.get();

boolean hostChanged = !dockerInstance.getHost().equals( hostname );
DockerManager.getInstance().updateDockerInstance( id, hostname, alias );
DockerManager.getInstance().updateDockerInstance( id, hostname, alias, registry );

if ( hostChanged && !dockerInstance.isConnected() ) {
HandshakeManager.getInstance().newHandshake(
Expand Down Expand Up @@ -194,7 +194,7 @@ static public final class DockerUpdateResult {

private String error = "";
private Map<String, String> handshake = Map.of();
private Map<String, String> instance = Map.of();
private Map<String, Object> instance = Map.of();


private DockerUpdateResult( String err ) {
Expand All @@ -205,11 +205,7 @@ private DockerUpdateResult( String err ) {
private DockerUpdateResult( int dockerId, boolean handshake ) {
DockerInstance dockerInstance = DockerManager.getInstance().getInstanceById( dockerId ).get();

this.instance = Map.of(
"host", dockerInstance.getHost(),
"alias", dockerInstance.getAlias(),
"connected", dockerInstance.isConnected() ? "true" : "false"
);
this.instance = dockerInstance.getMap();

if ( handshake ) {
this.handshake = HandshakeManager.getInstance().getHandshake( dockerInstance.getHost() );
Expand Down
4 changes: 2 additions & 2 deletions webui/src/main/java/org/polypheny/db/webui/Crud.java
Original file line number Diff line number Diff line change
Expand Up @@ -3619,7 +3619,7 @@ void getTypeSchemas( final Context ctx ) {
void addDockerInstance( final Context ctx ) {
try {
Map<String, String> config = gson.fromJson( ctx.body(), Map.class );
DockerSetupResult res = DockerSetupHelper.newDockerInstance( config.getOrDefault( "host", "" ), config.getOrDefault( "alias", "" ), true );
DockerSetupResult res = DockerSetupHelper.newDockerInstance( config.getOrDefault( "host", "" ), config.getOrDefault( "alias", "" ), config.getOrDefault( "registry", "" ), true );

Map<String, Object> json = new HashMap<>( res.getMap() );
json.put( "instances", DockerManager.getInstance().getDockerInstances().values().stream().map( DockerInstance::getMap ).collect( Collectors.toList() ) );
Expand Down Expand Up @@ -3656,7 +3656,7 @@ void updateDockerInstance( final Context ctx ) {
try {
Map<String, String> config = gson.fromJson( ctx.body(), Map.class );

DockerUpdateResult res = DockerSetupHelper.updateDockerInstance( Integer.parseInt( config.getOrDefault( "id", "-1" ) ), config.getOrDefault( "hostname", "" ), config.getOrDefault( "alias", "" ) );
DockerUpdateResult res = DockerSetupHelper.updateDockerInstance( Integer.parseInt( config.getOrDefault( "id", "-1" ) ), config.getOrDefault( "hostname", "" ), config.getOrDefault( "alias", "" ), config.getOrDefault( "registry", "" ) );

ctx.json( res.getMap() );
} catch ( RuntimeException e ) {
Expand Down

0 comments on commit 4d7cd88

Please sign in to comment.