diff --git a/theodolite-benchmarks/definitions/uc1-flink/resources/flink-configuration-configmap.yaml b/theodolite-benchmarks/definitions/uc1-flink/resources/flink-configuration-configmap.yaml index ecda4025087f103613b9700ca733962709c48836..625d8eb9aeebf5bb55f079ebe290460191965cec 100644 --- a/theodolite-benchmarks/definitions/uc1-flink/resources/flink-configuration-configmap.yaml +++ b/theodolite-benchmarks/definitions/uc1-flink/resources/flink-configuration-configmap.yaml @@ -16,12 +16,12 @@ data: metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter metrics.reporter.prom.interval: 10 SECONDS # gives metrics about inbound/outbound network queue lengths - taskmanager.network.detailed-metrics: true + #taskmanager.network.detailed-metrics: true log4j-console.properties: |+ # This affects logging for both user code and Flink rootLogger.level = INFO rootLogger.appenderRef.console.ref = ConsoleAppender - rootLogger.appenderRef.rolling.ref = RollingFileAppender + #rootLogger.appenderRef.rolling.ref = RollingFileAppender # Uncomment this if you want to _only_ change Flink's logging #logger.flink.name = org.apache.flink @@ -46,18 +46,18 @@ data: appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n # Log all infos in the given rolling file - appender.rolling.name = RollingFileAppender - appender.rolling.type = RollingFile - appender.rolling.append = false - appender.rolling.fileName = ${sys:log.file} - appender.rolling.filePattern = ${sys:log.file}.%i - appender.rolling.layout.type = PatternLayout - appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n - appender.rolling.policies.type = Policies - appender.rolling.policies.size.type = SizeBasedTriggeringPolicy - appender.rolling.policies.size.size=100MB - appender.rolling.strategy.type = DefaultRolloverStrategy - appender.rolling.strategy.max = 10 + #appender.rolling.name = RollingFileAppender + #appender.rolling.type = RollingFile + #appender.rolling.append = false + #appender.rolling.fileName = ${sys:log.file} + #appender.rolling.filePattern = ${sys:log.file}.%i + #appender.rolling.layout.type = PatternLayout + #appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n + #appender.rolling.policies.type = Policies + #appender.rolling.policies.size.type = SizeBasedTriggeringPolicy + #appender.rolling.policies.size.size=100MB + #appender.rolling.strategy.type = DefaultRolloverStrategy + #appender.rolling.strategy.max = 10 # Suppress the irrelevant (wrong) warnings from the Netty channel handler logger.netty.name = org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline diff --git a/theodolite-benchmarks/definitions/uc2-flink/resources/flink-configuration-configmap.yaml b/theodolite-benchmarks/definitions/uc2-flink/resources/flink-configuration-configmap.yaml index ecda4025087f103613b9700ca733962709c48836..625d8eb9aeebf5bb55f079ebe290460191965cec 100644 --- a/theodolite-benchmarks/definitions/uc2-flink/resources/flink-configuration-configmap.yaml +++ b/theodolite-benchmarks/definitions/uc2-flink/resources/flink-configuration-configmap.yaml @@ -16,12 +16,12 @@ data: metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter metrics.reporter.prom.interval: 10 SECONDS # gives metrics about inbound/outbound network queue lengths - taskmanager.network.detailed-metrics: true + #taskmanager.network.detailed-metrics: true log4j-console.properties: |+ # This affects logging for both user code and Flink rootLogger.level = INFO rootLogger.appenderRef.console.ref = ConsoleAppender - rootLogger.appenderRef.rolling.ref = RollingFileAppender + #rootLogger.appenderRef.rolling.ref = RollingFileAppender # Uncomment this if you want to _only_ change Flink's logging #logger.flink.name = org.apache.flink @@ -46,18 +46,18 @@ data: appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n # Log all infos in the given rolling file - appender.rolling.name = RollingFileAppender - appender.rolling.type = RollingFile - appender.rolling.append = false - appender.rolling.fileName = ${sys:log.file} - appender.rolling.filePattern = ${sys:log.file}.%i - appender.rolling.layout.type = PatternLayout - appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n - appender.rolling.policies.type = Policies - appender.rolling.policies.size.type = SizeBasedTriggeringPolicy - appender.rolling.policies.size.size=100MB - appender.rolling.strategy.type = DefaultRolloverStrategy - appender.rolling.strategy.max = 10 + #appender.rolling.name = RollingFileAppender + #appender.rolling.type = RollingFile + #appender.rolling.append = false + #appender.rolling.fileName = ${sys:log.file} + #appender.rolling.filePattern = ${sys:log.file}.%i + #appender.rolling.layout.type = PatternLayout + #appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n + #appender.rolling.policies.type = Policies + #appender.rolling.policies.size.type = SizeBasedTriggeringPolicy + #appender.rolling.policies.size.size=100MB + #appender.rolling.strategy.type = DefaultRolloverStrategy + #appender.rolling.strategy.max = 10 # Suppress the irrelevant (wrong) warnings from the Netty channel handler logger.netty.name = org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline diff --git a/theodolite-benchmarks/definitions/uc3-flink/resources/flink-configuration-configmap.yaml b/theodolite-benchmarks/definitions/uc3-flink/resources/flink-configuration-configmap.yaml index ecda4025087f103613b9700ca733962709c48836..625d8eb9aeebf5bb55f079ebe290460191965cec 100644 --- a/theodolite-benchmarks/definitions/uc3-flink/resources/flink-configuration-configmap.yaml +++ b/theodolite-benchmarks/definitions/uc3-flink/resources/flink-configuration-configmap.yaml @@ -16,12 +16,12 @@ data: metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter metrics.reporter.prom.interval: 10 SECONDS # gives metrics about inbound/outbound network queue lengths - taskmanager.network.detailed-metrics: true + #taskmanager.network.detailed-metrics: true log4j-console.properties: |+ # This affects logging for both user code and Flink rootLogger.level = INFO rootLogger.appenderRef.console.ref = ConsoleAppender - rootLogger.appenderRef.rolling.ref = RollingFileAppender + #rootLogger.appenderRef.rolling.ref = RollingFileAppender # Uncomment this if you want to _only_ change Flink's logging #logger.flink.name = org.apache.flink @@ -46,18 +46,18 @@ data: appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n # Log all infos in the given rolling file - appender.rolling.name = RollingFileAppender - appender.rolling.type = RollingFile - appender.rolling.append = false - appender.rolling.fileName = ${sys:log.file} - appender.rolling.filePattern = ${sys:log.file}.%i - appender.rolling.layout.type = PatternLayout - appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n - appender.rolling.policies.type = Policies - appender.rolling.policies.size.type = SizeBasedTriggeringPolicy - appender.rolling.policies.size.size=100MB - appender.rolling.strategy.type = DefaultRolloverStrategy - appender.rolling.strategy.max = 10 + #appender.rolling.name = RollingFileAppender + #appender.rolling.type = RollingFile + #appender.rolling.append = false + #appender.rolling.fileName = ${sys:log.file} + #appender.rolling.filePattern = ${sys:log.file}.%i + #appender.rolling.layout.type = PatternLayout + #appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n + #appender.rolling.policies.type = Policies + #appender.rolling.policies.size.type = SizeBasedTriggeringPolicy + #appender.rolling.policies.size.size=100MB + #appender.rolling.strategy.type = DefaultRolloverStrategy + #appender.rolling.strategy.max = 10 # Suppress the irrelevant (wrong) warnings from the Netty channel handler logger.netty.name = org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline diff --git a/theodolite-benchmarks/definitions/uc4-flink/resources/flink-configuration-configmap.yaml b/theodolite-benchmarks/definitions/uc4-flink/resources/flink-configuration-configmap.yaml index ecda4025087f103613b9700ca733962709c48836..625d8eb9aeebf5bb55f079ebe290460191965cec 100644 --- a/theodolite-benchmarks/definitions/uc4-flink/resources/flink-configuration-configmap.yaml +++ b/theodolite-benchmarks/definitions/uc4-flink/resources/flink-configuration-configmap.yaml @@ -16,12 +16,12 @@ data: metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter metrics.reporter.prom.interval: 10 SECONDS # gives metrics about inbound/outbound network queue lengths - taskmanager.network.detailed-metrics: true + #taskmanager.network.detailed-metrics: true log4j-console.properties: |+ # This affects logging for both user code and Flink rootLogger.level = INFO rootLogger.appenderRef.console.ref = ConsoleAppender - rootLogger.appenderRef.rolling.ref = RollingFileAppender + #rootLogger.appenderRef.rolling.ref = RollingFileAppender # Uncomment this if you want to _only_ change Flink's logging #logger.flink.name = org.apache.flink @@ -46,18 +46,18 @@ data: appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n # Log all infos in the given rolling file - appender.rolling.name = RollingFileAppender - appender.rolling.type = RollingFile - appender.rolling.append = false - appender.rolling.fileName = ${sys:log.file} - appender.rolling.filePattern = ${sys:log.file}.%i - appender.rolling.layout.type = PatternLayout - appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n - appender.rolling.policies.type = Policies - appender.rolling.policies.size.type = SizeBasedTriggeringPolicy - appender.rolling.policies.size.size=100MB - appender.rolling.strategy.type = DefaultRolloverStrategy - appender.rolling.strategy.max = 10 + #appender.rolling.name = RollingFileAppender + #appender.rolling.type = RollingFile + #appender.rolling.append = false + #appender.rolling.fileName = ${sys:log.file} + #appender.rolling.filePattern = ${sys:log.file}.%i + #appender.rolling.layout.type = PatternLayout + #appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n + #appender.rolling.policies.type = Policies + #appender.rolling.policies.size.type = SizeBasedTriggeringPolicy + #appender.rolling.policies.size.size=100MB + #appender.rolling.strategy.type = DefaultRolloverStrategy + #appender.rolling.strategy.max = 10 # Suppress the irrelevant (wrong) warnings from the Netty channel handler logger.netty.name = org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline 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 0000000000000000000000000000000000000000..d78f801fcbdb0dbf23a6913ed165d41ba74bd613 --- /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 { + + final 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/AbstractPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractPatcher.kt deleted file mode 100644 index 0ed2a5e5a8c96761074f998721489f0ddd2db1ac..0000000000000000000000000000000000000000 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractPatcher.kt +++ /dev/null @@ -1,30 +0,0 @@ -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]. - * - * 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 { - - override fun patch(resources: List<HasMetadata>, value: String) : List<HasMetadata> { - return resources - .map { Serialization.clone(it)} - .map { patchSingleResource(it, value) } - } - - abstract fun patchSingleResource(resource: HasMetadata, value: String): 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 adb5c1468130069524221de25354787e045c9b9e..5da1dea79bb2161ed2f81a823f3a00f3c5d49288 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractResourcePatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractResourcePatcher.kt @@ -22,9 +22,9 @@ 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 { + final override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata { when (resource) { is Deployment -> { resource.spec.template.spec.containers.filter { it.name == container }.forEach { diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractStringPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractStringPatcher.kt new file mode 100644 index 0000000000000000000000000000000000000000..7048a78eebb161505223b6e9e0f6d66a318d03fd --- /dev/null +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/AbstractStringPatcher.kt @@ -0,0 +1,22 @@ +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 AbstractStringPatcher( + val prefix: String = "", + val suffix: String = "" +) : Patcher { + + final override fun patch(resources: List<HasMetadata>, value: String) : List<HasMetadata> { + return resources + .map { Serialization.clone(it)} + .map { patchSingleResource(it, prefix + value) } + } + + abstract fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata + +} 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 272e3785e274eecbb85e3618113ae5137d5314bc..3c495331fd0b0df61a6b56eb58a02ac8506860e3 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ConfigMapYamlPatcher.kt @@ -13,8 +13,8 @@ import org.yaml.snakeyaml.Yaml */ class ConfigMapYamlPatcher( private val fileName: String, - private val variableName: String -) : AbstractPatcher() { + private val variableName: String, +) : 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 2979d06268d4b363ba2c4de35242bd45fa52f423..bfc40a4a5dfb181543b9979dbc2ef495c5f1b4af 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/DataVolumeLoadGeneratorReplicaPatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/DataVolumeLoadGeneratorReplicaPatcher.kt @@ -16,22 +16,22 @@ import io.fabric8.kubernetes.api.model.HasMetadata */ class DataVolumeLoadGeneratorReplicaPatcher( private val maxVolume: Int, - private val container: String, - private val variableName: String -) : Patcher { + val container: String, + val variableName: String +) : AbstractStringPatcher() { - override fun patch(resources: List<HasMetadata>, value: String) : List<HasMetadata> { - return resources.flatMap { patchSingeResource(it, value)} - } + private val envVarPatcher = EnvVarPatcher(container, variableName) + private val replicaPatcher = ReplicaPatcher() - private fun patchSingeResource(k8sResource: HasMetadata, value: String): List<HasMetadata> { + override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata { // calculate number of load generator instances and load per instance val load = Integer.parseInt(value) val loadGenInstances = (load + maxVolume - 1) / maxVolume val loadPerInstance = load / loadGenInstances // Patch instance values and load value of generators - val resourceList = ReplicaPatcher().patch(listOf(k8sResource), loadGenInstances.toString()) - return EnvVarPatcher(this.container, this.variableName).patch(resourceList, loadPerInstance.toString()) + return this.envVarPatcher.patchSingleResource( + replicaPatcher.patchSingleResource(resource, loadGenInstances), + loadPerInstance.toString()) } } diff --git a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/DecoratingPatcher.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/DecoratingPatcher.kt new file mode 100644 index 0000000000000000000000000000000000000000..2cd2265b74a5b977e7f778bdc366a708b3427471 --- /dev/null +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/DecoratingPatcher.kt @@ -0,0 +1,35 @@ +package rocks.theodolite.kubernetes.patcher + +import io.fabric8.kubernetes.api.model.HasMetadata +import mu.KotlinLogging + +private val logger = KotlinLogging.logger {} + +/** + * A decorating [Patcher] to modifies a value by a factor, a prefix and a suffix. All modifications are optional. The + * factor only has an effect if the supplied value is an integer. + */ +class DecoratingPatcher( + private val innerPatcher: Patcher, + private val prefix: String?, + private val suffix: String?, + private val factor: Int? +) : Patcher { + + override fun patch(resources: List<HasMetadata>, value: String) : List<HasMetadata> { + return this.innerPatcher.patch(resources, (prefix ?: "") + multiply(value) + (suffix ?: "")) + } + + private fun multiply(value: String): String { + if (this.factor == null) { + return value + } + val valueAsInt = value.toIntOrNull() + if (valueAsInt == null) { + logger.warn { "Patcher value cannot be parsed as Int. Ignoring factor." } + return value + } + return valueAsInt.times(factor).toString() + } + +} 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 33d6c8d9b6f5f82a49e7cd414e4b273708c0e68a..58bb51276acb5f6ebe0edab624d5e45b43c69260 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 7f54416501bc742499a958566a179b7fad320318..00909fb741f53e9f2b9f50896bb58ea5dc945677 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ImagePatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ImagePatcher.kt @@ -3,22 +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() { - - override fun patch(resources: List<HasMetadata>, value: String) : List<HasMetadata> { - return resources - .map { Serialization.clone(it) } - .map { patchSingleResource(it, value as kotlin.String) } - } +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 8bb5be97e780479884e6cb8e551c03340b04f8e6..86d78176c36dcddf56fbeb0301912cfa45f62eb2 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/LabelPatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/LabelPatcher.kt @@ -1,50 +1,16 @@ 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 { - when (resource) { - is Deployment -> { - if (resource.metadata.labels == null) { - resource.metadata.labels = mutableMapOf() - } - resource.metadata.labels[this.variableName] = value - } - is StatefulSet -> { - if (resource.metadata.labels == null) { - resource.metadata.labels = mutableMapOf() - } - resource.metadata.labels[this.variableName] = value - } - is Service -> { - if (resource.metadata.labels == null) { - resource.metadata.labels = mutableMapOf() - } - resource.metadata.labels[this.variableName] = value - - } - is ConfigMap -> { - if (resource.metadata.labels == null) { - resource.metadata.labels = mutableMapOf() - } - resource.metadata.labels[this.variableName] = value - } - is GenericKubernetesResource -> { - if (resource.metadata.labels == null) { - resource.metadata.labels = mutableMapOf() - } - resource.metadata.labels[this.variableName] = value - } + if (resource.metadata.labels == null) { + resource.metadata.labels = mutableMapOf() } + resource.metadata.labels[this.variableName] = value return resource } } \ No newline at end of file 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 725c9cf8a6a87c23119812c0a5d5ad3280a42e3c..2cb70842add05aff5a0238d2b52a642c838c6820 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/MatchLabelPatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/MatchLabelPatcher.kt @@ -9,9 +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 a6416a7e77841fa869de7ce2c248882fb486572c..9a39a5b285ff69b4dea88f089432f420a6cd5df3 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NamePatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NamePatcher.kt @@ -1,35 +1,11 @@ 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 { - when (resource) { - is Deployment -> { - resource.metadata.name = value - } - is StatefulSet -> { - resource.metadata.name = value - } - is Service -> { - resource.metadata.name = value - } - is ConfigMap -> { - resource.metadata.name = value - } - is io.fabric8.kubernetes.api.model.networking.v1.Ingress -> { - resource.metadata.name = value - } - is GenericKubernetesResource -> { - resource.metadata.name = value - } - } + resource.metadata.name = value return resource } } \ No newline at end of file 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 c3b5ba1a07afa41dd604f2335baf6b58e362f293..a145c26285b3ccefc74b9a83cf80156e049c143f 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NodeSelectorPatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/NodeSelectorPatcher.kt @@ -8,10 +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 e3b0105768ec339758fd89233a09da233145d641..c9301463564777c15590ff6929fb4f3d7f41af59 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 6bb2750bb1ca923aa05022884ef7054772a987c6..088f9854b253a9f4c25ab07b49fbabfe38a4f37d 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/PatchHandler.kt b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/PatchHandler.kt index 92b1e52ba7492181b5f3b06080efe01aae6cf66b..9740952d8a7a4aa016ff3928f344098c65c85088 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/PatchHandler.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/PatchHandler.kt @@ -5,7 +5,7 @@ class PatchHandler { companion object { private fun getResourcesToPatch(resources: Map<String, List<HasMetadata>>, patcherDefinition: PatcherDefinition): List<HasMetadata> { return resources[patcherDefinition.resource] - ?: throw InvalidPatcherConfigurationException("Could not find resource ${patcherDefinition.resource}") + ?: throw InvalidPatcherConfigurationException("Could not find resource ${patcherDefinition.resource}.") } fun patchResource( 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 26e76ccfabbb773e45bf80fd09612473c246c5e4..4b75999e70197f775e7fa610eeb6700545bf6869 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/PatcherFactory.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/PatcherFactory.kt @@ -21,20 +21,25 @@ 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(), container = patcher.properties["container"] ?: throwInvalid(patcher), variableName = patcher.properties["variableName"] ?: throwInvalid(patcher) ) - "EnvVarPatcher" -> EnvVarPatcher( - container = patcher.properties["container"] ?: throwInvalid(patcher), - variableName = patcher.properties["variableName"] ?: throwInvalid(patcher) + "EnvVarPatcher" -> DecoratingPatcher( + EnvVarPatcher( + container = patcher.properties["container"] ?: throwInvalid(patcher), + variableName = patcher.properties["variableName"] ?: throwInvalid(patcher) + ), + prefix = patcher.properties["prefix"], + suffix = patcher.properties["suffix"], + factor = patcher.properties["factor"]?.toInt(), ) "NodeSelectorPatcher" -> NodeSelectorPatcher( variableName = patcher.properties["variableName"] ?: throwInvalid(patcher) @@ -64,9 +69,14 @@ class PatcherFactory { "ImagePatcher" -> ImagePatcher( container = patcher.properties["container"] ?: throwInvalid(patcher) ) - "ConfigMapYamlPatcher" -> ConfigMapYamlPatcher( - fileName = patcher.properties["fileName"] ?: throwInvalid(patcher), - variableName = patcher.properties["variableName"] ?: throwInvalid(patcher) + "ConfigMapYamlPatcher" -> DecoratingPatcher( + ConfigMapYamlPatcher( + 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( 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 8637b1299e878c4424e7fcaf4eac3bc901428541..5c5fe6d1352081ea5ea56c6f4005e7ba05bacd6f 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 c5ac16cdfe25f6b2fd2e4d0a2fb27000f885ffe7..5df0a10c97bd8d16b268ce847c3696c82081b9f2 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/SchedulerNamePatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/SchedulerNamePatcher.kt @@ -6,9 +6,8 @@ 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. - * @param k8sResource Kubernetes resource to be patched. */ -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 b38ae4108748f85e7ac60f3ee3aa8c5d28281432..70b61b0cea7043f645be522f3dc706509c812b06 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ServiceSelectorPatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/ServiceSelectorPatcher.kt @@ -3,9 +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 e1c1bc3a15b8a9035bcaaa513f040aff9982e7ab..45dc30530e20950c5a2fb3d15e9203109c4c845d 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/TemplateLabelPatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/TemplateLabelPatcher.kt @@ -9,9 +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 54a459a19b35e74839de647761e8ac22f839ca2d..54ac12be7629da792cbb72b2f1d409ba0f4ba93c 100644 --- a/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcher.kt +++ b/theodolite/src/main/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcher.kt @@ -4,8 +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/ResourceSetsTest.kt b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/ResourceSetsTest.kt index f0a6c120ca6c3397e8d41cd9f42b536b3e053caf..103d8e4c8498ebe2f27bf06b907557ece6cbefaa 100644 --- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/ResourceSetsTest.kt +++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/ResourceSetsTest.kt @@ -118,7 +118,6 @@ internal class ResourceSetsTest { val fileSystem = resourcesSet.loadResourceSet(server.client) assertEquals(fileSystem.size, 1) - assertTrue(fileSystem.elementAt(0).second is HasMetadata) } @Test 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 8940e288fae79f10e5dcd728121a2dbbf0aaa180..e8fbd43f50731b3ab0a2c4edd76e0dddd9829d2e 100644 --- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumNestedGroupsLoadGeneratorReplicaPatcherTest.kt +++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumNestedGroupsLoadGeneratorReplicaPatcherTest.kt @@ -14,7 +14,7 @@ internal class NumNestedGroupsLoadGeneratorReplicaPatcherTest : AbstractPatcherT @BeforeEach fun setUp() { resource = listOf(createDeployment()) - patcher = NumNestedGroupsLoadGeneratorReplicaPatcher("10", "500") + patcher = NumNestedGroupsLoadGeneratorReplicaPatcher(10, 500) value = "2" } 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 e3bb6ffff4938bcaeb4a0db6487bd4741da75850..f561b8f773b562d7855a670e99c3eec2486ab121 100644 --- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumSensorsLoadGeneratorReplicaPatcherTest.kt +++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/NumSensorsLoadGeneratorReplicaPatcherTest.kt @@ -14,7 +14,7 @@ internal class NumSensorsLoadGeneratorReplicaPatcherTest: AbstractPatcherTest() @BeforeEach fun setUp() { resource = listOf(createDeployment()) - patcher = NumSensorsLoadGeneratorReplicaPatcher("10") + patcher = NumSensorsLoadGeneratorReplicaPatcher(10) value = "2" } 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 db3fc812e426c0f74cf68d35a158f32a3ec0bc3f..82f12d7379bd47dd5d5032f2ae0bbf7dcb252a98 100644 --- a/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcherTest.kt +++ b/theodolite/src/test/kotlin/rocks/theodolite/kubernetes/patcher/VolumesConfigMapPatcherTest.kt @@ -26,8 +26,9 @@ internal class VolumesConfigMapPatcherTest: AbstractPatcherTest() { override fun validate() { patch() resource.forEach { - println((it as Deployment).spec.template.spec.volumes[0].configMap.name) - assertTrue((it as Deployment).spec.template.spec.volumes[0].configMap.name == value) + it as Deployment + println(it.spec.template.spec.volumes[0].configMap.name) + assertTrue(it.spec.template.spec.volumes[0].configMap.name == value) } } } \ No newline at end of file