Skip to content

Commit dc5b979

Browse files
authored
Merge pull request #12655 from Karthik-K-N/add-nil-check
🌱 Add input validations for desired state generator function
2 parents e6bd3f3 + e89e871 commit dc5b979

File tree

5 files changed

+37
-6
lines changed

5 files changed

+37
-6
lines changed

controllers/clustercache/cluster_cache_fake.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,8 @@ func NewFakeClusterCache(workloadClient client.Client, clusterKey client.ObjectK
4444
}
4545
return testCacheTracker
4646
}
47+
48+
// NewFakeEmptyClusterCache creates a new empty ClusterCache that can be used by unit tests.
49+
func NewFakeEmptyClusterCache() ClusterCache {
50+
return &clusterCache{}
51+
}

exp/topology/desiredstate/desired_state.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,21 @@ type Generator interface {
6363
}
6464

6565
// NewGenerator creates a new generator to generate desired state.
66-
func NewGenerator(client client.Client, clusterCache clustercache.ClusterCache, runtimeClient runtimeclient.Client) Generator {
66+
func NewGenerator(client client.Client, clusterCache clustercache.ClusterCache, runtimeClient runtimeclient.Client) (Generator, error) {
67+
if client == nil || clusterCache == nil {
68+
return nil, errors.New("Client and ClusterCache must not be nil")
69+
}
70+
71+
if feature.Gates.Enabled(feature.RuntimeSDK) && runtimeClient == nil {
72+
return nil, errors.New("RuntimeClient must not be nil")
73+
}
74+
6775
return &generator{
6876
Client: client,
6977
ClusterCache: clusterCache,
7078
RuntimeClient: runtimeClient,
7179
patchEngine: patches.NewEngine(runtimeClient),
72-
}
80+
}, nil
7381
}
7482

7583
// generator is a generator to generate desired state.

internal/controllers/topology/cluster/cluster_controller.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,11 @@ func (r *Reconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager, opt
156156
Scheme: mgr.GetScheme(),
157157
PredicateLogger: &predicateLog,
158158
}
159-
r.desiredStateGenerator = desiredstate.NewGenerator(r.Client, r.ClusterCache, r.RuntimeClient)
159+
r.desiredStateGenerator, err = desiredstate.NewGenerator(r.Client, r.ClusterCache, r.RuntimeClient)
160+
if err != nil {
161+
return errors.Wrap(err, "failed creating desired state generator")
162+
}
163+
160164
r.recorder = mgr.GetEventRecorderFor("topology/cluster-controller")
161165
r.ssaCache = ssa.NewCache("topology/cluster")
162166
return nil

internal/controllers/topology/cluster/reconcile_state_test.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import (
4747
clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2"
4848
runtimehooksv1 "sigs.k8s.io/cluster-api/api/runtime/hooks/v1alpha1"
4949
runtimev1 "sigs.k8s.io/cluster-api/api/runtime/v1beta2"
50+
"sigs.k8s.io/cluster-api/controllers/clustercache"
5051
"sigs.k8s.io/cluster-api/controllers/external"
5152
runtimecatalog "sigs.k8s.io/cluster-api/exp/runtime/catalog"
5253
"sigs.k8s.io/cluster-api/exp/topology/desiredstate"
@@ -1167,14 +1168,21 @@ func TestReconcile_callAfterClusterUpgrade(t *testing.T) {
11671168

11681169
fakeClient := fake.NewClientBuilder().WithObjects(tt.s.Current.Cluster).Build()
11691170

1171+
desiredStateGenerator, err := desiredstate.NewGenerator(
1172+
fakeClient,
1173+
clustercache.NewFakeEmptyClusterCache(),
1174+
fakeRuntimeClient,
1175+
)
1176+
g.Expect(err).ToNot(HaveOccurred())
1177+
11701178
r := &Reconciler{
11711179
Client: fakeClient,
11721180
APIReader: fakeClient,
11731181
RuntimeClient: fakeRuntimeClient,
1174-
desiredStateGenerator: desiredstate.NewGenerator(fakeClient, nil, fakeRuntimeClient),
1182+
desiredStateGenerator: desiredStateGenerator,
11751183
}
11761184

1177-
err := r.callAfterClusterUpgrade(ctx, tt.s)
1185+
err = r.callAfterClusterUpgrade(ctx, tt.s)
11781186
if tt.wantError {
11791187
g.Expect(err).To(HaveOccurred())
11801188
} else {

test/extension/handlers/topologymutation/handler_integration_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import (
5050
runtimehooksv1 "sigs.k8s.io/cluster-api/api/runtime/hooks/v1alpha1"
5151
runtimev1 "sigs.k8s.io/cluster-api/api/runtime/v1beta2"
5252
"sigs.k8s.io/cluster-api/controllers"
53+
"sigs.k8s.io/cluster-api/controllers/clustercache"
5354
runtimecatalog "sigs.k8s.io/cluster-api/exp/runtime/catalog"
5455
runtimeclient "sigs.k8s.io/cluster-api/exp/runtime/client"
5556
"sigs.k8s.io/cluster-api/exp/topology/desiredstate"
@@ -114,7 +115,12 @@ func TestHandler(t *testing.T) {
114115
clientWithV1Beta2ContractCRD := fake.NewClientBuilder().WithScheme(scheme).WithObjects(crd).Build()
115116

116117
// Create a desired state generator.
117-
desiredStateGenerator := desiredstate.NewGenerator(clientWithV1Beta2ContractCRD, nil, runtimeClient)
118+
desiredStateGenerator, err := desiredstate.NewGenerator(
119+
clientWithV1Beta2ContractCRD,
120+
clustercache.NewFakeEmptyClusterCache(),
121+
runtimeClient,
122+
)
123+
g.Expect(err).ToNot(HaveOccurred())
118124

119125
// Note: as of today we don't have to set any fields and also don't have to call
120126
// SetupWebhookWithManager because DefaultAndValidateVariables doesn't need any of that.

0 commit comments

Comments
 (0)