Skip to content

Commit fb3e267

Browse files
committed
cvo: refactor always enabled caps processing
Refactor the code to be consistent with how the other options are processed. The `NewControllerContext` is a method on `Options` struct, so it does not make sense to pass it some options through the struct, and some options through method parameters. I went further and separated the validation (performed with all other validation) from conversion, resulting in two smaller methods instead one larger one. The result is slightly less efficient but more readable.
1 parent 74e9a47 commit fb3e267

File tree

2 files changed

+35
-42
lines changed

2 files changed

+35
-42
lines changed

pkg/start/start.go

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2020
"k8s.io/apimachinery/pkg/fields"
2121
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
22+
"k8s.io/apimachinery/pkg/util/sets"
2223
"k8s.io/apimachinery/pkg/util/wait"
2324
"k8s.io/client-go/informers"
2425
"k8s.io/client-go/kubernetes"
@@ -159,6 +160,10 @@ func (o *Options) ValidateAndComplete() error {
159160
o.PromQLTarget.URL = parsed
160161
}
161162

163+
if err := validateCapabilities(o.AlwaysEnableCapabilities); err != nil {
164+
return fmt.Errorf("--always-enable-capabilities: %w", err)
165+
}
166+
162167
return nil
163168
}
164169

@@ -169,10 +174,6 @@ func (o *Options) Run(ctx context.Context) error {
169174
if len(o.Exclude) > 0 {
170175
klog.Infof("Excluding manifests for %q", o.Exclude)
171176
}
172-
alwaysEnableCaps, unknownCaps := parseAlwaysEnableCapabilities(o.AlwaysEnableCapabilities)
173-
if len(unknownCaps) > 0 {
174-
return fmt.Errorf("--always-enable-capabilities was set with unknown capabilities: %v", unknownCaps)
175-
}
176177

177178
// Inject the cluster ID into PromQL queries in HyperShift
178179
o.InjectClusterIdIntoPromQL = o.HyperShift
@@ -189,7 +190,7 @@ func (o *Options) Run(ctx context.Context) error {
189190
}
190191

191192
// initialize the controllers and attempt to load the payload information
192-
controllerCtx, err := o.NewControllerContext(cb, alwaysEnableCaps)
193+
controllerCtx, err := o.NewControllerContext(cb)
193194
if err != nil {
194195
return err
195196
}
@@ -472,9 +473,17 @@ type Context struct {
472473
fgLister configlistersv1.FeatureGateLister
473474
}
474475

476+
func stringsToCapabilities(caps []string) []configv1.ClusterVersionCapability {
477+
alwaysEnableCapabilities := make([]configv1.ClusterVersionCapability, 0, len(caps))
478+
for _, c := range caps {
479+
alwaysEnableCapabilities = append(alwaysEnableCapabilities, configv1.ClusterVersionCapability(c))
480+
}
481+
return alwaysEnableCapabilities
482+
}
483+
475484
// NewControllerContext initializes the default Context for the current Options. It does
476485
// not start any background processes.
477-
func (o *Options) NewControllerContext(cb *ClientBuilder, alwaysEnableCapabilities []configv1.ClusterVersionCapability) (*Context, error) {
486+
func (o *Options) NewControllerContext(cb *ClientBuilder) (*Context, error) {
478487
client := cb.ClientOrDie("shared-informer")
479488
kubeClient := cb.KubeClientOrDie(internal.ConfigNamespace, useProtobuf)
480489
operatorClient := cb.OperatorClientOrDie("operator-client")
@@ -494,6 +503,7 @@ func (o *Options) NewControllerContext(cb *ClientBuilder, alwaysEnableCapabiliti
494503

495504
cvoKubeClient := cb.KubeClientOrDie(o.Namespace, useProtobuf)
496505
o.PromQLTarget.KubeClient = cvoKubeClient
506+
497507
cvo, err := cvo.New(
498508
o.NodeName,
499509
o.Namespace, o.Name,
@@ -515,7 +525,7 @@ func (o *Options) NewControllerContext(cb *ClientBuilder, alwaysEnableCapabiliti
515525
o.PromQLTarget,
516526
o.InjectClusterIdIntoPromQL,
517527
o.UpdateService,
518-
alwaysEnableCapabilities,
528+
stringsToCapabilities(o.AlwaysEnableCapabilities),
519529
)
520530
if err != nil {
521531
return nil, err
@@ -622,25 +632,14 @@ func (c *Context) InitializeFromPayload(ctx context.Context, restConfig *rest.Co
622632
return nil
623633
}
624634

625-
// parseAlwaysEnableCapabilities parses the string list of capabilities
626-
// into two lists of configv1.ClusterVersionCapability: known and unknown.
627-
func parseAlwaysEnableCapabilities(caps []string) ([]configv1.ClusterVersionCapability, []configv1.ClusterVersionCapability) {
628-
var (
629-
knownCaps []configv1.ClusterVersionCapability
630-
unknownCaps []configv1.ClusterVersionCapability
631-
)
632-
for _, c := range caps {
633-
known := false
634-
for _, kc := range configv1.KnownClusterVersionCapabilities {
635-
if configv1.ClusterVersionCapability(c) == kc {
636-
knownCaps = append(knownCaps, kc)
637-
known = true
638-
break
639-
}
640-
}
641-
if !known {
642-
unknownCaps = append(unknownCaps, configv1.ClusterVersionCapability(c))
643-
}
635+
func validateCapabilities(caps []string) error {
636+
unknown := sets.New(caps...)
637+
for _, kc := range configv1.KnownClusterVersionCapabilities {
638+
unknown.Delete(string(kc))
639+
}
640+
641+
if len(unknown) > 0 {
642+
return fmt.Errorf("unknown capabilities: %s", sets.List(unknown))
644643
}
645-
return knownCaps, unknownCaps
644+
return nil
646645
}

pkg/start/start_integration_test.go

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -184,15 +184,13 @@ func TestIntegrationCVO_initializeAndUpgrade(t *testing.T) {
184184
options.ReleaseImage = payloadImage1
185185
options.PayloadOverride = filepath.Join(dir, "0.0.1")
186186
options.leaderElection = getLeaderElectionConfig(ctx, cfg)
187-
alwaysEnableCapabilities := []configv1.ClusterVersionCapability{
188-
configv1.ClusterVersionCapabilityIngress,
189-
}
190-
controllers, err := options.NewControllerContext(cb, alwaysEnableCapabilities)
187+
options.AlwaysEnableCapabilities = []string{string(configv1.ClusterVersionCapabilityIngress)}
188+
controllers, err := options.NewControllerContext(cb)
191189
if err != nil {
192190
t.Fatal(err)
193191
}
194192

195-
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil, nil), 5*time.Second, wait.Backoff{Steps: 3}, "", "", record.NewFakeRecorder(100), payload.DefaultClusterProfile, alwaysEnableCapabilities)
193+
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil, nil), 5*time.Second, wait.Backoff{Steps: 3}, "", "", record.NewFakeRecorder(100), payload.DefaultClusterProfile, stringsToCapabilities(options.AlwaysEnableCapabilities))
196194
controllers.CVO.SetSyncWorkerForTesting(worker)
197195

198196
lock, err := createResourceLock(cb, options.Namespace, options.Name)
@@ -318,15 +316,13 @@ func TestIntegrationCVO_gracefulStepDown(t *testing.T) {
318316
options.ReleaseImage = payloadImage1
319317
options.PayloadOverride = filepath.Join(dir, "0.0.1")
320318
options.leaderElection = getLeaderElectionConfig(ctx, cfg)
321-
alwaysEnableCapabilities := []configv1.ClusterVersionCapability{
322-
configv1.ClusterVersionCapabilityIngress,
323-
}
324-
controllers, err := options.NewControllerContext(cb, alwaysEnableCapabilities)
319+
options.AlwaysEnableCapabilities = []string{string(configv1.ClusterVersionCapabilityIngress)}
320+
controllers, err := options.NewControllerContext(cb)
325321
if err != nil {
326322
t.Fatal(err)
327323
}
328324

329-
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil, nil), 5*time.Second, wait.Backoff{Steps: 3}, "", "", record.NewFakeRecorder(100), payload.DefaultClusterProfile, alwaysEnableCapabilities)
325+
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil, nil), 5*time.Second, wait.Backoff{Steps: 3}, "", "", record.NewFakeRecorder(100), payload.DefaultClusterProfile, stringsToCapabilities(options.AlwaysEnableCapabilities))
330326
controllers.CVO.SetSyncWorkerForTesting(worker)
331327

332328
lock, err := createResourceLock(cb, options.Namespace, options.Name)
@@ -514,15 +510,13 @@ metadata:
514510
options.ReleaseImage = payloadImage1
515511
options.PayloadOverride = payloadDir
516512
options.leaderElection = getLeaderElectionConfig(ctx, cfg)
517-
alwaysEnableCapabilities := []configv1.ClusterVersionCapability{
518-
configv1.ClusterVersionCapabilityIngress,
519-
}
520-
controllers, err := options.NewControllerContext(cb, alwaysEnableCapabilities)
513+
options.AlwaysEnableCapabilities = []string{string(configv1.ClusterVersionCapabilityIngress)}
514+
controllers, err := options.NewControllerContext(cb)
521515
if err != nil {
522516
t.Fatal(err)
523517
}
524518

525-
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil, nil), 5*time.Second, wait.Backoff{Steps: 3}, "", "", record.NewFakeRecorder(100), payload.DefaultClusterProfile, alwaysEnableCapabilities)
519+
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil, nil), 5*time.Second, wait.Backoff{Steps: 3}, "", "", record.NewFakeRecorder(100), payload.DefaultClusterProfile, stringsToCapabilities(options.AlwaysEnableCapabilities))
526520
controllers.CVO.SetSyncWorkerForTesting(worker)
527521

528522
lock, err := createResourceLock(cb, options.Namespace, options.Name)

0 commit comments

Comments
 (0)