diff --git a/theodolite/src/main/kotlin/theodolite/k8s/K8sManager.kt b/theodolite/src/main/kotlin/theodolite/k8s/K8sManager.kt index abeb1c514d100fc3a12bd8f210e89d65eff9b2cf..389d5eefad556df502c218862e2f253ef8ad2100 100644 --- a/theodolite/src/main/kotlin/theodolite/k8s/K8sManager.kt +++ b/theodolite/src/main/kotlin/theodolite/k8s/K8sManager.kt @@ -46,8 +46,7 @@ class K8sManager(private val client: NamespacedKubernetesClient) { this.client.apps().deployments().delete(resource) ResourceByLabelHandler(client = client) .blockUntilPodsDeleted( - labelName = "app", - labelValue = resource.spec.selector.matchLabels["app"]!! + matchLabels = resource.spec.selector.matchLabels ) logger.info { "Deployment '${resource.metadata.name}' deleted." } } @@ -59,8 +58,7 @@ class K8sManager(private val client: NamespacedKubernetesClient) { this.client.apps().statefulSets().delete(resource) ResourceByLabelHandler(client = client) .blockUntilPodsDeleted( - labelName = "app", - labelValue = resource.spec.selector.matchLabels["app"]!! + matchLabels = resource.spec.selector.matchLabels ) logger.info { "StatefulSet '$resource.metadata.name' deleted." } } diff --git a/theodolite/src/main/kotlin/theodolite/k8s/ResourceByLabelHandler.kt b/theodolite/src/main/kotlin/theodolite/k8s/ResourceByLabelHandler.kt index 9f3754c54f4b1eeb018b55787974179647f726b6..28a72c8947bffe7b57203cacf2460d7080fa7b51 100644 --- a/theodolite/src/main/kotlin/theodolite/k8s/ResourceByLabelHandler.kt +++ b/theodolite/src/main/kotlin/theodolite/k8s/ResourceByLabelHandler.kt @@ -99,16 +99,16 @@ class ResourceByLabelHandler(private val client: NamespacedKubernetesClient) { * @param [labelName] the label name * @param [labelValue] the value of this label * */ - fun blockUntilPodsDeleted(labelName: String, labelValue: String) { + fun blockUntilPodsDeleted(matchLabels: MutableMap<String, String>) { while ( !this.client .pods() - .withLabel("$labelName=$labelValue") + .withLabels(matchLabels) .list() .items .isNullOrEmpty() ) { - logger.info { "Wait for pods with label $labelName=$labelValue to be deleted." } + logger.info { "Wait for pods with label ${matchLabels.toString()} to be deleted." } Thread.sleep(1000) } } diff --git a/theodolite/src/main/kotlin/theodolite/patcher/DataVolumeLoadGeneratorReplicaPatcher.kt b/theodolite/src/main/kotlin/theodolite/patcher/DataVolumeLoadGeneratorReplicaPatcher.kt new file mode 100644 index 0000000000000000000000000000000000000000..bdc107910edc8ddfb41e7757c775977086a25a26 --- /dev/null +++ b/theodolite/src/main/kotlin/theodolite/patcher/DataVolumeLoadGeneratorReplicaPatcher.kt @@ -0,0 +1,38 @@ +package theodolite.patcher + +import io.fabric8.kubernetes.api.model.KubernetesResource + +/** + * The DataVolumeLoadGeneratorReplicaPatcher takes the total load that should be generated + * and computes the number of instances needed for this load based on the `maxVolume` + * ((load + maxVolume - 1) / maxVolume) and calculates the load per instance + * (loadPerInstance = load / instances). + * The number of instances are set for the load generator and the given variable is set to the + * load per instance. + * + * @property k8sResource Kubernetes resource to be patched. + * @property maxVolume per load generator instance + * @property container Container to be patched. + * @property variableName Name of the environment variable to be patched. + */ +class DataVolumeLoadGeneratorReplicaPatcher( + k8sResource: KubernetesResource, + private val maxVolume: Int, + container: String, + variableName: String +) : AbstractPatcher(k8sResource) { + + private val replicaPatcher = ReplicaPatcher(k8sResource) + private val envVarPatcher = EnvVarPatcher(k8sResource, container, variableName) + + override fun <T> patch(value: T) { + // calculate number of load generator instances and load per instance + val load = Integer.parseInt(value.toString()) + val loadGenInstances = (load + maxVolume - 1) / maxVolume + val loadPerInstance = load / loadGenInstances + + // Patch instance values and load value of generators + replicaPatcher.patch(loadGenInstances.toString()) + envVarPatcher.patch(loadPerInstance.toString()) + } +} diff --git a/theodolite/src/main/kotlin/theodolite/patcher/PatcherFactory.kt b/theodolite/src/main/kotlin/theodolite/patcher/PatcherFactory.kt index 004963de8c89725f31dc26da6929b46b18471ac5..d89e1f0089ed43f76d69ce98cdb91c348d4aa451 100644 --- a/theodolite/src/main/kotlin/theodolite/patcher/PatcherFactory.kt +++ b/theodolite/src/main/kotlin/theodolite/patcher/PatcherFactory.kt @@ -48,6 +48,12 @@ class PatcherFactory { k8sResource = resource, loadGenMaxRecords = patcherDefinition.properties["loadGenMaxRecords"]!! ) + "DataVolumeLoadGeneratorReplicaPatcher" -> DataVolumeLoadGeneratorReplicaPatcher( + k8sResource = resource, + maxVolume = patcherDefinition.properties["maxVolume"]!!.toInt(), + container = patcherDefinition.properties["container"]!!, + variableName = patcherDefinition.properties["variableName"]!! + ) "EnvVarPatcher" -> EnvVarPatcher( k8sResource = resource, container = patcherDefinition.properties["container"]!!,