...
1 package controller
2
3 import (
4 "os"
5 "time"
6
7 "github.com/go-logr/logr"
8 "k8s.io/apimachinery/pkg/fields"
9 kruntime "k8s.io/apimachinery/pkg/runtime"
10 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
11 clientgoscheme "k8s.io/client-go/kubernetes/scheme"
12 "k8s.io/client-go/rest"
13 ctrl "sigs.k8s.io/controller-runtime"
14 "sigs.k8s.io/controller-runtime/pkg/cache"
15 "sigs.k8s.io/controller-runtime/pkg/client"
16 ctrlmgr "sigs.k8s.io/controller-runtime/pkg/manager"
17
18 "k8s.io/apimachinery/pkg/util/wait"
19
20 "edge-infra.dev/pkg/k8s/runtime/controller"
21 v1ienpatch "edge-infra.dev/pkg/sds/patching/k8s/apis/ienpatch/v1"
22 )
23
24 var (
25 scheme = kruntime.NewScheme()
26 requeueTime = time.Minute
27 )
28
29 func init() {
30 utilruntime.Must(clientgoscheme.AddToScheme(scheme))
31 utilruntime.Must(v1ienpatch.AddToScheme(scheme))
32 }
33
34 func Run(logger logr.Logger, opts ...controller.Option) error {
35 ctrl.SetLogger(logger)
36 log := ctrl.Log.WithName("setup")
37
38 backoff := wait.Backoff{
39 Duration: 500 * time.Millisecond,
40 Factor: 2.0,
41 Jitter: 1.0,
42 Steps: 15,
43 Cap: 60 * time.Second,
44 }
45 var mgrPtr *ctrlmgr.Manager
46 if err := wait.ExponentialBackoff(backoff, func() (bool, error) {
47 mgr, err := createManager(opts...)
48 if err != nil {
49 log.Error(err, "unable to setup the controller manager")
50 return false, nil
51 }
52 mgrPtr = &mgr
53 return true, nil
54 }); err != nil {
55 log.Error(err, "error creating patchctl manager: too many retries")
56 os.Exit(1)
57 }
58 mgr := *mgrPtr
59
60
61 if err := setupControllersWithManager(mgr, log); err != nil {
62 log.Error(err, "unable to setup controllers")
63 return err
64 }
65
66
67 if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
68 log.Error(err, "could not start controllers")
69 return err
70 }
71
72 return nil
73 }
74
75 func createManager(o ...controller.Option) (mgr ctrl.Manager, err error) {
76 mgrRestConfig, mgrOpts := getManagerOptions(o...)
77 return ctrl.NewManager(mgrRestConfig, mgrOpts)
78 }
79
80 func getManagerOptions(opts ...controller.Option) (*rest.Config, ctrlmgr.Options) {
81 mgrConfig, mgrOpts := controller.ProcessOptions(opts...)
82 mgrOpts.Scheme = scheme
83 mgrOpts.Cache = cacheOptions()
84 return mgrConfig, mgrOpts
85 }
86
87 func cacheOptions() cache.Options {
88 return cache.Options{
89 ByObject: map[client.Object]cache.ByObject{
90 &v1ienpatch.IENPatch{}: {
91 Field: fields.Everything(),
92 },
93 },
94 }
95 }
96
97 func setupControllersWithManager(mgr ctrl.Manager, log logr.Logger) error {
98 controller := NewPatchController(mgr, log)
99 return controller.SetUpWithManager(mgr)
100 }
101
View as plain text