Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove deleted pending workloads from the cache so the visibility API results are correct #1679

Merged
merged 1 commit into from
Feb 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions pkg/controller/core/workload_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -403,9 +403,8 @@ func (r *WorkloadReconciler) Delete(e event.DeleteEvent) bool {

// Even if the state is unknown, the last cached state tells us whether the
// workload was in the queues and should be cleared from them.
if workload.HasQuotaReservation(wl) {
r.queues.DeleteWorkload(wl)
}
r.queues.DeleteWorkload(wl)

return true
}

Expand Down
57 changes: 57 additions & 0 deletions test/integration/controller/core/clusterqueue_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,63 @@ var _ = ginkgo.Describe("ClusterQueue controller", ginkgo.Ordered, ginkgo.Contin
util.ExpectReservingActiveWorkloadsMetric(clusterQueue, 0)
})

ginkgo.It("Should update status and report metrics when a pending workload is deleted", func() {
workload := testing.MakeWorkload("one", ns.Name).Queue(localQueue.Name).
Request(corev1.ResourceCPU, "5").Obj()

ginkgo.By("Creating a workload", func() {
gomega.Expect(k8sClient.Create(ctx, workload)).To(gomega.Succeed())
})

// Pending workloads count is incremented as the workload is inadmissible
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

non-blocking nit: I would prefer to turn the comment into ginkgo step. Maybe ginkgo.By("await until the pending workload count is incremented as the workload is inadmissible, because the ResourceFlavors don't exist"). This way the comment is also logged, which can make debugging easier.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. Actually I saw an existing comment and somehow decided to choose that style, but I would have chosen the ginkgo.By stanza otherwise. Let me know if you feel like it's worth I open a follow-up PR.

Copy link
Contributor

@mimowo mimowo Feb 5, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't notice the PR was approved actually, and thought you would have time to apply the remark.
I'm ok either way, as you feel.

// because ResourceFlavors don't exist.
gomega.Eventually(func() kueue.ClusterQueueStatus {
var updatedCq kueue.ClusterQueue
gomega.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterQueue), &updatedCq)).To(gomega.Succeed())
return updatedCq.Status
}, util.Timeout, util.Interval).Should(gomega.BeComparableTo(kueue.ClusterQueueStatus{
PendingWorkloads: 1,
FlavorsReservation: emptyUsedFlavors,
FlavorsUsage: emptyUsedFlavors,
Conditions: []metav1.Condition{
{
Type: kueue.ClusterQueueActive,
Status: metav1.ConditionFalse,
Reason: "FlavorNotFound",
Message: "Can't admit new workloads: FlavorNotFound",
},
},
}, ignoreConditionTimestamps, ignorePendingWorkloadsStatus))

util.ExpectPendingWorkloadsMetric(clusterQueue, 0, 1)
util.ExpectReservingActiveWorkloadsMetric(clusterQueue, 0)

ginkgo.By("Deleting the pending workload", func() {
gomega.Expect(k8sClient.Delete(ctx, workload)).To(gomega.Succeed())
})

// Pending workloads count is decrement as the deleted workload has been removed from the queue.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

non-blocking nit: same here - turn into ginkgo step

gomega.Eventually(func() kueue.ClusterQueueStatus {
var updatedCq kueue.ClusterQueue
gomega.Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(clusterQueue), &updatedCq)).To(gomega.Succeed())
return updatedCq.Status
}, util.Timeout, util.Interval).Should(gomega.BeComparableTo(kueue.ClusterQueueStatus{
PendingWorkloads: 0,
FlavorsReservation: emptyUsedFlavors,
FlavorsUsage: emptyUsedFlavors,
Conditions: []metav1.Condition{
{
Type: kueue.ClusterQueueActive,
Status: metav1.ConditionFalse,
Reason: "FlavorNotFound",
Message: "Can't admit new workloads: FlavorNotFound",
},
},
}, ignoreConditionTimestamps, ignorePendingWorkloadsStatus))
util.ExpectPendingWorkloadsMetric(clusterQueue, 0, 0)
util.ExpectReservingActiveWorkloadsMetric(clusterQueue, 0)
})

ginkgo.It("Should update status when workloads have reclaimable pods", func() {

ginkgo.By("Creating ResourceFlavors", func() {
Expand Down