Skip to content

Commit c9161fb

Browse files
committed
feat: inject clock into StatusConditions calls via operatorpkg WithClock
Upgrades operatorpkg to v0.0.0-20260501204335-c49b4ca8d58d and karpenter to v1.12.1-0.20260527205500-924ddee92750 which support WithClock for status conditions. Updates EC2NodeClass.StatusConditions() to accept ...status.ForOption. Injects status.WithClock(clk) into all StatusConditions write calls in the nodeclass controller sub-reconcilers (ami, subnet, securitygroup, instanceprofile, placementgroup, capacityreservation, validation).
1 parent fe623d5 commit c9161fb

10 files changed

Lines changed: 65 additions & 39 deletions

File tree

pkg/controllers/nodeclass/ami.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ import (
2020
"sort"
2121
"time"
2222

23+
"github.com/awslabs/operatorpkg/status"
2324
"github.com/samber/lo"
2425
corev1 "k8s.io/api/core/v1"
26+
"k8s.io/utils/clock"
2527
"sigs.k8s.io/controller-runtime/pkg/log"
2628
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2729

@@ -34,12 +36,14 @@ import (
3436

3537
type AMI struct {
3638
amiProvider amifamily.Provider
39+
clk clock.Clock
3740
cm *pretty.ChangeMonitor
3841
}
3942

40-
func NewAMIReconciler(provider amifamily.Provider) *AMI {
43+
func NewAMIReconciler(clk clock.Clock, provider amifamily.Provider) *AMI {
4144
return &AMI{
4245
amiProvider: provider,
46+
clk: clk,
4347
cm: pretty.NewChangeMonitor(),
4448
}
4549
}
@@ -48,14 +52,14 @@ func (a *AMI) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClass) (reconc
4852
amis, err := a.amiProvider.List(ctx, nodeClass)
4953
if err != nil {
5054
if amifamily.IsAl2DeprecationError(err) || amifamily.IsWS2025UnsupportedVersionError(err) {
51-
nodeClass.StatusConditions().SetFalse(v1.ConditionTypeAMIsReady, "UnsupportedAlias", err.Error())
55+
nodeClass.StatusConditions(status.WithClock(a.clk)).SetFalse(v1.ConditionTypeAMIsReady, "UnsupportedAlias", err.Error())
5256
return reconcile.Result{}, reconcile.TerminalError(fmt.Errorf("getting amis, %w", err))
5357
}
5458
return reconcile.Result{}, fmt.Errorf("getting amis, %w", err)
5559
}
5660
if len(amis) == 0 {
5761
nodeClass.Status.AMIs = nil
58-
nodeClass.StatusConditions().SetFalse(v1.ConditionTypeAMIsReady, "AMINotFound", "AMISelector did not match any AMIs")
62+
nodeClass.StatusConditions(status.WithClock(a.clk)).SetFalse(v1.ConditionTypeAMIsReady, "AMINotFound", "AMISelector did not match any AMIs")
5963
// If users have omitted the necessary tags from their AMIs and later add them, we need to reprocess the information.
6064
// Returning 'ok' in this case means that the nodeclass will remain in an unready state until the component is restarted.
6165
return reconcile.Result{RequeueAfter: time.Minute}, nil
@@ -89,6 +93,6 @@ func (a *AMI) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClass) (reconc
8993
}
9094
})
9195

92-
nodeClass.StatusConditions().SetTrue(v1.ConditionTypeAMIsReady)
96+
nodeClass.StatusConditions(status.WithClock(a.clk)).SetTrue(v1.ConditionTypeAMIsReady)
9397
return reconcile.Result{RequeueAfter: 5 * time.Minute}, nil
9498
}

pkg/controllers/nodeclass/capacityreservation.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222

