@@ -22,93 +22,97 @@ import (
22
22
23
23
"github.com/kubernetes-sigs/controller-runtime/pkg/client"
24
24
"github.com/kubernetes-sigs/controller-runtime/pkg/client/apiutil"
25
+ "github.com/kubernetes-sigs/controller-runtime/pkg/client/config"
25
26
"github.com/kubernetes-sigs/controller-runtime/pkg/controller"
26
27
"github.com/kubernetes-sigs/controller-runtime/pkg/handler"
28
+ internalcontroller "github.com/kubernetes-sigs/controller-runtime/pkg/internal/controller"
27
29
"github.com/kubernetes-sigs/controller-runtime/pkg/manager"
28
30
"github.com/kubernetes-sigs/controller-runtime/pkg/reconcile"
29
31
"github.com/kubernetes-sigs/controller-runtime/pkg/runtime/signals"
30
32
"github.com/kubernetes-sigs/controller-runtime/pkg/source"
31
33
"k8s.io/apimachinery/pkg/runtime"
32
- "k8s.io/apimachinery/pkg/runtime/schema"
33
- "k8s.io/client-go/rest"
34
34
)
35
35
36
36
// Operator is a very simple Controller that embeds a Manager.
37
37
type Operator struct {
38
38
mrg manager.Manager
39
39
stopFn func () <- chan struct {}
40
-
41
- // Allow deps to be mocked out for testing
42
- newController func (name string , mrg manager.Manager , options controller.Options ) (controller.Controller , error )
43
- getGvk func (obj runtime.Object , scheme * runtime.Scheme ) (schema.GroupVersionKind , error )
40
+ ctrl * internalcontroller.Controller
44
41
}
45
42
46
- // New returns a new Operator
47
- func New (config * rest.Config ) (* Operator , error ) {
48
- mrg , err := manager .New (config , manager.Options {})
49
- if err != nil {
50
- return nil , err
51
- }
43
+ var noop = reconcile .Func (func (reconcile.Request ) (reconcile.Result , error ) {
44
+ return reconcile.Result {}, nil
45
+ })
52
46
53
- o := & Operator {
54
- mrg : mrg ,
55
- stopFn : signals .SetupSignalHandler ,
56
- newController : controller .New ,
57
- getGvk : apiutil .GVKForObject ,
58
- }
59
- return o , nil
60
- }
47
+ var getConfig = config .GetConfig
48
+ var newController = controller .New
49
+ var newManager = manager .New
50
+ var getGvk = apiutil .GVKForObject
61
51
62
- // HandleType configures the Operator for a Kubernetes Resource type.
52
+ // New returns a new Operator for a Kubernetes Resource type.
63
53
//
64
54
// * Watch for changes (e.g. create,update,delete operations) to objects of the Resource type
65
55
//
66
56
// * Watch for changes to objects created or managed by the Resource type.
67
57
//
68
58
// * Reconcile the object that was changed or that owns the changed objects.
69
59
//
70
- // impl: the Reconcile implementation. reconcile.Reconcile is a function that may be called at anytime with the
71
- // name / Namespace of an object. When called, it will ensure that the state of the system matches what is
72
- // specified in the object at the time reconcile is called.
73
- //
74
60
// reconcileObject: the type of the Kubernetes object that will be Watched and Reconciled - e.g. &v1.ReplicaSet{}
75
61
//
76
62
// ownedTypes: list of types of objects that may be created or managed by the reconcileObject. These
77
63
// objects must have the OwnersReference set to the owning object in the ObjectMeta - e.g. &v1.Pod{}
78
- func (o * Operator ) HandleType (impl reconcile.Reconcile ,
79
- reconcileObject runtime.Object , ownedTypes ... runtime.Object ) error {
64
+ func New (reconcileObject runtime.Object , ownedTypes ... runtime.Object ) (* Operator , error ) {
65
+ c , err := getConfig ()
66
+ if err != nil {
67
+ return nil , err
68
+ }
69
+ mrg , err := newManager (c , manager.Options {})
70
+ if err != nil {
71
+ return nil , err
72
+ }
80
73
81
- gvk , err := o .getGvk (reconcileObject , o .mrg .GetScheme ())
74
+ o := & Operator {
75
+ mrg : mrg ,
76
+ stopFn : signals .SetupSignalHandler ,
77
+ }
78
+
79
+ gvk , err := getGvk (reconcileObject , o .mrg .GetScheme ())
82
80
if err != nil {
83
- return err
81
+ return nil , err
84
82
}
85
83
86
84
// Create the controller
87
85
name := fmt .Sprintf ("%s-operator" , strings .ToLower (gvk .Kind ))
88
- c , err := o . newController (name , o . mrg , controller.Options {Reconcile : impl })
86
+ ctrl , err := newController (name , mrg , controller.Options {Reconcile : noop })
89
87
if err != nil {
90
- return err
88
+ return nil , err
91
89
}
90
+ o .ctrl = ctrl .(* internalcontroller.Controller )
92
91
93
92
// Reconcile type
94
- err = c .Watch (& source.Kind {Type : reconcileObject }, & handler.Enqueue {})
93
+ err = o . ctrl .Watch (& source.Kind {Type : reconcileObject }, & handler.Enqueue {})
95
94
if err != nil {
96
- return err
95
+ return nil , err
97
96
}
98
97
99
98
// Watch the managed types
100
99
for _ , t := range ownedTypes {
101
- err = c .Watch (& source.Kind {Type : t }, & handler.EnqueueOwner {OwnerType : reconcileObject , IsController : true })
100
+ err = o . ctrl .Watch (& source.Kind {Type : t }, & handler.EnqueueOwner {OwnerType : reconcileObject , IsController : true })
102
101
if err != nil {
103
- return err
102
+ return nil , err
104
103
}
105
104
}
106
105
107
- return err
106
+ return o , nil
108
107
}
109
108
110
109
// Start starts the Operator and blocks until the program is shutdown.
111
- func (o * Operator ) Start () error {
110
+ //
111
+ // call: the Reconcile implementation. reconcile.Reconcile is a function that may be called at anytime with the
112
+ // name / Namespace of an object. When called, it will ensure that the state of the system matches what is
113
+ // specified in the object at the time reconcile is called.
114
+ func (o * Operator ) Start (call reconcile.Reconcile ) error {
115
+ o .ctrl .Do = call
112
116
return o .mrg .Start (o .stopFn ())
113
117
}
114
118
0 commit comments