From c45768a4e93a913db417316a05ce26fc2225cd01 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=B6ren=20Henning?= <soeren.henning@email.uni-kiel.de>
Date: Sun, 4 Dec 2022 15:36:04 +0100
Subject: [PATCH] Fix non-string serialization

---
 .../patcher/ConfigMapYamlPatcher.kt           |  4 +-
 .../patcher/ConfigMapYamlPatcherTest.kt       | 52 +++++++++++++++++++
 2 files changed, 54 insertions(+), 2 deletions(-)
 create mode 100644 theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcherTest.kt

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 3c495331f..28b2d55d4 100644
--- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcher.kt
+++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcher.kt
@@ -27,8 +27,8 @@ class ConfigMapYamlPatcher(
             val parser = Yaml(dumperOptions)
 
             // Change value
-            val yaml = parser.loadAs(yamlFile, LinkedHashMap<String, String>()::class.java)
-            yaml[variableName] = value
+            val yaml = parser.loadAs(yamlFile, LinkedHashMap<String, Any>()::class.java)
+            yaml[variableName] = value.toLongOrNull() ?: value.toDoubleOrNull() ?: value.toBooleanStrictOrNull() ?: value
 
             // Convert back to String and set in Kubernetes resource
             resource.data[fileName] = parser.dump(yaml)
diff --git a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcherTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcherTest.kt
new file mode 100644
index 000000000..474080b5c
--- /dev/null
+++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcherTest.kt
@@ -0,0 +1,52 @@
+package rocks.theodolite.kubernetes.patcher
+
+import io.fabric8.kubernetes.api.model.ConfigMap
+import io.fabric8.kubernetes.api.model.ConfigMapBuilder
+import org.junit.jupiter.api.AfterEach
+import org.junit.jupiter.api.Assertions.*
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.params.ParameterizedTest
+import org.junit.jupiter.params.provider.ValueSource
+
+internal class ConfigMapYamlPatcherTest {
+
+    private lateinit var configMap: ConfigMap
+
+    private val patcher = ConfigMapYamlPatcher("some-file.yaml", "second")
+
+    @BeforeEach
+    fun setUp() {
+        val data = mapOf(
+            "some-file.yaml" to """
+                first: some-test
+                second: 1
+                third: 1234
+            """.trimIndent()
+        )
+
+        this.configMap = ConfigMapBuilder()
+            .withNewMetadata()
+            .withName("example")
+            .endMetadata()
+            .addToData(data)
+            .build()
+    }
+
+    @ParameterizedTest
+    @ValueSource(strings = ["some-string", "42", "42.42", "true"])
+    fun setSettingString(inputValue: String) {
+        val patched = patcher.patchSingleResource(this.configMap, inputValue)
+        assertTrue(patched is ConfigMap)
+        //patched.let { it as ConfigMap }.data
+        patched as ConfigMap
+        val yaml = patched.data["some-file.yaml"]
+        assertTrue(yaml != null)
+        val line = yaml!!.lines().getOrNull(1)
+        assertTrue(line != null)
+        val value = line!!.split(": ").getOrNull(1)
+        assertEquals(inputValue, value)
+    }
+
+
+}
\ No newline at end of file
-- 
GitLab