Skip to content

Commit d44453e

Browse files
committed
Make controller as mandatory param in external object tracker
1 parent 7b752c6 commit d44453e

File tree

8 files changed

+215
-7
lines changed

8 files changed

+215
-7
lines changed
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
Copyright 2024 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package fake
18+
19+
import (
20+
"sigs.k8s.io/controller-runtime/pkg/controller"
21+
"sigs.k8s.io/controller-runtime/pkg/source"
22+
)
23+
24+
// Controller implements controller.Controller interface.
25+
type Controller struct {
26+
controller.Controller
27+
}
28+
29+
// Watch helps in testing and does nothing but returns nil.
30+
func (c Controller) Watch(_ source.Source) error {
31+
return nil
32+
}

controllers/external/fake/doc.go

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
Copyright 2024 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
// Package fake provides a fake controllers for testing.
18+
package fake

controllers/external/tracker.go

+2-7
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,8 @@ type ObjectTracker struct {
4444

4545
// Watch uses the controller to issue a Watch only if the object hasn't been seen before.
4646
func (o *ObjectTracker) Watch(log logr.Logger, obj client.Object, handler handler.EventHandler, p ...predicate.Predicate) error {
47-
// Consider this a no-op if the controller isn't present.
48-
if o.Controller == nil {
49-
return nil
50-
}
51-
52-
if o.Cache == nil || o.Scheme == nil {
53-
return errors.New("both scheme and cache must be set for object tracker")
47+
if o.Controller == nil || o.Cache == nil || o.Scheme == nil {
48+
return errors.New("all of controller, cache and scheme must be set for object tracker")
5449
}
5550

5651
gvk := obj.GetObjectKind().GroupVersionKind()

exp/internal/controllers/machinepool_controller_phases_test.go

+103
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,19 @@ import (
2626
apierrors "k8s.io/apimachinery/pkg/api/errors"
2727
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2828
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
29+
"k8s.io/apimachinery/pkg/runtime"
2930
"k8s.io/apimachinery/pkg/types"
3031
"k8s.io/client-go/tools/record"
3132
"k8s.io/utils/ptr"
3233
ctrl "sigs.k8s.io/controller-runtime"
34+
"sigs.k8s.io/controller-runtime/pkg/cache/informertest"
3335
"sigs.k8s.io/controller-runtime/pkg/client"
3436
"sigs.k8s.io/controller-runtime/pkg/client/fake"
3537

3638
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
3739
"sigs.k8s.io/cluster-api/controllers/clustercache"
3840
"sigs.k8s.io/cluster-api/controllers/external"
41+
fakeController "sigs.k8s.io/cluster-api/controllers/external/fake"
3942
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
4043
"sigs.k8s.io/cluster-api/internal/test/builder"
4144
"sigs.k8s.io/cluster-api/internal/util/ssa"
@@ -128,6 +131,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
128131
r := &MachinePoolReconciler{
129132
Client: fakeClient,
130133
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
134+
externalTracker: external.ObjectTracker{
135+
Controller: fakeController.Controller{},
136+
Cache: &informertest.FakeInformers{},
137+
Scheme: runtime.NewScheme(),
138+
},
131139
}
132140

133141
scope := &scope{
@@ -165,6 +173,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
165173
r := &MachinePoolReconciler{
166174
Client: fakeClient,
167175
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
176+
externalTracker: external.ObjectTracker{
177+
Controller: fakeController.Controller{},
178+
Cache: &informertest.FakeInformers{},
179+
Scheme: runtime.NewScheme(),
180+
},
168181
}
169182

170183
scope := &scope{
@@ -199,6 +212,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
199212
r := &MachinePoolReconciler{
200213
Client: fakeClient,
201214
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
215+
externalTracker: external.ObjectTracker{
216+
Controller: fakeController.Controller{},
217+
Cache: &informertest.FakeInformers{},
218+
Scheme: runtime.NewScheme(),
219+
},
202220
}
203221

204222
scope := &scope{
@@ -249,6 +267,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
249267
r := &MachinePoolReconciler{
250268
Client: fakeClient,
251269
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
270+
externalTracker: external.ObjectTracker{
271+
Controller: fakeController.Controller{},
272+
Cache: &informertest.FakeInformers{},
273+
Scheme: runtime.NewScheme(),
274+
},
252275
}
253276

254277
scope := &scope{
@@ -311,6 +334,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
311334
r := &MachinePoolReconciler{
312335
Client: fakeClient,
313336
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
337+
externalTracker: external.ObjectTracker{
338+
Controller: fakeController.Controller{},
339+
Cache: &informertest.FakeInformers{},
340+
Scheme: runtime.NewScheme(),
341+
},
314342
}
315343

316344
scope := &scope{
@@ -351,6 +379,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
351379
r := &MachinePoolReconciler{
352380
Client: fakeClient,
353381
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
382+
externalTracker: external.ObjectTracker{
383+
Controller: fakeController.Controller{},
384+
Cache: &informertest.FakeInformers{},
385+
Scheme: runtime.NewScheme(),
386+
},
354387
}
355388

356389
scope := &scope{
@@ -398,6 +431,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
398431
r := &MachinePoolReconciler{
399432
Client: fakeClient,
400433
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
434+
externalTracker: external.ObjectTracker{
435+
Controller: fakeController.Controller{},
436+
Cache: &informertest.FakeInformers{},
437+
Scheme: runtime.NewScheme(),
438+
},
401439
}
402440

403441
scope := &scope{
@@ -458,6 +496,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
458496
r := &MachinePoolReconciler{
459497
Client: fakeClient,
460498
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
499+
externalTracker: external.ObjectTracker{
500+
Controller: fakeController.Controller{},
501+
Cache: &informertest.FakeInformers{},
502+
Scheme: runtime.NewScheme(),
503+
},
461504
}
462505

463506
scope := &scope{
@@ -524,6 +567,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
524567
r := &MachinePoolReconciler{
525568
Client: fakeClient,
526569
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
570+
externalTracker: external.ObjectTracker{
571+
Controller: fakeController.Controller{},
572+
Cache: &informertest.FakeInformers{},
573+
Scheme: runtime.NewScheme(),
574+
},
527575
}
528576

529577
scope := &scope{
@@ -588,6 +636,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
588636
r := &MachinePoolReconciler{
589637
Client: fakeClient,
590638
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
639+
externalTracker: external.ObjectTracker{
640+
Controller: fakeController.Controller{},
641+
Cache: &informertest.FakeInformers{},
642+
Scheme: runtime.NewScheme(),
643+
},
591644
}
592645

593646
scope := &scope{
@@ -674,6 +727,11 @@ func TestReconcileMachinePoolPhases(t *testing.T) {
674727
r := &MachinePoolReconciler{
675728
Client: fakeClient,
676729
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
730+
externalTracker: external.ObjectTracker{
731+
Controller: fakeController.Controller{},
732+
Cache: &informertest.FakeInformers{},
733+
Scheme: runtime.NewScheme(),
734+
},
677735
}
678736

679737
scope := &scope{
@@ -990,6 +1048,11 @@ func TestReconcileMachinePoolBootstrap(t *testing.T) {
9901048
bootstrapConfig := &unstructured.Unstructured{Object: tc.bootstrapConfig}
9911049
r := &MachinePoolReconciler{
9921050
Client: fake.NewClientBuilder().WithObjects(tc.machinepool, bootstrapConfig, builder.TestBootstrapConfigCRD, builder.TestInfrastructureMachineTemplateCRD).Build(),
1051+
externalTracker: external.ObjectTracker{
1052+
Controller: fakeController.Controller{},
1053+
Cache: &informertest.FakeInformers{},
1054+
Scheme: runtime.NewScheme(),
1055+
},
9931056
}
9941057

9951058
scope := &scope{
@@ -1285,6 +1348,11 @@ func TestReconcileMachinePoolInfrastructure(t *testing.T) {
12851348
r := &MachinePoolReconciler{
12861349
Client: fakeClient,
12871350
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: defaultCluster.Name, Namespace: defaultCluster.Namespace}),
1351+
externalTracker: external.ObjectTracker{
1352+
Controller: fakeController.Controller{},
1353+
Cache: &informertest.FakeInformers{},
1354+
Scheme: runtime.NewScheme(),
1355+
},
12881356
}
12891357

12901358
scope := &scope{
@@ -1368,6 +1436,11 @@ func TestReconcileMachinePoolMachines(t *testing.T) {
13681436
r := &MachinePoolReconciler{
13691437
Client: env,
13701438
ssaCache: ssa.NewCache(),
1439+
externalTracker: external.ObjectTracker{
1440+
Controller: fakeController.Controller{},
1441+
Cache: &informertest.FakeInformers{},
1442+
Scheme: runtime.NewScheme(),
1443+
},
13711444
}
13721445
scope := &scope{
13731446
machinePool: &machinePool,
@@ -1431,6 +1504,11 @@ func TestReconcileMachinePoolMachines(t *testing.T) {
14311504
r := &MachinePoolReconciler{
14321505
Client: env,
14331506
ssaCache: ssa.NewCache(),
1507+
externalTracker: external.ObjectTracker{
1508+
Controller: fakeController.Controller{},
1509+
Cache: &informertest.FakeInformers{},
1510+
Scheme: runtime.NewScheme(),
1511+
},
14341512
}
14351513

14361514
scope := &scope{
@@ -1789,6 +1867,11 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
17891867
Client: fakeClient,
17901868
ClusterCache: clustercache.NewFakeClusterCache(env.GetClient(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
17911869
recorder: record.NewFakeRecorder(32),
1870+
externalTracker: external.ObjectTracker{
1871+
Controller: fakeController.Controller{},
1872+
Cache: &informertest.FakeInformers{},
1873+
Scheme: runtime.NewScheme(),
1874+
},
17921875
}
17931876

17941877
scope := &scope{
@@ -1851,6 +1934,11 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
18511934
Client: fakeClient,
18521935
ClusterCache: clustercache.NewFakeClusterCache(env.GetClient(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
18531936
recorder: record.NewFakeRecorder(32),
1937+
externalTracker: external.ObjectTracker{
1938+
Controller: fakeController.Controller{},
1939+
Cache: &informertest.FakeInformers{},
1940+
Scheme: runtime.NewScheme(),
1941+
},
18541942
}
18551943

18561944
scope := &scope{
@@ -1896,6 +1984,11 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
18961984
Client: fakeClient,
18971985
recorder: record.NewFakeRecorder(32),
18981986
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
1987+
externalTracker: external.ObjectTracker{
1988+
Controller: fakeController.Controller{},
1989+
Cache: &informertest.FakeInformers{},
1990+
Scheme: runtime.NewScheme(),
1991+
},
18991992
}
19001993

19011994
scope := &scope{
@@ -1937,6 +2030,11 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
19372030
Client: fakeClient,
19382031
recorder: record.NewFakeRecorder(32),
19392032
ClusterCache: clustercache.NewFakeClusterCache(fakeClient, client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
2033+
externalTracker: external.ObjectTracker{
2034+
Controller: fakeController.Controller{},
2035+
Cache: &informertest.FakeInformers{},
2036+
Scheme: runtime.NewScheme(),
2037+
},
19402038
}
19412039

19422040
scope := &scope{
@@ -2000,6 +2098,11 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
20002098
Client: fakeClient,
20012099
ClusterCache: clustercache.NewFakeClusterCache(env.GetClient(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
20022100
recorder: record.NewFakeRecorder(32),
2101+
externalTracker: external.ObjectTracker{
2102+
Controller: fakeController.Controller{},
2103+
Cache: &informertest.FakeInformers{},
2104+
Scheme: runtime.NewScheme(),
2105+
},
20032106
}
20042107

20052108
scope := &scope{

exp/internal/controllers/machinepool_controller_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,16 @@ import (
3232
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3333
"k8s.io/utils/ptr"
3434
ctrl "sigs.k8s.io/controller-runtime"
35+
"sigs.k8s.io/controller-runtime/pkg/cache/informertest"
3536
"sigs.k8s.io/controller-runtime/pkg/client"
3637
"sigs.k8s.io/controller-runtime/pkg/client/fake"
3738
"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
3839
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3940

4041
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
4142
"sigs.k8s.io/cluster-api/controllers/clustercache"
43+
"sigs.k8s.io/cluster-api/controllers/external"
44+
fakeController "sigs.k8s.io/cluster-api/controllers/external/fake"
4245
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
4346
"sigs.k8s.io/cluster-api/internal/test/builder"
4447
"sigs.k8s.io/cluster-api/util"
@@ -556,6 +559,11 @@ func TestReconcileMachinePoolRequest(t *testing.T) {
556559
Client: clientFake,
557560
APIReader: clientFake,
558561
ClusterCache: clustercache.NewFakeClusterCache(trackerClientFake, client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
562+
externalTracker: external.ObjectTracker{
563+
Controller: fakeController.Controller{},
564+
Cache: &informertest.FakeInformers{},
565+
Scheme: runtime.NewScheme(),
566+
},
559567
}
560568

561569
result, err := r.Reconcile(ctx, reconcile.Request{NamespacedName: util.ObjectKey(&tc.machinePool)})
@@ -1103,6 +1111,11 @@ func TestMachinePoolConditions(t *testing.T) {
11031111
Client: clientFake,
11041112
APIReader: clientFake,
11051113
ClusterCache: clustercache.NewFakeClusterCache(clientFake, client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
1114+
externalTracker: external.ObjectTracker{
1115+
Controller: fakeController.Controller{},
1116+
Cache: &informertest.FakeInformers{},
1117+
Scheme: runtime.NewScheme(),
1118+
},
11061119
}
11071120

11081121
_, err := r.Reconcile(ctx, reconcile.Request{NamespacedName: util.ObjectKey(machinePool)})

0 commit comments

Comments
 (0)