From 9b86bd7e628b996242416e971b42403d3b5e5c70 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Henning?= <soeren.henning@email.uni-kiel.de>
Date: Sat, 3 Dec 2022 16:44:13 +0100
Subject: [PATCH] Reduce code duplication for abstract patchers

---
 .../kubernetes/patcher/AbstractIntPatcher.kt  | 19 +++++++++++++++++++
 .../patcher/AbstractResourcePatcher.kt        |  2 +-
 ...actPatcher.kt => AbstractStringPatcher.kt} | 13 +------------
 .../patcher/ConfigMapYamlPatcher.kt           |  2 +-
 .../DataVolumeLoadGeneratorReplicaPatcher.kt  |  2 +-
 .../kubernetes/patcher/EnvVarPatcher.kt       |  2 +-
 .../kubernetes/patcher/ImagePatcher.kt        |  3 +--
 .../kubernetes/patcher/LabelPatcher.kt        |  7 +------
 .../kubernetes/patcher/MatchLabelPatcher.kt   |  2 +-
 .../kubernetes/patcher/NamePatcher.kt         |  7 +------
 .../kubernetes/patcher/NodeSelectorPatcher.kt |  2 +-
 ...NestedGroupsLoadGeneratorReplicaPatcher.kt | 10 +++++-----
 .../NumSensorsLoadGeneratorReplicaPatcher.kt  | 10 ++++------
 .../kubernetes/patcher/PatcherFactory.kt      |  6 +++---
 .../kubernetes/patcher/ReplicaPatcher.kt      |  6 +++---
 .../patcher/SchedulerNamePatcher.kt           |  2 +-
 .../patcher/ServiceSelectorPatcher.kt         |  2 +-
 .../patcher/TemplateLabelPatcher.kt           |  2 +-
 .../patcher/VolumesConfigMapPatcher.kt        |  2 +-
 ...erTest.kt => AbstractStringPatcherTest.kt} |  2 +-
 ...taVolumeLoadGeneratorReplicaPatcherTest.kt |  4 ++--
 .../kubernetes/patcher/EnvVarPatcherTest.kt   |  2 +-
 .../kubernetes/patcher/ImagePatcherTest.kt    |  2 +-
 .../kubernetes/patcher/LabelPatcherTest.kt    |  2 +-
 .../patcher/MatchLabelPatcherTest.kt          |  2 +-
 .../kubernetes/patcher/NamePatcherTest.kt     |  2 +-
 .../patcher/NodeSelectorPatcherTest.kt        |  2 +-
 ...edGroupsLoadGeneratorReplicaPatcherTest.kt |  2 +-
 ...mSensorsLoadGeneratorReplicaPatcherTest.kt |  2 +-
 .../kubernetes/patcher/ReplicaPatcherTest.kt  |  2 +-
 .../patcher/SchedulerNamePatcherTest.kt       |  2 +-
 .../patcher/TemplateLabelPatcherTest.kt       |  2 +-
 .../patcher/VolumesConfigMapPatcherTest.kt    |  2 +-
 33 files changed, 63 insertions(+), 68 deletions(-)
 create mode 100644 theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractIntPatcher.kt
 rename theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/{AbstractPatcher.kt => AbstractStringPatcher.kt} (62%)
 rename theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/{AbstractPatcherTest.kt => AbstractStringPatcherTest.kt} (98%)

diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractIntPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractIntPatcher.kt
new file mode 100644
index 000000000..9cb207f2f
--- /dev/null
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractIntPatcher.kt
@@ -0,0 +1,19 @@
+package rocks.theodolite.kubernetes.patcher
+
+import io.fabric8.kubernetes.api.model.HasMetadata
+import io.fabric8.kubernetes.client.utils.Serialization
+
+/**
+ * A Patcher is able to modify values of a Kubernetes resource, see [Patcher].
+ */
+abstract class AbstractIntPatcher : Patcher {
+
+    override fun patch(resources: List<HasMetadata>, value: String) : List<HasMetadata> {
+        return resources
+            .map { Serialization.clone(it)}
+            .map { patchSingleResource(it, value.toInt()) }
+    }
+
+    abstract fun patchSingleResource(resource: HasMetadata, value: Int): HasMetadata
+
+}
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractResourcePatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractResourcePatcher.kt
index adb5c1468..6a453a1f0 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractResourcePatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractResourcePatcher.kt
@@ -22,7 +22,7 @@ abstract class AbstractResourcePatcher(
     protected val requiredResource: String,
     private val format: String? = null,
     private val factor: Int? = null
-) : AbstractPatcher() {
+) : AbstractStringPatcher() {
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
         when (resource) {
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractStringPatcher.kt
similarity index 62%
rename from theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractPatcher.kt
rename to theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractStringPatcher.kt
index 0ed2a5e5a..e761cfff4 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractStringPatcher.kt
@@ -5,19 +5,8 @@ import io.fabric8.kubernetes.client.utils.Serialization
 
 /**
  * A Patcher is able to modify values of a Kubernetes resource, see [Patcher].
- *
- * An AbstractPatcher is created with up to three parameters.
- *
- *
- *
- * **For example** to patch the load dimension of a load generator, the patcher should be created as follow:
- *
- * k8sResource: `uc-1-workload-generator.yaml`
- * container: `workload`
- * variableName: `NUM_SENSORS`
- *
  */
-abstract class AbstractPatcher : Patcher {
+abstract class AbstractStringPatcher : Patcher {
 
     override fun patch(resources: List<HasMetadata>, value: String) : List<HasMetadata> {
         return resources
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcher.kt
index 272e3785e..210fe8c26 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcher.kt
@@ -14,7 +14,7 @@ import org.yaml.snakeyaml.Yaml
 class ConfigMapYamlPatcher(
     private val fileName: String,
     private val variableName: String
-) : AbstractPatcher() {
+) : AbstractStringPatcher() {
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
         if (resource is ConfigMap) {
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/DataVolumeLoadGeneratorReplicaPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/DataVolumeLoadGeneratorReplicaPatcher.kt
index fce3de2b9..297045fa1 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/DataVolumeLoadGeneratorReplicaPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/DataVolumeLoadGeneratorReplicaPatcher.kt
@@ -18,7 +18,7 @@ class DataVolumeLoadGeneratorReplicaPatcher(
     private val maxVolume: Int,
     val container: String,
     val variableName: String
-) : AbstractPatcher() {
+) : AbstractStringPatcher() {
 
     private val envVarPatcher = EnvVarPatcher(container, variableName)
     private val replicaPatcher = ReplicaPatcher()
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/EnvVarPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/EnvVarPatcher.kt
index 33d6c8d9b..58bb51276 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/EnvVarPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/EnvVarPatcher.kt
@@ -14,7 +14,7 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
 class EnvVarPatcher(
     private val container: String,
     private val variableName: String
-) : AbstractPatcher() {
+) : AbstractStringPatcher() {
 
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ImagePatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ImagePatcher.kt
index c847f99d2..00909fb74 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ImagePatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ImagePatcher.kt
@@ -3,14 +3,13 @@ package rocks.theodolite.kubernetes.patcher
 import io.fabric8.kubernetes.api.model.HasMetadata
 import io.fabric8.kubernetes.api.model.apps.Deployment
 import io.fabric8.kubernetes.api.model.apps.StatefulSet
-import io.fabric8.kubernetes.client.utils.Serialization
 
 /**
  * The Image patcher allows to change the image of a container.
  *
  * @param container Container to be patched.
  */
-class ImagePatcher(private val container: String) : AbstractPatcher() {
+class ImagePatcher(private val container: String) : AbstractStringPatcher() {
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
         if (resource is Deployment) {
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/LabelPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/LabelPatcher.kt
index 9e690ea68..86d78176c 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/LabelPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/LabelPatcher.kt
@@ -1,15 +1,10 @@
 package rocks.theodolite.kubernetes.patcher
 
-import io.fabric8.kubernetes.api.model.ConfigMap
-import io.fabric8.kubernetes.api.model.GenericKubernetesResource
 import io.fabric8.kubernetes.api.model.HasMetadata
-import io.fabric8.kubernetes.api.model.Service
-import io.fabric8.kubernetes.api.model.apps.Deployment
-import io.fabric8.kubernetes.api.model.apps.StatefulSet
 
 class LabelPatcher(
     val variableName: String) :
-    AbstractPatcher() {
+    AbstractStringPatcher() {
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
         if (resource.metadata.labels == null) {
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/MatchLabelPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/MatchLabelPatcher.kt
index 0b60514cf..2cb70842a 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/MatchLabelPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/MatchLabelPatcher.kt
@@ -9,7 +9,7 @@ import io.fabric8.kubernetes.api.model.apps.StatefulSet
  *
  * @property variableName The matchLabel which should be set
  */
-class MatchLabelPatcher(val variableName: String) : AbstractPatcher() {
+class MatchLabelPatcher(val variableName: String) : AbstractStringPatcher() {
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
         when (resource) {
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NamePatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NamePatcher.kt
index 86c6c6b97..9a39a5b28 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NamePatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NamePatcher.kt
@@ -1,13 +1,8 @@
 package rocks.theodolite.kubernetes.patcher
 
-import io.fabric8.kubernetes.api.model.ConfigMap
-import io.fabric8.kubernetes.api.model.GenericKubernetesResource
 import io.fabric8.kubernetes.api.model.HasMetadata
-import io.fabric8.kubernetes.api.model.Service
-import io.fabric8.kubernetes.api.model.apps.Deployment
-import io.fabric8.kubernetes.api.model.apps.StatefulSet
 
-class NamePatcher : AbstractPatcher() {
+class NamePatcher : AbstractStringPatcher() {
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
         resource.metadata.name = value
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NodeSelectorPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NodeSelectorPatcher.kt
index 0ffda7d55..a145c2628 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NodeSelectorPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NodeSelectorPatcher.kt
@@ -8,7 +8,7 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
  *
  * @param variableName The `label-key` of the node for which the `label-value` is to be patched.
  */
-class NodeSelectorPatcher(private val variableName: String) : AbstractPatcher() {
+class NodeSelectorPatcher(private val variableName: String) : AbstractStringPatcher() {
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
         if (resource is Deployment) {
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NumNestedGroupsLoadGeneratorReplicaPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NumNestedGroupsLoadGeneratorReplicaPatcher.kt
index e3b010576..c93014635 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NumNestedGroupsLoadGeneratorReplicaPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NumNestedGroupsLoadGeneratorReplicaPatcher.kt
@@ -5,13 +5,13 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
 import kotlin.math.pow
 
 class NumNestedGroupsLoadGeneratorReplicaPatcher(
-    private val numSensors: String,
-    private val loadGenMaxRecords: String,
-) : AbstractPatcher() {
+    private val numSensors: Int,
+    private val loadGenMaxRecords: Int,
+) : AbstractIntPatcher() {
 
-    override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
+    override fun patchSingleResource(resource: HasMetadata, value: Int): HasMetadata {
         if (resource is Deployment) {
-            val approxNumSensors = numSensors.toDouble().pow(Integer.parseInt(value).toDouble())
+            val approxNumSensors = numSensors.toDouble().pow(value.toDouble())
             val loadGenInstances =
                 (approxNumSensors + loadGenMaxRecords.toDouble() - 1) / loadGenMaxRecords.toDouble()
             resource.spec.replicas = loadGenInstances.toInt()
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NumSensorsLoadGeneratorReplicaPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NumSensorsLoadGeneratorReplicaPatcher.kt
index 6bb2750bb..088f9854b 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NumSensorsLoadGeneratorReplicaPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NumSensorsLoadGeneratorReplicaPatcher.kt
@@ -5,14 +5,12 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
 
 
 class NumSensorsLoadGeneratorReplicaPatcher(
-    private val loadGenMaxRecords: String,
-) : AbstractPatcher() {
+    private val loadGenMaxRecords: Int
+) : AbstractIntPatcher() {
 
-    override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
+    override fun patchSingleResource(resource: HasMetadata, value: Int): HasMetadata {
         if (resource is Deployment) {
-            val loadGenInstances =
-                (Integer.parseInt(value) + loadGenMaxRecords.toInt() - 1) / loadGenMaxRecords.toInt()
-            resource.spec.replicas = loadGenInstances
+            resource.spec.replicas = (value + loadGenMaxRecords - 1) / loadGenMaxRecords
 
         }
         return resource
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/PatcherFactory.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/PatcherFactory.kt
index 26e76ccfa..7bfde3e38 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/PatcherFactory.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/PatcherFactory.kt
@@ -21,11 +21,11 @@ class PatcherFactory {
                     "ReplicaPatcher" -> ReplicaPatcher(
                     )
                     "NumNestedGroupsLoadGeneratorReplicaPatcher" -> NumNestedGroupsLoadGeneratorReplicaPatcher(
-                        loadGenMaxRecords = patcher.properties["loadGenMaxRecords"] ?: throwInvalid(patcher),
-                        numSensors = patcher.properties["numSensors"] ?: throwInvalid(patcher)
+                        loadGenMaxRecords = (patcher.properties["loadGenMaxRecords"] ?: throwInvalid(patcher)).toInt(),
+                        numSensors = (patcher.properties["numSensors"] ?: throwInvalid(patcher)).toInt()
                     )
                     "NumSensorsLoadGeneratorReplicaPatcher" -> NumSensorsLoadGeneratorReplicaPatcher(
-                        loadGenMaxRecords = patcher.properties["loadGenMaxRecords"] ?: throwInvalid(patcher)
+                        loadGenMaxRecords = (patcher.properties["loadGenMaxRecords"] ?: throwInvalid(patcher)).toInt()
                     )
                     "DataVolumeLoadGeneratorReplicaPatcher" -> DataVolumeLoadGeneratorReplicaPatcher(
                         maxVolume = (patcher.properties["maxVolume"] ?: throwInvalid(patcher)).toInt(),
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ReplicaPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ReplicaPatcher.kt
index 8637b1299..5c5fe6d13 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ReplicaPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ReplicaPatcher.kt
@@ -7,11 +7,11 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
  * The Replica [Patcher] modifies the number of replicas for the given Kubernetes deployment.
  *
  */
-class ReplicaPatcher : AbstractPatcher() {
+class ReplicaPatcher : AbstractIntPatcher() {
 
-    override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
+    override fun patchSingleResource(resource: HasMetadata, value: Int): HasMetadata {
         if (resource is Deployment) {
-            resource.spec.replicas = Integer.parseInt(value)
+            resource.spec.replicas = value
         }
         return resource
     }
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/SchedulerNamePatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/SchedulerNamePatcher.kt
index 3c6f4be19..5df0a10c9 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/SchedulerNamePatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/SchedulerNamePatcher.kt
@@ -7,7 +7,7 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
  * The Scheduler name [Patcher] make it possible to set the scheduler which should
  * be used to deploy the given deployment.
  */
-class SchedulerNamePatcher : AbstractPatcher() {
+class SchedulerNamePatcher : AbstractStringPatcher() {
 
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ServiceSelectorPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ServiceSelectorPatcher.kt
index 58ccdea24..70b61b0ce 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ServiceSelectorPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ServiceSelectorPatcher.kt
@@ -3,7 +3,7 @@ package rocks.theodolite.kubernetes.patcher
 import io.fabric8.kubernetes.api.model.HasMetadata
 import io.fabric8.kubernetes.api.model.Service
 
-class ServiceSelectorPatcher(private var variableName: String) : AbstractPatcher() {
+class ServiceSelectorPatcher(private var variableName: String) : AbstractStringPatcher() {
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
         if (resource is Service) {
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/TemplateLabelPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/TemplateLabelPatcher.kt
index 04cbb8e2b..45dc30530 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/TemplateLabelPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/TemplateLabelPatcher.kt
@@ -9,7 +9,7 @@ import io.fabric8.kubernetes.api.model.apps.StatefulSet
  *
  * @property variableName The label which should be set
  */
-class TemplateLabelPatcher(val variableName: String) : AbstractPatcher() {
+class TemplateLabelPatcher(val variableName: String) : AbstractStringPatcher() {
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
         when (resource) {
diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcher.kt
index 5dfa2cc17..54ac12be7 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcher.kt
@@ -4,7 +4,7 @@ import io.fabric8.kubernetes.api.model.HasMetadata
 import io.fabric8.kubernetes.api.model.apps.Deployment
 import io.fabric8.kubernetes.api.model.apps.StatefulSet
 
-class VolumesConfigMapPatcher(private var volumeName: String) : AbstractPatcher() {
+class VolumesConfigMapPatcher(private var volumeName: String) : AbstractStringPatcher() {
 
     override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
         if (resource is Deployment) {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/AbstractPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/AbstractStringPatcherTest.kt
similarity index 98%
rename from theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/AbstractPatcherTest.kt
rename to theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/AbstractStringPatcherTest.kt
index cb9242330..e8fbb110e 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/AbstractPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/AbstractStringPatcherTest.kt
@@ -7,7 +7,7 @@ import io.quarkus.test.junit.QuarkusTest
 import org.junit.jupiter.api.Test
 
 @QuarkusTest
-abstract class AbstractPatcherTest {
+abstract class AbstractStringPatcherTest {
 
     lateinit var resource: List<HasMetadata>
     lateinit var patcher: Patcher
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/DataVolumeLoadGeneratorReplicaPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/DataVolumeLoadGeneratorReplicaPatcherTest.kt
index 6c9be1b9a..4d0d95a9c 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/DataVolumeLoadGeneratorReplicaPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/DataVolumeLoadGeneratorReplicaPatcherTest.kt
@@ -4,12 +4,12 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
 import io.quarkus.test.junit.QuarkusTest
 import org.junit.jupiter.api.BeforeEach
 import org.junit.jupiter.api.Test
-import rocks.theodolite.kubernetes.patcher.AbstractPatcherTest
+import rocks.theodolite.kubernetes.patcher.AbstractStringPatcherTest
 
 import rocks.theodolite.kubernetes.patcher.VolumesConfigMapPatcher
 
 @QuarkusTest
-internal class DataVolumeLoadGeneratorReplicaPatcherTest: AbstractPatcherTest() {
+internal class DataVolumeLoadGeneratorReplicaPatcherTest: AbstractStringPatcherTest() {
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/EnvVarPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/EnvVarPatcherTest.kt
index 83cd056ac..732bb05d0 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/EnvVarPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/EnvVarPatcherTest.kt
@@ -10,7 +10,7 @@ import org.junit.jupiter.api.Assertions.*
 import org.junit.jupiter.api.BeforeEach
 
 @QuarkusTest
-internal class EnvVarPatcherTest : AbstractPatcherTest() {
+internal class EnvVarPatcherTest : AbstractStringPatcherTest() {
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ImagePatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ImagePatcherTest.kt
index 7b3f803a4..c93e4b87f 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ImagePatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ImagePatcherTest.kt
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class ImagePatcherTest: AbstractPatcherTest(){
+internal class ImagePatcherTest: AbstractStringPatcherTest(){
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/LabelPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/LabelPatcherTest.kt
index 652dda47c..901551bc2 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/LabelPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/LabelPatcherTest.kt
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class LabelPatcherTest: AbstractPatcherTest() {
+internal class LabelPatcherTest: AbstractStringPatcherTest() {
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/MatchLabelPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/MatchLabelPatcherTest.kt
index a5711a762..b536f0594 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/MatchLabelPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/MatchLabelPatcherTest.kt
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class MatchLabelPatcherTest: AbstractPatcherTest() {
+internal class MatchLabelPatcherTest: AbstractStringPatcherTest() {
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NamePatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NamePatcherTest.kt
index cb1308cb7..5544c68af 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NamePatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NamePatcherTest.kt
@@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class NamePatcherTest: AbstractPatcherTest() {
+internal class NamePatcherTest: AbstractStringPatcherTest() {
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NodeSelectorPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NodeSelectorPatcherTest.kt
index ca8f83518..7e1c11298 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NodeSelectorPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NodeSelectorPatcherTest.kt
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class NodeSelectorPatcherTest: AbstractPatcherTest() {
+internal class NodeSelectorPatcherTest: AbstractStringPatcherTest() {
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumNestedGroupsLoadGeneratorReplicaPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumNestedGroupsLoadGeneratorReplicaPatcherTest.kt
index 8940e288f..7bf532a69 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumNestedGroupsLoadGeneratorReplicaPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumNestedGroupsLoadGeneratorReplicaPatcherTest.kt
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class NumNestedGroupsLoadGeneratorReplicaPatcherTest : AbstractPatcherTest(){
+internal class NumNestedGroupsLoadGeneratorReplicaPatcherTest : AbstractStringPatcherTest(){
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumSensorsLoadGeneratorReplicaPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumSensorsLoadGeneratorReplicaPatcherTest.kt
index e3bb6ffff..7aae52b21 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumSensorsLoadGeneratorReplicaPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumSensorsLoadGeneratorReplicaPatcherTest.kt
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class NumSensorsLoadGeneratorReplicaPatcherTest: AbstractPatcherTest() {
+internal class NumSensorsLoadGeneratorReplicaPatcherTest: AbstractStringPatcherTest() {
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ReplicaPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ReplicaPatcherTest.kt
index 852002a07..3e6da5aaa 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ReplicaPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ReplicaPatcherTest.kt
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class ReplicaPatcherTest: AbstractPatcherTest() {
+internal class ReplicaPatcherTest: AbstractStringPatcherTest() {
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/SchedulerNamePatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/SchedulerNamePatcherTest.kt
index 2b2021ec5..f057c612d 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/SchedulerNamePatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/SchedulerNamePatcherTest.kt
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class SchedulerNamePatcherTest : AbstractPatcherTest(){
+internal class SchedulerNamePatcherTest : AbstractStringPatcherTest(){
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/TemplateLabelPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/TemplateLabelPatcherTest.kt
index 94073b9f3..a6daef67e 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/TemplateLabelPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/TemplateLabelPatcherTest.kt
@@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class TemplateLabelPatcherTest: AbstractPatcherTest() {
+internal class TemplateLabelPatcherTest: AbstractStringPatcherTest() {
 
     @BeforeEach
     fun setUp() {
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcherTest.kt
index db3fc812e..e765f3aed 100644
--- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcherTest.kt
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcherTest.kt
@@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.Assertions.*
 
 @QuarkusTest
-internal class VolumesConfigMapPatcherTest: AbstractPatcherTest() {
+internal class VolumesConfigMapPatcherTest: AbstractStringPatcherTest() {
 
     @BeforeEach
     fun setUp() {
-- 
GitLab