Skip to content

Commit 4920e6e

Browse files
authored
Merge pull request #8916 from sbueringer/pr-cluster-md-ms-cache-unstructured
🌱 Cache unstructured in Cluster, MD and MS controller
2 parents 9a6b99b + 49da5bc commit 4920e6e

17 files changed

+221
-106
lines changed

controllers/alias.go

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,20 @@ import (
4141

4242
// ClusterReconciler reconciles a Cluster object.
4343
type ClusterReconciler struct {
44-
Client client.Client
45-
APIReader client.Reader
44+
Client client.Client
45+
UnstructuredCachingClient client.Client
46+
APIReader client.Reader
4647

4748
// WatchFilterValue is the label value used to filter events prior to reconciliation.
4849
WatchFilterValue string
4950
}
5051

5152
func (r *ClusterReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error {
5253
return (&clustercontroller.Reconciler{
53-
Client: r.Client,
54-
APIReader: r.APIReader,
55-
WatchFilterValue: r.WatchFilterValue,
54+
Client: r.Client,
55+
UnstructuredCachingClient: r.UnstructuredCachingClient,
56+
APIReader: r.APIReader,
57+
WatchFilterValue: r.WatchFilterValue,
5658
}).SetupWithManager(ctx, mgr, options)
5759
}
5860

@@ -79,37 +81,41 @@ func (r *MachineReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manag
7981

8082
// MachineSetReconciler reconciles a MachineSet object.
8183
type MachineSetReconciler struct {
82-
Client client.Client
83-
APIReader client.Reader
84-
Tracker *remote.ClusterCacheTracker
84+
Client client.Client
85+
UnstructuredCachingClient client.Client
86+
APIReader client.Reader
87+
Tracker *remote.ClusterCacheTracker
8588

8689
// WatchFilterValue is the label value used to filter events prior to reconciliation.
8790
WatchFilterValue string
8891
}
8992

9093
func (r *MachineSetReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error {
9194
return (&machinesetcontroller.Reconciler{
92-
Client: r.Client,
93-
APIReader: r.APIReader,
94-
Tracker: r.Tracker,
95-
WatchFilterValue: r.WatchFilterValue,
95+
Client: r.Client,
96+
UnstructuredCachingClient: r.UnstructuredCachingClient,
97+
APIReader: r.APIReader,
98+
Tracker: r.Tracker,
99+
WatchFilterValue: r.WatchFilterValue,
96100
}).SetupWithManager(ctx, mgr, options)
97101
}
98102

99103
// MachineDeploymentReconciler reconciles a MachineDeployment object.
100104
type MachineDeploymentReconciler struct {
101-
Client client.Client
102-
APIReader client.Reader
105+
Client client.Client
106+
UnstructuredCachingClient client.Client
107+
APIReader client.Reader
103108

104109
// WatchFilterValue is the label value used to filter events prior to reconciliation.
105110
WatchFilterValue string
106111
}
107112

108113
func (r *MachineDeploymentReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, options controller.Options) error {
109114
return (&machinedeploymentcontroller.Reconciler{
110-
Client: r.Client,
111-
APIReader: r.APIReader,
112-
WatchFilterValue: r.WatchFilterValue,
115+
Client: r.Client,
116+
UnstructuredCachingClient: r.UnstructuredCachingClient,
117+
APIReader: r.APIReader,
118+
WatchFilterValue: r.WatchFilterValue,
113119
}).SetupWithManager(ctx, mgr, options)
114120
}
115121

internal/controllers/cluster/cluster_controller.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@ const (
6565

6666
// Reconciler reconciles a Cluster object.
6767
type Reconciler struct {
68-
Client client.Client
69-
APIReader client.Reader
68+
Client client.Client
69+
UnstructuredCachingClient client.Client
70+
APIReader client.Reader
7071

7172
// WatchFilterValue is the label value used to filter events prior to reconciliation.
7273
WatchFilterValue string
@@ -270,7 +271,7 @@ func (r *Reconciler) reconcileDelete(ctx context.Context, cluster *clusterv1.Clu
270271
}
271272

272273
if cluster.Spec.ControlPlaneRef != nil {
273-
obj, err := external.Get(ctx, r.Client, cluster.Spec.ControlPlaneRef, cluster.Namespace)
274+
obj, err := external.Get(ctx, r.UnstructuredCachingClient, cluster.Spec.ControlPlaneRef, cluster.Namespace)
274275
switch {
275276
case apierrors.IsNotFound(errors.Cause(err)):
276277
// All good - the control plane resource has been deleted
@@ -301,7 +302,7 @@ func (r *Reconciler) reconcileDelete(ctx context.Context, cluster *clusterv1.Clu
301302
}
302303

303304
if cluster.Spec.InfrastructureRef != nil {
304-
obj, err := external.Get(ctx, r.Client, cluster.Spec.InfrastructureRef, cluster.Namespace)
305+
obj, err := external.Get(ctx, r.UnstructuredCachingClient, cluster.Spec.InfrastructureRef, cluster.Namespace)
305306
switch {
306307
case apierrors.IsNotFound(errors.Cause(err)):
307308
// All good - the infra resource has been deleted

internal/controllers/cluster/cluster_controller_phases.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func (r *Reconciler) reconcileExternal(ctx context.Context, cluster *clusterv1.C
8383
return external.ReconcileOutput{}, err
8484
}
8585

86-
obj, err := external.Get(ctx, r.Client, ref, cluster.Namespace)
86+
obj, err := external.Get(ctx, r.UnstructuredCachingClient, ref, cluster.Namespace)
8787
if err != nil {
8888
if apierrors.IsNotFound(errors.Cause(err)) {
8989
log.Info("Could not find external object for cluster, requeuing", "refGroupVersionKind", ref.GroupVersionKind(), "refName", ref.Name)

internal/controllers/cluster/cluster_controller_phases_test.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,9 @@ func TestClusterReconcilePhases(t *testing.T) {
137137
Build()
138138
}
139139
r := &Reconciler{
140-
Client: c,
141-
recorder: record.NewFakeRecorder(32),
140+
Client: c,
141+
UnstructuredCachingClient: c,
142+
recorder: record.NewFakeRecorder(32),
142143
}
143144

144145
res, err := r.reconcileInfrastructure(ctx, tt.cluster)
@@ -217,8 +218,9 @@ func TestClusterReconcilePhases(t *testing.T) {
217218
Build()
218219
}
219220
r := &Reconciler{
220-
Client: c,
221-
recorder: record.NewFakeRecorder(32),
221+
Client: c,
222+
UnstructuredCachingClient: c,
223+
recorder: record.NewFakeRecorder(32),
222224
}
223225
res, err := r.reconcileKubeconfig(ctx, tt.cluster)
224226
if tt.wantErr {
@@ -368,8 +370,9 @@ func TestClusterReconciler_reconcilePhase(t *testing.T) {
368370
Build()
369371

370372
r := &Reconciler{
371-
Client: c,
372-
recorder: record.NewFakeRecorder(32),
373+
Client: c,
374+
UnstructuredCachingClient: c,
375+
recorder: record.NewFakeRecorder(32),
373376
}
374377
r.reconcilePhase(ctx, tt.cluster)
375378
g.Expect(tt.cluster.Status.GetTypedPhase()).To(Equal(tt.wantPhase))
@@ -483,9 +486,11 @@ func TestClusterReconcilePhases_reconcileFailureDomains(t *testing.T) {
483486
objs = append(objs, &unstructured.Unstructured{Object: tt.infraRef})
484487
}
485488

489+
c := fake.NewClientBuilder().WithObjects(objs...).Build()
486490
r := &Reconciler{
487-
Client: fake.NewClientBuilder().WithObjects(objs...).Build(),
488-
recorder: record.NewFakeRecorder(32),
491+
Client: c,
492+
UnstructuredCachingClient: c,
493+
recorder: record.NewFakeRecorder(32),
489494
}
490495

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

internal/controllers/cluster/cluster_controller_test.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -389,8 +389,9 @@ func TestClusterReconciler_reconcileDelete(t *testing.T) {
389389
g := NewWithT(t)
390390
fakeClient := fake.NewClientBuilder().WithObjects(fakeInfraCluster, tt.cluster).Build()
391391
r := &Reconciler{
392-
Client: fakeClient,
393-
APIReader: fakeClient,
392+
Client: fakeClient,
393+
UnstructuredCachingClient: fakeClient,
394+
APIReader: fakeClient,
394395
}
395396

396397
_, _ = r.reconcileDelete(ctx, tt.cluster)
@@ -524,8 +525,10 @@ func TestClusterReconcilerNodeRef(t *testing.T) {
524525
t.Run(tt.name, func(t *testing.T) {
525526
g := NewWithT(t)
526527

528+
c := fake.NewClientBuilder().WithObjects(cluster, controlPlaneWithNoderef, controlPlaneWithoutNoderef, nonControlPlaneWithNoderef, nonControlPlaneWithoutNoderef).Build()
527529
r := &Reconciler{
528-
Client: fake.NewClientBuilder().WithObjects(cluster, controlPlaneWithNoderef, controlPlaneWithoutNoderef, nonControlPlaneWithNoderef, nonControlPlaneWithoutNoderef).Build(),
530+
Client: c,
531+
UnstructuredCachingClient: c,
529532
}
530533
requests := r.controlPlaneMachineToCluster(ctx, tt.o)
531534
g.Expect(requests).To(Equal(tt.want))

internal/controllers/cluster/suite_test.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"k8s.io/apimachinery/pkg/runtime"
3030
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3131
ctrl "sigs.k8s.io/controller-runtime"
32+
"sigs.k8s.io/controller-runtime/pkg/client"
3233
"sigs.k8s.io/controller-runtime/pkg/controller"
3334

3435
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -81,15 +82,28 @@ func TestMain(m *testing.M) {
8182
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
8283
panic(fmt.Sprintf("Failed to start ClusterCacheReconciler: %v", err))
8384
}
85+
86+
unstructuredCachingClient, err := client.New(mgr.GetConfig(), client.Options{
87+
HTTPClient: mgr.GetHTTPClient(),
88+
Cache: &client.CacheOptions{
89+
Reader: mgr.GetCache(),
90+
Unstructured: true,
91+
},
92+
})
93+
if err != nil {
94+
panic(fmt.Sprintf("unable to create unstructuredCachineClient: %v", err))
95+
}
96+
8497
if err := (&Reconciler{
85-
Client: mgr.GetClient(),
86-
APIReader: mgr.GetClient(),
98+
Client: mgr.GetClient(),
99+
UnstructuredCachingClient: unstructuredCachingClient,
100+
APIReader: mgr.GetClient(),
87101
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
88102
panic(fmt.Sprintf("Failed to start ClusterReconciler: %v", err))
89103
}
90104
if err := (&machinecontroller.Reconciler{
91105
Client: mgr.GetClient(),
92-
UnstructuredCachingClient: mgr.GetClient(),
106+
UnstructuredCachingClient: unstructuredCachingClient,
93107
APIReader: mgr.GetAPIReader(),
94108
Tracker: tracker,
95109
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {

internal/controllers/machine/suite_test.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"k8s.io/apimachinery/pkg/runtime/schema"
3535
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3636
ctrl "sigs.k8s.io/controller-runtime"
37+
"sigs.k8s.io/controller-runtime/pkg/client"
3738
"sigs.k8s.io/controller-runtime/pkg/controller"
3839

3940
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -86,9 +87,21 @@ func TestMain(m *testing.M) {
8687
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
8788
panic(fmt.Sprintf("Failed to start ClusterCacheReconciler: %v", err))
8889
}
90+
91+
unstructuredCachingClient, err := client.New(mgr.GetConfig(), client.Options{
92+
HTTPClient: mgr.GetHTTPClient(),
93+
Cache: &client.CacheOptions{
94+
Reader: mgr.GetCache(),
95+
Unstructured: true,
96+
},
97+
})
98+
if err != nil {
99+
panic(fmt.Sprintf("unable to create unstructuredCachineClient: %v", err))
100+
}
101+
89102
if err := (&Reconciler{
90103
Client: mgr.GetClient(),
91-
UnstructuredCachingClient: mgr.GetClient(),
104+
UnstructuredCachingClient: unstructuredCachingClient,
92105
APIReader: mgr.GetAPIReader(),
93106
Tracker: tracker,
94107
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {

internal/controllers/machinedeployment/machinedeployment_controller.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ const machineDeploymentManagerName = "capi-machinedeployment"
6363

6464
// Reconciler reconciles a MachineDeployment object.
6565
type Reconciler struct {
66-
Client client.Client
67-
APIReader client.Reader
66+
Client client.Client
67+
UnstructuredCachingClient client.Client
68+
APIReader client.Reader
6869

6970
// WatchFilterValue is the label value used to filter events prior to reconciliation.
7071
WatchFilterValue string
@@ -213,12 +214,12 @@ func (r *Reconciler) reconcile(ctx context.Context, cluster *clusterv1.Cluster,
213214
}))
214215

215216
// Make sure to reconcile the external infrastructure reference.
216-
if err := reconcileExternalTemplateReference(ctx, r.Client, cluster, &md.Spec.Template.Spec.InfrastructureRef); err != nil {
217+
if err := reconcileExternalTemplateReference(ctx, r.UnstructuredCachingClient, cluster, &md.Spec.Template.Spec.InfrastructureRef); err != nil {
217218
return ctrl.Result{}, err
218219
}
219220
// Make sure to reconcile the external bootstrap reference, if any.
220221
if md.Spec.Template.Spec.Bootstrap.ConfigRef != nil {
221-
if err := reconcileExternalTemplateReference(ctx, r.Client, cluster, md.Spec.Template.Spec.Bootstrap.ConfigRef); err != nil {
222+
if err := reconcileExternalTemplateReference(ctx, r.UnstructuredCachingClient, cluster, md.Spec.Template.Spec.Bootstrap.ConfigRef); err != nil {
222223
return ctrl.Result{}, err
223224
}
224225
}

internal/controllers/machinedeployment/suite_test.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,30 @@ func TestMain(m *testing.M) {
8888
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
8989
panic(fmt.Sprintf("Failed to start ClusterCacheReconciler: %v", err))
9090
}
91+
92+
unstructuredCachingClient, err := client.New(mgr.GetConfig(), client.Options{
93+
HTTPClient: mgr.GetHTTPClient(),
94+
Cache: &client.CacheOptions{
95+
Reader: mgr.GetCache(),
96+
Unstructured: true,
97+
},
98+
})
99+
if err != nil {
100+
panic(fmt.Sprintf("unable to create unstructuredCachineClient: %v", err))
101+
}
102+
91103
if err := (&machinesetcontroller.Reconciler{
92-
Client: mgr.GetClient(),
93-
APIReader: mgr.GetAPIReader(),
94-
Tracker: tracker,
104+
Client: mgr.GetClient(),
105+
UnstructuredCachingClient: unstructuredCachingClient,
106+
APIReader: mgr.GetAPIReader(),
107+
Tracker: tracker,
95108
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
96109
panic(fmt.Sprintf("Failed to start MMachineSetReconciler: %v", err))
97110
}
98111
if err := (&Reconciler{
99-
Client: mgr.GetClient(),
100-
APIReader: mgr.GetAPIReader(),
112+
Client: mgr.GetClient(),
113+
UnstructuredCachingClient: unstructuredCachingClient,
114+
APIReader: mgr.GetAPIReader(),
101115
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
102116
panic(fmt.Sprintf("Failed to start MMachineDeploymentReconciler: %v", err))
103117
}

internal/controllers/machinehealthcheck/suite_test.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"k8s.io/apimachinery/pkg/runtime"
3030
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3131
ctrl "sigs.k8s.io/controller-runtime"
32+
"sigs.k8s.io/controller-runtime/pkg/client"
3233
"sigs.k8s.io/controller-runtime/pkg/controller"
3334

3435
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
@@ -84,9 +85,22 @@ func TestMain(m *testing.M) {
8485
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
8586
panic(fmt.Sprintf("Failed to start ClusterCacheReconciler: %v", err))
8687
}
88+
89+
unstructuredCachingClient, err := client.New(mgr.GetConfig(), client.Options{
90+
HTTPClient: mgr.GetHTTPClient(),
91+
Cache: &client.CacheOptions{
92+
Reader: mgr.GetCache(),
93+
Unstructured: true,
94+
},
95+
})
96+
if err != nil {
97+
panic(fmt.Sprintf("unable to create unstructuredCachineClient: %v", err))
98+
}
99+
87100
if err := (&clustercontroller.Reconciler{
88-
Client: mgr.GetClient(),
89-
APIReader: mgr.GetClient(),
101+
Client: mgr.GetClient(),
102+
UnstructuredCachingClient: unstructuredCachingClient,
103+
APIReader: mgr.GetClient(),
90104
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
91105
panic(fmt.Sprintf("Failed to start ClusterReconciler: %v", err))
92106
}
@@ -98,16 +112,17 @@ func TestMain(m *testing.M) {
98112
}
99113
if err := (&machinecontroller.Reconciler{
100114
Client: mgr.GetClient(),
101-
UnstructuredCachingClient: mgr.GetClient(),
115+
UnstructuredCachingClient: unstructuredCachingClient,
102116
APIReader: mgr.GetAPIReader(),
103117
Tracker: tracker,
104118
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
105119
panic(fmt.Sprintf("Failed to start MachineReconciler: %v", err))
106120
}
107121
if err := (&machinesetcontroller.Reconciler{
108-
Client: mgr.GetClient(),
109-
APIReader: mgr.GetAPIReader(),
110-
Tracker: tracker,
122+
Client: mgr.GetClient(),
123+
UnstructuredCachingClient: unstructuredCachingClient,
124+
APIReader: mgr.GetAPIReader(),
125+
Tracker: tracker,
111126
}).SetupWithManager(ctx, mgr, controller.Options{MaxConcurrentReconciles: 1}); err != nil {
112127
panic(fmt.Sprintf("Failed to start MMachineSetReconciler: %v", err))
113128
}

0 commit comments

Comments
 (0)