diff --git a/cluster-autoscaler/capacitybuffer/controller/controller.go b/cluster-autoscaler/capacitybuffer/controller/controller.go index 58ace97df16b..12268085aa72 100644 --- a/cluster-autoscaler/capacitybuffer/controller/controller.go +++ b/cluster-autoscaler/capacitybuffer/controller/controller.go @@ -51,7 +51,7 @@ type bufferController struct { strategyFilter filters.Filter translator translators.Translator quotaAllocator *resourceQuotaAllocator - updater updater.StatusUpdater + updater updater.BufferUpdater queue workqueue.TypedRateLimitingInterface[string] } @@ -60,7 +60,7 @@ func NewBufferController( client *cbclient.CapacityBufferClient, strategyFilter filters.Filter, translator translators.Translator, - updater updater.StatusUpdater, + updater updater.BufferUpdater, ) BufferController { bc := &bufferController{ client: client, @@ -93,7 +93,7 @@ func NewDefaultBufferController( }, ), quotaAllocator: newResourceQuotaAllocator(client), - updater: *updater.NewStatusUpdater(client), + updater: updater.NewStatusUpdater(client), queue: workqueue.NewTypedRateLimitingQueueWithConfig( workqueue.DefaultTypedControllerRateLimiter[string](), workqueue.TypedRateLimitingQueueConfig[string]{Name: "CapacityBuffers"}, ), @@ -307,7 +307,7 @@ func (c *bufferController) reconcileNamespace(namespace string) error { } // Update buffer status by calling API server - updateErrors := c.updater.Update(filteredBuffers) + _, updateErrors := c.updater.Update(filteredBuffers) for _, err := range updateErrors { runtime.HandleError(fmt.Errorf("capacity buffer controller error: %w", err)) } diff --git a/cluster-autoscaler/capacitybuffer/updater/status_updater.go b/cluster-autoscaler/capacitybuffer/updater/status_updater.go index 1c7df2b63367..5c1c5e87dca5 100644 --- a/cluster-autoscaler/capacitybuffer/updater/status_updater.go +++ b/cluster-autoscaler/capacitybuffer/updater/status_updater.go @@ -33,16 +33,19 @@ func NewStatusUpdater(client *cbclient.CapacityBufferClient) *StatusUpdater { } } -// Update updates the buffer status with pod capacity -func (u *StatusUpdater) Update(buffers []*v1.CapacityBuffer) []error { +// Update updates the buffer status and returns the updated buffers objects and list of errors +func (u *StatusUpdater) Update(buffers []*v1.CapacityBuffer) ([]*v1.CapacityBuffer, []error) { var errors []error + var updatedBuffers []*v1.CapacityBuffer for _, buffer := range buffers { - _, err := u.client.UpdateCapacityBuffer(buffer) + updatedBuffer, err := u.client.UpdateCapacityBuffer(buffer) if err != nil { errors = append(errors, err) + } else { + updatedBuffers = append(updatedBuffers, updatedBuffer) } } - return errors + return updatedBuffers, errors } // CleanUp cleans up the updater's internal structures. diff --git a/cluster-autoscaler/capacitybuffer/updater/status_updater_test.go b/cluster-autoscaler/capacitybuffer/updater/status_updater_test.go index 9fc4d0524d5a..e4555742bfd9 100644 --- a/cluster-autoscaler/capacitybuffer/updater/status_updater_test.go +++ b/cluster-autoscaler/capacitybuffer/updater/status_updater_test.go @@ -89,9 +89,10 @@ func TestStatusUpdater(t *testing.T) { }, ) buffersUpdater := NewStatusUpdater(fakeCapacityBuffersClient) - errors := buffersUpdater.Update(test.buffers) + updatedBuffers, errors := buffersUpdater.Update(test.buffers) assert.Equal(t, test.expectedNumberOfErrors, len(errors)) assert.Equal(t, test.expectedNumberOfCalls, updateCallsCount) + assert.Equal(t, len(test.buffers)-test.expectedNumberOfErrors, len(updatedBuffers)) }) } } diff --git a/cluster-autoscaler/capacitybuffer/updater/updater.go b/cluster-autoscaler/capacitybuffer/updater/updater.go new file mode 100644 index 000000000000..23b71c23624f --- /dev/null +++ b/cluster-autoscaler/capacitybuffer/updater/updater.go @@ -0,0 +1,27 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package updater + +import ( + v1 "k8s.io/autoscaler/cluster-autoscaler/apis/capacitybuffer/autoscaling.x-k8s.io/v1beta1" +) + +// BufferUpdater updates the passed buffers via API server call and returns the +// successfully updated buffers and list of errors +type BufferUpdater interface { + Update(buffers []*v1.CapacityBuffer) ([]*v1.CapacityBuffer, []error) +}