...

Source file src/edge-infra.dev/pkg/edge/controllers/sequel/controller.go

Documentation: edge-infra.dev/pkg/edge/controllers/sequel

     1  package sequel
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  	"time"
     8  
     9  	"google.golang.org/api/option"
    10  	"k8s.io/apimachinery/pkg/runtime"
    11  	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
    12  	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
    13  	ctrl "sigs.k8s.io/controller-runtime"
    14  
    15  	iamAPI "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/clients/generated/apis/iam/v1beta1"
    16  	sqlAPI "github.com/GoogleCloudPlatform/k8s-config-connector/pkg/clients/generated/apis/sql/v1beta1"
    17  
    18  	backendv1 "edge-infra.dev/pkg/edge/apis/sequel/k8s/v1alpha2"
    19  	"edge-infra.dev/pkg/edge/controllers/sequel/internal"
    20  	"edge-infra.dev/pkg/k8s/runtime/controller"
    21  	"edge-infra.dev/pkg/k8s/runtime/controller/metrics"
    22  	"edge-infra.dev/pkg/lib/fog"
    23  	"edge-infra.dev/pkg/lib/gcp/secretmanager"
    24  	"edge-infra.dev/pkg/lib/runtime/version"
    25  )
    26  
    27  // Run creates the manager, sets up the controller, and then starts
    28  // everything.
    29  func Run(opts ...controller.Option) error {
    30  	ctrl.SetLogger(fog.New())
    31  	log := ctrl.Log.WithName("run")
    32  	log.Info("sequel", "version", version.New().String())
    33  
    34  	// create config first, so that controller-runtime flags are parsed when
    35  	// we create the manager
    36  	cfg, err := newConfig(os.Args[1:])
    37  	if err != nil {
    38  		log.Error(err, "failed to instantiate config")
    39  		return err
    40  	}
    41  
    42  	mgr, err := createMgr(opts...)
    43  	if err != nil {
    44  		log.Error(err, "failed to create manager")
    45  		return err
    46  	}
    47  
    48  	ctx := ctrl.SetupSignalHandler()
    49  	if err := cfg.afterParse(); err != nil {
    50  		log.Error(err, "failed to compute config values after parsing")
    51  		return err
    52  	}
    53  
    54  	if err := registerControllers(ctx, mgr, cfg); err != nil {
    55  		log.Error(err, "failed to register controllers")
    56  		return err
    57  	}
    58  
    59  	log.Info("starting manager")
    60  	if err := mgr.Start(ctx); err != nil {
    61  		log.Error(err, "manager encountered a fatal error")
    62  		return err
    63  	}
    64  
    65  	return nil
    66  }
    67  
    68  func createMgr(o ...controller.Option) (ctrl.Manager, error) {
    69  	cfg, opts := controller.ProcessOptions(o...)
    70  	opts.LeaderElectionID = "sequel.edge.ncr.com"
    71  	opts.Scheme = createScheme()
    72  
    73  	return ctrl.NewManager(cfg, opts)
    74  }
    75  
    76  // registerControllers instantiates each reconciler for this controller and
    77  // registers it with the input controller manager
    78  func registerControllers(ctx context.Context, mgr ctrl.Manager, cfg *config, opts ...option.ClientOption) error {
    79  	sm, err := secretmanager.NewWithOptions(ctx, cfg.projectID, opts...)
    80  	if err != nil {
    81  		return fmt.Errorf("an error occurred initializing secret manager client in the user controller: %w", err)
    82  	}
    83  	metrics := metrics.New(mgr, controllerName,
    84  		metrics.WithSuspend(),
    85  		metrics.WithCollectors(
    86  			internal.DatabaseUserSuccessMetric,
    87  			internal.DatabasePingFailedMetric,
    88  			internal.DatabaseBuiltInUserSecretDeletionFailedMetric,
    89  			internal.DatabaseRevokeSQLPermissionsFailedMetric,
    90  			internal.DatabaseUserDependencyMetric,
    91  			internal.DatabaseUserSpecValidationFailedMetric,
    92  			internal.DatabaseSetSQLPermissionsFailedMetric,
    93  			internal.DatabaseSetSequencePermissionsFailedMetric,
    94  			internal.DatabaseRevokeSequencePermissionsFailedMetric,
    95  		),
    96  	)
    97  	if err := (&UserReconciler{
    98  		Reconciler: &Reconciler{
    99  			Conditions:      userConditions,
   100  			OwnerGroupLabel: backendv1.UserLabel,
   101  			Metrics:         metrics,
   102  			Namespace:       cfg.namespace,
   103  		},
   104  		cfg:                cfg,
   105  		sm:                 sm,
   106  		depRequeueInterval: 2 * time.Second,
   107  		recorder:           internal.NewMetricsRecorder(),
   108  	}).SetupWithManager(mgr); err != nil {
   109  		return fmt.Errorf("an error occurred setting up user controller: %w", err)
   110  	}
   111  
   112  	return nil
   113  }
   114  
   115  func createScheme() *runtime.Scheme {
   116  	scheme := runtime.NewScheme()
   117  	utilruntime.Must(clientgoscheme.AddToScheme(scheme))
   118  	utilruntime.Must(sqlAPI.AddToScheme(scheme))
   119  	utilruntime.Must(iamAPI.AddToScheme(scheme))
   120  	utilruntime.Must(backendv1.AddToScheme(scheme))
   121  
   122  	return scheme
   123  }
   124  

View as plain text