@@ -124,28 +124,65 @@ def kube_object_namespace_name(kube_object: KubeNamespacedObj) -> NamespaceName:
124124
125125
126126def aggregate_resources (
127- resource_type : Literal ["memory" , "cpu" ], containers : Collection [api .ContainerSpec ]
127+ resource_type : Literal ["memory" , "cpu" ], pods : Sequence [api .Pod ]
128128) -> section .Resources :
129- specified_requests = [
130- request
131- for c in containers
132- if (request := getattr (c .resources .requests , resource_type )) is not None
133- ]
134- specified_limits = [
135- limit
136- for c in containers
137- if (limit := getattr (c .resources .limits , resource_type )) is not None
138- ]
139-
140- count_total = len (containers )
129+ # requests
130+ total_request = 0.0 # sum of all requests (pod-level or container-level)
131+ count_unspecified_requests = 0 # containers without a request set
132+ count_total_requests = 0 # containers from pods using container-level requests
133+ count_pods_pod_level_request = 0 # pods with a non-zero pod-level request
134+
135+ # limits
136+ total_limit = 0.0 # sum of all limits (pod-level or container-level)
137+ count_unspecified_limits = 0 # containers without a limit set
138+ count_zeroed_limits = 0 # containers with limit==0 (unlimited)
139+ count_total_limits = 0 # containers from pods using container-level limits
140+ count_pods_pod_level_limit = 0 # pods with a non-zero pod-level limit
141+
142+ for pod in pods :
143+ pod_request = getattr (pod .spec .resources .requests , resource_type )
144+ pod_limit = getattr (pod .spec .resources .limits , resource_type )
145+ containers = pod .spec .containers
146+
147+ if pod_request is not None and pod_request : # also handles: 0 -> unlimited
148+ total_request += pod_request
149+ count_pods_pod_level_request += 1
150+ else :
151+ specified_requests = [
152+ request
153+ for c in containers
154+ if (request := getattr (c .resources .requests , resource_type )) is not None
155+ ]
156+ total_request += sum (specified_requests )
157+ count_unspecified_requests += len (containers ) - len (specified_requests )
158+ count_total_requests += len (containers )
159+
160+ if pod_limit is not None and pod_limit : # also handles: 0 -> unlimited
161+ total_limit += pod_limit
162+ count_pods_pod_level_limit += 1
163+ else :
164+ specified_limits = [
165+ limit
166+ for c in containers
167+ if (limit := getattr (c .resources .limits , resource_type )) is not None
168+ ]
169+ total_limit += sum (specified_limits )
170+ count_unspecified_limits += len (containers ) - len (specified_limits )
171+ count_zeroed_limits += sum (1 for x in specified_limits if x == 0 )
172+ count_total_limits += len (containers )
141173
142174 return section .Resources (
143- request = sum (specified_requests ),
144- limit = sum (specified_limits ),
145- count_unspecified_requests = count_total - len (specified_requests ),
146- count_unspecified_limits = count_total - len (specified_limits ),
147- count_zeroed_limits = sum (1 for x in specified_limits if x == 0 ),
148- count_total = count_total ,
175+ request = total_request ,
176+ limit = total_limit ,
177+ # requests
178+ count_unspecified_requests = count_unspecified_requests ,
179+ count_total_requests = count_total_requests ,
180+ count_pods_pod_level_request = count_pods_pod_level_request ,
181+ # limits
182+ count_unspecified_limits = count_unspecified_limits ,
183+ count_zeroed_limits = count_zeroed_limits ,
184+ count_total_limits = count_total_limits ,
185+ count_pods_pod_level_limit = count_pods_pod_level_limit ,
149186 )
150187
151188
@@ -161,11 +198,11 @@ def thin_containers(pods: Collection[api.Pod]) -> section.ThinContainers:
161198
162199
163200def collect_memory_resources_from_api_pods (pods : Sequence [api .Pod ]) -> section .Resources :
164- return aggregate_resources ("memory" , [ c for pod in pods for c in pod . spec . containers ] )
201+ return aggregate_resources ("memory" , pods )
165202
166203
167204def collect_cpu_resources_from_api_pods (pods : Sequence [api .Pod ]) -> section .Resources :
168- return aggregate_resources ("cpu" , [ c for pod in pods for c in pod . spec . containers ] )
205+ return aggregate_resources ("cpu" , pods )
169206
170207
171208def pod_resources_from_api_pods (pods : Sequence [api .Pod ]) -> section .PodResources :
0 commit comments