From 2d70cf1b175a3d8b3b8688afbf518cb4c14a5e3f Mon Sep 17 00:00:00 2001 From: Pasqual Koschmieder Date: Tue, 10 Jun 2025 14:46:32 +0200 Subject: [PATCH] feat: allow node host override in docker module --- .../docker/config/DockerConfiguration.java | 14 +++++- .../docker/config/TaskDockerConfig.java | 9 ++++ .../modules/docker/impl/DockerCommand.java | 48 ++++++++++++++++++- .../docker/impl/DockerizedService.java | 11 +++++ .../docker/impl/DockerizedServicesModule.java | 1 + 5 files changed, 80 insertions(+), 3 deletions(-) diff --git a/modules/dockerized-services/api/src/main/java/eu/cloudnetservice/modules/docker/config/DockerConfiguration.java b/modules/dockerized-services/api/src/main/java/eu/cloudnetservice/modules/docker/config/DockerConfiguration.java index c86d051ee3..10e6624cd7 100644 --- a/modules/dockerized-services/api/src/main/java/eu/cloudnetservice/modules/docker/config/DockerConfiguration.java +++ b/modules/dockerized-services/api/src/main/java/eu/cloudnetservice/modules/docker/config/DockerConfiguration.java @@ -17,6 +17,7 @@ package eu.cloudnetservice.modules.docker.config; import com.google.common.base.Preconditions; +import eu.cloudnetservice.driver.network.HostAndPort; import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -36,7 +37,8 @@ public record DockerConfiguration( @Nullable String registryEmail, @Nullable String registryPassword, @Nullable String registryUrl, - @Nullable String user + @Nullable String user, + @Nullable HostAndPort nodeHostOverride ) { public static @NonNull Builder builder() { @@ -77,7 +79,9 @@ public static final class Builder { private String registryEmail; private String registryPassword; private String registryUrl; + private String user; + private HostAndPort nodeHostOverride; public @NonNull Builder javaImage(@NonNull DockerImage javaImage) { this.javaImage = javaImage; @@ -159,6 +163,11 @@ public static final class Builder { return this; } + public @NonNull Builder nodeHostOverride(@Nullable HostAndPort nodeHostOverride) { + this.nodeHostOverride = nodeHostOverride; + return this; + } + public @NonNull DockerConfiguration build() { Preconditions.checkNotNull(this.javaImage, "Java docker image must be given"); return new DockerConfiguration( @@ -174,7 +183,8 @@ public static final class Builder { this.registryEmail, this.registryPassword, this.registryUrl, - this.user); + this.user, + this.nodeHostOverride); } } } diff --git a/modules/dockerized-services/api/src/main/java/eu/cloudnetservice/modules/docker/config/TaskDockerConfig.java b/modules/dockerized-services/api/src/main/java/eu/cloudnetservice/modules/docker/config/TaskDockerConfig.java index 9768742378..6f352ace22 100644 --- a/modules/dockerized-services/api/src/main/java/eu/cloudnetservice/modules/docker/config/TaskDockerConfig.java +++ b/modules/dockerized-services/api/src/main/java/eu/cloudnetservice/modules/docker/config/TaskDockerConfig.java @@ -16,6 +16,7 @@ package eu.cloudnetservice.modules.docker.config; +import eu.cloudnetservice.driver.network.HostAndPort; import java.util.HashSet; import java.util.Set; import lombok.NonNull; @@ -23,6 +24,7 @@ public record TaskDockerConfig( @Nullable DockerImage javaImage, + @Nullable HostAndPort nodeHostOverride, @NonNull Set volumes, @NonNull Set binds, @NonNull Set exposedPorts @@ -43,6 +45,7 @@ public record TaskDockerConfig( public static class Builder { private DockerImage javaImage; + private HostAndPort nodeHostOverride; private Set volumes = new HashSet<>(); private Set binds = new HashSet<>(); private Set exposedPorts = new HashSet<>(); @@ -52,6 +55,11 @@ public static class Builder { return this; } + public @NonNull Builder nodeHostOverride(@Nullable HostAndPort nodeHostOverride) { + this.nodeHostOverride = nodeHostOverride; + return this; + } + public @NonNull Builder addVolume(@NonNull String volume) { this.volumes.add(volume); return this; @@ -85,6 +93,7 @@ public static class Builder { public @NonNull TaskDockerConfig build() { return new TaskDockerConfig( this.javaImage, + this.nodeHostOverride, Set.copyOf(this.volumes), Set.copyOf(this.binds), Set.copyOf(this.exposedPorts)); diff --git a/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerCommand.java b/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerCommand.java index f1775048c1..29e87acb99 100644 --- a/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerCommand.java +++ b/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerCommand.java @@ -17,6 +17,7 @@ package eu.cloudnetservice.modules.docker.impl; import eu.cloudnetservice.driver.language.I18n; +import eu.cloudnetservice.driver.network.HostAndPort; import eu.cloudnetservice.driver.provider.ServiceTaskProvider; import eu.cloudnetservice.driver.registry.Service; import eu.cloudnetservice.driver.service.ServiceTask; @@ -74,6 +75,31 @@ public void removeImage( source.sendMessage(i18n.translate("command-tasks-set-property-success", "javaImage", task.name(), "null")); } + @Command("docker task nodeHostOverride ") + public void setNodeHostOverride( + @NonNull @Service I18n i18n, + @NonNull CommandSource source, + @Argument("task") @NonNull ServiceTask task, + @Argument(value = "host", parserName = "anyHostAndPort") @NonNull HostAndPort hostOverride + ) { + this.updateTaskDockerConfig(task, (_, builder) -> builder.nodeHostOverride(hostOverride)); + source.sendMessage(i18n.translate( + "command-tasks-set-property-success", + "nodeHostOverride", + task.name(), + hostOverride)); + } + + @Command("docker task remove nodeHostOverride") + public void removeNodeHostOverride( + @NonNull @Service I18n i18n, + @NonNull CommandSource source, + @Argument("task") @NonNull ServiceTask task + ) { + this.updateTaskDockerConfig(task, (_, builder) -> builder.nodeHostOverride(null)); + source.sendMessage(i18n.translate("command-tasks-set-property-success", "nodeHostOverride", task.name(), "null")); + } + @Command("docker task add bind ") public void addBind( @NonNull @Service I18n i18n, @@ -249,6 +275,22 @@ public void removeUser(@NonNull @Service I18n i18n, @NonNull CommandSource sourc source.sendMessage(i18n.translate("module-docker-command-remove-success", "user")); } + @Command("docker config nodeHostOverride ") + public void setNodeHostOverride( + @NonNull @Service I18n i18n, + @NonNull CommandSource source, + @Argument(value = "host", parserName = "anyHostAndPort") @NonNull HostAndPort hostOverride + ) { + this.updateDockerConfig((_, builder) -> builder.nodeHostOverride(hostOverride)); + source.sendMessage(i18n.translate("module-docker-command-set-success", "nodeHostOverride", hostOverride)); + } + + @Command("docker config remove nodeHostOverride") + public void removeNodeHostOverride(@NonNull @Service I18n i18n, @NonNull CommandSource source) { + this.updateDockerConfig((_, builder) -> builder.nodeHostOverride(null)); + source.sendMessage(i18n.translate("module-docker-command-remove-success", "nodeHostOverride")); + } + @Command("docker config add bind ") public void addBind( @NonNull @Service I18n i18n, @@ -290,7 +332,11 @@ public void clearVolumes(@NonNull @Service I18n i18n, @NonNull CommandSource sou } @Command("docker config remove volume ") - public void removeVolumes(@NonNull @Service I18n i18n, @NonNull CommandSource source, @Argument("volume") String volume) { + public void removeVolumes( + @NonNull @Service I18n i18n, + @NonNull CommandSource source, + @Argument("volume") String volume + ) { this.updateDockerConfig((config, builder) -> builder.volumes(config.volumes().stream() .filter(entry -> !entry.equals(volume)) .collect(Collectors.toSet()))); diff --git a/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerizedService.java b/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerizedService.java index 49b7a0d85f..09593cda60 100644 --- a/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerizedService.java +++ b/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerizedService.java @@ -34,6 +34,7 @@ import eu.cloudnetservice.driver.document.property.DocProperty; import eu.cloudnetservice.driver.event.EventManager; import eu.cloudnetservice.driver.language.I18n; +import eu.cloudnetservice.driver.network.HostAndPort; import eu.cloudnetservice.driver.provider.ServiceTaskProvider; import eu.cloudnetservice.driver.registry.Service; import eu.cloudnetservice.driver.service.ServiceConfiguration; @@ -320,6 +321,16 @@ public void doDelete() { } } + @Override + protected @NonNull HostAndPort selectConnectListener(@NonNull List listeners) { + var taskConfig = this.resolveTaskDockerConfig(); + var overriddenNodeHostFromTask = this.readFromTaskConfig(taskConfig, TaskDockerConfig::nodeHostOverride); + var nodeHostOverride = overriddenNodeHostFromTask != null + ? overriddenNodeHostFromTask + : this.configuration.nodeHostOverride(); + return Objects.requireNonNullElseGet(nodeHostOverride, () -> super.selectConnectListener(listeners)); + } + protected @NonNull Bind[] collectBinds(@NonNull Path wrapperFilePath, @Nullable TaskDockerConfig config) { Set binds = new HashSet<>(); diff --git a/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerizedServicesModule.java b/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerizedServicesModule.java index 9033fc20f0..3ce7a0b995 100644 --- a/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerizedServicesModule.java +++ b/modules/dockerized-services/impl/src/main/java/eu/cloudnetservice/modules/docker/impl/DockerizedServicesModule.java @@ -58,6 +58,7 @@ public void loadConfiguration() { null, null, null, + null, null), DocumentFactory.json()); }