Skip to content

Commit b2b4bdf

Browse files
authored
Merge pull request #440 from alenkacz/av/set-ownership
operator/controller: Set ownerReference for created objects
2 parents ac01e48 + 94d411c commit b2b4bdf

File tree

2 files changed

+54
-16
lines changed

2 files changed

+54
-16
lines changed

src/go/k8s/controllers/redpanda/cluster_controller.go

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
// the Business Source License, use of this software will be governed
88
// by the Apache License, Version 2.0
99

10-
// Package redpanda is responsible for Reconcile the redpanda.vectorized.io Custom Resource Definition
10+
// Package redpanda contains reconciliation logic for redpanda.vectorized.io CRD
1111
package redpanda
1212

1313
import (
@@ -32,6 +32,7 @@ import (
3232
"k8s.io/utils/pointer"
3333
ctrl "sigs.k8s.io/controller-runtime"
3434
"sigs.k8s.io/controller-runtime/pkg/client"
35+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3536
)
3637

3738
const (
@@ -91,7 +92,7 @@ func (r *ClusterReconciler) Reconcile(
9192
if errors.IsNotFound(err) {
9293
log.V(debugLevel).Info("Creating headless service")
9394

94-
if err = r.createHeadlessService(ctx, &redpandaCluster); err != nil {
95+
if err = r.createHeadlessService(ctx, &redpandaCluster, r.Scheme); err != nil {
9596
log.Error(err, "Failed to create new service",
9697
"Service.Namespace", redpandaCluster.Namespace,
9798
"Service.Name", redpandaCluster.Name)
@@ -112,7 +113,7 @@ func (r *ClusterReconciler) Reconcile(
112113
if errors.IsNotFound(err) {
113114
log.V(debugLevel).Info("Creating seed redpanda ConfigMap")
114115

115-
if err = r.createBootstrapConfigMap(ctx, &redpandaCluster); err != nil {
116+
if err = r.createBootstrapConfigMap(ctx, &redpandaCluster, r.Scheme); err != nil {
116117
log.Error(err, "Failed to create new seed redpanda ConfigMap",
117118
"Configmap.Namespace", redpandaCluster.Namespace,
118119
"Configmap.Name", redpandaCluster.Name+seedSuffix)
@@ -133,7 +134,7 @@ func (r *ClusterReconciler) Reconcile(
133134
if errors.IsNotFound(err) {
134135
log.V(debugLevel).Info("Creating bootstrap StatefulSet")
135136

136-
if err = r.createBootstrapStatefulSet(ctx, &redpandaCluster); err != nil {
137+
if err = r.createBootstrapStatefulSet(ctx, &redpandaCluster, r.Scheme); err != nil {
137138
log.Error(err, "Failed to create new bootstrap StatefulSet",
138139
"Configmap.Namespace", redpandaCluster.Namespace, "StatefulSet.Name", redpandaCluster.Name+seedSuffix)
139140

@@ -181,9 +182,11 @@ func (r *ClusterReconciler) Reconcile(
181182
}
182183

183184
func (r *ClusterReconciler) createHeadlessService(
184-
ctx context.Context, clusterSpec *redpandav1alpha1.Cluster,
185+
ctx context.Context,
186+
clusterSpec *redpandav1alpha1.Cluster,
187+
scheme *runtime.Scheme,
185188
) error {
186-
return r.Create(ctx, &corev1.Service{
189+
svc := &corev1.Service{
187190
ObjectMeta: metav1.ObjectMeta{
188191
Namespace: clusterSpec.Namespace,
189192
Name: clusterSpec.Name,
@@ -201,11 +204,18 @@ func (r *ClusterReconciler) createHeadlessService(
201204
},
202205
Selector: clusterSpec.Labels,
203206
},
204-
})
207+
}
208+
err := controllerutil.SetControllerReference(clusterSpec, svc, scheme)
209+
if err != nil {
210+
return err
211+
}
212+
return r.Create(ctx, svc)
205213
}
206214

207215
func (r *ClusterReconciler) createBootstrapConfigMap(
208-
ctx context.Context, cluster *redpandav1alpha1.Cluster,
216+
ctx context.Context,
217+
cluster *redpandav1alpha1.Cluster,
218+
scheme *runtime.Scheme,
209219
) error {
210220
cfg := config.Default()
211221
cfg.Redpanda = copyConfig(&cluster.Spec.Configuration, &cfg.Redpanda)
@@ -225,7 +235,7 @@ func (r *ClusterReconciler) createBootstrapConfigMap(
225235
return err
226236
}
227237

228-
return r.Create(ctx, &corev1.ConfigMap{
238+
cm := &corev1.ConfigMap{
229239
ObjectMeta: metav1.ObjectMeta{
230240
Namespace: cluster.Namespace,
231241
Name: cluster.Name + seedSuffix,
@@ -234,7 +244,13 @@ func (r *ClusterReconciler) createBootstrapConfigMap(
234244
Data: map[string]string{
235245
"redpanda.yaml": string(cfgBytes),
236246
},
237-
})
247+
}
248+
err = controllerutil.SetControllerReference(cluster, cm, scheme)
249+
if err != nil {
250+
return err
251+
}
252+
253+
return r.Create(ctx, cm)
238254
}
239255

240256
func copyConfig(
@@ -276,14 +292,16 @@ func copyConfig(
276292

277293
// nolint:funlen // The definition needs further refinement
278294
func (r *ClusterReconciler) createBootstrapStatefulSet(
279-
ctx context.Context, cluster *redpandav1alpha1.Cluster,
295+
ctx context.Context,
296+
cluster *redpandav1alpha1.Cluster,
297+
scheme *runtime.Scheme,
280298
) error {
281299
memory, exist := cluster.Spec.Resources.Limits["memory"]
282300
if !exist {
283301
memory = resource.MustParse("2Gi")
284302
}
285303

286-
return r.Create(ctx, &appsv1.StatefulSet{
304+
ss := &appsv1.StatefulSet{
287305
ObjectMeta: metav1.ObjectMeta{
288306
Namespace: cluster.Namespace,
289307
Name: cluster.Name + seedSuffix,
@@ -405,7 +423,14 @@ func (r *ClusterReconciler) createBootstrapStatefulSet(
405423
},
406424
},
407425
},
408-
})
426+
}
427+
428+
err := controllerutil.SetControllerReference(cluster, ss, scheme)
429+
if err != nil {
430+
return err
431+
}
432+
433+
return r.Create(ctx, ss)
409434
}
410435

411436
// SetupWithManager sets up the controller with the Manager.

src/go/k8s/controllers/redpanda/cluster_controller_test.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ var _ = Describe("RedPandaCluster controller", func() {
8585
err := k8sClient.Get(context.Background(), key, &svc)
8686
return err == nil &&
8787
svc.Spec.ClusterIP == corev1.ClusterIPNone &&
88-
svc.Spec.Ports[0].Port == kafkaPort
88+
svc.Spec.Ports[0].Port == kafkaPort &&
89+
validOwner(redpandaCluster, svc.OwnerReferences)
8990
}, timeout, interval).Should(BeTrue())
9091

9192
By("Creating Configmap with the redpanda configuration")
@@ -96,7 +97,8 @@ var _ = Describe("RedPandaCluster controller", func() {
9697
return false
9798
}
9899
_, exist := cm.Data[redpandaConfigurationFile]
99-
return exist
100+
return exist &&
101+
validOwner(redpandaCluster, cm.OwnerReferences)
100102
}, timeout, interval).Should(BeTrue())
101103

102104
By("Creating StatefulSet")
@@ -105,11 +107,22 @@ var _ = Describe("RedPandaCluster controller", func() {
105107
err := k8sClient.Get(context.Background(), seedKey, &sts)
106108
return err == nil &&
107109
*sts.Spec.Replicas == replicas &&
108-
sts.Spec.Template.Spec.Containers[0].Image == "vectorized/redpanda:"+redpandaContainerTag
110+
sts.Spec.Template.Spec.Containers[0].Image == "vectorized/redpanda:"+redpandaContainerTag &&
111+
validOwner(redpandaCluster, sts.OwnerReferences)
109112
}, timeout, interval).Should(BeTrue())
110113

111114
Expect(sts.Spec.Template.Spec.Containers[0].Resources.Requests).Should(Equal(resources))
112115
Expect(sts.Spec.Template.Spec.Containers[0].Resources.Limits).Should(Equal(resources))
113116
})
114117
})
115118
})
119+
120+
func validOwner(
121+
cluster *v1alpha1.Cluster, owners []metav1.OwnerReference,
122+
) bool {
123+
if len(owners) != 1 {
124+
return false
125+
}
126+
owner := owners[0]
127+
return owner.Name == cluster.Name && owner.Controller != nil && *owner.Controller
128+
}

0 commit comments

Comments
 (0)