fix(docker): use Floci's address on the configured docker network

Spawned containers (Lambda, RDS, EKS, EC2, ...) join services.docker-network,
but the address they were given to reach Floci was its IP on the first
user-defined network it is attached to. Once Floci is also attached to an
emulated VPC network, that address is unreachable and every Lambda times out
with "Failed to get next invocation". Prefer the configured network when
Floci is attached to it.
This commit is contained in:
Zakaria
2026-10-24 01:35:31 -04:00
parent bbe7e19554
commit a1510d8cd6
2 changed files with 79 additions and 6 deletions
@@ -6,6 +6,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.model.ContainerNetwork;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.Ports;
import io.github.hectorvent.floci.config.EmulatorConfig;
import org.junit.jupiter.api.Test;
import java.util.LinkedHashMap;
@@ -43,6 +44,55 @@ class CurrentContainerNetworkResolverTest {
assertEquals(Optional.of("172.24.0.2"), resolver.resolveContainerIp());
}
@Test
void resolveNetworkName_prefersConfiguredDockerNetworkOverOtherAttachedNetworks() {
DockerClient dockerClient = mock(DockerClient.class);
ContainerDetector containerDetector = mock(ContainerDetector.class);
when(containerDetector.isRunningInContainer()).thenReturn(true);
InspectContainerCmd inspectCmd = mock(InspectContainerCmd.class);
InspectContainerResponse inspect = mock(InspectContainerResponse.class, RETURNS_DEEP_STUBS);
Map<String, ContainerNetwork> networks = networks(
"floci-vpc-4566-us-east-1-vpc-default-us-east-1", "172.31.0.3",
"floci_default", "172.22.0.4");
when(dockerClient.inspectContainerCmd("floci-container")).thenReturn(inspectCmd);
when(inspectCmd.exec()).thenReturn(inspect);
when(inspect.getNetworkSettings().getNetworks()).thenReturn(networks);
EmulatorConfig config = mock(EmulatorConfig.class, RETURNS_DEEP_STUBS);
when(config.services().dockerNetwork()).thenReturn(Optional.of("floci_default"));
CurrentContainerNetworkResolver resolver =
new TestResolver(dockerClient, containerDetector, config, "floci-container");
assertEquals(Optional.of("floci_default"), resolver.resolveNetworkName());
assertEquals(Optional.of("172.22.0.4"), resolver.resolveContainerIp());
}
@Test
void resolveNetworkName_fallsBackWhenConfiguredNetworkIsNotAttached() {
DockerClient dockerClient = mock(DockerClient.class);
ContainerDetector containerDetector = mock(ContainerDetector.class);
when(containerDetector.isRunningInContainer()).thenReturn(true);
InspectContainerCmd inspectCmd = mock(InspectContainerCmd.class);
InspectContainerResponse inspect = mock(InspectContainerResponse.class, RETURNS_DEEP_STUBS);
Map<String, ContainerNetwork> networks = networks(
"bridge", "172.17.0.2",
"avoxx-network", "172.24.0.2");
when(dockerClient.inspectContainerCmd("floci-container")).thenReturn(inspectCmd);
when(inspectCmd.exec()).thenReturn(inspect);
when(inspect.getNetworkSettings().getNetworks()).thenReturn(networks);
EmulatorConfig config = mock(EmulatorConfig.class, RETURNS_DEEP_STUBS);
when(config.services().dockerNetwork()).thenReturn(Optional.of("floci_default"));
CurrentContainerNetworkResolver resolver =
new TestResolver(dockerClient, containerDetector, config, "floci-container");
assertEquals(Optional.of("avoxx-network"), resolver.resolveNetworkName());
}
@Test
void resolveNetworkName_returnsEmptyOutsideContainer() {
DockerClient dockerClient = mock(DockerClient.class);
@@ -126,7 +176,12 @@ class CurrentContainerNetworkResolverTest {
private final String containerId;
TestResolver(DockerClient dockerClient, ContainerDetector containerDetector, String containerId) {
super(dockerClient, containerDetector);
this(dockerClient, containerDetector, null, containerId);
}
TestResolver(DockerClient dockerClient, ContainerDetector containerDetector, EmulatorConfig config,
String containerId) {
super(dockerClient, containerDetector, config);
this.containerId = containerId;
}