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(
protected val requiredResource: String,
private val format: String? = null,
private val factor: Int? = null
) : AbstractPatcher() {
) : AbstractStringPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
when (resource) {
......
......@@ -5,19 +5,8 @@ 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 {
abstract class AbstractStringPatcher : Patcher {
override fun patch(resources: List<HasMetadata>, value: String) : List<HasMetadata> {
return resources
......
......@@ -14,7 +14,7 @@ import org.yaml.snakeyaml.Yaml
class ConfigMapYamlPatcher(
private val fileName: String,
private val variableName: String
) : AbstractPatcher() {
) : AbstractStringPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource is ConfigMap) {
......
......@@ -18,7 +18,7 @@ class DataVolumeLoadGeneratorReplicaPatcher(
private val maxVolume: Int,
val container: String,
val variableName: String
) : AbstractPatcher() {
) : AbstractStringPatcher() {
private val envVarPatcher = EnvVarPatcher(container, variableName)
private val replicaPatcher = ReplicaPatcher()
......
......@@ -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 {
......
......@@ -3,14 +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() {
class ImagePatcher(private val container: String) : AbstractStringPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
if (resource is Deployment) {
......
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 {
if (resource.metadata.labels == null) {
......
......@@ -9,7 +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) {
......
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 {
resource.metadata.name = value
......
......@@ -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.
*/
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) {
......
......@@ -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()
......
......@@ -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
......
......@@ -21,11 +21,11 @@ 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(),
......
......@@ -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
}
......
......@@ -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
* be used to deploy the given deployment.
*/
class SchedulerNamePatcher : AbstractPatcher() {
class SchedulerNamePatcher : AbstractStringPatcher() {
override fun patchSingleResource(resource: HasMetadata, value: String): HasMetadata {
......
......@@ -3,7 +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) {
......
......@@ -9,7 +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) {
......
......@@ -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.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) {
......
......@@ -7,7 +7,7 @@ import io.quarkus.test.junit.QuarkusTest
import org.junit.jupiter.api.Test
@QuarkusTest
abstract class AbstractPatcherTest {
abstract class AbstractStringPatcherTest {
lateinit var resource: List<HasMetadata>
lateinit var patcher: Patcher
......
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