diff options
Diffstat (limited to 'node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java')
-rw-r--r-- | node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java index 1b5507eb534..b9cea1cd5da 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java @@ -18,9 +18,11 @@ import com.yahoo.vespa.hosted.dockerapi.ProcessResult; import com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec; import com.yahoo.vespa.hosted.node.admin.component.Environment; import com.yahoo.vespa.hosted.node.admin.maintenance.acl.iptables.NATCommand; +import com.yahoo.vespa.hosted.node.admin.task.util.network.IPAddresses; import com.yahoo.vespa.hosted.node.admin.util.PrefixLogger; import java.io.IOException; +import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.URI; @@ -43,7 +45,8 @@ public class DockerOperationsImpl implements DockerOperations { private static final String MANAGER_NAME = "node-admin"; - private static final String LOCAL_IPV6_PREFIX = "fd00::"; + private static final String IPV6_NPT_PREFIX = "fd00::"; + private static final String IPV4_NPT_PREFIX = "172.17.0.0"; private static final String DOCKER_CUSTOM_BRIDGE_NETWORK_NAME = "vespa-bridge"; private final Docker docker; @@ -51,11 +54,13 @@ public class DockerOperationsImpl implements DockerOperations { private final ProcessExecuter processExecuter; private final String nodeProgram; private Map<Path, Boolean> directoriesToMount; + private final IPAddresses retriever; - public DockerOperationsImpl(Docker docker, Environment environment, ProcessExecuter processExecuter) { + public DockerOperationsImpl(Docker docker, Environment environment, ProcessExecuter processExecuter, IPAddresses retriever) { this.docker = docker; this.environment = environment; this.processExecuter = processExecuter; + this.retriever = retriever; this.nodeProgram = environment.pathInNodeUnderVespaHome("bin/vespa-nodectl").toString(); this.directoriesToMount = getDirectoriesToMount(environment); @@ -91,10 +96,21 @@ public class DockerOperationsImpl implements DockerOperations { command.withNetworkMode(DockerImpl.DOCKER_CUSTOM_MACVLAN_NETWORK_NAME); command.withVolume("/etc/hosts", "/etc/hosts"); // TODO This is probably not necessary - review later } else { - command.withIpAddress(NetworkPrefixTranslator.translate( - nodeInetAddress, - InetAddress.getByName(LOCAL_IPV6_PREFIX), - 64)); + // IPv6 - Assume always valid + Inet6Address ipV6Address = this.retriever.getIPv6Address(nodeSpec.hostname).orElseThrow( + () -> new RuntimeException("Unable to find a valid IPv6 address. Missing an AAAA DNS entry?")); + InetAddress ipV6Prefix = InetAddress.getByName(IPV6_NPT_PREFIX); + InetAddress ipV6Local = IPAddresses.prefixTranslate(ipV6Address, ipV6Prefix, 8); + command.withIpAddress(ipV6Local); + + // IPv4 - Only present for some containers + Optional<Inet4Address> ipV4Address = this.retriever.getIPv4Address(nodeSpec.hostname); + if (ipV4Address.isPresent()) { + InetAddress ipV4Prefix = InetAddress.getByName(IPV4_NPT_PREFIX); + InetAddress ipV4Local = IPAddresses.prefixTranslate(ipV4Address.get(), ipV4Prefix, 2); + command.withIpAddress(ipV4Local); + } + command.withNetworkMode(DOCKER_CUSTOM_BRIDGE_NETWORK_NAME); } |