Skip to content

Commit 686a2c2

Browse files
committed
Expose drifted nodeclaim condition status to printer column output
Signed-off-by: Cameron McAvoy <[email protected]>
1 parent db4938c commit 686a2c2

File tree

6 files changed

+38
-20
lines changed

6 files changed

+38
-20
lines changed

kwok/charts/crds/karpenter.sh_nodeclaims.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ spec:
3232
- jsonPath: .status.conditions[?(@.type=="Ready")].status
3333
name: Ready
3434
type: string
35+
- jsonPath: .status.conditions[?(@.type=="Drifted")].status
36+
name: Drifted
37+
type: string
3538
- jsonPath: .metadata.creationTimestamp
3639
name: Age
3740
type: date

pkg/apis/crds/karpenter.sh_nodeclaims.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ spec:
3232
- jsonPath: .status.conditions[?(@.type=="Ready")].status
3333
name: Ready
3434
type: string
35+
- jsonPath: .status.conditions[?(@.type=="Drifted")].status
36+
name: Drifted
37+
type: string
3538
- jsonPath: .metadata.creationTimestamp
3639
name: Age
3740
type: date

pkg/apis/v1/nodeclaim.go

+1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ type Provider = runtime.RawExtension
132132
// +kubebuilder:printcolumn:name="Zone",type="string",JSONPath=".metadata.labels.topology\\.kubernetes\\.io/zone",description=""
133133
// +kubebuilder:printcolumn:name="Node",type="string",JSONPath=".status.nodeName",description=""
134134
// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.conditions[?(@.type==\"Ready\")].status",description=""
135+
// +kubebuilder:printcolumn:name="Drifted",type="string",JSONPath=".status.conditions[?(@.type==\"Drifted\")].status",description=""
135136
// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp",description=""
136137
// +kubebuilder:printcolumn:name="ImageID",type="string",JSONPath=".status.imageID",priority=1,description=""
137138
// +kubebuilder:printcolumn:name="ID",type="string",JSONPath=".status.providerID",priority=1,description=""

pkg/controllers/nodeclaim/disruption/drift.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,13 @@ type Drift struct {
4444
}
4545

4646
func (d *Drift) Reconcile(ctx context.Context, nodePool *v1.NodePool, nodeClaim *v1.NodeClaim) (reconcile.Result, error) {
47-
hasDriftedCondition := nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted) != nil
47+
hasDriftedCondition := nodeClaim.StatusConditions().IsTrue(v1.ConditionTypeDrifted)
4848

