Skip to content

Commit aa28ca4

Browse files
committed
Fix #34841: add cpu and memory limit/request for k8s
1 parent aa7bb9f commit aa28ca4

1 file changed

Lines changed: 55 additions & 0 deletions

File tree

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/kubernetes/components/PodTemplateSpecFactory.kt

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,16 @@ import eu.openanalytics.shinyproxyoperator.impl.kubernetes.getImagePullPolicy
2828
import eu.openanalytics.shinyproxyoperator.impl.kubernetes.getParsedKubernetesPodTemplateSpecPatches
2929
import eu.openanalytics.shinyproxyoperator.model.ShinyProxy
3030
import eu.openanalytics.shinyproxyoperator.model.ShinyProxyInstance
31+
import eu.openanalytics.shinyproxyoperator.prettyMessage
3132
import io.fabric8.kubernetes.api.model.Affinity
3233
import io.fabric8.kubernetes.api.model.AffinityBuilder
3334
import io.fabric8.kubernetes.api.model.ConfigMapVolumeSourceBuilder
3435
import io.fabric8.kubernetes.api.model.EnvVarBuilder
3536
import io.fabric8.kubernetes.api.model.PodTemplateSpec
3637
import io.fabric8.kubernetes.api.model.PodTemplateSpecBuilder
38+
import io.fabric8.kubernetes.api.model.Quantity
39+
import io.fabric8.kubernetes.api.model.ResourceRequirements
40+
import io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder
3741
import io.fabric8.kubernetes.api.model.VolumeBuilder
3842
import io.fabric8.kubernetes.api.model.VolumeMountBuilder
3943

@@ -100,6 +104,7 @@ class PodTemplateSpecFactory(config: Config) {
100104
.withName("PROXY_VERSION")
101105
.withValue(version.toString())
102106
.build()))
107+
.withResources(createResources(shinyProxy))
103108
.withVolumeMounts(VolumeMountBuilder()
104109
.withName("config-volume")
105110
.withMountPath("/opt/shinyproxy/application.yml")
@@ -184,5 +189,55 @@ class PodTemplateSpecFactory(config: Config) {
184189
}
185190
}
186191

192+
private fun createResources(shinyProxy: ShinyProxy): ResourceRequirements? {
193+
val resourceBuilder = ResourceRequirementsBuilder()
194+
if (shinyProxy.memoryRequest != null) {
195+
try {
196+
resourceBuilder.addToRequests("memory", parseMemorQuantity(shinyProxy.memoryRequest!!))
197+
} catch (e: Exception) {
198+
throw RuntimeException("Invalid memoryRequest: " + e.prettyMessage(), e)
199+
}
200+
}
201+
if (shinyProxy.memoryLimit != null) {
202+
try {
203+
resourceBuilder.addToLimits("memory", parseMemorQuantity(shinyProxy.memoryLimit!!))
204+
} catch (e: Exception) {
205+
throw RuntimeException("Invalid memoryLimit: " + e.prettyMessage(), e)
206+
}
207+
}
208+
if (shinyProxy.cpuRequest != null) {
209+
try {
210+
resourceBuilder.addToRequests("cpu", parseCpuQuantity(shinyProxy.cpuRequest!!))
211+
} catch (e: Exception) {
212+
throw RuntimeException("Invalid cpuRequest: " + e.prettyMessage(), e)
213+
}
214+
}
215+
if (shinyProxy.cpuLimit != null) {
216+
try {
217+
resourceBuilder.addToLimits("cpu", parseCpuQuantity(shinyProxy.cpuLimit!!))
218+
} catch (e: Exception) {
219+
throw RuntimeException("Invalid cpuLimit: " + e.prettyMessage(), e)
220+
}
221+
}
222+
return resourceBuilder.build()
223+
}
224+
225+
private fun parseCpuQuantity(value: String): Quantity {
226+
val quantity = Quantity(value)
227+
quantity.numericalAmount // validates the quantity
228+
if (quantity.format != "m" && quantity.format != "") {
229+
throw RuntimeException("Invalid format for CPU resources")
230+
}
231+
return quantity
232+
}
233+
234+
private fun parseMemorQuantity(value: String): Quantity {
235+
val quantity = Quantity(value)
236+
quantity.numericalAmount // validates the quantity
237+
if (quantity.format == "m" || quantity.format == "") {
238+
throw RuntimeException("Invalid format for memory resources")
239+
}
240+
return quantity
241+
}
187242

188243
}

0 commit comments

Comments
 (0)