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:
+56
-1
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user