@@ -266,10 +266,26 @@ public Proxy startContainer(Authentication user, Container initialContainer, Con
266266 .build ();
267267
268268 ResourceRequirementsBuilder resourceRequirementsBuilder = new ResourceRequirementsBuilder ();
269- resourceRequirementsBuilder .addToRequests ("cpu" , spec .getCpuRequest ().mapOrNull (Quantity ::new ));
270- resourceRequirementsBuilder .addToLimits ("cpu" , spec .getCpuLimit ().mapOrNull (Quantity ::new ));
271- resourceRequirementsBuilder .addToRequests ("memory" , spec .getMemoryRequest ().mapOrNull (Quantity ::new ));
272- resourceRequirementsBuilder .addToLimits ("memory" , spec .getMemoryLimit ().mapOrNull (Quantity ::new ));
269+ try {
270+ resourceRequirementsBuilder .addToRequests ("cpu" , parseCpuQuantity (spec .getCpuRequest ().getValueOrNull ()));
271+ } catch (IllegalArgumentException ex ) {
272+ throw new IllegalArgumentException ("Invalid container-cpu-request: " + ex .getMessage ());
273+ }
274+ try {
275+ resourceRequirementsBuilder .addToLimits ("cpu" , parseCpuQuantity (spec .getCpuLimit ().getValueOrNull ()));
276+ } catch (IllegalArgumentException ex ) {
277+ throw new IllegalArgumentException ("Invalid container-cpu-limit: " + ex .getMessage ());
278+ }
279+ try {
280+ resourceRequirementsBuilder .addToRequests ("memory" , parseMemoryQuantity (spec .getMemoryRequest ().getValueOrNull ()));
281+ } catch (IllegalArgumentException ex ) {
282+ throw new IllegalArgumentException ("Invalid container-memory-request: " + ex .getMessage ());
283+ }
284+ try {
285+ resourceRequirementsBuilder .addToLimits ("memory" , parseMemoryQuantity (spec .getMemoryLimit ().getValueOrNull ()));
286+ } catch (IllegalArgumentException ex ) {
287+ throw new IllegalArgumentException ("Invalid container-memory-limit: " + ex .getMessage ());
288+ }
273289
274290 List <ContainerPort > containerPorts = spec .getPortMapping ().stream ()
275291 .map (p -> new ContainerPortBuilder ().withContainerPort (p .getPort ()).build ())
@@ -932,4 +948,42 @@ private Optional<Pod> getPod(BackendContainerName podInfo) {
932948 return Optional .ofNullable (kubeClient .pods ().inNamespace (podInfo .getNamespace ()).withName (podInfo .getName ()).get ());
933949 }
934950
951+ private Quantity parseCpuQuantity (String value ) {
952+ if (value == null ) {
953+ return null ;
954+ }
955+ // convert upper case suffix automatically to a value accepted by k8s
956+ if (value .endsWith ("M" )) {
957+ value = value .substring (0 , value .length () - 1 ) + "m" ;
958+ }
959+ Quantity quantity = new Quantity (value );
960+ quantity .getNumericalAmount (); // validates the quantity
961+ if (!quantity .getFormat ().equals ("m" ) && !quantity .getFormat ().isEmpty ()) {
962+ throw new IllegalArgumentException ("Invalid format for CPU resources" );
963+ }
964+ return quantity ;
965+ }
966+
967+ private Quantity parseMemoryQuantity (String value ) {
968+ if (value == null ) {
969+ return null ;
970+ }
971+ // convert lower case suffixes automatically to a value accepted by k8s
972+ for (String suffix : List .of ("p" , "t" , "g" , "m" , "k" )) {
973+ if (value .endsWith (suffix )) {
974+ value = value .substring (0 , value .length () - 1 ) + suffix .toUpperCase ();
975+ break ;
976+ } else if (value .endsWith (suffix + "i" )) {
977+ value = value .substring (0 , value .length () - 2 ) + suffix .toUpperCase () + "i" ;
978+ break ;
979+ }
980+ }
981+ Quantity quantity = new Quantity (value );
982+ quantity .getNumericalAmount (); // validates the quantity
983+ if (quantity .getFormat ().equals ("m" ) || quantity .getFormat ().equals ("mi" ) || quantity .getFormat () == "" ) {
984+ throw new IllegalArgumentException ("Invalid format for memory resources" );
985+ }
986+ return quantity ;
987+ }
988+
935989}
0 commit comments