2323
ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
2424
"github.com/awslabs/operatorpkg/singleton"
25+
"github.com/awslabs/operatorpkg/status"
2526
"github.com/samber/lo"
2627
"go.uber.org/multierr"
2728
"k8s.io/utils/clock"
@@ -56,7 +57,7 @@ func (c *CapacityReservation) Reconcile(ctx context.Context, nc *v1.EC2NodeClass
5657
}
5758
if len(reservations) == 0 {
5859
nc.Status.CapacityReservations = nil
59-
nc.StatusConditions().SetTrue(v1.ConditionTypeCapacityReservationsReady)
60+
nc.StatusConditions(status.WithClock(c.clk)).SetTrue(v1.ConditionTypeCapacityReservationsReady)
6061
return reconcile.Result{RequeueAfter: capacityReservationPollPeriod}, nil
6162
}
6263

@@ -84,7 +85,7 @@ func (c *CapacityReservation) Reconcile(ctx context.Context, nc *v1.EC2NodeClass
8485
"total-count", len(reservations),
8586
).Error(multierr.Combine(errors...), "failed to parse discovered capacity reservations")
8687
}
87-
nc.StatusConditions().SetTrue(v1.ConditionTypeCapacityReservationsReady)
88+
nc.StatusConditions(status.WithClock(c.clk)).SetTrue(v1.ConditionTypeCapacityReservationsReady)
8889
return reconcile.Result{RequeueAfter: c.requeueAfter(reservations...)}, nil
8990
}
9091

