Skip to content

Commit 70b640c

Browse files
authored
Add support for a cmdline modifier to K3sContainer (#319)
1 parent d1825fd commit 70b640c

File tree

2 files changed

+65
-4
lines changed

2 files changed

+65
-4
lines changed

src/main/java/com/dajudge/kindcontainer/K3sContainer.java

+25-4
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,22 @@
2626
* SOFTWARE.
2727
*/
2828

29+
import org.slf4j.Logger;
30+
import org.slf4j.LoggerFactory;
2931
import org.testcontainers.containers.BindMode;
3032

33+
import java.util.ArrayList;
3134
import java.util.HashMap;
35+
import java.util.List;
36+
import java.util.function.Function;
3237

3338
import static com.dajudge.kindcontainer.KubernetesVersionEnum.latest;
3439
import static com.dajudge.kindcontainer.client.KubeConfigUtils.replaceServerInKubeconfig;
3540
import static com.github.dockerjava.api.model.DockerObjectAccessor.overrideRawValue;
41+
import static java.util.Arrays.asList;
3642

3743
public class K3sContainer<SELF extends K3sContainer<SELF>> extends KubernetesWithKubeletContainer<SELF> {
44+
private static final Logger LOG = LoggerFactory.getLogger(K3sContainer.class);
3845
private static final int INTERNAL_API_SERVER_PORT = 6443;
3946
private static final HashMap<String, String> TMP_FILESYSTEMS = new HashMap<String, String>() {{
4047
put("/run", "");
@@ -43,6 +50,7 @@ public class K3sContainer<SELF extends K3sContainer<SELF>> extends KubernetesWit
4350
private final K3sContainerVersion version;
4451
private int minNodePort = 30000;
4552
private int maxNodePort = 32767;
53+
private Function<List<String>, List<String>> cmdLineModifier = Function.identity();
4654

4755
public K3sContainer() {
4856
this(latest(K3sContainerVersion.class));
@@ -65,12 +73,14 @@ public K3sContainer(final KubernetesImageSpec<K3sContainerVersion> imageSpec) {
6573

6674
@Override
6775
public void start() {
68-
this.withCommand(
76+
final List<String> cmdLine = cmdLineModifier.apply(new ArrayList<>(asList(
6977
"server",
7078
getDisabledComponentsCmdlineArg(),
71-
"--tls-san=" + this.getHost(),
79+
String.format("--tls-san=%s", this.getHost()),
7280
String.format("--service-node-port-range=%d-%d", minNodePort, maxNodePort)
73-
);
81+
)));
82+
LOG.debug("K3s command line: {}", cmdLine);
83+
this.withCommand(cmdLine.toArray(new String[0]));
7484
super.start();
7585
}
7686

@@ -82,12 +92,23 @@ private String getDisabledComponentsCmdlineArg() {
8292
}
8393

8494
@Override
85-
public SELF withNodePortRange(int minPort, int maxPort) {
95+
public SELF withNodePortRange(final int minPort, final int maxPort) {
8696
this.minNodePort = minPort;
8797
this.maxNodePort = maxPort;
8898
return self();
8999
}
90100

101+
/**
102+
* Sets a command line modifier for the K3s container, e.g. to configure etcd or the K8s API server.
103+
*
104+
* @param modifier the command line modifier
105+
* @return <code>this</code>
106+
*/
107+
public SELF withCommandLineModifier(final Function<List<String>, List<String>> modifier) {
108+
this.cmdLineModifier = modifier;
109+
return self();
110+
}
111+
91112
@Override
92113
public int getInternalPort() {
93114
return INTERNAL_API_SERVER_PORT;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.dajudge.kindcontainer;
2+
3+
import com.dajudge.kindcontainer.util.ContainerVersionHelpers.KubernetesTestPackage;
4+
import org.junit.jupiter.api.DynamicTest;
5+
import org.junit.jupiter.api.TestFactory;
6+
7+
import java.util.Arrays;
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
import java.util.stream.Stream;
11+
12+
import static com.dajudge.kindcontainer.util.ContainerVersionHelpers.k3sContainers;
13+
import static com.dajudge.kindcontainer.util.ContainerVersionHelpers.runWithK8s;
14+
import static java.util.Arrays.asList;
15+
import static org.junit.jupiter.api.Assertions.assertEquals;
16+
import static org.junit.jupiter.api.Assertions.assertTrue;
17+
18+
public class ConfigurableCmdlineOptionsTest {
19+
@TestFactory
20+
public Stream<DynamicTest> adds_cmdline_options() {
21+
return k3sContainers(this::assertCmdlineOptions);
22+
}
23+
24+
private void assertCmdlineOptions(final KubernetesTestPackage<? extends K3sContainer<?>> container) {
25+
runWithK8s(container.newContainer()
26+
.withCommandLineModifier(cmdLine -> {
27+
cmdLine.addAll(asList("--debug", "-v", "1"));
28+
return cmdLine;
29+
}), k8s -> {
30+
List<String> commandParts = Arrays.stream(k8s.getCommandParts()).collect(Collectors.toList());
31+
// assert that default cmdline options are still present
32+
assertEquals("server", commandParts.get(0));
33+
assertTrue(commandParts.get(1).contains("traefik"));
34+
// assert that custom cmdline options are present
35+
assertTrue(commandParts.contains("--debug"));
36+
assertTrue(commandParts.contains("-v"));
37+
assertTrue(commandParts.contains("1"));
38+
});
39+
}
40+
}

0 commit comments

Comments
 (0)