Skip to content
Snippets Groups Projects
Commit f3e6bf44 authored by Sören Henning's avatar Sören Henning
Browse files

Add ConfigMapPropertiesPatcher

parent ead33635
No related branches found
No related tags found
No related merge requests found
Pipeline #10418 passed
package rocks.theodolite.kubernetes.patcher
import io.fabric8.kubernetes.api.model.ConfigMap
import io.fabric8.kubernetes.api.model.HasMetadata
import java.io.StringReader
import java.io.StringWriter
import java.util.Properties
/**
* The ConfigMapYamlPatcher allows to add/modify a key-value pair in a .properties file of a ConfigMap
*
* @property fileName of the .properties file in the ConfigMap that should be modified.
* @property variableName Name of the environment variable to be patched.
*/
class ConfigMapPropertiesPatcher(
private val fileName: String,
private val variableName: String,
) : AbstractStringPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource is ConfigMap) {
val propertiesFile = resource.data[fileName]
// Read properties string
val properties = Properties().also { it.load(StringReader(propertiesFile)) }
// Change value
properties.setProperty(this.variableName, value)
// Convert back to String and set in Kubernetes resource
val writer = StringWriter()
properties.store(writer, null)
resource.data[fileName] = writer.toString()
}
return resource
}
}
......@@ -78,6 +78,15 @@ class PatcherFactory {
suffix = patcher.properties["suffix"],
factor = patcher.properties["factor"]?.toInt(),
)
"ConfigMapPropertiesPatcher" -> DecoratingPatcher(
ConfigMapPropertiesPatcher(
fileName = patcher.properties["fileName"] ?: throwInvalid(patcher),
variableName = patcher.properties["variableName"] ?: throwInvalid(patcher)
),
prefix = patcher.properties["prefix"],
suffix = patcher.properties["suffix"],
factor = patcher.properties["factor"]?.toInt(),
)
"NamePatcher" -> NamePatcher()
"ServiceSelectorPatcher" -> ServiceSelectorPatcher(
variableName = patcher.properties["label"] ?: throwInvalid(patcher)
......
package rocks.theodolite.kubernetes.patcher
import io.fabric8.kubernetes.api.model.ConfigMap
import io.fabric8.kubernetes.api.model.ConfigMapBuilder
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.ValueSource
internal class ConfigMapPropertiesPatcherTest {
private lateinit var configMap: ConfigMap
private val patcher = ConfigMapPropertiesPatcher("some-file.properties", "second.prop.value")
@BeforeEach
fun setUp() {
val data = mapOf(
"some-file.properties" to """
first.properties.value = some-test
second.prop.value = 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 properties = patched.data["some-file.properties"]
assertTrue(properties != null)
val matchLines = properties!!.lines().filter { it.startsWith("second.prop.value") }
assertEquals(1, matchLines.size)
val value = matchLines[0].split("=").getOrNull(1)
assertEquals(inputValue, value)
}
}
\ No newline at end of file
......@@ -20,6 +20,7 @@ internal class ConfigMapYamlPatcherTest {
val data = mapOf(
"some-file.yaml" to """
first: some-test
# some comment: with colon
second: 1
third: 1234
""".trimIndent()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment