@@ -19,6 +19,7 @@ import (
19
19
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
20
20
"k8s.io/apimachinery/pkg/fields"
21
21
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
22
+ "k8s.io/apimachinery/pkg/util/sets"
22
23
"k8s.io/apimachinery/pkg/util/wait"
23
24
"k8s.io/client-go/informers"
24
25
"k8s.io/client-go/kubernetes"
@@ -132,7 +133,7 @@ func NewOptions() *Options {
132
133
}
133
134
}
134
135
135
- func (o * Options ) Run ( ctx context. Context ) error {
136
+ func (o * Options ) ValidateAndComplete ( ) error {
136
137
if o .NodeName == "" {
137
138
return fmt .Errorf ("node-name is required" )
138
139
}
@@ -152,25 +153,29 @@ func (o *Options) Run(ctx context.Context) error {
152
153
(o .PromQLTarget .KubeSvc .Namespace == "" || o .PromQLTarget .KubeSvc .Name == "" ) {
153
154
return fmt .Errorf ("--use-dns-for-services is disabled, so --metrics-service and --metrics-namespace must be set" )
154
155
}
155
- if len (o .PayloadOverride ) > 0 {
156
- klog .Warningf ("Using an override payload directory for testing only: %s" , o .PayloadOverride )
157
- }
158
- if len (o .Exclude ) > 0 {
159
- klog .Infof ("Excluding manifests for %q" , o .Exclude )
160
- }
161
- alwaysEnableCaps , unknownCaps := parseAlwaysEnableCapabilities (o .AlwaysEnableCapabilities )
162
- if len (unknownCaps ) > 0 {
163
- return fmt .Errorf ("--always-enable-capabilities was set with unknown capabilities: %v" , unknownCaps )
156
+
157
+ if parsed , err := url .Parse (o .PrometheusURLString ); err != nil {
158
+ return fmt .Errorf ("error parsing promql url: %v" , err )
159
+ } else {
160
+ o .PromQLTarget .URL = parsed
164
161
}
165
162
166
163
// Inject the cluster ID into PromQL queries in HyperShift
167
164
o .InjectClusterIdIntoPromQL = o .HyperShift
168
165
169
- // parse the prometheus url
170
- var err error
171
- o .PromQLTarget .URL , err = url .Parse (o .PrometheusURLString )
172
- if err != nil {
173
- return fmt .Errorf ("error parsing promql url: %v" , err )
166
+ if err := validateCapabilities (o .AlwaysEnableCapabilities ); err != nil {
167
+ return fmt .Errorf ("--always-enable-capabilities: %w" , err )
168
+ }
169
+
170
+ return nil
171
+ }
172
+
173
+ func (o * Options ) Run (ctx context.Context ) error {
174
+ if len (o .PayloadOverride ) > 0 {
175
+ klog .Warningf ("Using an override payload directory for testing only: %s" , o .PayloadOverride )
176
+ }
177
+ if len (o .Exclude ) > 0 {
178
+ klog .Infof ("Excluding manifests for %q" , o .Exclude )
174
179
}
175
180
176
181
// initialize the core objects
@@ -185,7 +190,7 @@ func (o *Options) Run(ctx context.Context) error {
185
190
}
186
191
187
192
// initialize the controllers and attempt to load the payload information
188
- controllerCtx , err := o .NewControllerContext (cb , alwaysEnableCaps )
193
+ controllerCtx , err := o .NewControllerContext (cb )
189
194
if err != nil {
190
195
return err
191
196
}
@@ -470,7 +475,7 @@ type Context struct {
470
475
471
476
// NewControllerContext initializes the default Context for the current Options. It does
472
477
// not start any background processes.
473
- func (o * Options ) NewControllerContext (cb * ClientBuilder , alwaysEnableCapabilities []configv1. ClusterVersionCapability ) (* Context , error ) {
478
+ func (o * Options ) NewControllerContext (cb * ClientBuilder ) (* Context , error ) {
474
479
client := cb .ClientOrDie ("shared-informer" )
475
480
kubeClient := cb .KubeClientOrDie (internal .ConfigNamespace , useProtobuf )
476
481
operatorClient := cb .OperatorClientOrDie ("operator-client" )
@@ -490,6 +495,7 @@ func (o *Options) NewControllerContext(cb *ClientBuilder, alwaysEnableCapabiliti
490
495
491
496
cvoKubeClient := cb .KubeClientOrDie (o .Namespace , useProtobuf )
492
497
o .PromQLTarget .KubeClient = cvoKubeClient
498
+
493
499
cvo , err := cvo .New (
494
500
o .NodeName ,
495
501
o .Namespace , o .Name ,
@@ -511,7 +517,7 @@ func (o *Options) NewControllerContext(cb *ClientBuilder, alwaysEnableCapabiliti
511
517
o .PromQLTarget ,
512
518
o .InjectClusterIdIntoPromQL ,
513
519
o .UpdateService ,
514
- alwaysEnableCapabilities ,
520
+ stringsToCapabilities ( o . AlwaysEnableCapabilities ) ,
515
521
)
516
522
if err != nil {
517
523
return nil , err
@@ -618,25 +624,22 @@ func (c *Context) InitializeFromPayload(ctx context.Context, restConfig *rest.Co
618
624
return nil
619
625
}
620
626
621
- // parseAlwaysEnableCapabilities parses the string list of capabilities
622
- // into two lists of configv1.ClusterVersionCapability: known and unknown.
623
- func parseAlwaysEnableCapabilities (caps []string ) ([]configv1.ClusterVersionCapability , []configv1.ClusterVersionCapability ) {
624
- var (
625
- knownCaps []configv1.ClusterVersionCapability
626
- unknownCaps []configv1.ClusterVersionCapability
627
- )
628
- for _ , c := range caps {
629
- known := false
630
- for _ , kc := range configv1 .KnownClusterVersionCapabilities {
631
- if configv1 .ClusterVersionCapability (c ) == kc {
632
- knownCaps = append (knownCaps , kc )
633
- known = true
634
- break
635
- }
636
- }
637
- if ! known {
638
- unknownCaps = append (unknownCaps , configv1 .ClusterVersionCapability (c ))
639
- }
627
+ func stringsToCapabilities (names []string ) []configv1.ClusterVersionCapability {
628
+ caps := make ([]configv1.ClusterVersionCapability , len (names ))
629
+ for i , c := range names {
630
+ caps [i ] = configv1 .ClusterVersionCapability (c )
631
+ }
632
+ return caps
633
+ }
634
+
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 ))
640
643
}
641
- return knownCaps , unknownCaps
644
+ return nil
642
645
}
0 commit comments