@@ -37,15 +37,15 @@ var getGvk = apiutil.GVKForObject
37
37
38
38
// Builder builds a Controller.
39
39
type Builder struct {
40
- apiType runtime. Object
41
- mgr manager. Manager
42
- predicates []predicate. Predicate
43
- managedObjects []runtime. Object
44
- watchRequest [] watchRequest
45
- config * rest.Config
46
- ctrl controller.Controller
47
- ctrlOptions controller.Options
48
- name string
40
+ forInput ForInput
41
+ ownsInput [] OwnsInput
42
+ watchesInput []WatchesInput
43
+ mgr manager. Manager
44
+ globalPredicates []predicate. Predicate
45
+ config * rest.Config
46
+ ctrl controller.Controller
47
+ ctrlOptions controller.Options
48
+ name string
49
49
}
50
50
51
51
// ControllerManagedBy returns a new controller builder that will be started by the provided Manager
@@ -63,32 +63,62 @@ func (blder *Builder) ForType(apiType runtime.Object) *Builder {
63
63
return blder .For (apiType )
64
64
}
65
65
66
+ // ForInput represents the information set by For method.
67
+ type ForInput struct {
68
+ object runtime.Object
69
+ predicates []predicate.Predicate
70
+ }
71
+
66
72
// For defines the type of Object being *reconciled*, and configures the ControllerManagedBy to respond to create / delete /
67
73
// update events by *reconciling the object*.
68
74
// This is the equivalent of calling
69
75
// Watches(&source.Kind{Type: apiType}, &handler.EnqueueRequestForObject{})
70
- func (blder * Builder ) For (apiType runtime.Object ) * Builder {
71
- blder .apiType = apiType
76
+ func (blder * Builder ) For (object runtime.Object , opts ... ForOption ) * Builder {
77
+ input := ForInput {object : object }
78
+ for _ , opt := range opts {
79
+ opt .ApplyToFor (& input )
80
+ }
81
+
82
+ blder .forInput = input
72
83
return blder
73
84
}
74
85
86
+ // OwnsInput represents the information set by Owns method.
87
+ type OwnsInput struct {
88
+ object runtime.Object
89
+ predicates []predicate.Predicate
90
+ }
91
+
75
92
// Owns defines types of Objects being *generated* by the ControllerManagedBy, and configures the ControllerManagedBy to respond to
76
93
// create / delete / update events by *reconciling the owner object*. This is the equivalent of calling
77
- // Watches(&source.Kind{Type: <ForType-apiType>}, &handler.EnqueueRequestForOwner{OwnerType: apiType, IsController: true})
78
- func (blder * Builder ) Owns (apiType runtime.Object ) * Builder {
79
- blder .managedObjects = append (blder .managedObjects , apiType )
94
+ // Watches(&source.Kind{Type: <ForType-forInput>}, &handler.EnqueueRequestForOwner{OwnerType: apiType, IsController: true})
95
+ func (blder * Builder ) Owns (object runtime.Object , opts ... OwnsOption ) * Builder {
96
+ input := OwnsInput {object : object }
97
+ for _ , opt := range opts {
98
+ opt .ApplyToOwns (& input )
99
+ }
100
+
101
+ blder .ownsInput = append (blder .ownsInput , input )
80
102
return blder
81
103
}
82
104
83
- type watchRequest struct {
105
+ // WatchesInput represents the information set by Watches method.
106
+ type WatchesInput struct {
84
107
src source.Source
85
108
eventhandler handler.EventHandler
109
+ predicates []predicate.Predicate
86
110
}
87
111
88
112
// Watches exposes the lower-level ControllerManagedBy Watches functions through the builder. Consider using
89
113
// Owns or For instead of Watches directly.
90
- func (blder * Builder ) Watches (src source.Source , eventhandler handler.EventHandler ) * Builder {
91
- blder .watchRequest = append (blder .watchRequest , watchRequest {src : src , eventhandler : eventhandler })
114
+ // Specified predicates are registered only for given source.
115
+ func (blder * Builder ) Watches (src source.Source , eventhandler handler.EventHandler , opts ... WatchesOption ) * Builder {
116
+ input := WatchesInput {src : src , eventhandler : eventhandler }
117
+ for _ , opt := range opts {
118
+ opt .ApplyToWatches (& input )
119
+ }
120
+
121
+ blder .watchesInput = append (blder .watchesInput , input )
92
122
return blder
93
123
}
94
124
@@ -102,9 +132,10 @@ func (blder *Builder) WithConfig(config *rest.Config) *Builder {
102
132
103
133
// WithEventFilter sets the event filters, to filter which create/update/delete/generic events eventually
104
134
// trigger reconciliations. For example, filtering on whether the resource version has changed.
135
+ // Given predicate is added for all watched objects.
105
136
// Defaults to the empty list.
106
137
func (blder * Builder ) WithEventFilter (p predicate.Predicate ) * Builder {
107
- blder .predicates = append (blder .predicates , p )
138
+ blder .globalPredicates = append (blder .globalPredicates , p )
108
139
return blder
109
140
}
110
141
@@ -157,28 +188,33 @@ func (blder *Builder) Build(r reconcile.Reconciler) (controller.Controller, erro
157
188
158
189
func (blder * Builder ) doWatch () error {
159
190
// Reconcile type
160
- src := & source.Kind {Type : blder .apiType }
191
+ src := & source.Kind {Type : blder .forInput . object }
161
192
hdler := & handler.EnqueueRequestForObject {}
162
- err := blder .ctrl .Watch (src , hdler , blder .predicates ... )
193
+ allPredicates := append (blder .globalPredicates , blder .forInput .predicates ... )
194
+ err := blder .ctrl .Watch (src , hdler , allPredicates ... )
163
195
if err != nil {
164
196
return err
165
197
}
166
198
167
199
// Watches the managed types
168
- for _ , obj := range blder .managedObjects {
169
- src := & source.Kind {Type : obj }
200
+ for _ , own := range blder .ownsInput {
201
+ src := & source.Kind {Type : own . object }
170
202
hdler := & handler.EnqueueRequestForOwner {
171
- OwnerType : blder .apiType ,
203
+ OwnerType : blder .forInput . object ,
172
204
IsController : true ,
173
205
}
174
- if err := blder .ctrl .Watch (src , hdler , blder .predicates ... ); err != nil {
206
+ allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
207
+ allPredicates = append (allPredicates , own .predicates ... )
208
+ if err := blder .ctrl .Watch (src , hdler , allPredicates ... ); err != nil {
175
209
return err
176
210
}
177
211
}
178
212
179
213
// Do the watch requests
180
- for _ , w := range blder .watchRequest {
181
- if err := blder .ctrl .Watch (w .src , w .eventhandler , blder .predicates ... ); err != nil {
214
+ for _ , w := range blder .watchesInput {
215
+ allPredicates := append ([]predicate.Predicate (nil ), blder .globalPredicates ... )
216
+ allPredicates = append (allPredicates , w .predicates ... )
217
+ if err := blder .ctrl .Watch (w .src , w .eventhandler , allPredicates ... ); err != nil {
182
218
return err
183
219
}
184
220
@@ -196,7 +232,7 @@ func (blder *Builder) getControllerName() (string, error) {
196
232
if blder .name != "" {
197
233
return blder .name , nil
198
234
}
199
- gvk , err := getGvk (blder .apiType , blder .mgr .GetScheme ())
235
+ gvk , err := getGvk (blder .forInput . object , blder .mgr .GetScheme ())
200
236
if err != nil {
201
237
return "" , err
202
238
}
0 commit comments