diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/K3d.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/K3d.kt deleted file mode 100644 index 37e683a..0000000 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/K3d.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.domaindrivenarchitecture.provs.server.domain - -import org.domaindrivenarchitecture.provs.framework.core.Prov -import org.domaindrivenarchitecture.provs.framework.core.docker.provideContainer -import org.domaindrivenarchitecture.provs.framework.core.echoCommandForTextWithNewlinesReplaced -import org.domaindrivenarchitecture.provs.framework.core.repeatTaskUntilSuccess - - -/** - * Runs a k3s server and a k3s agent as containers. - * Copies the kubeconfig from container to the default location: $HOME/.kube/config - */ -fun Prov.installK3sAsContainers(token: String = "12345678901234") = task { - cmd("docker volume create k3s-server") - provideContainer("k3s-server", "rancher/k3s", command = "server --cluster-init", options = - "-d --privileged --tmpfs /run --tmpfs /var/run " + - "-e K3S_TOKEN=$token -e K3S_KUBECONFIG_OUTPUT=./kubeconfig.yaml -e K3S_KUBECONFIG_MODE=666 " + - "-v k3s-server:/var/lib/rancher/k3s:z -p 6443:6443 -p 80:80 -p 443:443 " + - "--ulimit nproc=65535 --ulimit nofile=65535:65535") - - // wait for config file - cmd("export timeout=60; while [ ! -f /var/lib/docker/volumes/k3s-server/_data/server/kubeconfig.yaml ]; do if [ \"${'$'}timeout\" == 0 ]; then echo \"ERROR: Timeout while waiting for file.\"; break; fi; sleep 1; ((timeout--)); done") - - sh(""" - mkdir -p ${'$'}HOME/.kube/ - cp /var/lib/docker/volumes/k3s-server/_data/server/kubeconfig.yaml ${'$'}HOME/.kube/config - """.trimIndent()) -} - - -/** - * Apply a config to kubernetes. - * Prerequisite: Kubectl has to be installed - */ -fun Prov.applyK8sConfig(configAsYaml: String, kubectlCommand: String = "kubectl") = task { - repeatTaskUntilSuccess(6, 10) { - cmd(echoCommandForTextWithNewlinesReplaced(configAsYaml) + " | $kubectlCommand apply -f -") - } -} diff --git a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/K3s.kt b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/K3s.kt index 61fd7bb..caa9070 100644 --- a/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/K3s.kt +++ b/src/main/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/K3s.kt @@ -10,7 +10,8 @@ import java.io.File // ----------------------------------- versions -------------------------------- -// when updating it is recommended to update also file k3s-install.sh in this repo (under: src/main/resources/org/domaindrivenarchitecture/provs/server/infrastructure/k3s/k3s-install.sh) +// when updating this version, it is recommended to update also file k3s-install.sh in this repo +// (under: src/main/resources/org/domaindrivenarchitecture/provs/server/infrastructure/k3s/k3s-install.sh) const val K3S_VERSION = "v1.29.1+k3s2" // ----------------------------------- directories -------------------------------- diff --git a/src/test/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/K3dKtTest.kt b/src/test/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/K3dKtTest.kt deleted file mode 100644 index 4cf1e8f..0000000 --- a/src/test/kotlin/org/domaindrivenarchitecture/provs/server/infrastructure/K3dKtTest.kt +++ /dev/null @@ -1,126 +0,0 @@ -package org.domaindrivenarchitecture.provs.server.infrastructure - -import org.domaindrivenarchitecture.provs.framework.core.* -import org.domaindrivenarchitecture.provs.framework.core.docker.containerExec -import org.domaindrivenarchitecture.provs.framework.core.docker.provideContainer -import org.domaindrivenarchitecture.provs.framework.core.processors.ContainerStartMode -import org.domaindrivenarchitecture.provs.server.domain.applyK8sConfig -import org.domaindrivenarchitecture.provs.server.domain.installK3sAsContainers -import org.domaindrivenarchitecture.provs.test.tags.ContainerTest -import org.domaindrivenarchitecture.provs.test.tags.NonCi -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.Disabled - -internal class K3dKtTest { - - @Disabled // remove line and execute manually as this test may take several minutes - @ContainerTest - @NonCi - fun installK3sAsContainers() { - - // given - val containerName = "alpine-docker-dind" - local().task { - provideContainer( - containerName, - "yobasystems/alpine-docker:dind-amd64", - ContainerStartMode.CREATE_NEW_KILL_EXISTING, // for re-create a potentially existing container - sudo = false, - options = "--privileged" - ) - - // alpine does not have bash pre-installed - but bash is currently required for provs - containerExec(containerName, "sh -c \"apk add bash\"", sudo = false) - } - - val result = docker(containerName, sudo = false).task { - - cmd("apk update") - cmd("apk add sudo curl") - task( - "Install kubectl" - ) { - sh(""" - curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/linux/amd64/kubectl - chmod +x ./kubectl - mv ./kubectl /usr/local/bin/kubectl - kubectl version --client - """.trimIndent()) - } - - // when - installK3sAsContainers() - applyK8sConfig(appleConfig()) - - cmd("kubectl wait --for=condition=ready --timeout=600s pod apple-app") - checkAppleService() - } - - // then - assertTrue(result.success) - } -} - - -/** - * Checks if URL "$host/apple" is available and return text "apple" - */ -private fun Prov.checkAppleService(host: String = "127.0.0.1") = requireLast { - // repeat required as curl may return with "empty reply from server" or with "Recv failure: Connection reset by peer" - val res = repeatTaskUntilSuccess(12, 10) { - cmd("curl -m 30 $host/apple") - }.out?.trim() - - if ("apple" == res) { - ProvResult(true, out = res) - } else { - ProvResult(false, err = "Url $host/apple did not return text \"apple\" but returned: $res") - } -} - - -fun appleConfig() = - """ -kind: Ingress -apiVersion: networking.k8s.io/v1 -metadata: - name: apple-ingress - annotations: - kubernetes.io/ingress.class: "traefik" -spec: - rules: - - http: - paths: - - path: /apple - pathType: Prefix - backend: - service: - name: apple-service - port: - number: 5678 ---- - -kind: Pod -apiVersion: v1 -metadata: - name: apple-app - labels: - app: apple -spec: - containers: - - name: apple-app - image: hashicorp/http-echo - args: - - "-text=apple" ---- - -kind: Service -apiVersion: v1 -metadata: - name: apple-service -spec: - selector: - app: apple - ports: - - port: 5678 # Default port for image - """