Skip to content

Commit d273cb7

Browse files
committed
Make controller mandatory param in object tracker
1 parent ff4645c commit d273cb7

9 files changed

+128
-7
lines changed

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, scheme and cache must be set for object tracker")
5449
}
5550

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

exp/internal/controllers/machinepool_controller_phases_test.go

+37
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ import (
2727
apierrors "k8s.io/apimachinery/pkg/api/errors"
2828
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2929
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
30+
"k8s.io/apimachinery/pkg/runtime"
3031
"k8s.io/apimachinery/pkg/types"
3132
"k8s.io/client-go/tools/record"
3233
"k8s.io/utils/ptr"
3334
ctrl "sigs.k8s.io/controller-runtime"
35+
"sigs.k8s.io/controller-runtime/pkg/cache/informertest"
3436
"sigs.k8s.io/controller-runtime/pkg/client"
3537
"sigs.k8s.io/controller-runtime/pkg/client/fake"
3638
"sigs.k8s.io/controller-runtime/pkg/log"
@@ -1370,6 +1372,11 @@ func TestReconcileMachinePoolMachines(t *testing.T) {
13701372
r := &MachinePoolReconciler{
13711373
Client: env,
13721374
ssaCache: ssa.NewCache(),
1375+
externalTracker: external.ObjectTracker{
1376+
Controller: fakeController{},
1377+
Cache: &informertest.FakeInformers{},
1378+
Scheme: runtime.NewScheme(),
1379+
},
13731380
}
13741381
scope := &scope{
13751382
machinePool: &machinePool,
@@ -1433,6 +1440,11 @@ func TestReconcileMachinePoolMachines(t *testing.T) {
14331440
r := &MachinePoolReconciler{
14341441
Client: env,
14351442
ssaCache: ssa.NewCache(),
1443+
externalTracker: external.ObjectTracker{
1444+
Controller: fakeController{},
1445+
Cache: &informertest.FakeInformers{},
1446+
Scheme: runtime.NewScheme(),
1447+
},
14361448
}
14371449

14381450
scope := &scope{
@@ -1791,6 +1803,11 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
17911803
Client: fakeClient,
17921804
Tracker: remote.NewTestClusterCacheTracker(logr.New(log.NullLogSink{}), env.GetClient(), env.GetClient(), env.GetClient().Scheme(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
17931805
recorder: record.NewFakeRecorder(32),
1806+
externalTracker: external.ObjectTracker{
1807+
Controller: fakeController{},
1808+
Cache: &informertest.FakeInformers{},
1809+
Scheme: runtime.NewScheme(),
1810+
},
17941811
}
17951812

17961813
scope := &scope{
@@ -1853,6 +1870,11 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
18531870
Client: fakeClient,
18541871
Tracker: remote.NewTestClusterCacheTracker(logr.New(log.NullLogSink{}), env.GetClient(), env.GetClient(), env.GetClient().Scheme(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
18551872
recorder: record.NewFakeRecorder(32),
1873+
externalTracker: external.ObjectTracker{
1874+
Controller: fakeController{},
1875+
Cache: &informertest.FakeInformers{},
1876+
Scheme: runtime.NewScheme(),
1877+
},
18561878
}
18571879

18581880
scope := &scope{
@@ -1898,6 +1920,11 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
18981920
Client: fakeClient,
18991921
recorder: record.NewFakeRecorder(32),
19001922
Tracker: remote.NewTestClusterCacheTracker(logr.New(log.NullLogSink{}), fakeClient, fakeClient, fakeClient.Scheme(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
1923+
externalTracker: external.ObjectTracker{
1924+
Controller: fakeController{},
1925+
Cache: &informertest.FakeInformers{},
1926+
Scheme: runtime.NewScheme(),
1927+
},
19011928
}
19021929

19031930
scope := &scope{
@@ -1939,6 +1966,11 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
19391966
Client: fakeClient,
19401967
recorder: record.NewFakeRecorder(32),
19411968
Tracker: remote.NewTestClusterCacheTracker(logr.New(log.NullLogSink{}), fakeClient, fakeClient, fakeClient.Scheme(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
1969+
externalTracker: external.ObjectTracker{
1970+
Controller: fakeController{},
1971+
Cache: &informertest.FakeInformers{},
1972+
Scheme: runtime.NewScheme(),
1973+
},
19421974
}
19431975

19441976
scope := &scope{
@@ -2002,6 +2034,11 @@ func TestReconcileMachinePoolScaleToFromZero(t *testing.T) {
20022034
Client: fakeClient,
20032035
Tracker: remote.NewTestClusterCacheTracker(logr.New(log.NullLogSink{}), env.GetClient(), env.GetClient(), env.GetClient().Scheme(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
20042036
recorder: record.NewFakeRecorder(32),
2037+
externalTracker: external.ObjectTracker{
2038+
Controller: fakeController{},
2039+
Cache: &informertest.FakeInformers{},
2040+
Scheme: runtime.NewScheme(),
2041+
},
20052042
}
20062043

20072044
scope := &scope{

exp/internal/controllers/machinepool_controller_test.go

+12
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ 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"
42+
"sigs.k8s.io/cluster-api/controllers/external"
4143
"sigs.k8s.io/cluster-api/controllers/remote"
4244
expv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
4345
"sigs.k8s.io/cluster-api/internal/test/builder"
@@ -556,6 +558,11 @@ func TestReconcileMachinePoolRequest(t *testing.T) {
556558
Client: clientFake,
557559
APIReader: clientFake,
558560
Tracker: remote.NewTestClusterCacheTracker(ctrl.LoggerFrom(ctx), clientFake, trackerClientFake, clientFake.Scheme(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
561+
externalTracker: external.ObjectTracker{
562+
Controller: fakeController{},
563+
Cache: &informertest.FakeInformers{},
564+
Scheme: runtime.NewScheme(),
565+
},
559566
}
560567

561568
result, err := r.Reconcile(ctx, reconcile.Request{NamespacedName: util.ObjectKey(&tc.machinePool)})
@@ -1103,6 +1110,11 @@ func TestMachinePoolConditions(t *testing.T) {
11031110
Client: clientFake,
11041111
APIReader: clientFake,
11051112
Tracker: remote.NewTestClusterCacheTracker(ctrl.LoggerFrom(ctx), clientFake, clientFake, clientFake.Scheme(), client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
1113+
externalTracker: external.ObjectTracker{
1114+
Controller: fakeController{},
1115+
Cache: &informertest.FakeInformers{},
1116+
Scheme: runtime.NewScheme(),
1117+
},
11061118
}
11071119

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

exp/internal/controllers/suite_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424

2525
ctrl "sigs.k8s.io/controller-runtime"
2626
"sigs.k8s.io/controller-runtime/pkg/controller"
27+
"sigs.k8s.io/controller-runtime/pkg/source"
2728

2829
"sigs.k8s.io/cluster-api/api/v1beta1/index"
2930
"sigs.k8s.io/cluster-api/internal/test/envtest"
@@ -59,3 +60,11 @@ func TestMain(m *testing.M) {
5960
SetupReconcilers: setupReconcilers,
6061
}))
6162
}
63+
64+
type fakeController struct {
65+
controller.Controller
66+
}
67+
68+
func (c fakeController) Watch(_ source.Source) error {
69+
return nil
70+
}

internal/controllers/cluster/cluster_controller_phases_test.go

+18
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@ import (
2424
corev1 "k8s.io/api/core/v1"
2525
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2626
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
27+
"k8s.io/apimachinery/pkg/runtime"
2728
"k8s.io/client-go/tools/record"
2829
ctrl "sigs.k8s.io/controller-runtime"
30+
"sigs.k8s.io/controller-runtime/pkg/cache/informertest"
2931
"sigs.k8s.io/controller-runtime/pkg/client"
3032
"sigs.k8s.io/controller-runtime/pkg/client/fake"
3133

3234
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
35+
"sigs.k8s.io/cluster-api/controllers/external"
3336
capierrors "sigs.k8s.io/cluster-api/errors"
3437
"sigs.k8s.io/cluster-api/internal/test/builder"
3538
"sigs.k8s.io/cluster-api/util/conditions"
@@ -205,6 +208,11 @@ func TestClusterReconcilePhases(t *testing.T) {
205208
r := &Reconciler{
206209
Client: c,
207210
recorder: record.NewFakeRecorder(32),
211+
externalTracker: external.ObjectTracker{
212+
Controller: fakeController{},
213+
Cache: &informertest.FakeInformers{},
214+
Scheme: runtime.NewScheme(),
215+
},
208216
}
209217

210218
res, err := r.reconcileInfrastructure(ctx, tt.cluster)
@@ -396,6 +404,11 @@ func TestClusterReconcilePhases(t *testing.T) {
396404
r := &Reconciler{
397405
Client: c,
398406
recorder: record.NewFakeRecorder(32),
407+
externalTracker: external.ObjectTracker{
408+
Controller: fakeController{},
409+
Cache: &informertest.FakeInformers{},
410+
Scheme: runtime.NewScheme(),
411+
},
399412
}
400413

401414
res, err := r.reconcileControlPlane(ctx, tt.cluster)
@@ -768,6 +781,11 @@ func TestClusterReconcilePhases_reconcileFailureDomains(t *testing.T) {
768781
r := &Reconciler{
769782
Client: c,
770783
recorder: record.NewFakeRecorder(32),
784+
externalTracker: external.ObjectTracker{
785+
Controller: fakeController{},
786+
Cache: &informertest.FakeInformers{},
787+
Scheme: runtime.NewScheme(),
788+
},
771789
}
772790

773791
_, err := r.reconcileInfrastructure(ctx, tt.cluster)

internal/controllers/cluster/suite_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3030
ctrl "sigs.k8s.io/controller-runtime"
3131
"sigs.k8s.io/controller-runtime/pkg/controller"
32+
"sigs.k8s.io/controller-runtime/pkg/source"
3233

3334
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
3435
"sigs.k8s.io/cluster-api/api/v1beta1/index"
@@ -105,3 +106,11 @@ func TestMain(m *testing.M) {
105106
SetupReconcilers: setupReconcilers,
106107
}))
107108
}
109+
110+
type fakeController struct {
111+
controller.Controller
112+
}
113+
114+
func (c fakeController) Watch(_ source.Source) error {
115+
return nil
116+
}

internal/controllers/machine/machine_controller_phases_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,15 @@ import (
2626
corev1 "k8s.io/api/core/v1"
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/utils/ptr"
3031
ctrl "sigs.k8s.io/controller-runtime"
32+
"sigs.k8s.io/controller-runtime/pkg/cache/informertest"
3133
"sigs.k8s.io/controller-runtime/pkg/client"
3234
"sigs.k8s.io/controller-runtime/pkg/client/fake"
3335

3436
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
37+
"sigs.k8s.io/cluster-api/controllers/external"
3538
"sigs.k8s.io/cluster-api/internal/test/builder"
3639
"sigs.k8s.io/cluster-api/util"
3740
"sigs.k8s.io/cluster-api/util/conditions"
@@ -850,6 +853,11 @@ func TestReconcileBootstrap(t *testing.T) {
850853

851854
r := &Reconciler{
852855
Client: c,
856+
externalTracker: external.ObjectTracker{
857+
Controller: fakeController{},
858+
Cache: &informertest.FakeInformers{},
859+
Scheme: runtime.NewScheme(),
860+
},
853861
}
854862
s := &scope{cluster: defaultCluster, machine: tc.machine}
855863
res, err := r.reconcileBootstrap(ctx, s)
@@ -1350,6 +1358,11 @@ func TestReconcileInfrastructure(t *testing.T) {
13501358

13511359
r := &Reconciler{
13521360
Client: c,
1361+
externalTracker: external.ObjectTracker{
1362+
Controller: fakeController{},
1363+
Cache: &informertest.FakeInformers{},
1364+
Scheme: runtime.NewScheme(),
1365+
},
13531366
}
13541367
s := &scope{cluster: defaultCluster, machine: tc.machine}
13551368
result, err := r.reconcileInfrastructure(ctx, s)

internal/controllers/machine/machine_controller_test.go

+19
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@ import (
2929
apierrors "k8s.io/apimachinery/pkg/api/errors"
3030
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3131
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
32+
"k8s.io/apimachinery/pkg/runtime"
3233
"k8s.io/client-go/kubernetes/scheme"
3334
"k8s.io/client-go/tools/record"
3435
"k8s.io/utils/ptr"
3536
ctrl "sigs.k8s.io/controller-runtime"
37+
"sigs.k8s.io/controller-runtime/pkg/cache/informertest"
3638
"sigs.k8s.io/controller-runtime/pkg/client"
3739
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
3840
"sigs.k8s.io/controller-runtime/pkg/client/fake"
@@ -42,6 +44,7 @@ import (
4244

4345
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
4446
"sigs.k8s.io/cluster-api/api/v1beta1/index"
47+
"sigs.k8s.io/cluster-api/controllers/external"
4548
"sigs.k8s.io/cluster-api/controllers/remote"
4649
"sigs.k8s.io/cluster-api/internal/controllers/machine/drain"
4750
"sigs.k8s.io/cluster-api/internal/test/builder"
@@ -916,6 +919,11 @@ func TestReconcileRequest(t *testing.T) {
916919
Client: clientFake,
917920
Tracker: remote.NewTestClusterCacheTracker(logr.New(log.NullLogSink{}), clientFake, clientFake, scheme.Scheme, client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
918921
ssaCache: ssa.NewCache(),
922+
externalTracker: external.ObjectTracker{
923+
Controller: fakeController{},
924+
Cache: &informertest.FakeInformers{},
925+
Scheme: runtime.NewScheme(),
926+
},
919927
}
920928

921929
result, err := r.Reconcile(ctx, reconcile.Request{NamespacedName: util.ObjectKey(&tc.machine)})
@@ -1196,6 +1204,11 @@ func TestMachineConditions(t *testing.T) {
11961204
recorder: record.NewFakeRecorder(10),
11971205
Tracker: remote.NewTestClusterCacheTracker(logr.New(log.NullLogSink{}), clientFake, clientFake, scheme.Scheme, client.ObjectKey{Name: testCluster.Name, Namespace: testCluster.Namespace}),
11981206
ssaCache: ssa.NewCache(),
1207+
externalTracker: external.ObjectTracker{
1208+
Controller: fakeController{},
1209+
Cache: &informertest.FakeInformers{},
1210+
Scheme: runtime.NewScheme(),
1211+
},
11991212
}
12001213

12011214
_, err := r.Reconcile(ctx, reconcile.Request{NamespacedName: util.ObjectKey(&machine)})
@@ -1287,8 +1300,14 @@ func TestReconcileDeleteExternal(t *testing.T) {
12871300
}
12881301

12891302
c := fake.NewClientBuilder().WithObjects(objs...).Build()
1303+
12901304
r := &Reconciler{
12911305
Client: c,
1306+
externalTracker: external.ObjectTracker{
1307+
Controller: fakeController{},
1308+
Cache: &informertest.FakeInformers{},
1309+
Scheme: runtime.NewScheme(),
1310+
},
12921311
}
12931312

12941313
obj, err := r.reconcileDeleteExternal(ctx, testCluster, machine, machine.Spec.Bootstrap.ConfigRef)

internal/controllers/machine/suite_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3535
ctrl "sigs.k8s.io/controller-runtime"
3636
"sigs.k8s.io/controller-runtime/pkg/controller"
37+
"sigs.k8s.io/controller-runtime/pkg/source"
3738

3839
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
3940
"sigs.k8s.io/cluster-api/api/v1beta1/index"
@@ -143,3 +144,11 @@ func (matcher *refGroupKindMatcher) FailureMessage(actual interface{}) (message
143144
func (matcher *refGroupKindMatcher) NegatedFailureMessage(actual interface{}) (message string) {
144145
return fmt.Sprintf("Expected %+v not to contain refs of Group %s and Kind %s", actual, matcher.group, matcher.kind)
145146
}
147+
148+
type fakeController struct {
149+
controller.Controller
150+
}
151+
152+
func (c fakeController) Watch(_ source.Source) error {
153+
return nil
154+
}

0 commit comments

Comments
 (0)