49+
// Prefer to set the Drifted condition to false instead of clearing for the printer column output.
4950
// From here there are three scenarios to handle:
50-
// 1. If NodeClaim is not launched, remove the drift status condition
51+
// 1. If NodeClaim is not launched, set the drift status condition false
5152
if !nodeClaim.StatusConditions().Get(v1.ConditionTypeLaunched).IsTrue() {
52-
_ = nodeClaim.StatusConditions().Clear(v1.ConditionTypeDrifted)
53+
_ = nodeClaim.StatusConditions().SetFalse(v1.ConditionTypeDrifted, v1.ConditionTypeDrifted, "")
5354
if hasDriftedCondition {
5455
log.FromContext(ctx).V(1).Info("removing drift status condition, isn't launched")
5556
}
@@ -59,10 +60,10 @@ func (d *Drift) Reconcile(ctx context.Context, nodePool *v1.NodePool, nodeClaim
5960
if err != nil {
6061
return reconcile.Result{}, cloudprovider.IgnoreNodeClaimNotFoundError(fmt.Errorf("getting drift, %w", err))
6162
}
62-
// 2. Otherwise, if the NodeClaim isn't drifted, but has the status condition, remove it.
63+
// 2. Otherwise, if the NodeClaim isn't drifted, but has the status condition, unset it
6364
if driftedReason == "" {
65+
_ = nodeClaim.StatusConditions().SetFalse(v1.ConditionTypeDrifted, v1.ConditionTypeDrifted, "")
6466
if hasDriftedCondition {
65-
_ = nodeClaim.StatusConditions().Clear(v1.ConditionTypeDrifted)
6667
log.FromContext(ctx).V(1).Info("removing drifted status condition, not drifted")
6768
}
6869
return reconcile.Result{RequeueAfter: 5 * time.Minute}, nil

pkg/controllers/nodeclaim/disruption/drift_test.go

+24-14
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ var _ = Describe("Drift", func() {
170170
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
171171

172172
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
173-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
173+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
174174
})
175175
It("should remove the status condition from the nodeClaim when the nodeClaim launch condition is false", func() {
176176
cp.Drifted = "drifted"
@@ -182,15 +182,15 @@ var _ = Describe("Drift", func() {
182182
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
183183

184184
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
185-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
185+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
186186
})
187187
It("should not detect drift if the nodePool does not exist", func() {
188188
cp.Drifted = "drifted"
189189
ExpectApplied(ctx, env.Client, nodeClaim)
190190
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
191191

192192
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
193-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
193+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
194194
})
195195
It("should remove the status condition from the nodeClaim if the nodeClaim is no longer drifted", func() {
196196
nodeClaim.StatusConditions().SetTrue(v1.ConditionTypeDrifted)
@@ -199,7 +199,17 @@ var _ = Describe("Drift", func() {
199199
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
200200

201201
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
202-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
202+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
203+
})
204+
It("should set the drifted condition to false if unset after reconcile", func() {
205+
cp.Drifted = ""
206+
_ = nodeClaim.StatusConditions().Clear(v1.ConditionTypeDrifted)
207+
ExpectApplied(ctx, env.Client, nodePool, nodeClaim)
208+
209+
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
210+
211+
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
212+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
203213
})
204214
Context("NodeRequirement Drift", func() {
205215
DescribeTable("",
@@ -210,7 +220,7 @@ var _ = Describe("Drift", func() {
210220
ExpectApplied(ctx, env.Client, nodePool, nodeClaim)
211221
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
212222
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
213-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
223+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
214224

215225
nodePool.Spec.Template.Spec.Requirements = newNodePoolReq
216226
ExpectApplied(ctx, env.Client, nodePool)
@@ -219,7 +229,7 @@ var _ = Describe("Drift", func() {
219229
if drifted {
220230
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeTrue())
221231
} else {
222-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
232+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
223233
}
224234
},
225235
Entry(
@@ -384,8 +394,8 @@ var _ = Describe("Drift", func() {
384394
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaimTwo)
385395
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
386396
nodeClaimTwo = ExpectExists(ctx, env.Client, nodeClaimTwo)
387-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
388-
Expect(nodeClaimTwo.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
397+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
398+
Expect(nodeClaimTwo.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
389399

390400
// Removed Windows OS
391401
nodePool.Spec.Template.Spec.Requirements = []v1.NodeSelectorRequirementWithMinValues{
@@ -396,7 +406,7 @@ var _ = Describe("Drift", func() {
396406

397407
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
398408
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
399-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
409+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
400410

401411
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaimTwo)
402412
nodeClaimTwo = ExpectExists(ctx, env.Client, nodeClaimTwo)
@@ -457,7 +467,7 @@ var _ = Describe("Drift", func() {
457467
ExpectObjectReconciled(ctx, env.Client, nodePoolController, nodePool)
458468
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
459469
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
460-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
470+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
461471

462472
nodePool = ExpectExists(ctx, env.Client, nodePool)
463473
Expect(mergo.Merge(nodePool, changes, mergo.WithOverride)).To(Succeed())
@@ -481,7 +491,7 @@ var _ = Describe("Drift", func() {
481491
ExpectApplied(ctx, env.Client, nodePool, nodeClaim)
482492
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
483493
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
484-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
494+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
485495
})
486496
It("should not return drifted if karpenter.sh/nodepool-hash annotation is not present on the NodeClaim", func() {
487497
nodeClaim.ObjectMeta.Annotations = map[string]string{
@@ -490,7 +500,7 @@ var _ = Describe("Drift", func() {
490500
ExpectApplied(ctx, env.Client, nodePool, nodeClaim)
491501
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
492502
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
493-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
503+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
494504
})
495505
It("should not return drifted if the NodeClaim's karpenter.sh/nodepool-hash-version annotation does not match the NodePool's", func() {
496506
nodePool.ObjectMeta.Annotations = map[string]string{
@@ -504,7 +514,7 @@ var _ = Describe("Drift", func() {
504514
ExpectApplied(ctx, env.Client, nodePool, nodeClaim)
505515
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
506516
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
507-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
517+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
508518
})
509519
It("should not return drifted if karpenter.sh/nodepool-hash-version annotation is not present on the NodeClaim", func() {
510520
nodeClaim.ObjectMeta.Annotations = map[string]string{
@@ -513,7 +523,7 @@ var _ = Describe("Drift", func() {
513523
ExpectApplied(ctx, env.Client, nodePool, nodeClaim)
514524
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
515525
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
516-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
526+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
517527
})
518528
})
519529
})

pkg/controllers/nodeclaim/disruption/suite_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ var _ = Describe("Disruption", func() {
152152
ExpectObjectReconciled(ctx, env.Client, nodeClaimDisruptionController, nodeClaim)
153153

154154
nodeClaim = ExpectExists(ctx, env.Client, nodeClaim)
155-
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted)).To(BeNil())
155+
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeDrifted).IsTrue()).To(BeFalse())
156156
Expect(nodeClaim.StatusConditions().Get(v1.ConditionTypeConsolidatable)).To(BeNil())
157157
})
158158
})

0 commit comments

Comments
 (0)