From dc8e4fa1920cb81b076423eef31a9b9c1f764382 Mon Sep 17 00:00:00 2001 From: Richard North Date: Tue, 18 Jan 2022 12:57:20 +0000 Subject: [PATCH] Fix k3s for latest Docker for Mac (cgroupsv2) --- .../org/testcontainers/k3s/K3sContainer.java | 6 +++ .../k3s/Fabric8K3sContainerTest.java | 42 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/modules/k3s/src/main/java/org/testcontainers/k3s/K3sContainer.java b/modules/k3s/src/main/java/org/testcontainers/k3s/K3sContainer.java index 800d80c67e1..511b309e0d5 100644 --- a/modules/k3s/src/main/java/org/testcontainers/k3s/K3sContainer.java +++ b/modules/k3s/src/main/java/org/testcontainers/k3s/K3sContainer.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.node.TextNode; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.DockerObjectAccessor; import lombok.SneakyThrows; import org.testcontainers.containers.BindMode; import org.testcontainers.containers.GenericContainer; @@ -25,6 +26,11 @@ public K3sContainer(DockerImageName dockerImageName) { addExposedPorts(6443, 8443); setPrivilegedMode(true); + withCreateContainerCmdModifier(it -> { + DockerObjectAccessor.overrideRawValue( + it.getHostConfig(), "CgroupnsMode", "host" + ); + }); addFileSystemBind("/sys/fs/cgroup", "/sys/fs/cgroup", BindMode.READ_WRITE); Map tmpFsMapping = new HashMap<>(); diff --git a/modules/k3s/src/test/java/org/testcontainers/k3s/Fabric8K3sContainerTest.java b/modules/k3s/src/test/java/org/testcontainers/k3s/Fabric8K3sContainerTest.java index 8e7b601c5b0..8b31c299634 100644 --- a/modules/k3s/src/test/java/org/testcontainers/k3s/Fabric8K3sContainerTest.java +++ b/modules/k3s/src/test/java/org/testcontainers/k3s/Fabric8K3sContainerTest.java @@ -1,15 +1,27 @@ package org.testcontainers.k3s; +import io.fabric8.kubernetes.api.model.ContainerBuilder; +import io.fabric8.kubernetes.api.model.ContainerPortBuilder; import io.fabric8.kubernetes.api.model.Node; +import io.fabric8.kubernetes.api.model.Pod; +import io.fabric8.kubernetes.api.model.PodBuilder; +import io.fabric8.kubernetes.api.model.PodSpec; +import io.fabric8.kubernetes.api.model.PodSpecBuilder; +import io.fabric8.kubernetes.api.model.ProbeBuilder; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.DefaultKubernetesClient; +import io.fabric8.kubernetes.client.dsl.PodResource; +import io.fabric8.kubernetes.client.dsl.Readiable; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; +import org.assertj.core.api.Condition; import org.junit.Test; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.utility.DockerImageName; import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; @Slf4j public class Fabric8K3sContainerTest { @@ -38,6 +50,36 @@ public void shouldStartAndHaveListableNode() { // } Assertions.assertThat(nodes).hasSize(1); + + // verify that we can start a pod + Pod helloworld = dummyStartablePod(); + client.pods().create(helloworld); + client.pods().inNamespace("default").withName("helloworld").waitUntilReady(30, TimeUnit.SECONDS); + + Assertions.assertThat(client.pods().inNamespace("default").withName("helloworld")) + .extracting(Readiable::isReady) + .isEqualTo(true); } } + + private Pod dummyStartablePod() { + PodSpec podSpec = new PodSpecBuilder() + .withContainers( + new ContainerBuilder() + .withName("helloworld") + .withImage("testcontainers/helloworld:1.1.0") + .withPorts(new ContainerPortBuilder().withContainerPort(8080).build()) + .withReadinessProbe(new ProbeBuilder().withNewTcpSocket().withNewPort(8080).endTcpSocket().build()) + .build() + ) + .build(); + + return new PodBuilder() + .withNewMetadata() + .withName("helloworld") + .withNamespace("default") + .endMetadata() + .withSpec(podSpec) + .build(); + } }