From 8e8488996e6760c21a6a6733ac8f5f8927cee514 Mon Sep 17 00:00:00 2001 From: Bryan Cox Date: Mon, 4 May 2026 20:10:13 -0400 Subject: [PATCH] fix(e2e): wait for Karpenter node cleanup in parallel tests to prevent vCPU flake testCapacityReservation and testNodeClassVersionField provision Karpenter nodes but only rely on t.Cleanup for deletion without waiting for nodes to fully terminate. When the sequential testBillingConsolidationAndPDB runs next and asserts AutoNode.VCPUs=0, stale NodeClaims from these parallel tests cause a 50% flake rate across all e2e-aws runs. Add explicit WaitForReadyNodesByLabels(..., 0, ...) calls after deleting workloads and NodePools, matching the pattern already used by testARM64Provisioning and testInstanceProfileAnnotation. Co-Authored-By: Claude Opus 4.6 --- test/e2e/karpenter_test.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/e2e/karpenter_test.go b/test/e2e/karpenter_test.go index 1d48f9326f5d..6ae58ea0031c 100644 --- a/test/e2e/karpenter_test.go +++ b/test/e2e/karpenter_test.go @@ -672,9 +672,11 @@ func testNodeClassVersionField(ctx context.Context, mgtClient, guestClient crcli instanceID, instance.MetadataOptions.HttpTokens, instance.MetadataOptions.HttpEndpoint, *instance.MetadataOptions.HttpPutResponseHopLimit) } - // Trigger cleanup; the t.Cleanup handles final deletion. + // Trigger cleanup and wait for nodes to fully terminate so stale + // NodeClaims don't leak vCPUs into subsequent sequential tests. g.Expect(guestClient.Delete(ctx, testWorkLoads)).To(Succeed()) g.Expect(guestClient.Delete(ctx, testNodePool)).To(Succeed()) + _ = e2eutil.WaitForReadyNodesByLabels(t, ctx, guestClient, hostedCluster.Spec.Platform.Type, 0, testNodeLabels) // Verify that a version exceeding the allowed n-3 skew sets SupportedVersionSkew=False. skewMajor, skewMinor, err := supportedversion.PreviousMinorVersion(cpVersion, 4) @@ -887,6 +889,12 @@ func testCapacityReservation(ctx context.Context, mgtClient, guestClient crclien g.Expect(aws.ToString(instance.CapacityReservationId)).To(Equal(crID), "instance %s should have been launched into capacity reservation %s", instanceID, crID) t.Logf("Instance %s correctly launched into capacity reservation %s", instanceID, crID) + + // Delete workload and NodePool, then wait for nodes to fully terminate + // so stale NodeClaims don't leak vCPUs into subsequent sequential tests. + g.Expect(guestClient.Delete(ctx, crWorkload)).To(Succeed()) + g.Expect(guestClient.Delete(ctx, crNodePool)).To(Succeed()) + _ = e2eutil.WaitForReadyNodesByLabels(t, ctx, guestClient, hostedCluster.Spec.Platform.Type, 0, crNodeLabels) } }