Skip to content

Commit

Permalink
K3d setup waits now until all dogus are rolled out and the setup is r…
Browse files Browse the repository at this point in the history
…eally done.
  • Loading branch information
jelemux committed May 16, 2024
2 parents ad8e523 + afef933 commit 96b799c
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 5 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0


## [Unreleased]

## [2.2.1](https://github.com/cloudogu/ces-build-lib/releases/tag/2.2.1) - 2024-05-16
### Fixed
- [#125] K3d setup waits now until all dogus are rolled out and the setup is really done.

## [2.2.0](https://github.com/cloudogu/ces-build-lib/releases/tag/2.2.0) - 2024-05-02
### Added
- `Maven.useMirrors([name: 'maven-proxy', mirrorOf: 'central', url: 'https://maven.example.org'])`
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ Jenkins Pipeline Shared library, that contains additional features for Git, Mave
* Install [Pipeline: GitHub Groovy Libraries](https://wiki.jenkins.io/display/JENKINS/Pipeline+GitHub+Library+Plugin)
* Use the Library in any Jenkinsfile like so
```
@Library('github.com/cloudogu/[email protected].0')
@Library('github.com/cloudogu/[email protected].1')
import com.cloudogu.ces.cesbuildlib.*
```
* Best practice: Use a defined version (e.g. a git commit hash or a git tag, such as `6cd41e0` or `1.67.0` in the example above) and not a branch such as `develop`. Otherwise, your build might change when the there is a new commit on the branch. Using branches is like using snapshots!
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<groupId>com.cloudogu.ces</groupId>
<artifactId>ces-build-lib</artifactId>
<name>ces-build-lib</name>
<version>2.2.0</version>
<version>2.2.1</version>


<properties>
Expand Down
31 changes: 29 additions & 2 deletions src/com/cloudogu/ces/cesbuildlib/K3d.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ class K3d {
appendToYamlFile(K3D_VALUES_YAML_FILE, ".logLevel", loglevel)
}

void installAndTriggerSetup(String tag, Integer timout = 300, Integer interval = 5) {
void installAndTriggerSetup(String tag, Integer timeout = 300, Integer interval = 5) {
script.echo "Installing setup..."
String registryUrl = "registry.cloudogu.com"
String registryNamespace = "k8s"
Expand All @@ -316,7 +316,34 @@ class K3d {
helm("registry logout ${registryUrl}")

script.echo "Wait for dogu-operator to be ready..."
waitForDeploymentRollout("k8s-dogu-operator-controller-manager", timout, interval)
waitForDeploymentRollout("k8s-dogu-operator-controller-manager", timeout, interval)

script.echo "Wait for setup-finisher to be executed..."
waitForSetupToFinish(timeout, interval)

script.echo "Wait for dogus to be ready..."
waitForDogusToBeRolledOut(timeout, interval)
}

void waitForDogusToBeRolledOut(Integer timeout, Integer interval) {
String dogus = kubectl("get dogus --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'", true)
String[] doguList = dogus.split("\n")
for (String dogu : doguList) {
script.echo "Wait for $dogu to be rolled out..."
waitForDeploymentRollout(dogu, timeout, interval)
}
}

void waitForSetupToFinish(Integer timeout, Integer interval) {
for (int i = 0; i < timeout / interval; i++) {
script.sh("sleep ${interval}s")
String deploys = kubectl("get deployments --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'", true)
if (!deploys.contains("k8s-ces-setup")) {
return
}
}

this.script.error "failed to wait for setup to finish: timeout"
}

/**
Expand Down
17 changes: 16 additions & 1 deletion test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,11 @@ class K3dTest extends GroovyTestCase {
scriptMock.expectedShRetValueForScript.put("curl -s https://raw.githubusercontent.com/cloudogu/k8s-ces-setup/${tag}/k8s/k8s-ces-setup.yaml".toString(), "fake setup yaml with {{ .Namespace }}")
scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/k8s-dogu-operator-controller-manager".toString(), "successfully rolled out")
scriptMock.expectedShRetValueForScript.put("curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip", "192.168.56.2")
scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl get deployments --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'".toString(), "k8s-dogu-operator\nk8s-service-discovery")
scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl get dogus --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'".toString(), "cas\nnginx-ingress")
scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/cas".toString(), "successfully rolled out")
scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/nginx-ingress".toString(), "successfully rolled out")


K3d sut = new K3d(scriptMock, "leWorkSpace", "leK3dWorkSpace", "path")

Expand All @@ -216,6 +221,10 @@ class K3dTest extends GroovyTestCase {
assertThat(scriptMock.actualEcho.get(1)).isEqualTo("create values.yaml for setup deployment")
assertThat(scriptMock.actualEcho.get(2)).isEqualTo("Installing setup...")
assertThat(scriptMock.actualEcho.get(3)).isEqualTo("Wait for dogu-operator to be ready...")
assertThat(scriptMock.actualEcho.get(4)).isEqualTo("Wait for setup-finisher to be executed...")
assertThat(scriptMock.actualEcho.get(5)).isEqualTo("Wait for dogus to be ready...")
assertThat(scriptMock.actualEcho.get(6)).isEqualTo("Wait for cas to be rolled out...")
assertThat(scriptMock.actualEcho.get(7)).isEqualTo("Wait for nginx-ingress to be rolled out...")

assertThat(scriptMock.allActualArgs[0].trim()).isEqualTo("curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip")
assertThat(scriptMock.allActualArgs[1].trim()).isEqualTo("whoami".trim())
Expand All @@ -226,6 +235,13 @@ class K3dTest extends GroovyTestCase {
assertThat(scriptMock.allActualArgs[6].trim()).isEqualTo("sudo KUBECONFIG=leK3dWorkSpace/.k3d/.kube/config helm registry logout registry.cloudogu.com".trim())
assertThat(scriptMock.allActualArgs[7].trim()).isEqualTo("sleep 1s")
assertThat(scriptMock.allActualArgs[8].trim()).isEqualTo("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/k8s-dogu-operator-controller-manager".trim())
assertThat(scriptMock.allActualArgs[9].trim()).isEqualTo("sleep 1s")
assertThat(scriptMock.allActualArgs[10].trim()).isEqualTo("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl get deployments --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'")
assertThat(scriptMock.allActualArgs[11].trim()).isEqualTo("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl get dogus --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'")
assertThat(scriptMock.allActualArgs[12].trim()).isEqualTo("sleep 1s")
assertThat(scriptMock.allActualArgs[13].trim()).isEqualTo("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/cas")
assertThat(scriptMock.allActualArgs[14].trim()).isEqualTo("sleep 1s")
assertThat(scriptMock.allActualArgs[15].trim()).isEqualTo("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/nginx-ingress")

assertThat(scriptMock.writeFileParams.get(0)).isNotNull()
String setupYaml = scriptMock.writeFileParams.get(1)
Expand All @@ -235,7 +251,6 @@ class K3dTest extends GroovyTestCase {

void testSetupShouldThrowExceptionOnDoguOperatorRollout() {
// given
def workspaceEnvDir = "leK3dWorkSpace"
String tag = "v0.6.0"
def scriptMock = new ScriptMock()
scriptMock.expectedShRetValueForScript.put("curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip", "192.168.56.2")
Expand Down

0 comments on commit 96b799c

Please sign in to comment.