Skip to content

Commit 37ef9d8

Browse files
author
Per Goncalves da Silva
committed
Add Boxcutter featuregate
Signed-off-by: Per Goncalves da Silva <[email protected]>
1 parent 5e0b16d commit 37ef9d8

File tree

5 files changed

+90
-52
lines changed

5 files changed

+90
-52
lines changed

cmd/operator-controller/main.go

Lines changed: 59 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ import (
2222
"errors"
2323
"flag"
2424
"fmt"
25+
"github.com/operator-framework/operator-controller/internal/operator-controller/authorization"
26+
"github.com/operator-framework/operator-controller/internal/operator-controller/rukpak/convert"
27+
"github.com/operator-framework/operator-controller/internal/operator-controller/rukpak/preflights/crdupgradesafety"
28+
"github.com/operator-framework/operator-controller/internal/operator-controller/rukpak/render"
29+
"github.com/operator-framework/operator-controller/internal/operator-controller/rukpak/render/certproviders"
30+
"github.com/operator-framework/operator-controller/internal/operator-controller/rukpak/render/registryv1"
31+
apiextensionsv1client "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
2532
"net/http"
2633
"os"
2734
"path/filepath"
@@ -410,50 +417,47 @@ func run() error {
410417
},
411418
}
412419

413-
// aeClient, err := apiextensionsv1client.NewForConfig(mgr.GetConfig())
414-
// if err != nil {
415-
// setupLog.Error(err, "unable to create apiextensions client")
416-
// return err
417-
// }
418-
419-
// preflights := []applier.Preflight{
420-
// crdupgradesafety.NewPreflight(aeClient.CustomResourceDefinitions()),
421-
// }
422-
423-
// // determine if PreAuthorizer should be enabled based on feature gate
424-
// var preAuth authorization.PreAuthorizer
425-
// if features.OperatorControllerFeatureGate.Enabled(features.PreflightPermissions) {
426-
// preAuth = authorization.NewRBACPreAuthorizer(mgr.GetClient())
427-
// }
428-
429-
boxcutterApplier := &applier.Boxcutter{
430-
Client: mgr.GetClient(),
431-
Scheme: mgr.GetScheme(),
432-
}
433-
434-
// determine if a certificate provider should be set in the bundle renderer and feature support for the provider
435-
// based on the feature flag
436-
// var certProvider render.CertificateProvider
437-
// var isWebhookSupportEnabled bool
438-
// if features.OperatorControllerFeatureGate.Enabled(features.WebhookProviderCertManager) {
439-
// certProvider = certproviders.CertManagerCertificateProvider{}
440-
// isWebhookSupportEnabled = true
441-
// } else if features.OperatorControllerFeatureGate.Enabled(features.WebhookProviderOpenshiftServiceCA) {
442-
// certProvider = certproviders.OpenshiftServiceCaCertificateProvider{}
443-
// isWebhookSupportEnabled = true
444-
// }
445-
446-
// now initialize the helmApplier, assigning the potentially nil preAuth
447-
// helmApplier := &applier.Helm{
448-
// ActionClientGetter: acg,
449-
// Preflights: preflights,
450-
// BundleToHelmChartConverter: &convert.BundleToHelmChartConverter{
451-
// BundleRenderer: registryv1.Renderer,
452-
// CertificateProvider: certProvider,
453-
// IsWebhookSupportEnabled: isWebhookSupportEnabled,
454-
// },
455-
// PreAuthorizer: preAuth,
456-
// }
420+
aeClient, err := apiextensionsv1client.NewForConfig(mgr.GetConfig())
421+
if err != nil {
422+
setupLog.Error(err, "unable to create apiextensions client")
423+
return err
424+
}
425+
426+
preflights := []applier.Preflight{
427+
crdupgradesafety.NewPreflight(aeClient.CustomResourceDefinitions()),
428+
}
429+
430+
// determine if PreAuthorizer should be enabled based on feature gate
431+
var preAuth authorization.PreAuthorizer
432+
if features.OperatorControllerFeatureGate.Enabled(features.PreflightPermissions) {
433+
preAuth = authorization.NewRBACPreAuthorizer(mgr.GetClient())
434+
}
435+
436+
// create applier
437+
var ctrlBuilderOpts []controllers.ControllerBuilderOption
438+
var extApplier controllers.Applier
439+
440+
if features.OperatorControllerFeatureGate.Enabled(features.BoxcutterRuntime) {
441+
// TODO: add support for preflight checks
442+
extApplier = &applier.Boxcutter{
443+
Client: mgr.GetClient(),
444+
Scheme: mgr.GetScheme(),
445+
}
446+
ctrlBuilderOpts = append(ctrlBuilderOpts, controllers.WithOwns(&ocv1.ClusterExtensionRevision{}))
447+
} else {
448+
// now initialize the helmApplier, assigning the potentially nil preAuth
449+
certProvider := getCertificateProvider()
450+
extApplier = &applier.Helm{
451+
ActionClientGetter: acg,
452+
Preflights: preflights,
453+
BundleToHelmChartConverter: &convert.BundleToHelmChartConverter{
454+
BundleRenderer: registryv1.Renderer,
455+
CertificateProvider: certProvider,
456+
IsWebhookSupportEnabled: certProvider != nil,
457+
},
458+
PreAuthorizer: preAuth,
459+
}
460+
}
457461

458462
cm := contentmanager.NewManager(clientRestConfigMapper, mgr.GetConfig(), mgr.GetRESTMapper())
459463
err = clusterExtensionFinalizers.Register(controllers.ClusterExtensionCleanupContentManagerCacheFinalizer, finalizers.FinalizerFunc(func(ctx context.Context, obj client.Object) (crfinalizer.Result, error) {
@@ -505,18 +509,17 @@ func run() error {
505509
setupLog.Error(err, "unable to register AccessManager")
506510
return err
507511
}
508-
// Boxcutter
509512

510513
if err = (&controllers.ClusterExtensionReconciler{
511514
Client: cl,
512515
Resolver: resolver,
513516
ImageCache: imageCache,
514517
ImagePuller: imagePuller,
515-
Applier: boxcutterApplier,
518+
Applier: extApplier,
516519
InstalledBundleGetter: &controllers.DefaultInstalledBundleGetter{ActionClientGetter: acg},
517520
Finalizers: clusterExtensionFinalizers,
518521
Manager: cm,
519-
}).SetupWithManager(mgr); err != nil {
522+
}).SetupWithManager(mgr, ctrlBuilderOpts...); err != nil {
520523
setupLog.Error(err, "unable to create controller", "controller", "ClusterExtension")
521524
return err
522525
}
@@ -577,6 +580,15 @@ func run() error {
577580
return nil
578581
}
579582

583+
func getCertificateProvider() render.CertificateProvider {
584+
if features.OperatorControllerFeatureGate.Enabled(features.WebhookProviderCertManager) {
585+
return certproviders.CertManagerCertificateProvider{}
586+
} else if features.OperatorControllerFeatureGate.Enabled(features.WebhookProviderOpenshiftServiceCA) {
587+
return certproviders.OpenshiftServiceCaCertificateProvider{}
588+
}
589+
return nil
590+
}
591+
580592
func main() {
581593
if err := operatorControllerCmd.Execute(); err != nil {
582594
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# DO NOT ADD A NAMESPACE HERE
2+
---
3+
apiVersion: kustomize.config.k8s.io/v1alpha1
4+
kind: Component
5+
patches:
6+
- target:
7+
kind: Deployment
8+
name: operator-controller-controller-manager
9+
path: patches/enable-featuregate.yaml
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# enable Boxcutter runtime feature gate
2+
- op: add
3+
path: /spec/template/spec/containers/0/args/-
4+
value: "--feature-gates=BoxcutterRuntime=true"

internal/operator-controller/controllers/clusterextension_controller.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -413,12 +413,19 @@ func SetDeprecationStatus(ext *ocv1.ClusterExtension, bundleName string, depreca
413413
}
414414
}
415415

416+
type ControllerBuilderOption func(builder *ctrl.Builder)
417+
418+
func WithOwns(obj client.Object) ControllerBuilderOption {
419+
return func(builder *ctrl.Builder) {
420+
builder.Owns(obj)
421+
}
422+
}
423+
416424
// SetupWithManager sets up the controller with the Manager.
417-
func (r *ClusterExtensionReconciler) SetupWithManager(mgr ctrl.Manager) error {
418-
controller, err := ctrl.NewControllerManagedBy(mgr).
425+
func (r *ClusterExtensionReconciler) SetupWithManager(mgr ctrl.Manager, opts ...ControllerBuilderOption) error {
426+
ctrlBuilder := ctrl.NewControllerManagedBy(mgr).
419427
For(&ocv1.ClusterExtension{}).
420428
Named("controller-operator-cluster-extension-controller").
421-
Owns(&ocv1.ClusterExtensionRevision{}).
422429
Watches(&ocv1.ClusterCatalog{},
423430
crhandler.EnqueueRequestsFromMapFunc(clusterExtensionRequestsForCatalog(mgr.GetClient(), mgr.GetLogger())),
424431
builder.WithPredicates(predicate.Funcs{
@@ -437,8 +444,13 @@ func (r *ClusterExtensionReconciler) SetupWithManager(mgr ctrl.Manager) error {
437444
}
438445
return true
439446
},
440-
})).
441-
Build(r)
447+
}))
448+
449+
for _, applyOpt := range opts {
450+
applyOpt(ctrlBuilder)
451+
}
452+
453+
controller, err := ctrlBuilder.Build(r)
442454
if err != nil {
443455
return err
444456
}

internal/operator-controller/features/features.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const (
1717
WebhookProviderCertManager featuregate.Feature = "WebhookProviderCertManager"
1818
WebhookProviderOpenshiftServiceCA featuregate.Feature = "WebhookProviderOpenshiftServiceCA"
1919
HelmChartSupport featuregate.Feature = "HelmChartSupport"
20+
BoxcutterRuntime featuregate.Feature = "BoxcutterRuntime"
2021
)
2122

2223
var operatorControllerFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{

0 commit comments

Comments
 (0)