Skip to content

Commit d9347c7

Browse files
committed
K3S Module
1 parent 9219a11 commit d9347c7

File tree

5 files changed

+88
-0
lines changed

5 files changed

+88
-0
lines changed

build.sbt

+11
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ lazy val root = (project in file("."))
111111
moduleWireMock,
112112
moduleYugabytedb,
113113
moduleOpensearch,
114+
moduleK3s,
114115
allOld
115116
)
116117
.settings(noPublishSettings)
@@ -563,3 +564,13 @@ lazy val moduleOpensearch = (project in file("modules/opensearch"))
563564
name := "testcontainers-scala-opensearch",
564565
libraryDependencies ++= Dependencies.moduleOpensearch.value
565566
)
567+
568+
lazy val moduleK3s = project.in(file("modules/k3s"))
569+
.dependsOn(
570+
core % "compile->compile;test->test;provided->provided",
571+
scalatest % "test->test"
572+
)
573+
.settings(
574+
commonSettings,
575+
libraryDependencies ++= Dependencies.moduleK3s.value
576+
)

docs/src/main/tut/setup.md

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ Here is the full list of the [currently available modules](https://github.com/te
9595
* `testcontainers-scala-redis` — module with Redis container.
9696
* `testcontainers-scala-wiremock` - module with WireMock container.
9797
* `testcontainers-scala-opensearch` - module with Opensearch container.
98+
* `testcontainers-scala-k3s` - module with K3S container.
9899

99100
Most of the modules are just proxies to the testcontainers-java modules and behave exactly like java containers.
100101
You can find documentation about them in the [testcontainers-java docs pages](https://www.testcontainers.org/).
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.dimafeng.testcontainers
2+
3+
import org.testcontainers.k3s.{K3sContainer => JavaK3sContainer}
4+
import org.testcontainers.utility.DockerImageName
5+
import org.testcontainers.containers.Network
6+
7+
class K3sContainer private (
8+
dockerImageName: DockerImageName,
9+
network: Option[Network],
10+
networkAlias: Option[String]
11+
) extends SingleContainer[JavaK3sContainer] {
12+
override val container: JavaK3sContainer = {
13+
val c = new JavaK3sContainer(dockerImageName)
14+
network.fold(c)(c.withNetwork(_))
15+
networkAlias.fold(c)(c.withNetworkAliases(_))
16+
}
17+
18+
def generateInternalKubeConfigYaml(networkAlias: String): String = container.generateInternalKubeConfigYaml(networkAlias)
19+
def kubeConfigYaml: String = container.getKubeConfigYaml()
20+
}
21+
22+
object K3sContainer {
23+
private[testcontainers] final val defaultImage: String = "rancher/k3s"
24+
private[testcontainers] final val defaultTag: String = "v1.32.2-k3s1"
25+
private[testcontainers] final val defaultDockerImageName: String = s"${defaultImage}:${defaultTag}"
26+
27+
case class Def(
28+
dockerImageName: DockerImageName = DockerImageName.parse(defaultDockerImageName),
29+
network: Option[Network] = None,
30+
networkAlias: Option[String] = None
31+
) extends ContainerDef {
32+
override type Container = K3sContainer
33+
override def createContainer(): K3sContainer = new K3sContainer(dockerImageName, network, networkAlias)
34+
35+
def withNetwork(network: Network): Def = copy(network = Some(network))
36+
def withNetworkAlias(alias: String): Def = copy(networkAlias = Some(alias))
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.dimafeng.testcontainers
2+
3+
import com.dimafeng.testcontainers.scalatest.TestContainersForAll
4+
import org.scalatest.flatspec.AnyFlatSpec
5+
import org.testcontainers.containers.Network
6+
import org.testcontainers.utility.DockerImageName
7+
8+
class K3sSpec extends AnyFlatSpec with TestContainersForAll {
9+
override type Containers = K3sContainer
10+
11+
val network: Network = Network.SHARED
12+
13+
override def startContainers(): K3sContainer = {
14+
K3sContainer.Def()
15+
.withNetwork(network)
16+
.withNetworkAlias("k3s")
17+
.start()
18+
}
19+
20+
"K3sContainer" should "be started" in withContainers { k3s =>
21+
val kubeConfig = k3s.generateInternalKubeConfigYaml("k3s")
22+
k3s.container.getKubeConfigYaml()
23+
24+
assert(kubeConfig.contains("apiVersion"))
25+
assert(kubeConfig.contains("kind: \"Config\""))
26+
assert(kubeConfig.contains("clusters"))
27+
assert(kubeConfig.contains("users"))
28+
assert(kubeConfig.contains("contexts"))
29+
assert(k3s.logs.contains("kube-system"))
30+
assert(k3s.kubeConfigYaml.contains("apiVersion"))
31+
}
32+
}

project/Dependencies.scala

+6
Original file line numberDiff line numberDiff line change
@@ -372,4 +372,10 @@ object Dependencies {
372372
"com.softwaremill.sttp.client3" %% "core" % sttpVersion
373373
)
374374
)
375+
376+
val moduleK3s = Def.setting(
377+
COMPILE(
378+
"org.testcontainers" % "k3s" % testcontainersVersion
379+
)
380+
)
375381
}

0 commit comments

Comments
 (0)