diff --git a/internal/controller/factory/labels_builder.go b/internal/controller/factory/labels_builder.go new file mode 100644 index 00000000..57c7e566 --- /dev/null +++ b/internal/controller/factory/labels_builder.go @@ -0,0 +1,22 @@ +package factory + +type LabelsBuilder map[string]string + +func NewLabelsBuilder() LabelsBuilder { + return make(map[string]string) +} + +func (b LabelsBuilder) WithName() LabelsBuilder { + b["app.kubernetes.io/name"] = "etcd" + return b +} + +func (b LabelsBuilder) WithInstance(name string) LabelsBuilder { + b["app.kubernetes.io/instance"] = name + return b +} + +func (b LabelsBuilder) WithManagedBy() LabelsBuilder { + b["app.kubernetes.io/managed-by"] = "etcd-operator" + return b +} diff --git a/internal/controller/factory/labels_builder_test.go b/internal/controller/factory/labels_builder_test.go new file mode 100644 index 00000000..2185f983 --- /dev/null +++ b/internal/controller/factory/labels_builder_test.go @@ -0,0 +1,40 @@ +package factory + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("Labels builder", func() { + Context("When ensuring a labels builder", func() { + It("constructor returns empty initialized map", func() { + builder := NewLabelsBuilder() + Expect(builder).To(Equal(make(LabelsBuilder))) + }) + It("WithName sets correct key and value", func() { + builder := NewLabelsBuilder() + builder.WithName() + Expect(builder["app.kubernetes.io/name"]).To(Equal("etcd")) + }) + It("WithManagedBy sets correct key and value", func() { + builder := NewLabelsBuilder() + builder.WithManagedBy() + Expect(builder["app.kubernetes.io/managed-by"]).To(Equal("etcd-operator")) + }) + It("WithInstance sets correct key and value", func() { + builder := NewLabelsBuilder() + builder.WithInstance("local") + Expect(builder["app.kubernetes.io/instance"]).To(Equal("local")) + }) + It("Chaining methods builds correct map", func() { + builder := NewLabelsBuilder() + builder.WithName().WithManagedBy().WithInstance("local") + expected := map[string]string{ + "app.kubernetes.io/name": "etcd", + "app.kubernetes.io/instance": "local", + "app.kubernetes.io/managed-by": "etcd-operator", + } + Expect(builder).To(Equal(LabelsBuilder(expected))) + }) + }) +}) diff --git a/internal/controller/factory/statefulset.go b/internal/controller/factory/statefulset.go index 239592cf..4762d855 100644 --- a/internal/controller/factory/statefulset.go +++ b/internal/controller/factory/statefulset.go @@ -38,11 +38,7 @@ func CreateOrUpdateStatefulSet( rscheme *runtime.Scheme, ) error { podMetadata := metav1.ObjectMeta{ - Labels: map[string]string{ - "app.kubernetes.io/name": "etcd", - "app.kubernetes.io/instance": cluster.Name, - "app.kubernetes.io/managed-by": "etcd-operator", - }, + Labels: NewLabelsBuilder().WithName().WithInstance(cluster.Name).WithManagedBy(), } if cluster.Spec.PodSpec.PodMetadata != nil { @@ -88,11 +84,7 @@ func CreateOrUpdateStatefulSet( ServiceName: cluster.Name, PodManagementPolicy: appsv1.ParallelPodManagement, Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "app.kubernetes.io/name": "etcd", - "app.kubernetes.io/instance": cluster.Name, - "app.kubernetes.io/managed-by": "etcd-operator", - }, + MatchLabels: NewLabelsBuilder().WithName().WithInstance(cluster.Name).WithManagedBy(), }, Template: corev1.PodTemplateSpec{ ObjectMeta: podMetadata, diff --git a/internal/controller/factory/svc.go b/internal/controller/factory/svc.go index 41e657d3..94b225e6 100644 --- a/internal/controller/factory/svc.go +++ b/internal/controller/factory/svc.go @@ -44,24 +44,16 @@ func CreateOrUpdateClusterService( ObjectMeta: metav1.ObjectMeta{ Name: cluster.Name, Namespace: cluster.Namespace, - Labels: map[string]string{ - "app.kubernetes.io/name": "etcd", - "app.kubernetes.io/instance": cluster.Name, - "app.kubernetes.io/managed-by": "etcd-operator", - }, + Labels: NewLabelsBuilder().WithName().WithInstance(cluster.Name).WithManagedBy(), }, Spec: corev1.ServiceSpec{ Ports: []corev1.ServicePort{ {Name: "peer", TargetPort: intstr.FromInt32(2380), Port: 2380, Protocol: corev1.ProtocolTCP}, {Name: "client", TargetPort: intstr.FromInt32(2379), Port: 2379, Protocol: corev1.ProtocolTCP}, }, - Type: corev1.ServiceTypeClusterIP, - ClusterIP: "None", - Selector: map[string]string{ - "app.kubernetes.io/name": "etcd", - "app.kubernetes.io/instance": cluster.Name, - "app.kubernetes.io/managed-by": "etcd-operator", - }, + Type: corev1.ServiceTypeClusterIP, + ClusterIP: "None", + Selector: NewLabelsBuilder().WithName().WithInstance(cluster.Name).WithManagedBy(), PublishNotReadyAddresses: true, }, } @@ -83,22 +75,14 @@ func CreateOrUpdateClientService( ObjectMeta: metav1.ObjectMeta{ Name: GetClientServiceName(cluster), Namespace: cluster.Namespace, - Labels: map[string]string{ - "app.kubernetes.io/name": "etcd", - "app.kubernetes.io/instance": cluster.Name, - "app.kubernetes.io/managed-by": "etcd-operator", - }, + Labels: NewLabelsBuilder().WithName().WithInstance(cluster.Name).WithManagedBy(), }, Spec: corev1.ServiceSpec{ Ports: []corev1.ServicePort{ {Name: "client", TargetPort: intstr.FromInt32(2379), Port: 2379, Protocol: corev1.ProtocolTCP}, }, - Type: corev1.ServiceTypeClusterIP, - Selector: map[string]string{ - "app.kubernetes.io/name": "etcd", - "app.kubernetes.io/instance": cluster.Name, - "app.kubernetes.io/managed-by": "etcd-operator", - }, + Type: corev1.ServiceTypeClusterIP, + Selector: NewLabelsBuilder().WithName().WithInstance(cluster.Name).WithManagedBy(), }, }