Skip to content
This repository was archived by the owner on Dec 12, 2025. It is now read-only.

Commit f7d2f9a

Browse files
authored
Moved StatefulSet Merging functions into merge package. (#296)
1 parent b9fe79b commit f7d2f9a

File tree

10 files changed

+133
-155
lines changed

10 files changed

+133
-155
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package container
2+
3+
import corev1 "k8s.io/api/core/v1"
4+
5+
// GetByName returns a container with the given name from the slice of containers.
6+
// nil is returned if the container does not exist.
7+
func GetByName(name string, containers []corev1.Container) *corev1.Container {
8+
for i, c := range containers {
9+
if c.Name == name {
10+
return &containers[i]
11+
}
12+
}
13+
return nil
14+
}

pkg/kube/podtemplatespec/podspec_template.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func WithContainer(name string, containerfunc func(*corev1.Container)) Modificat
4040
idx := findIndexByName(name, podTemplateSpec.Spec.Containers)
4141
if idx == notFound {
4242
// if we are attempting to modify a container that does not exist, we will add a new one
43-
podTemplateSpec.Spec.Containers = append(podTemplateSpec.Spec.Containers, corev1.Container{})
43+
podTemplateSpec.Spec.Containers = append(podTemplateSpec.Spec.Containers, corev1.Container{Name: name})
4444
idx = len(podTemplateSpec.Spec.Containers) - 1
4545
}
4646
c := &podTemplateSpec.Spec.Containers[idx]
@@ -68,7 +68,7 @@ func WithInitContainer(name string, containerfunc func(*corev1.Container)) Modif
6868
idx := findIndexByName(name, podTemplateSpec.Spec.InitContainers)
6969
if idx == notFound {
7070
// if we are attempting to modify a container that does not exist, we will add a new one
71-
podTemplateSpec.Spec.InitContainers = append(podTemplateSpec.Spec.InitContainers, corev1.Container{})
71+
podTemplateSpec.Spec.InitContainers = append(podTemplateSpec.Spec.InitContainers, corev1.Container{Name: name})
7272
idx = len(podTemplateSpec.Spec.InitContainers) - 1
7373
}
7474
c := &podTemplateSpec.Spec.InitContainers[idx]

pkg/kube/podtemplatespec/podspec_template_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -351,9 +351,10 @@ func getDefaultPodSpec() corev1.PodTemplateSpec {
351351

352352
return corev1.PodTemplateSpec{
353353
ObjectMeta: metav1.ObjectMeta{
354-
Name: "my-default-name",
355-
Namespace: "my-default-namespace",
356-
Labels: map[string]string{"app": "operator"},
354+
Name: "my-default-name",
355+
Namespace: "my-default-namespace",
356+
Labels: map[string]string{"app": "operator"},
357+
Annotations: map[string]string{},
357358
},
358359
Spec: corev1.PodSpec{
359360
NodeSelector: map[string]string{
@@ -376,7 +377,8 @@ func getCustomPodSpec() corev1.PodTemplateSpec {
376377

377378
return corev1.PodTemplateSpec{
378379
ObjectMeta: metav1.ObjectMeta{
379-
Labels: map[string]string{"custom": "some"},
380+
Labels: map[string]string{"custom": "some"},
381+
Annotations: map[string]string{},
380382
},
381383
Spec: corev1.PodSpec{
382384
NodeSelector: map[string]string{

pkg/kube/statefulset/merge_spec.go

Lines changed: 0 additions & 125 deletions
This file was deleted.

pkg/kube/statefulset/merge_spec_test.go renamed to pkg/kube/statefulset/merge_statefulset_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package statefulset
22

33
import (
4+
"github.com/mongodb/mongodb-kubernetes-operator/pkg/util/merge"
45
"reflect"
56
"testing"
67

@@ -50,7 +51,7 @@ func TestGetLabelSelectorRequirementByKey(t *testing.T) {
5051
}
5152
for _, tt := range tests {
5253
t.Run(tt.name, func(t *testing.T) {
53-
if got := getLabelSelectorRequirementByKey(tt.args.labelSelectorRequirements, tt.args.key); !reflect.DeepEqual(got, tt.want) {
54+
if got := merge.LabelSelectorRequirementByKey(tt.args.labelSelectorRequirements, tt.args.key); !reflect.DeepEqual(got, tt.want) {
5455
t.Errorf("getLabelSelectorRequirementByKey() = %v, want %v", got, tt.want)
5556
}
5657
})
@@ -115,7 +116,7 @@ func TestMergeSpec(t *testing.T) {
115116
}),
116117
)
117118

118-
mergedSpec := MergeSpecs(original.Spec, override.Spec)
119+
mergedSpec := merge.StatefulSetSpecs(original.Spec, override.Spec)
119120

120121
t.Run("Primitive fields of spec have been merged correctly", func(t *testing.T) {
121122
assert.Equal(t, "override-svc-name", mergedSpec.ServiceName)

pkg/kube/statefulset/statefulset.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ type VolumeMountData struct {
7878
Name string
7979
MountPath string
8080
Volume corev1.Volume
81+
ReadOnly bool
8182
}
8283

8384
func CreateVolumeFromConfigMap(name, sourceName string) corev1.Volume {
@@ -286,3 +287,12 @@ func findVolumeClaimIndexByName(name string, pvcs []corev1.PersistentVolumeClaim
286287
}
287288
return notFound
288289
}
290+
291+
func VolumeMountWithNameExists(mounts []corev1.VolumeMount, volumeName string) bool {
292+
for _, mount := range mounts {
293+
if mount.Name == volumeName {
294+
return true
295+
}
296+
}
297+
return false
298+
}

pkg/kube/statefulset/statefulset_builder.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ func (s *Builder) AddVolumes(volumes []corev1.Volume) *Builder {
107107
return s
108108
}
109109

110-
// getContainerIndexByName returns the index of the container with containerName
111-
func (s Builder) getContainerIndexByName(containerName string) (int, error) {
110+
// GetContainerIndexByName returns the index of the container with containerName.
111+
func (s Builder) GetContainerIndexByName(containerName string) (int, error) {
112112
for i, c := range s.podTemplateSpec.Spec.Containers {
113113
if c.Name == containerName {
114114
return i, nil
@@ -117,23 +117,26 @@ func (s Builder) getContainerIndexByName(containerName string) (int, error) {
117117
return -1, errors.Errorf("no container with name [%s] found", containerName)
118118
}
119119

120-
func (s *Builder) AddVolumeAndMount(containerName string, volumeMountData VolumeMountData) *Builder {
120+
func (s *Builder) AddVolumeAndMount(volumeMountData VolumeMountData, containerNames ...string) *Builder {
121121
s.AddVolume(volumeMountData.Volume)
122-
s.AddVolumeMount(containerName,
123-
corev1.VolumeMount{
124-
Name: volumeMountData.Name,
125-
ReadOnly: true,
126-
MountPath: volumeMountData.MountPath,
127-
},
128-
)
122+
for _, containerName := range containerNames {
123+
s.AddVolumeMount(
124+
containerName,
125+
corev1.VolumeMount{
126+
Name: volumeMountData.Name,
127+
ReadOnly: volumeMountData.ReadOnly,
128+
MountPath: volumeMountData.MountPath,
129+
},
130+
)
131+
}
129132
return s
130133
}
131134

132135
func (s Builder) buildPodTemplateSpec() (corev1.PodTemplateSpec, error) {
133136
podTemplateSpec := s.podTemplateSpec.DeepCopy()
134137
var errs error
135138
for containerName, volumeMounts := range s.volumeMountsPerContainer {
136-
idx, err := s.getContainerIndexByName(containerName)
139+
idx, err := s.GetContainerIndexByName(containerName)
137140
if err != nil {
138141
errs = multierror.Append(errs, err)
139142
// other containers may have valid mounts
@@ -152,7 +155,7 @@ func (s Builder) buildPodTemplateSpec() (corev1.PodTemplateSpec, error) {
152155
}
153156

154157
for containerName, overrideReadinessProbe := range s.readinessProbePerContainer {
155-
idx, err := s.getContainerIndexByName(containerName)
158+
idx, err := s.GetContainerIndexByName(containerName)
156159
if err != nil {
157160
errs = multierror.Append(errs, err)
158161
continue

pkg/kube/statefulset/statefulset_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,25 @@ func TestGetContainerIndexByName(t *testing.T) {
2929
}
3030

3131
stsBuilder := defaultStatefulSetBuilder().SetPodTemplateSpec(podTemplateWithContainers(containers))
32-
idx, err := stsBuilder.getContainerIndexByName("container-0")
32+
idx, err := stsBuilder.GetContainerIndexByName("container-0")
3333

3434
assert.NoError(t, err)
3535
assert.NotEqual(t, -1, idx)
3636
assert.Equal(t, 0, idx)
3737

38-
idx, err = stsBuilder.getContainerIndexByName("container-1")
38+
idx, err = stsBuilder.GetContainerIndexByName("container-1")
3939

4040
assert.NoError(t, err)
4141
assert.NotEqual(t, -1, idx)
4242
assert.Equal(t, 1, idx)
4343

44-
idx, err = stsBuilder.getContainerIndexByName("container-2")
44+
idx, err = stsBuilder.GetContainerIndexByName("container-2")
4545

4646
assert.NoError(t, err)
4747
assert.NotEqual(t, -1, idx)
4848
assert.Equal(t, 2, idx)
4949

50-
idx, err = stsBuilder.getContainerIndexByName("doesnt-exist")
50+
idx, err = stsBuilder.GetContainerIndexByName("doesnt-exist")
5151

5252
assert.Error(t, err)
5353
assert.Equal(t, -1, idx)
@@ -63,7 +63,7 @@ func TestAddVolumeAndMount(t *testing.T) {
6363
Volume: CreateVolumeFromConfigMap("mount-name", "config-map"),
6464
}
6565

66-
stsBuilder = defaultStatefulSetBuilder().SetPodTemplateSpec(podTemplateWithContainers([]corev1.Container{{Name: "container-name"}})).AddVolumeAndMount("container-name", vmd)
66+
stsBuilder = defaultStatefulSetBuilder().SetPodTemplateSpec(podTemplateWithContainers([]corev1.Container{{Name: "container-name"}})).AddVolumeAndMount(vmd, "container-name")
6767
sts, err = stsBuilder.Build()
6868

6969
// assert container was correctly updated with the volumes
@@ -78,7 +78,7 @@ func TestAddVolumeAndMount(t *testing.T) {
7878
assert.NotNil(t, sts.Spec.Template.Spec.Volumes[0].VolumeSource.ConfigMap, "volume should have been configured from a config map source")
7979
assert.Nil(t, sts.Spec.Template.Spec.Volumes[0].VolumeSource.Secret, "volume should not have been configured from a secret source")
8080

81-
stsBuilder = defaultStatefulSetBuilder().SetPodTemplateSpec(podTemplateWithContainers([]corev1.Container{{Name: "container-0"}, {Name: "container-1"}})).AddVolumeAndMount("container-0", vmd)
81+
stsBuilder = defaultStatefulSetBuilder().SetPodTemplateSpec(podTemplateWithContainers([]corev1.Container{{Name: "container-0"}, {Name: "container-1"}})).AddVolumeAndMount(vmd, "container-0")
8282
sts, err = stsBuilder.Build()
8383

8484
assert.NoError(t, err, "volume should successfully mount when the container exists")
@@ -90,7 +90,7 @@ func TestAddVolumeAndMount(t *testing.T) {
9090
}
9191

9292
// add a 2nd container to previously defined stsBuilder
93-
sts, err = stsBuilder.AddVolumeAndMount("container-1", secretVmd).Build()
93+
sts, err = stsBuilder.AddVolumeAndMount(secretVmd, "container-1").Build()
9494

9595
assert.NoError(t, err, "volume should successfully mount when the container exists")
9696
assert.Len(t, sts.Spec.Template.Spec.Containers[1].VolumeMounts, 1, "volume mount should have been added to the container in the stateful set")

pkg/util/merge/merge_podtemplate_spec.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
func PodTemplateSpecs(original, override corev1.PodTemplateSpec) corev1.PodTemplateSpec {
99
merged := original
1010

11+
merged.Annotations = StringToStringMap(original.Annotations, override.Annotations)
1112
merged.Labels = StringToStringMap(original.Labels, override.Labels)
1213
merged.Spec.Volumes = Volumes(original.Spec.Volumes, override.Spec.Volumes)
1314
merged.Spec.Containers = Containers(original.Spec.Containers, override.Spec.Containers)

0 commit comments

Comments
 (0)