@@ -337,46 +337,84 @@ func GetVPAResourceStatusWithCurrent(vpa *apis.KatalystVerticalPodAutoscaler, po
337
337
return nil , nil , err
338
338
}
339
339
340
+ updateContainerResourcesCurrent := func (targetResourceNames map [consts.ContainerName ][]core.ResourceName ,
341
+ containerName consts.ContainerName ,
342
+ target core.ResourceList , current * core.ResourceList ,
343
+ specResource core.ResourceList ,
344
+ ) {
345
+ // if pod apply strategy is 'Pod', we not need update container current,
346
+ // because each pod has different recommendation.
347
+ if vpa .Spec .UpdatePolicy .PodApplyStrategy == apis .PodApplyStrategyStrategyPod {
348
+ * current = nil
349
+ return
350
+ }
351
+
352
+ _ , ok := targetResourceNames [containerName ]
353
+ if ! ok {
354
+ * current = target .DeepCopy ()
355
+ resourceNames := make ([]core.ResourceName , 0 , len (target ))
356
+ for resourceName := range target {
357
+ resourceNames = append (resourceNames , resourceName )
358
+ }
359
+ sort .SliceStable (resourceNames , func (i , j int ) bool {
360
+ return string (resourceNames [i ]) < string (resourceNames [j ])
361
+ })
362
+ targetResourceNames [containerName ] = resourceNames
363
+ }
364
+
365
+ specCurrent := cropResourcesWithBounds (specResource , nil , nil , targetResourceNames [containerName ])
366
+ if ! native .ResourcesEqual (target , specCurrent ) &&
367
+ (native .ResourcesEqual (target , * current ) ||
368
+ ! native .ResourcesLess (* current , specCurrent , targetResourceNames [containerName ])) {
369
+ * current = specCurrent
370
+ }
371
+ }
372
+
340
373
for containerName := range containerResources {
341
374
// get container resource current requests
342
375
if containerResources [containerName ].Requests != nil {
376
+ targetResourceNames := make (map [consts.ContainerName ][]core.ResourceName )
343
377
func (pods []* core.Pod ) {
344
378
for _ , pod := range pods {
345
379
for _ , container := range pod .Spec .Containers {
346
380
if container .Name != string (containerName ) {
347
381
continue
348
382
}
349
383
350
- containerResources [containerName ].Requests .Current = container .Resources .Requests
351
- // if some container current requests doesn't equal to target, return it immediately
352
- if ! native .ResourcesEqual (containerResources [containerName ].Requests .Target , container .Resources .Requests ) {
353
- return
354
- }
384
+ updateContainerResourcesCurrent (targetResourceNames , containerName , containerResources [containerName ].Requests .Target ,
385
+ & containerResources [containerName ].Requests .Current , container .Resources .Requests )
355
386
}
356
387
}
357
388
}(pods )
358
389
}
359
390
360
391
// get container resource current limits
361
392
if containerResources [containerName ].Limits != nil {
393
+ targetResourceNames := make (map [consts.ContainerName ][]core.ResourceName )
362
394
func (pods []* core.Pod ) {
363
395
for _ , pod := range pods {
364
396
for _ , container := range pod .Spec .Containers {
365
397
if container .Name != string (containerName ) {
366
398
continue
367
399
}
368
400
369
- containerResources [containerName ].Limits .Current = container .Resources .Limits
370
- // if some container current limits doesn't equal to target, return it immediately
371
- if ! native .ResourcesEqual (containerResources [containerName ].Limits .Target , container .Resources .Limits ) {
372
- return
373
- }
401
+ updateContainerResourcesCurrent (targetResourceNames , containerName , containerResources [containerName ].Limits .Target ,
402
+ & containerResources [containerName ].Limits .Current , container .Resources .Limits )
374
403
}
375
404
}
376
405
}(pods )
377
406
}
378
407
}
379
408
409
+ getPodContainerResourcesCurrent := func (target core.ResourceList , specResource core.ResourceList ) core.ResourceList {
410
+ resourceNames := make ([]core.ResourceName , 0 , len (target ))
411
+ for resourceName := range target {
412
+ resourceNames = append (resourceNames , resourceName )
413
+ }
414
+
415
+ return cropResourcesWithBounds (specResource , nil , nil , resourceNames )
416
+ }
417
+
380
418
for podContainerName := range podResources {
381
419
podName , containerName , err := native .ParsePodContainerName (podContainerName )
382
420
if err != nil {
@@ -396,7 +434,7 @@ func GetVPAResourceStatusWithCurrent(vpa *apis.KatalystVerticalPodAutoscaler, po
396
434
continue
397
435
}
398
436
399
- podResources [podContainerName ].Requests .Current = container .Resources .Requests
437
+ podResources [podContainerName ].Requests .Current = getPodContainerResourcesCurrent ( podResources [ podContainerName ]. Requests . Target , container .Resources .Requests )
400
438
return
401
439
}
402
440
}
@@ -415,7 +453,8 @@ func GetVPAResourceStatusWithCurrent(vpa *apis.KatalystVerticalPodAutoscaler, po
415
453
if container .Name != containerName {
416
454
continue
417
455
}
418
- podResources [podContainerName ].Limits .Current = container .Resources .Limits
456
+
457
+ podResources [podContainerName ].Limits .Current = getPodContainerResourcesCurrent (podResources [podContainerName ].Limits .Target , container .Resources .Limits )
419
458
return
420
459
}
421
460
}
0 commit comments