@@ -728,6 +728,13 @@ def _validate_plugin_instance_for_signature(self, signature: str, plugin_instanc
728728 f"{ DEEPLOY_ERRORS .REQUEST6 } . Plugin instance{ index_str } with signature '{ signature } ': 'CONTAINER_RESOURCES.cpu' is required."
729729 )
730730
731+ try :
732+ self ._parse_cpu_value (resources .get (DEEPLOY_RESOURCES .CPU ), default = None )
733+ except ValueError :
734+ raise ValueError (
735+ f"{ DEEPLOY_ERRORS .REQUEST6 } . Plugin instance{ index_str } with signature '{ signature } ': 'CONTAINER_RESOURCES.cpu' must be a number."
736+ )
737+
731738 if DEEPLOY_RESOURCES .MEMORY not in resources :
732739 raise ValueError (
733740 f"{ DEEPLOY_ERRORS .REQUEST6 } . Plugin instance{ index_str } with signature '{ signature } ': 'CONTAINER_RESOURCES.memory' is required."
@@ -1087,6 +1094,17 @@ def deeploy_get_auth_result(self, inputs):
10871094 }
10881095 return result
10891096
1097+ def _parse_cpu_value (self , value , default = None ):
1098+ """
1099+ Parse CPU value as float, allowing numeric strings.
1100+ """
1101+ if value is None :
1102+ return default
1103+ try :
1104+ return float (value )
1105+ except (TypeError , ValueError ):
1106+ raise ValueError (f"{ DEEPLOY_ERRORS .REQUEST6 } . 'CONTAINER_RESOURCES.cpu' must be a number." )
1107+
10901108 def _aggregate_container_resources (self , inputs ):
10911109 """
10921110 Aggregate container resources across all CONTAINER_APP_RUNNER plugin instances.
@@ -1110,11 +1128,17 @@ def _aggregate_container_resources(self, inputs):
11101128 self .Pd ("Using legacy format (app_params) for resource aggregation" )
11111129 app_params = inputs .get (DEEPLOY_KEYS .APP_PARAMS , {})
11121130 legacy_resources = app_params .get (DEEPLOY_RESOURCES .CONTAINER_RESOURCES , {})
1131+ if isinstance (legacy_resources , dict ):
1132+ legacy_resources = self .deepcopy (legacy_resources )
1133+ if DEEPLOY_RESOURCES .CPU in legacy_resources :
1134+ legacy_resources [DEEPLOY_RESOURCES .CPU ] = self ._parse_cpu_value (
1135+ legacy_resources .get (DEEPLOY_RESOURCES .CPU )
1136+ )
11131137 self .Pd (f"Legacy resources: { legacy_resources } " )
11141138 return legacy_resources
11151139
11161140 self .Pd (f"Processing { len (plugins_array )} plugin instances from plugins array" )
1117- total_cpu = 0
1141+ total_cpu = 0.0
11181142 total_memory_mb = 0
11191143
11201144 # Iterate through plugins array (simplified format - each object is an instance)
@@ -1125,7 +1149,7 @@ def _aggregate_container_resources(self, inputs):
11251149 # Only aggregate for CONTAINER_APP_RUNNER and WORKER_APP_RUNNER plugins
11261150 if signature in CONTAINERIZED_APPS_SIGNATURES :
11271151 resources = plugin_instance .get (DEEPLOY_RESOURCES .CONTAINER_RESOURCES , {})
1128- cpu = resources .get (DEEPLOY_RESOURCES .CPU , 0 )
1152+ cpu = self . _parse_cpu_value ( resources .get (DEEPLOY_RESOURCES .CPU , 0 ) )
11291153 memory = resources .get (DEEPLOY_RESOURCES .MEMORY , "0m" )
11301154
11311155 self .Pd (f" Container resources: cpu={ cpu } , memory={ memory } " )
0 commit comments