Skip to content

Commit 22ecefd

Browse files
authored
Add support for custom Service labels via spec.service.labels (#1859)
* Added to types and controller ran tests pushing to work on another terminal * added check for user manipulation of internal services * add support for merging user provided service labels without overwriting internal labels
1 parent 41a1409 commit 22ecefd

File tree

6 files changed

+72
-0
lines changed

6 files changed

+72
-0
lines changed

api/v1beta1/rabbitmqcluster_types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,8 @@ type RabbitmqClusterServiceSpec struct {
422422
// See also: https://pkg.go.dev/k8s.io/api/core/v1#IPFamilyPolicy
423423
// +kubebuilder:validation:Enum=SingleStack;PreferDualStack;RequireDualStack
424424
IPFamilyPolicy *corev1.IPFamilyPolicy `json:"ipFamilyPolicy,omitempty"`
425+
// +optional
426+
Labels map[string]string `json:"labels,omitempty"`
425427
}
426428

427429
func (cluster *RabbitmqCluster) TLSEnabled() bool {

api/v1beta1/zz_generated.deepcopy.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/rabbitmq.com_rabbitmqclusters.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5155,6 +5155,10 @@ spec:
51555155
- PreferDualStack
51565156
- RequireDualStack
51575157
type: string
5158+
labels:
5159+
additionalProperties:
5160+
type: string
5161+
type: object
51585162
type:
51595163
default: ClusterIP
51605164
description: |-

docs/api/rabbitmq.com.ref.asciidoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ For more info see https://pkg.go.dev/k8s.io/api/core/v1#ServiceType
347347
| *`annotations`* __object (keys:string, values:string)__ | Annotations to add to the Service.
348348
| *`ipFamilyPolicy`* __link:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#ipfamilypolicy-v1-core[$$IPFamilyPolicy$$]__ | IPFamilyPolicy represents the dual-stack-ness requested or required by a Service
349349
See also: https://pkg.go.dev/k8s.io/api/core/v1#IPFamilyPolicy
350+
| *`labels`* __object (keys:string, values:string)__ |
350351
|===
351352

352353

internal/resource/service.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ func (builder *ServiceBuilder) Update(object client.Object) error {
5656
service := object.(*corev1.Service)
5757
builder.setAnnotations(service)
5858
service.Labels = metadata.GetLabels(builder.Instance.Name, builder.Instance.Labels)
59+
60+
if builder.Instance.Spec.Service.Labels != nil {
61+
for k, v := range builder.Instance.Spec.Service.Labels {
62+
if _, exists := service.Labels[k]; !exists {
63+
service.Labels[k] = v
64+
}
65+
}
66+
}
67+
5968
service.Spec.Type = builder.Instance.Spec.Service.Type
6069
service.Spec.Selector = metadata.LabelSelector(builder.Instance.Name)
6170
service.Spec.IPFamilyPolicy = builder.Instance.Spec.Service.IPFamilyPolicy

internal/resource/service_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,25 @@ var _ = Context("Services", func() {
478478
It("deletes the labels that are removed from the CR", func() {
479479
Expect(svc.Labels).NotTo(HaveKey("this-was-the-previous-label"))
480480
})
481+
482+
It("merges user provided service labels without overwriting internal labels", func() {
483+
userServiceLabels := map[string]string{
484+
"user-label": "user-value",
485+
"app.kubernetes.io/part-of": "should-not-overwrite",
486+
}
487+
488+
expectedLabels := map[string]string{
489+
"app.kubernetes.io/name": "foo",
490+
"app.kubernetes.io/component": "rabbitmq",
491+
"app.kubernetes.io/part-of": "rabbitmq",
492+
"user-label": "user-value",
493+
}
494+
495+
service := updateServiceWithLabels(builder, nil, userServiceLabels)
496+
497+
Expect(service.ObjectMeta.Labels).To(Equal(expectedLabels))
498+
})
499+
481500
})
482501

483502
Context("Service Type", func() {
@@ -902,3 +921,33 @@ func updateServiceWithAnnotations(rmqBuilder resource.RabbitmqResourceBuilder, i
902921
Expect(serviceBuilder.Update(svc)).To(Succeed())
903922
return svc
904923
}
924+
925+
func updateServiceWithLabels(rmqBuilder resource.RabbitmqResourceBuilder, instanceLabels, serviceLabels map[string]string) *corev1.Service {
926+
instance := &rabbitmqv1beta1.RabbitmqCluster{
927+
ObjectMeta: metav1.ObjectMeta{
928+
Name: "foo",
929+
Namespace: "foo-namespace",
930+
Labels: instanceLabels,
931+
},
932+
Spec: rabbitmqv1beta1.RabbitmqClusterSpec{
933+
Service: rabbitmqv1beta1.RabbitmqClusterServiceSpec{
934+
Labels: serviceLabels,
935+
},
936+
},
937+
}
938+
939+
rmqBuilder.Instance = instance
940+
serviceBuilder := rmqBuilder.Service()
941+
svc := &corev1.Service{
942+
ObjectMeta: metav1.ObjectMeta{
943+
Name: "foo-service",
944+
Namespace: "foo-namespace",
945+
Labels: map[string]string{
946+
"app.kubernetes.io/name": "do-not-touch",
947+
"app.kubernetes.io/part-of": "rabbitmq",
948+
},
949+
},
950+
}
951+
Expect(serviceBuilder.Update(svc)).To(Succeed())
952+
return svc
953+
}

0 commit comments

Comments
 (0)