@@ -28,12 +28,16 @@ import eu.openanalytics.shinyproxyoperator.impl.kubernetes.getImagePullPolicy
2828import eu.openanalytics.shinyproxyoperator.impl.kubernetes.getParsedKubernetesPodTemplateSpecPatches
2929import eu.openanalytics.shinyproxyoperator.model.ShinyProxy
3030import eu.openanalytics.shinyproxyoperator.model.ShinyProxyInstance
31+ import eu.openanalytics.shinyproxyoperator.prettyMessage
3132import io.fabric8.kubernetes.api.model.Affinity
3233import io.fabric8.kubernetes.api.model.AffinityBuilder
3334import io.fabric8.kubernetes.api.model.ConfigMapVolumeSourceBuilder
3435import io.fabric8.kubernetes.api.model.EnvVarBuilder
3536import io.fabric8.kubernetes.api.model.PodTemplateSpec
3637import 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
3741import io.fabric8.kubernetes.api.model.VolumeBuilder
3842import 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