From d8c771f96c95a75b8adf7d0fe06d25ff0cd4d43a Mon Sep 17 00:00:00 2001
From: "stu126940@mail.uni-kiel.de" <stu126940@mail.uni-kiel.de>
Date: Sat, 4 Jun 2022 12:36:19 +0200
Subject: [PATCH] make teardown faster by first sending delete command to all
 resources and then wait until all pods are deleted

---
 .../rocks/theodolite/kubernetes/K8sManager.kt | 32 ++++++++++---------
 .../KubernetesBenchmarkDeployment.kt          | 19 +++++++++--
 2 files changed, 33 insertions(+), 18 deletions(-)

diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/K8sManager.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/K8sManager.kt
index 66bfb2572..1da763a35 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/K8sManager.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/K8sManager.kt
@@ -27,22 +27,24 @@ class K8sManager(private val client: NamespacedKubernetesClient) {
      * Removes different k8s resources using the client.
      * @throws IllegalArgumentException if KubernetesResource not supported.
      */
-    fun remove(resource: HasMetadata) {
+    fun remove(resource: HasMetadata,  blockUntilDeleted: Boolean = true) {
         client.resource(resource).delete()
-        when (resource) {
-            is Deployment -> {
-                ResourceByLabelHandler(client = client)
-                    .blockUntilPodsDeleted(
-                        matchLabels = resource.spec.selector.matchLabels
-                    )
-                logger.info { "Deployment '${resource.metadata.name}' deleted." }
-            }
-            is StatefulSet -> {
-                ResourceByLabelHandler(client = client)
-                    .blockUntilPodsDeleted(
-                        matchLabels = resource.spec.selector.matchLabels
-                    )
-                logger.info { "StatefulSet '$resource.metadata.name' deleted." }
+        if(blockUntilDeleted) {
+            when (resource) {
+                is Deployment -> {
+                    ResourceByLabelHandler(client = client)
+                        .blockUntilPodsDeleted(
+                            matchLabels = resource.spec.selector.matchLabels
+                        )
+                    logger.info { "Deployment '${resource.metadata.name}' deleted." }
+                }
+                is StatefulSet -> {
+                    ResourceByLabelHandler(client = client)
+                        .blockUntilPodsDeleted(
+                            matchLabels = resource.spec.selector.matchLabels
+                        )
+                    logger.info { "StatefulSet '$resource.metadata.name' deleted." }
+                }
             }
         }
     }
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/KubernetesBenchmarkDeployment.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/KubernetesBenchmarkDeployment.kt
index be567ccd8..28ac651a0 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/KubernetesBenchmarkDeployment.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/KubernetesBenchmarkDeployment.kt
@@ -2,6 +2,8 @@ package rocks.theodolite.kubernetes
 
 import io.fabric8.kubernetes.api.model.HasMetadata
 import io.fabric8.kubernetes.api.model.KubernetesResource
+import io.fabric8.kubernetes.api.model.apps.Deployment
+import io.fabric8.kubernetes.api.model.apps.StatefulSet
 import io.fabric8.kubernetes.client.NamespacedKubernetesClient
 import io.quarkus.runtime.annotations.RegisterForReflection
 import mu.KotlinLogging
@@ -72,14 +74,25 @@ class KubernetesBenchmarkDeployment(
      *  - Remove the [KubernetesResource]s.
      */
     override fun teardown() {
-        loadGenResources.forEach { kubernetesManager.remove(it) }
+        val podCleaner = ResourceByLabelHandler(client)
+        loadGenResources.forEach { kubernetesManager.remove(it, false) }
         loadGenAfterActions.forEach { it.exec(client = client) }
-        appResources.forEach { kubernetesManager.remove(it) }
+        appResources.forEach { kubernetesManager.remove(it,false) }
         sutAfterActions.forEach { it.exec(client = client) }
         if (this.topics.isNotEmpty()) {
             kafkaController.removeTopics(this.topics.map { topic -> topic.name })
         }
-        ResourceByLabelHandler(client).removePods(
+
+        listOf(loadGenResources, appResources)
+            .forEach {
+                if (it is Deployment) {
+                    podCleaner.blockUntilPodsDeleted(it.spec.selector.matchLabels)
+                } else if (it is StatefulSet) {
+                    podCleaner.blockUntilPodsDeleted(it.spec.selector.matchLabels)
+                }
+            }
+
+        podCleaner.removePods(
             labelName = LAG_EXPORTER_POD_LABEL_NAME,
             labelValue = LAG_EXPORTER_POD_LABEL_VALUE
         )
-- 
GitLab