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

Reduce code duplication for abstract patchers

parent 01f4a45f
No related branches found
No related tags found
No related merge requests found
Pipeline #10326 failed
Showing
with 49 additions and 54 deletions
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
}
...@@ -22,7 +22,7 @@ abstract class AbstractResourcePatcher( ...@@ -22,7 +22,7 @@ abstract class AbstractResourcePatcher(
protected val requiredResource: String, protected val requiredResource: String,
private val format: String? = null, private val format: String? = null,
private val factor: Int? = null private val factor: Int? = null
) : AbstractPatcher() { ) : AbstractStringPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
when (resource) { when (resource) {
......
...@@ -5,19 +5,8 @@ import io.fabric8.kubernetes.client.utils.Serialization ...@@ -5,19 +5,8 @@ import io.fabric8.kubernetes.client.utils.Serialization
/** /**
* A Patcher is able to modify values of a Kubernetes resource, see [Patcher]. * 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> { override fun patch(resources: List<HasMetadata>, value: String) : List<HasMetadata> {
return resources return resources
......
...@@ -14,7 +14,7 @@ import org.yaml.snakeyaml.Yaml ...@@ -14,7 +14,7 @@ import org.yaml.snakeyaml.Yaml
class ConfigMapYamlPatcher( class ConfigMapYamlPatcher(
private val fileName: String, private val fileName: String,
private val variableName: String private val variableName: String
) : AbstractPatcher() { ) : AbstractStringPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource is ConfigMap) { if (resource is ConfigMap) {
......
...@@ -18,7 +18,7 @@ class DataVolumeLoadGeneratorReplicaPatcher( ...@@ -18,7 +18,7 @@ class DataVolumeLoadGeneratorReplicaPatcher(
private val maxVolume: Int, private val maxVolume: Int,
val container: String, val container: String,
val variableName: String val variableName: String
) : AbstractPatcher() { ) : AbstractStringPatcher() {
private val envVarPatcher = EnvVarPatcher(container, variableName) private val envVarPatcher = EnvVarPatcher(container, variableName)
private val replicaPatcher = ReplicaPatcher() private val replicaPatcher = ReplicaPatcher()
......
...@@ -14,7 +14,7 @@ import io.fabric8.kubernetes.api.model.apps.Deployment ...@@ -14,7 +14,7 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
class EnvVarPatcher( class EnvVarPatcher(
private val container: String, private val container: String,
private val variableName: String private val variableName: String
) : AbstractPatcher() { ) : AbstractStringPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
......
...@@ -3,14 +3,13 @@ package rocks.theodolite.kubernetes.patcher ...@@ -3,14 +3,13 @@ package rocks.theodolite.kubernetes.patcher
import io.fabric8.kubernetes.api.model.HasMetadata import io.fabric8.kubernetes.api.model.HasMetadata
import io.fabric8.kubernetes.api.model.apps.Deployment import io.fabric8.kubernetes.api.model.apps.Deployment
import io.fabric8.kubernetes.api.model.apps.StatefulSet 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. * The Image patcher allows to change the image of a container.
* *
* @param container Container to be patched. * @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 { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource is Deployment) { if (resource is Deployment) {
......
package rocks.theodolite.kubernetes.patcher 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.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( class LabelPatcher(
val variableName: String) : val variableName: String) :
AbstractPatcher() { AbstractStringPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource.metadata.labels == null) { if (resource.metadata.labels == null) {
......
...@@ -9,7 +9,7 @@ import io.fabric8.kubernetes.api.model.apps.StatefulSet ...@@ -9,7 +9,7 @@ import io.fabric8.kubernetes.api.model.apps.StatefulSet
* *
* @property variableName The matchLabel which should be set * @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 { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
when (resource) { when (resource) {
......
package rocks.theodolite.kubernetes.patcher 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.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 { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
resource.metadata.name = value resource.metadata.name = value
......
...@@ -8,7 +8,7 @@ import io.fabric8.kubernetes.api.model.apps.Deployment ...@@ -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. * @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 { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource is Deployment) { if (resource is Deployment) {
......
...@@ -5,13 +5,13 @@ import io.fabric8.kubernetes.api.model.apps.Deployment ...@@ -5,13 +5,13 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
import kotlin.math.pow import kotlin.math.pow
class NumNestedGroupsLoadGeneratorReplicaPatcher( class NumNestedGroupsLoadGeneratorReplicaPatcher(
private val numSensors: String, private val numSensors: Int,
private val loadGenMaxRecords: String, private val loadGenMaxRecords: Int,
) : AbstractPatcher() { ) : AbstractIntPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata { override fun patchSingleResource(resource: HasMetadata, value: Int): HasMetadata {
if (resource is Deployment) { if (resource is Deployment) {
val approxNumSensors = numSensors.toDouble().pow(Integer.parseInt(value).toDouble()) val approxNumSensors = numSensors.toDouble().pow(value.toDouble())
val loadGenInstances = val loadGenInstances =
(approxNumSensors + loadGenMaxRecords.toDouble() - 1) / loadGenMaxRecords.toDouble() (approxNumSensors + loadGenMaxRecords.toDouble() - 1) / loadGenMaxRecords.toDouble()
resource.spec.replicas = loadGenInstances.toInt() resource.spec.replicas = loadGenInstances.toInt()
......
...@@ -5,14 +5,12 @@ import io.fabric8.kubernetes.api.model.apps.Deployment ...@@ -5,14 +5,12 @@ import io.fabric8.kubernetes.api.model.apps.Deployment
class NumSensorsLoadGeneratorReplicaPatcher( class NumSensorsLoadGeneratorReplicaPatcher(
private val loadGenMaxRecords: String, private val loadGenMaxRecords: Int
) : AbstractPatcher() { ) : AbstractIntPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata { override fun patchSingleResource(resource: HasMetadata, value: Int): HasMetadata {
if (resource is Deployment) { if (resource is Deployment) {
val loadGenInstances = resource.spec.replicas = (value + loadGenMaxRecords - 1) / loadGenMaxRecords
(Integer.parseInt(value) + loadGenMaxRecords.toInt() - 1) / loadGenMaxRecords.toInt()
resource.spec.replicas = loadGenInstances
} }
return resource return resource
......
...@@ -21,11 +21,11 @@ class PatcherFactory { ...@@ -21,11 +21,11 @@ class PatcherFactory {
"ReplicaPatcher" -> ReplicaPatcher( "ReplicaPatcher" -> ReplicaPatcher(
) )
"NumNestedGroupsLoadGeneratorReplicaPatcher" -> NumNestedGroupsLoadGeneratorReplicaPatcher( "NumNestedGroupsLoadGeneratorReplicaPatcher" -> NumNestedGroupsLoadGeneratorReplicaPatcher(
loadGenMaxRecords = patcher.properties["loadGenMaxRecords"] ?: throwInvalid(patcher), loadGenMaxRecords = (patcher.properties["loadGenMaxRecords"] ?: throwInvalid(patcher)).toInt(),
numSensors = patcher.properties["numSensors"] ?: throwInvalid(patcher) numSensors = (patcher.properties["numSensors"] ?: throwInvalid(patcher)).toInt()
) )
"NumSensorsLoadGeneratorReplicaPatcher" -> NumSensorsLoadGeneratorReplicaPatcher( "NumSensorsLoadGeneratorReplicaPatcher" -> NumSensorsLoadGeneratorReplicaPatcher(
loadGenMaxRecords = patcher.properties["loadGenMaxRecords"] ?: throwInvalid(patcher) loadGenMaxRecords = (patcher.properties["loadGenMaxRecords"] ?: throwInvalid(patcher)).toInt()
) )
"DataVolumeLoadGeneratorReplicaPatcher" -> DataVolumeLoadGeneratorReplicaPatcher( "DataVolumeLoadGeneratorReplicaPatcher" -> DataVolumeLoadGeneratorReplicaPatcher(
maxVolume = (patcher.properties["maxVolume"] ?: throwInvalid(patcher)).toInt(), maxVolume = (patcher.properties["maxVolume"] ?: throwInvalid(patcher)).toInt(),
......
...@@ -7,11 +7,11 @@ import io.fabric8.kubernetes.api.model.apps.Deployment ...@@ -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. * 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) { if (resource is Deployment) {
resource.spec.replicas = Integer.parseInt(value) resource.spec.replicas = value
} }
return resource return resource
} }
......
...@@ -7,7 +7,7 @@ import io.fabric8.kubernetes.api.model.apps.Deployment ...@@ -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 * The Scheduler name [Patcher] make it possible to set the scheduler which should
* be used to deploy the given deployment. * be used to deploy the given deployment.
*/ */
class SchedulerNamePatcher : AbstractPatcher() { class SchedulerNamePatcher : AbstractStringPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
......
...@@ -3,7 +3,7 @@ package rocks.theodolite.kubernetes.patcher ...@@ -3,7 +3,7 @@ package rocks.theodolite.kubernetes.patcher
import io.fabric8.kubernetes.api.model.HasMetadata import io.fabric8.kubernetes.api.model.HasMetadata
import io.fabric8.kubernetes.api.model.Service 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 { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource is Service) { if (resource is Service) {
......
...@@ -9,7 +9,7 @@ import io.fabric8.kubernetes.api.model.apps.StatefulSet ...@@ -9,7 +9,7 @@ import io.fabric8.kubernetes.api.model.apps.StatefulSet
* *
* @property variableName The label which should be set * @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 { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
when (resource) { when (resource) {
......
...@@ -4,7 +4,7 @@ import io.fabric8.kubernetes.api.model.HasMetadata ...@@ -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.Deployment
import io.fabric8.kubernetes.api.model.apps.StatefulSet 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 { override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource is Deployment) { if (resource is Deployment) {
......
...@@ -7,7 +7,7 @@ import io.quarkus.test.junit.QuarkusTest ...@@ -7,7 +7,7 @@ import io.quarkus.test.junit.QuarkusTest
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
@QuarkusTest @QuarkusTest
abstract class AbstractPatcherTest { abstract class AbstractStringPatcherTest {
lateinit var resource: List<HasMetadata> lateinit var resource: List<HasMetadata>
lateinit var patcher: Patcher lateinit var patcher: Patcher
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment