...
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
28
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
35
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
77
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