pkg/controllers/nodeclass/controller.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func NewController(
9292
amiResolver amifamily.Resolver,
9393
disableDryRun bool,
9494
) *Controller {
95-
validation := NewValidationReconciler(kubeClient, cloudProvider, ec2api, amiResolver, instanceTypeProvider, launchTemplateProvider, validationCache, disableDryRun)
95+
validation := NewValidationReconciler(clk, kubeClient, cloudProvider, ec2api, amiResolver, instanceTypeProvider, launchTemplateProvider, validationCache, disableDryRun)
9696
return &Controller{
9797
kubeClient: kubeClient,
9898
recorder: recorder,
@@ -101,12 +101,12 @@ func NewController(
101101
instanceProfileProvider: instanceProfileProvider,
102102
validation: validation,
103103
reconcilers: []reconcile.TypedReconciler[*v1.EC2NodeClass]{
104-
NewAMIReconciler(amiProvider),
104+
NewAMIReconciler(clk, amiProvider),
105105
NewCapacityReservationReconciler(clk, capacityReservationProvider),
106-
NewPlacementGroupReconciler(placementGroupProvider),
107-
NewSubnetReconciler(subnetProvider),
108-
NewSecurityGroupReconciler(securityGroupProvider),
109-
NewInstanceProfileReconciler(instanceProfileProvider, region, recreationCache),
106+
NewPlacementGroupReconciler(clk, placementGroupProvider),
107+
NewSubnetReconciler(clk, subnetProvider),
108+
NewSecurityGroupReconciler(clk, securityGroupProvider),
109+
NewInstanceProfileReconciler(clk, instanceProfileProvider, region, recreationCache),
110110
validation,
111111
},
112112
}

pkg/controllers/nodeclass/instanceprofile.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ import (
1818
"context"
1919
"fmt"
2020

21+
"github.com/awslabs/operatorpkg/status"
2122
"github.com/patrickmn/go-cache"
2223
"github.com/samber/lo"
24+
"k8s.io/utils/clock"
2325
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2426

2527
v1 "github.com/aws/karpenter-provider-aws/pkg/apis/v1"
@@ -31,13 +33,15 @@ import (
3133
type InstanceProfile struct {
3234
instanceProfileProvider instanceprofile.Provider
3335
region string
36+
clk clock.Clock
3437
recreationCache *cache.Cache
3538
}
3639

37-
func NewInstanceProfileReconciler(instanceProfileProvider instanceprofile.Provider, region string, cache *cache.Cache) *InstanceProfile {
40+
func NewInstanceProfileReconciler(clk clock.Clock, instanceProfileProvider instanceprofile.Provider, region string, cache *cache.Cache) *InstanceProfile {
3841
return &InstanceProfile{
3942
instanceProfileProvider: instanceProfileProvider,
4043
region: region,
44+
clk: clk,
4145
recreationCache: cache,
4246
}
4347
}
@@ -114,6 +118,6 @@ func (ip *InstanceProfile) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeC
114118
ip.protectProfile(nodeClass.Status.InstanceProfile)
115119
nodeClass.Status.InstanceProfile = lo.FromPtr(nodeClass.Spec.InstanceProfile)
116120
}
117-
nodeClass.StatusConditions().SetTrue(v1.ConditionTypeInstanceProfileReady)
121+
nodeClass.StatusConditions(status.WithClock(ip.clk)).SetTrue(v1.ConditionTypeInstanceProfileReady)
118122
return reconcile.Result{}, nil
119123
}

pkg/controllers/nodeclass/placementgroup.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ import (
1919
"fmt"
2020

2121
"github.com/awslabs/operatorpkg/serrors"
22+
"github.com/awslabs/operatorpkg/status"
2223
"github.com/samber/lo"
24+
"k8s.io/utils/clock"
2325
"sigs.k8s.io/controller-runtime/pkg/log"
2426
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2527
"sigs.k8s.io/karpenter/pkg/utils/pretty"
@@ -30,12 +32,14 @@ import (
3032

3133
type PlacementGroupReconciler struct {
3234
provider placementgroup.Provider
35+
clk clock.Clock
3336
cm *pretty.ChangeMonitor
3437
}
3538

36-
func NewPlacementGroupReconciler(provider placementgroup.Provider) *PlacementGroupReconciler {
39+
func NewPlacementGroupReconciler(clk clock.Clock, provider placementgroup.Provider) *PlacementGroupReconciler {
3740
return &PlacementGroupReconciler{
3841
provider: provider,
42+
clk: clk,
3943
cm: pretty.NewChangeMonitor(),
4044
}
4145
}
@@ -49,14 +53,14 @@ func (p *PlacementGroupReconciler) Reconcile(ctx context.Context, nc *v1.EC2Node
4953
selector = lo.FromPtr(lo.CoalesceOrEmpty(term.Name, term.ID))
5054
}
5155
if err != nil {
52-
nc.StatusConditions().SetFalse(v1.ConditionTypePlacementGroupReady, "PlacementGroupResolutionFailed", "Failed to resolve placement group")
56+
nc.StatusConditions(status.WithClock(p.clk)).SetFalse(v1.ConditionTypePlacementGroupReady, "PlacementGroupResolutionFailed", "Failed to resolve placement group")
5357
return reconcile.Result{}, serrors.Wrap(fmt.Errorf("resolving placement group, %w", err), "placement-group", selector)
5458
}
5559
if pg == nil {
5660
if nc.Spec.PlacementGroupSelector != nil {
57-
nc.StatusConditions().SetFalse(v1.ConditionTypePlacementGroupReady, "PlacementGroupNotFound", fmt.Sprintf("Placement group %q not found", selector))
61+
nc.StatusConditions(status.WithClock(p.clk)).SetFalse(v1.ConditionTypePlacementGroupReady, "PlacementGroupNotFound", fmt.Sprintf("Placement group %q not found", selector))
5862
} else {
59-
nc.StatusConditions().SetTrue(v1.ConditionTypePlacementGroupReady)
63+
nc.StatusConditions(status.WithClock(p.clk)).SetTrue(v1.ConditionTypePlacementGroupReady)
6064
}
6165
return reconcile.Result{}, nil
6266
}
@@ -65,6 +69,6 @@ func (p *PlacementGroupReconciler) Reconcile(ctx context.Context, nc *v1.EC2Node
6569
log.FromContext(ctx).V(1).WithValues("id", pg.ID, "name", pg.Name, "strategy", pg.Strategy).Info("discovered placement group")
6670
}
6771

68-
nc.StatusConditions().SetTrue(v1.ConditionTypePlacementGroupReady)
72+
nc.StatusConditions(status.WithClock(p.clk)).SetTrue(v1.ConditionTypePlacementGroupReady)
6973
return reconcile.Result{}, nil
7074
}

pkg/controllers/nodeclass/securitygroup.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ import (
2121
"time"
2222

2323
ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
24+
"github.com/awslabs/operatorpkg/status"
2425
"github.com/samber/lo"
26+
"k8s.io/utils/clock"
2527
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2628

2729
v1 "github.com/aws/karpenter-provider-aws/pkg/apis/v1"
@@ -30,11 +32,13 @@ import (
3032

3133
type SecurityGroup struct {
3234
securityGroupProvider securitygroup.Provider
35+
clk clock.Clock
3336
}
3437

35-
func NewSecurityGroupReconciler(securityGroupProvider securitygroup.Provider) *SecurityGroup {
38+
func NewSecurityGroupReconciler(clk clock.Clock, securityGroupProvider securitygroup.Provider) *SecurityGroup {
3639
return &SecurityGroup{
3740
securityGroupProvider: securityGroupProvider,
41+
clk: clk,
3842
}
3943
}
4044

@@ -45,7 +49,7 @@ func (sg *SecurityGroup) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeCla
4549
}
4650
if len(securityGroups) == 0 && len(nodeClass.Spec.SecurityGroupSelectorTerms) > 0 {
4751
nodeClass.Status.SecurityGroups = nil
48-
nodeClass.StatusConditions().SetFalse(v1.ConditionTypeSecurityGroupsReady, "SecurityGroupsNotFound", "SecurityGroupSelector did not match any SecurityGroups")
52+
nodeClass.StatusConditions(status.WithClock(sg.clk)).SetFalse(v1.ConditionTypeSecurityGroupsReady, "SecurityGroupsNotFound", "SecurityGroupSelector did not match any SecurityGroups")
4953
// If users have omitted the necessary tags from their SecurityGroups and later add them, we need to reprocess the information.
5054
// Returning 'ok' in this case means that the nodeclass will remain in an unready state until the component is restarted.
5155
return reconcile.Result{RequeueAfter: time.Minute}, nil
@@ -59,6 +63,6 @@ func (sg *SecurityGroup) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeCla
5963
Name: *securityGroup.GroupName,
6064
}
6165
})
62-
nodeClass.StatusConditions().SetTrue(v1.ConditionTypeSecurityGroupsReady)
66+
nodeClass.StatusConditions(status.WithClock(sg.clk)).SetTrue(v1.ConditionTypeSecurityGroupsReady)
6367
return reconcile.Result{RequeueAfter: 5 * time.Minute}, nil
6468
}

pkg/controllers/nodeclass/subnet.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ import (
2121
"time"
2222

2323
ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types"
24+
"github.com/awslabs/operatorpkg/status"
2425
"github.com/samber/lo"
26+
"k8s.io/utils/clock"
2527
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2628

2729
v1 "github.com/aws/karpenter-provider-aws/pkg/apis/v1"
@@ -30,11 +32,13 @@ import (
3032

3133
type Subnet struct {
3234
subnetProvider subnet.Provider
35+
clk clock.Clock
3336
}
3437

35-
func NewSubnetReconciler(subnetProvider subnet.Provider) *Subnet {
38+
func NewSubnetReconciler(clk clock.Clock, subnetProvider subnet.Provider) *Subnet {
3639
return &Subnet{
3740
subnetProvider: subnetProvider,
41+
clk: clk,
3842
}
3943
}
4044

@@ -45,7 +49,7 @@ func (s *Subnet) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClass) (rec
4549
}
4650
if len(subnets) == 0 {
4751
nodeClass.Status.Subnets = nil
48-
nodeClass.StatusConditions().SetFalse(v1.ConditionTypeSubnetsReady, "SubnetsNotFound", "SubnetSelector did not match any Subnets")
52+
nodeClass.StatusConditions(status.WithClock(s.clk)).SetFalse(v1.ConditionTypeSubnetsReady, "SubnetsNotFound", "SubnetSelector did not match any Subnets")
4953
// If users have omitted the necessary tags from their Subnets and later add them, we need to reprocess the information.
5054
// Returning 'ok' in this case means that the nodeclass will remain in an unready state until the component is restarted.
5155
return reconcile.Result{RequeueAfter: time.Minute}, nil
@@ -63,6 +67,6 @@ func (s *Subnet) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClass) (rec
6367
ZoneID: *ec2subnet.AvailabilityZoneId,
6468
}
6569
})
66-
nodeClass.StatusConditions().SetTrue(v1.ConditionTypeSubnetsReady)
70+
nodeClass.StatusConditions(status.WithClock(s.clk)).SetTrue(v1.ConditionTypeSubnetsReady)
6771
return reconcile.Result{RequeueAfter: time.Minute}, nil
6872
}

pkg/controllers/nodeclass/validation.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ import (
2020
"strings"
2121
"time"
2222

23+
"github.com/awslabs/operatorpkg/status"
2324
"github.com/mitchellh/hashstructure/v2"
2425
"github.com/patrickmn/go-cache"
2526
"github.com/samber/lo"
27+
"k8s.io/utils/clock"
2628
"sigs.k8s.io/controller-runtime/pkg/client"
2729
"sigs.k8s.io/controller-runtime/pkg/log"
2830
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -79,10 +81,12 @@ type Validation struct {
7981
instanceTypeProvider instancetype.Provider
8082
launchTemplateProvider launchtemplate.Provider
8183
cache *cache.Cache
84+
clk clock.Clock
8285
dryRunDisabled bool
8386
}
8487

8588
func NewValidationReconciler(
89+
clk clock.Clock,
8690
kubeClient client.Client,
8791
cloudProvider cloudprovider.CloudProvider,
8892
ec2api sdk.EC2API,
@@ -100,6 +104,7 @@ func NewValidationReconciler(
100104
instanceTypeProvider: instanceTypeProvider,
101105
launchTemplateProvider: launchTemplateProvider,
102106
cache: cache,
107+
clk: clk,
103108
dryRunDisabled: dryRunDisabled,
104109
}
105110
}
@@ -114,7 +119,7 @@ func (v *Validation) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClass)
114119
if awserrors.IsServerError(err) {
115120
return reconcile.Result{Requeue: true}, nil
116121
}
117-
nodeClass.StatusConditions().SetFalse(
122+
nodeClass.StatusConditions(status.WithClock(v.clk)).SetFalse(
118123
v1.ConditionTypeValidationSucceeded,
119124
"ClusterCIDRResolutionFailed",
120125
"Failed to detect the cluster CIDR",
@@ -124,22 +129,22 @@ func (v *Validation) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClass)
124129
}
125130

126131
if _, ok := lo.Find(v.requiredConditions(), func(cond string) bool {
127-
return nodeClass.StatusConditions().Get(cond).IsFalse()
132+
return nodeClass.StatusConditions(status.WithClock(v.clk)).Get(cond).IsFalse()
128133
}); ok {
129134
// If any of the required status conditions are false, we know validation will fail regardless of the other values.
130-
nodeClass.StatusConditions().SetFalse(
135+
nodeClass.StatusConditions(status.WithClock(v.clk)).SetFalse(
131136
v1.ConditionTypeValidationSucceeded,
132137
ConditionReasonDependenciesNotReady,
133138
"Awaiting AMI, Instance Profile, Security Group, and Subnet resolution",
134139
)
135140
return reconcile.Result{RequeueAfter: requeueAfterTime}, nil
136141
}
137142
if _, ok := lo.Find(v.requiredConditions(), func(cond string) bool {
138-
return nodeClass.StatusConditions().Get(cond).IsUnknown()
143+
return nodeClass.StatusConditions(status.WithClock(v.clk)).Get(cond).IsUnknown()
139144
}); ok {
140145
// If none of the status conditions are false, but at least one is unknown, we should also consider the validation
141146
// state to be unknown. Once all required conditions collapse to a true or false state, we can test validation.
142-
nodeClass.StatusConditions().SetUnknownWithReason(
147+
nodeClass.StatusConditions(status.WithClock(v.clk)).SetUnknownWithReason(
143148
v1.ConditionTypeValidationSucceeded,
144149
ConditionReasonDependenciesNotReady,
145150
"Awaiting AMI, Instance Profile, Security Group, and Subnet resolution",
@@ -156,17 +161,17 @@ func (v *Validation) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClass)
156161
}
157162
tags, err := utils.GetTags(nodeClass, nodeClaim, options.FromContext(ctx).ClusterName)
158163
if err != nil {
159-
nodeClass.StatusConditions().SetFalse(v1.ConditionTypeValidationSucceeded, ConditionReasonTagValidationFailed, err.Error())
164+
nodeClass.StatusConditions(status.WithClock(v.clk)).SetFalse(v1.ConditionTypeValidationSucceeded, ConditionReasonTagValidationFailed, err.Error())
160165
return reconcile.Result{}, reconcile.TerminalError(fmt.Errorf("validating tags, %w", err))
161166
}
162167

163168
if val, ok := v.cache.Get(v.cacheKey(nodeClass, tags)); ok {
164169
// We still update the status condition even if it's cached since we may have had a conflict error previously
165170
entry := val.(validationCacheEntry)
166171
if entry.reason == "" {
167-
nodeClass.StatusConditions().SetTrue(v1.ConditionTypeValidationSucceeded)
172+
nodeClass.StatusConditions(status.WithClock(v.clk)).SetTrue(v1.ConditionTypeValidationSucceeded)
168173
} else {
169-
nodeClass.StatusConditions().SetFalse(
174+
nodeClass.StatusConditions(status.WithClock(v.clk)).SetFalse(
170175
v1.ConditionTypeValidationSucceeded,
171176
entry.reason,
172177
entry.message,
@@ -176,7 +181,7 @@ func (v *Validation) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClass)
176181
}
177182

178183
if v.dryRunDisabled {
179-
nodeClass.StatusConditions().SetTrue(v1.ConditionTypeValidationSucceeded)
184+
nodeClass.StatusConditions(status.WithClock(v.clk)).SetTrue(v1.ConditionTypeValidationSucceeded)
180185
v.cache.SetDefault(v.cacheKey(nodeClass, tags), validationCacheEntry{})
181186
return reconcile.Result{RequeueAfter: requeueAfterTime}, nil
182187
}
@@ -197,7 +202,7 @@ func (v *Validation) Reconcile(ctx context.Context, nodeClass *v1.EC2NodeClass)
197202
}
198203

199204
v.cache.SetDefault(v.cacheKey(nodeClass, tags), validationCacheEntry{})
200-
nodeClass.StatusConditions().SetTrue(v1.ConditionTypeValidationSucceeded)
205+
nodeClass.StatusConditions(status.WithClock(v.clk)).SetTrue(v1.ConditionTypeValidationSucceeded)
201206
return reconcile.Result{RequeueAfter: requeueAfterTime}, nil
202207
}
203208

@@ -207,7 +212,7 @@ func (v *Validation) updateCacheOnFailure(nodeClass *v1.EC2NodeClass, tags map[s
207212
reason: failureReason,
208213
message: message,
209214
})
210-
nodeClass.StatusConditions().SetFalse(
215+
nodeClass.StatusConditions(status.WithClock(v.clk)).SetFalse(
211216
v1.ConditionTypeValidationSucceeded,
212217
failureReason,
213218
message,

0 commit comments

Comments
 (0)