Skip to content
Snippets Groups Projects
Commit 20755fff authored by Benedikt Wetzel's avatar Benedikt Wetzel Committed by Sören Henning
Browse files

add additional patcher from bw msc

parent 314a8f7e
No related branches found
No related tags found
1 merge request!291Add Patcher to Theodolite
Pipeline #9092 passed
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.api.model.batch.v1.Job
import io.fabric8.kubernetes.client.utils.Serialization
/**
* The AnnotationPatcher adds an annotation to the kubernetes resource
*
* @property variableName The annotation key
*/
class AnnotationPatcher(
private val variableName: String
) :
AbstractPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource.metadata.annotations == null) {
resource.metadata.annotations = mutableMapOf()
}
resource.metadata.annotations[variableName] = value
return resource
}
}
\ No newline at end of file
package rocks.theodolite.kubernetes.patcher
import io.fabric8.kubernetes.api.model.ConfigMap
import io.fabric8.kubernetes.api.model.HasMetadata
import io.fabric8.kubernetes.api.model.KubernetesResource
import io.fabric8.kubernetes.client.utils.Serialization
import java.io.File
import java.io.FileReader
import java.io.PrintWriter
import java.io.StringWriter
import java.util.*
/**
* The configMapPropertiesFilePatcher changes a value in properties file given within a ConfigMap
*
* @property fileName The name of the file to be patched
* @property variableName The name of the variable which should be changed
*/
class ConfigMapPropertiesFilePatcher(
private val fileName: String,
private val variableName: String
): AbstractPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String) : HasMetadata {
if(resource is ConfigMap) {
val content = resource.data.toMap().toMutableMap()
val newContent = patchApplicationProperties(content[fileName] !!, variableName, value)
content[fileName] = newContent
resource.data = content
}
return resource
}
private fun patchApplicationProperties(content: String, variableName: String, value: String) : String {
val props: MutableMap<String,String> = mutableMapOf<String,String>()
content.lines().forEach {
it.split(",").forEach {
val kv = it.split("=")
if(kv.size>1) {
props[kv[0]] = kv[1] + "\n"
} else {
props[kv[0]] = "\n"
}
}
}
props[variableName] = value + "\n"
return props.toString().substring(1, props.toString().length - 1).replace(",","").replace(" ", "")
}
}
\ No newline at end of file
package rocks.theodolite.kubernetes.patcher
import io.fabric8.kubernetes.api.model.HasMetadata
import io.fabric8.kubernetes.api.model.Pod
import io.fabric8.kubernetes.api.model.apps.Deployment
import io.fabric8.kubernetes.api.model.apps.StatefulSet
import io.fabric8.kubernetes.api.model.batch.v1.Job
import io.fabric8.kubernetes.client.utils.Serialization
/**
* The Image patcher allows to change the imagePolicy of a container.
*
* @param container Container to be patched.
*/
class ImagePullPolicyPatcher(
private val container: String
) :
AbstractPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
when (resource) {
is Deployment -> {
resource.spec.template.spec.containers.filter { it.name == container }.forEach {
it.imagePullPolicy = value
}
return resource
}
is StatefulSet -> {
resource.spec.template.spec.containers.filter { it.name == container }.forEach {
it.imagePullPolicy = value
}
return resource
}
is Job -> {
resource.spec.template.spec.containers.filter { it.name == container }.forEach {
it.imagePullPolicy = value
}
return resource
}
is Pod -> {
resource.spec.containers.filter { it.name == container }.forEach {
it.imagePullPolicy = value
}
return resource
}
}
return resource
}
}
package rocks.theodolite.kubernetes.patcher
import io.fabric8.kubernetes.api.model.*
import io.fabric8.kubernetes.api.model.apps.Deployment
import io.fabric8.kubernetes.client.utils.Serialization
import java.beans.Expression
/**
* This patcher sets node affinities.
*
* @property expressionKey ExpressionKey to set node affinities
*/
class NodeAffinityPatcher(
private val expressionKey: String,
) :
AbstractPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource is Deployment) {
val req = NodeSelectorRequirement()
req.key=expressionKey
req.operator="In"
req.values= listOf(value)
val term = PreferredSchedulingTermBuilder().build()
term.weight = 80
term.preference = NodeSelectorTerm()
term.preference.matchExpressions = listOf(req)
val aff = Affinity()
aff.nodeAffinity = NodeAffinity()
aff.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution = mutableListOf(term)
resource.spec.template.spec.affinity = aff
}
return resource
}
}
...@@ -27,6 +27,9 @@ class PatcherFactory { ...@@ -27,6 +27,9 @@ class PatcherFactory {
return try { return try {
when (patcherDefinition.type) { when (patcherDefinition.type) {
"AnnotationPatcher" -> AnnotationPatcher(
variableName = patcherDefinition.properties["variableName"]!!
)
"ReplicaPatcher" -> ReplicaPatcher( "ReplicaPatcher" -> ReplicaPatcher(
) )
"NumNestedGroupsLoadGeneratorReplicaPatcher" -> NumNestedGroupsLoadGeneratorReplicaPatcher( "NumNestedGroupsLoadGeneratorReplicaPatcher" -> NumNestedGroupsLoadGeneratorReplicaPatcher(
...@@ -48,6 +51,13 @@ class PatcherFactory { ...@@ -48,6 +51,13 @@ class PatcherFactory {
"NodeSelectorPatcher" -> NodeSelectorPatcher( "NodeSelectorPatcher" -> NodeSelectorPatcher(
variableName = patcherDefinition.properties["variableName"]!! variableName = patcherDefinition.properties["variableName"]!!
) )
"PodAffinityPatcher" -> PodAffinityPatcher(
expressionKey = patcherDefinition.properties["expressionKey"]!!,
expressionTopKey = patcherDefinition.properties["expressionTopKey"]!!
)
"NodeAffinityPatcher" -> NodeAffinityPatcher(
expressionKey = patcherDefinition.properties["expressionKey"]!!,
)
"ResourceLimitPatcher" -> ResourceLimitPatcher( "ResourceLimitPatcher" -> ResourceLimitPatcher(
container = patcherDefinition.properties["container"]!!, container = patcherDefinition.properties["container"]!!,
limitedResource = patcherDefinition.properties["limitedResource"]!! limitedResource = patcherDefinition.properties["limitedResource"]!!
...@@ -69,6 +79,9 @@ class PatcherFactory { ...@@ -69,6 +79,9 @@ class PatcherFactory {
"ImagePatcher" -> ImagePatcher( "ImagePatcher" -> ImagePatcher(
container = patcherDefinition.properties["container"]!! container = patcherDefinition.properties["container"]!!
) )
"ImagePullPolicyPatcher" -> ImagePullPolicyPatcher(
container = patcherDefinition.properties["container"]!!
)
"NamePatcher" -> NamePatcher() "NamePatcher" -> NamePatcher()
"ServiceSelectorPatcher" -> ServiceSelectorPatcher( "ServiceSelectorPatcher" -> ServiceSelectorPatcher(
variableName = patcherDefinition.properties["label"]!! variableName = patcherDefinition.properties["label"]!!
...@@ -76,6 +89,11 @@ class PatcherFactory { ...@@ -76,6 +89,11 @@ class PatcherFactory {
"rocks.theodolite.kubernetes.patcher.VolumesConfigMapPatcher" -> VolumesConfigMapPatcher( "rocks.theodolite.kubernetes.patcher.VolumesConfigMapPatcher" -> VolumesConfigMapPatcher(
volumeName = patcherDefinition.properties["volumeName"]!! volumeName = patcherDefinition.properties["volumeName"]!!
) )
"ConfigMapPropertiesFilePatcher" -> ConfigMapPropertiesFilePatcher(
fileName = patcherDefinition.properties["fileName"]!!,
variableName = patcherDefinition.properties["property"]!!
)
else -> throw InvalidPatcherConfigurationException("Patcher type ${patcherDefinition.type} not found.") else -> throw InvalidPatcherConfigurationException("Patcher type ${patcherDefinition.type} not found.")
} }
} catch (e: NullPointerException) { } catch (e: NullPointerException) {
......
package rocks.theodolite.kubernetes.patcher
import io.fabric8.kubernetes.api.model.*
import io.fabric8.kubernetes.api.model.apps.Deployment
import io.fabric8.kubernetes.client.utils.Serialization
import java.beans.Expression
/**
* This patcher adds pod affinities to a Pod
*
* @property expressionKey The expressionKey used for the pod affinities
* @property expressionTopKey The expressionKey used for the pod affinities
*/
class PodAffinityPatcher(
private val expressionKey: String,
private val expressionTopKey: String
) :
AbstractPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource is Deployment) {
val affTerm = WeightedPodAffinityTermBuilder().build()
affTerm.weight = 80
affTerm.podAffinityTerm = PodAffinityTerm()
affTerm.podAffinityTerm.labelSelector = LabelSelector()
val req = LabelSelectorRequirement()
req.key=expressionKey
req.operator="In"
req.values= listOf(value)
affTerm.podAffinityTerm.labelSelector.matchExpressions = listOf(req)
affTerm.podAffinityTerm.topologyKey = expressionTopKey
val aff = Affinity()
aff.podAffinity = PodAffinity()
aff.podAffinity.preferredDuringSchedulingIgnoredDuringExecution = mutableListOf(affTerm)
resource.spec.template.spec.affinity = aff
}
return resource
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment