Skip to content

Commit d97de50

Browse files
committed
resolve linter issues
Signed-off-by: Joe Lanford <[email protected]>
1 parent 613514c commit d97de50

File tree

4 files changed

+149
-129
lines changed

4 files changed

+149
-129
lines changed

cmd/operator-controller/main.go

Lines changed: 145 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,11 @@ import (
4949
crcache "sigs.k8s.io/controller-runtime/pkg/cache"
5050
"sigs.k8s.io/controller-runtime/pkg/certwatcher"
5151
"sigs.k8s.io/controller-runtime/pkg/client"
52+
crcontroller "sigs.k8s.io/controller-runtime/pkg/controller"
5253
crfinalizer "sigs.k8s.io/controller-runtime/pkg/finalizer"
5354
"sigs.k8s.io/controller-runtime/pkg/healthz"
5455
"sigs.k8s.io/controller-runtime/pkg/log"
56+
"sigs.k8s.io/controller-runtime/pkg/manager"
5557
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
5658
"sigs.k8s.io/controller-runtime/pkg/metrics/server"
5759

@@ -420,132 +422,14 @@ func run() error {
420422
return err
421423
}
422424

423-
certProvider := getCertificateProvider()
424425
if features.OperatorControllerFeatureGate.Enabled(features.BoxcutterRuntime) {
425-
// TODO: add support for preflight checks
426-
// TODO: better scheme handling - which types do we want to support?
427-
_ = apiextensionsv1.AddToScheme(mgr.GetScheme())
428-
ceReconciler.Applier = &applier.Boxcutter{
429-
Client: mgr.GetClient(),
430-
Scheme: mgr.GetScheme(),
431-
RevisionGenerator: &applier.SimpleRevisionGenerator{
432-
Scheme: mgr.GetScheme(),
433-
BundleRenderer: &applier.RegistryV1BundleRenderer{
434-
BundleRenderer: registryv1.Renderer,
435-
CertificateProvider: certProvider,
436-
},
437-
},
438-
Preflights: preflights,
439-
}
440-
ceReconciler.RevisionStatesGetter = &controllers.BoxcutterRevisionStatesGetter{Reader: mgr.GetClient()}
441-
442-
// Boxcutter
443-
const (
444-
boxcutterSystemPrefixFieldOwner = "olm.operatorframework.io"
445-
)
446-
447-
discoveryClient, err := discovery.NewDiscoveryClientForConfig(restConfig)
448-
if err != nil {
449-
setupLog.Error(err, "unable to create discovery client")
450-
return err
451-
}
452-
453-
trackingCache, err := managedcache.NewTrackingCache(
454-
ctrl.Log.WithName("trackingCache"),
455-
restConfig,
456-
crcache.Options{
457-
Scheme: mgr.GetScheme(), Mapper: mgr.GetRESTMapper(),
458-
},
459-
)
460-
if err != nil {
461-
setupLog.Error(err, "unable to create boxcutter tracking cache")
462-
}
463-
if err := mgr.Add(trackingCache); err != nil {
464-
setupLog.Error(err, "unable to set up tracking cache")
465-
}
466-
467-
if err = (&controllers.ClusterExtensionRevisionReconciler{
468-
Client: cl,
469-
RevisionEngine: machinery.NewRevisionEngine(
470-
machinery.NewPhaseEngine(
471-
machinery.NewObjectEngine(
472-
mgr.GetScheme(), trackingCache, mgr.GetClient(),
473-
ownerhandling.NewNative(mgr.GetScheme()),
474-
machinery.NewComparator(ownerhandling.NewNative(mgr.GetScheme()), discoveryClient, mgr.GetScheme(), boxcutterSystemPrefixFieldOwner),
475-
boxcutterSystemPrefixFieldOwner, boxcutterSystemPrefixFieldOwner,
476-
),
477-
validation.NewClusterPhaseValidator(mgr.GetRESTMapper(), mgr.GetClient()),
478-
),
479-
validation.NewRevisionValidator(), mgr.GetClient(),
480-
),
481-
}).SetupWithManager(mgr, trackingCache); err != nil {
482-
setupLog.Error(err, "unable to create controller", "controller", "ClusterExtensionRevision")
483-
return err
484-
}
426+
err = setupBoxcutter(mgr, ceReconciler, preflights)
485427
} else {
486-
coreClient, err := corev1client.NewForConfig(mgr.GetConfig())
487-
if err != nil {
488-
setupLog.Error(err, "unable to create core client")
489-
return err
490-
}
491-
tokenGetter := authentication.NewTokenGetter(coreClient, authentication.WithExpirationDuration(1*time.Hour))
492-
clientRestConfigMapper := action.ServiceAccountRestConfigMapper(tokenGetter)
493-
if features.OperatorControllerFeatureGate.Enabled(features.SyntheticPermissions) {
494-
clientRestConfigMapper = action.SyntheticUserRestConfigMapper(clientRestConfigMapper)
495-
}
496-
497-
cfgGetter, err := helmclient.NewActionConfigGetter(mgr.GetConfig(), mgr.GetRESTMapper(),
498-
helmclient.StorageDriverMapper(action.ChunkedStorageDriverMapper(coreClient, mgr.GetAPIReader(), cfg.systemNamespace)),
499-
helmclient.ClientNamespaceMapper(func(obj client.Object) (string, error) {
500-
ext := obj.(*ocv1.ClusterExtension)
501-
return ext.Spec.Namespace, nil
502-
}),
503-
helmclient.ClientRestConfigMapper(clientRestConfigMapper),
504-
)
505-
if err != nil {
506-
setupLog.Error(err, "unable to config for creating helm client")
507-
return err
508-
}
509-
510-
acg, err := action.NewWrappedActionClientGetter(cfgGetter,
511-
helmclient.WithFailureRollbacks(false),
512-
)
513-
if err != nil {
514-
setupLog.Error(err, "unable to create helm client")
515-
return err
516-
}
517-
518-
// determine if PreAuthorizer should be enabled based on feature gate
519-
var preAuth authorization.PreAuthorizer
520-
if features.OperatorControllerFeatureGate.Enabled(features.PreflightPermissions) {
521-
preAuth = authorization.NewRBACPreAuthorizer(mgr.GetClient())
522-
}
523-
524-
cm := contentmanager.NewManager(clientRestConfigMapper, mgr.GetConfig(), mgr.GetRESTMapper())
525-
err = clusterExtensionFinalizers.Register(controllers.ClusterExtensionCleanupContentManagerCacheFinalizer, finalizers.FinalizerFunc(func(ctx context.Context, obj client.Object) (crfinalizer.Result, error) {
526-
ext := obj.(*ocv1.ClusterExtension)
527-
err := cm.Delete(ext)
528-
return crfinalizer.Result{}, err
529-
}))
530-
if err != nil {
531-
setupLog.Error(err, "unable to register content manager cleanup finalizer")
532-
return err
533-
}
534-
// now initialize the helmApplier, assigning the potentially nil preAuth
535-
ceReconciler.Applier = &applier.Helm{
536-
ActionClientGetter: acg,
537-
Preflights: preflights,
538-
BundleToHelmChartConverter: &convert.BundleToHelmChartConverter{
539-
BundleRenderer: registryv1.Renderer,
540-
CertificateProvider: certProvider,
541-
IsWebhookSupportEnabled: certProvider != nil,
542-
},
543-
HelmReleaseToObjectsConverter: &applier.HelmReleaseToObjectsConverter{},
544-
PreAuthorizer: preAuth,
545-
Watcher: ceController,
546-
Manager: cm,
547-
}
548-
ceReconciler.RevisionStatesGetter = &controllers.HelmRevisionStatesGetter{ActionClientGetter: acg}
428+
err = setupHelm(mgr, ceReconciler, preflights, ceController, clusterExtensionFinalizers)
429+
}
430+
if err != nil {
431+
setupLog.Error(err, "unable to setup lifecycler")
432+
return err
549433
}
550434

551435
if err = (&controllers.ClusterCatalogReconciler{
@@ -602,6 +486,143 @@ func getCertificateProvider() render.CertificateProvider {
602486
return nil
603487
}
604488

489+
func setupBoxcutter(mgr manager.Manager, ceReconciler *controllers.ClusterExtensionReconciler, preflights []applier.Preflight) error {
490+
certProvider := getCertificateProvider()
491+
492+
// TODO: add support for preflight checks
493+
// TODO: better scheme handling - which types do we want to support?
494+
_ = apiextensionsv1.AddToScheme(mgr.GetScheme())
495+
ceReconciler.Applier = &applier.Boxcutter{
496+
Client: mgr.GetClient(),
497+
Scheme: mgr.GetScheme(),
498+
RevisionGenerator: &applier.SimpleRevisionGenerator{
499+
Scheme: mgr.GetScheme(),
500+
BundleRenderer: &applier.RegistryV1BundleRenderer{
501+
BundleRenderer: registryv1.Renderer,
502+
CertificateProvider: certProvider,
503+
},
504+
},
505+
Preflights: preflights,
506+
}
507+
ceReconciler.RevisionStatesGetter = &controllers.BoxcutterRevisionStatesGetter{Reader: mgr.GetClient()}
508+
509+
// Boxcutter
510+
const (
511+
boxcutterSystemPrefixFieldOwner = "olm.operatorframework.io"
512+
)
513+
514+
discoveryClient, err := discovery.NewDiscoveryClientForConfig(mgr.GetConfig())
515+
if err != nil {
516+
return fmt.Errorf("unable to create discovery client: %w", err)
517+
}
518+
519+
trackingCache, err := managedcache.NewTrackingCache(
520+
ctrl.Log.WithName("trackingCache"),
521+
mgr.GetConfig(),
522+
crcache.Options{
523+
Scheme: mgr.GetScheme(), Mapper: mgr.GetRESTMapper(),
524+
},
525+
)
526+
if err != nil {
527+
setupLog.Error(err, "unable to create boxcutter tracking cache")
528+
}
529+
if err := mgr.Add(trackingCache); err != nil {
530+
return fmt.Errorf("unable to add tracking cache to manager: %w", err)
531+
}
532+
533+
if err = (&controllers.ClusterExtensionRevisionReconciler{
534+
Client: mgr.GetClient(),
535+
RevisionEngine: machinery.NewRevisionEngine(
536+
machinery.NewPhaseEngine(
537+
machinery.NewObjectEngine(
538+
mgr.GetScheme(), trackingCache, mgr.GetClient(),
539+
ownerhandling.NewNative(mgr.GetScheme()),
540+
machinery.NewComparator(ownerhandling.NewNative(mgr.GetScheme()), discoveryClient, mgr.GetScheme(), boxcutterSystemPrefixFieldOwner),
541+
boxcutterSystemPrefixFieldOwner, boxcutterSystemPrefixFieldOwner,
542+
),
543+
validation.NewClusterPhaseValidator(mgr.GetRESTMapper(), mgr.GetClient()),
544+
),
545+
validation.NewRevisionValidator(), mgr.GetClient(),
546+
),
547+
}).SetupWithManager(mgr, trackingCache); err != nil {
548+
return fmt.Errorf("unable to setup ClusterExtensionRevision controller: %w", err)
549+
}
550+
return nil
551+
}
552+
553+
func setupHelm(
554+
mgr manager.Manager,
555+
ceReconciler *controllers.ClusterExtensionReconciler,
556+
preflights []applier.Preflight,
557+
ceController crcontroller.Controller,
558+
clusterExtensionFinalizers crfinalizer.Registerer,
559+
) error {
560+
coreClient, err := corev1client.NewForConfig(mgr.GetConfig())
561+
if err != nil {
562+
return fmt.Errorf("unable to create core client: %w", err)
563+
}
564+
tokenGetter := authentication.NewTokenGetter(coreClient, authentication.WithExpirationDuration(1*time.Hour))
565+
clientRestConfigMapper := action.ServiceAccountRestConfigMapper(tokenGetter)
566+
if features.OperatorControllerFeatureGate.Enabled(features.SyntheticPermissions) {
567+
clientRestConfigMapper = action.SyntheticUserRestConfigMapper(clientRestConfigMapper)
568+
}
569+
570+
cfgGetter, err := helmclient.NewActionConfigGetter(mgr.GetConfig(), mgr.GetRESTMapper(),
571+
helmclient.StorageDriverMapper(action.ChunkedStorageDriverMapper(coreClient, mgr.GetAPIReader(), cfg.systemNamespace)),
572+
helmclient.ClientNamespaceMapper(func(obj client.Object) (string, error) {
573+
ext := obj.(*ocv1.ClusterExtension)
574+
return ext.Spec.Namespace, nil
575+
}),
576+
helmclient.ClientRestConfigMapper(clientRestConfigMapper),
577+
)
578+
if err != nil {
579+
return fmt.Errorf("unable to create helm action config getter: %w", err)
580+
}
581+
582+
acg, err := action.NewWrappedActionClientGetter(cfgGetter,
583+
helmclient.WithFailureRollbacks(false),
584+
)
585+
if err != nil {
586+
return fmt.Errorf("unable to create helm action client getter: %w", err)
587+
}
588+
589+
// determine if PreAuthorizer should be enabled based on feature gate
590+
var preAuth authorization.PreAuthorizer
591+
if features.OperatorControllerFeatureGate.Enabled(features.PreflightPermissions) {
592+
preAuth = authorization.NewRBACPreAuthorizer(mgr.GetClient())
593+
}
594+
595+
cm := contentmanager.NewManager(clientRestConfigMapper, mgr.GetConfig(), mgr.GetRESTMapper())
596+
err = clusterExtensionFinalizers.Register(controllers.ClusterExtensionCleanupContentManagerCacheFinalizer, finalizers.FinalizerFunc(func(ctx context.Context, obj client.Object) (crfinalizer.Result, error) {
597+
ext := obj.(*ocv1.ClusterExtension)
598+
err := cm.Delete(ext)
599+
return crfinalizer.Result{}, err
600+
}))
601+
if err != nil {
602+
setupLog.Error(err, "unable to register content manager cleanup finalizer")
603+
return err
604+
}
605+
606+
certProvider := getCertificateProvider()
607+
608+
// now initialize the helmApplier, assigning the potentially nil preAuth
609+
ceReconciler.Applier = &applier.Helm{
610+
ActionClientGetter: acg,
611+
Preflights: preflights,
612+
BundleToHelmChartConverter: &convert.BundleToHelmChartConverter{
613+
BundleRenderer: registryv1.Renderer,
614+
CertificateProvider: certProvider,
615+
IsWebhookSupportEnabled: certProvider != nil,
616+
},
617+
HelmReleaseToObjectsConverter: &applier.HelmReleaseToObjectsConverter{},
618+
PreAuthorizer: preAuth,
619+
Watcher: ceController,
620+
Manager: cm,
621+
}
622+
ceReconciler.RevisionStatesGetter = &controllers.HelmRevisionStatesGetter{ActionClientGetter: acg}
623+
return nil
624+
}
625+
605626
func main() {
606627
if err := operatorControllerCmd.Execute(); err != nil {
607628
fmt.Fprintf(os.Stderr, "Error: %v\n", err)

internal/operator-controller/applier/boxcutter_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ func TestBoxcutter_Apply(t *testing.T) {
510510
} else {
511511
require.NoError(t, err)
512512
assert.False(t, installSucceeded)
513-
assert.Equal(t, installStatus, "New revision created")
513+
assert.Equal(t, "New revision created", installStatus)
514514
}
515515

516516
if tc.validate != nil {

internal/operator-controller/applier/helm_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ func TestApply_Installation(t *testing.T) {
344344

345345
installSucceeded, installStatus, err := helmApplier.Apply(context.TODO(), validFS, testCE, testObjectLabels, testStorageLabels)
346346
require.NoError(t, err)
347-
require.Equal(t, "", installStatus)
347+
require.Empty(t, installStatus)
348348
require.True(t, installSucceeded)
349349
})
350350
}
@@ -480,7 +480,7 @@ func TestApply_InstallationWithPreflightPermissionsEnabled(t *testing.T) {
480480

481481
installSucceeded, installStatus, err := helmApplier.Apply(context.TODO(), validFS, validCE, testObjectLabels, testStorageLabels)
482482
require.NoError(t, err)
483-
require.Equal(t, "", installStatus)
483+
require.Empty(t, installStatus)
484484
require.True(t, installSucceeded)
485485
})
486486
}

internal/operator-controller/controllers/clusterextension_controller.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ func (d *HelmRevisionStatesGetter) GetRevisionStates(ctx context.Context, ext *o
525525
}
526526

527527
type BoxcutterRevisionStatesGetter struct {
528-
client.Reader
528+
Reader client.Reader
529529
}
530530

531531
func (d *BoxcutterRevisionStatesGetter) GetRevisionStates(ctx context.Context, ext *ocv1.ClusterExtension) (*RevisionStates, error) {
@@ -545,7 +545,6 @@ func (d *BoxcutterRevisionStatesGetter) GetRevisionStates(ctx context.Context, e
545545
rs := &RevisionStates{}
546546
for _, rev := range existingRevisionList.Items {
547547
if rev.Spec.LifecycleState == ocv1.ClusterExtensionRevisionLifecycleStateActive {
548-
549548
// TODO: the setting of these annotations (happens in boxcutter applier when we pass in "storageLabels")
550549
// is fairly decoupled from this code where we get the annotations back out. We may want to co-locate
551550
// the set/get logic a bit better to make it more maintainable and less likely to get out of sync.

0 commit comments

Comments
 (0)