diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/patcher/ResourceLimitPatcher.kt b/theodolite-quarkus/src/main/kotlin/theodolite/patcher/ResourceLimitPatcher.kt index 752e4703bd7e2338cc04de210b6639aa5278ffa9..533489a44457ba7452f3d0ca1eb88eb6f3ada7d9 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/patcher/ResourceLimitPatcher.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/patcher/ResourceLimitPatcher.kt @@ -1,10 +1,12 @@ package theodolite.patcher +import io.fabric8.kubernetes.api.model.Container import io.fabric8.kubernetes.api.model.KubernetesResource import io.fabric8.kubernetes.api.model.Quantity import io.fabric8.kubernetes.api.model.ResourceRequirements import io.fabric8.kubernetes.api.model.apps.Deployment -import javax.validation.constraints.Null +import io.fabric8.kubernetes.api.model.apps.StatefulSet +import java.lang.IllegalArgumentException class ResourceLimitPatcher( private val k8sResource: KubernetesResource, @@ -13,25 +15,39 @@ class ResourceLimitPatcher( ) : AbstractPatcher(k8sResource, container, limitedResource) { override fun <String> patch(value: String) { - if (k8sResource is Deployment) { - k8sResource.spec.template.spec.containers.filter { it.name == container }.forEach { - when { - it.resources == null -> { - val resource = ResourceRequirements() - resource.limits = mapOf(limitedResource to Quantity(value as kotlin.String)) - it.resources = resource - } - it.resources.limits.isEmpty() -> { - it.resources.limits = mapOf(limitedResource to Quantity(value as kotlin.String)) - } - else -> { - val values = mutableMapOf<kotlin.String, Quantity>() - it.resources.limits.forEach { entry -> values[entry.key] = entry.value } - values[limitedResource] = Quantity(value as kotlin.String) - it.resources.limits = values - } + when (k8sResource) { + is Deployment -> { + k8sResource.spec.template.spec.containers.filter { it.name == container }.forEach { + setLimits(it, value as kotlin.String) } } + is StatefulSet -> { + k8sResource.spec.template.spec.containers.filter { it.name == container }.forEach { + setLimits(it, value as kotlin.String) + } + } + else -> { + throw IllegalArgumentException("ResourceLimitPatcher not applicable for $k8sResource") + } + } + } + + private fun setLimits(container: Container, value: String) { + when { + container.resources == null -> { + val resource = ResourceRequirements() + resource.limits = mapOf(limitedResource to Quantity(value)) + container.resources = resource + } + container.resources.limits.isEmpty() -> { + container.resources.limits = mapOf(limitedResource to Quantity(value)) + } + else -> { + val values = mutableMapOf<String, Quantity>() + container.resources.limits.forEach { entry -> values[entry.key] = entry.value } + values[limitedResource] = Quantity(value) + container.resources.limits = values + } } } } diff --git a/theodolite-quarkus/src/main/kotlin/theodolite/patcher/ResourceRequestPatcher.kt b/theodolite-quarkus/src/main/kotlin/theodolite/patcher/ResourceRequestPatcher.kt index 865d350bbe484f1bb4b2ffa733ba1761c47376ea..39e8fafb513a60e8a8cd445227160025fe6d8c42 100644 --- a/theodolite-quarkus/src/main/kotlin/theodolite/patcher/ResourceRequestPatcher.kt +++ b/theodolite-quarkus/src/main/kotlin/theodolite/patcher/ResourceRequestPatcher.kt @@ -1,9 +1,12 @@ package theodolite.patcher +import io.fabric8.kubernetes.api.model.Container import io.fabric8.kubernetes.api.model.KubernetesResource import io.fabric8.kubernetes.api.model.Quantity import io.fabric8.kubernetes.api.model.ResourceRequirements import io.fabric8.kubernetes.api.model.apps.Deployment +import io.fabric8.kubernetes.api.model.apps.StatefulSet +import java.lang.IllegalArgumentException class ResourceRequestPatcher( private val k8sResource: KubernetesResource, @@ -12,25 +15,39 @@ class ResourceRequestPatcher( ) : AbstractPatcher(k8sResource, container, requestedResource) { override fun <String> patch(value: String) { - if (k8sResource is Deployment) { - k8sResource.spec.template.spec.containers.filter { it.name == container }.forEach { - when { - it.resources == null -> { - val resource = ResourceRequirements() - resource.requests = mapOf(requestedResource to Quantity(value as kotlin.String)) - it.resources = resource - } - it.resources.requests.isEmpty() -> { - it.resources.requests = mapOf(requestedResource to Quantity(value as kotlin.String)) - } - else -> { - val values = mutableMapOf<kotlin.String, Quantity>() - it.resources.requests.forEach { entry -> values[entry.key] = entry.value } - values[requestedResource] = Quantity(value as kotlin.String) - it.resources.requests = values - } + when (k8sResource) { + is Deployment -> { + k8sResource.spec.template.spec.containers.filter { it.name == container }.forEach { + setRequests(it, value as kotlin.String) } } + is StatefulSet -> { + k8sResource.spec.template.spec.containers.filter { it.name == container }.forEach { + setRequests(it, value as kotlin.String) + } + } + else -> { + throw IllegalArgumentException("ResourceRequestPatcher not applicable for $k8sResource") + } + } + } + + private fun setRequests(container: Container, value: String) { + when { + container.resources == null -> { + val resource = ResourceRequirements() + resource.requests = mapOf(requestedResource to Quantity(value)) + container.resources = resource + } + container.resources.requests.isEmpty() -> { + container.resources.requests = mapOf(requestedResource to Quantity(value)) + } + else -> { + val values = mutableMapOf<String, Quantity>() + container.resources.requests.forEach { entry -> values[entry.key] = entry.value } + values[requestedResource] = Quantity(value) + container.resources.requests = values + } } } }