Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions api/v1beta1/rabbitmqcluster_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,24 @@ type RabbitmqClusterPersistenceSpec struct {
// See https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity for more info on the format of this field.
// +kubebuilder:default:="10Gi"
Storage *k8sresource.Quantity `json:"storage,omitempty"`
// EmptyDir configuration to be used when Storage is set to 0Gi.
// +optional
EmptyDir *RabbitmqClusterEmptyDirSpec `json:"emptyDir,omitempty"`
}

// RabbitmqClusterEmptyDirSpec contains configuration for EmptyDir volumes.
type RabbitmqClusterEmptyDirSpec struct {
// Medium represents the storage medium for the EmptyDir volume.
// The default is "" which means to use the node's default medium.
// Must be an empty string (default) or Memory.
// More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir
// +optional
Medium corev1.StorageMedium `json:"medium,omitempty"`
// SizeLimit sets the size limit for EmptyDir volumes.
// The format of this field matches that defined by kubernetes/apimachinery.
// See https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity for more info on the format of this field.
// +optional
SizeLimit *k8sresource.Quantity `json:"sizeLimit,omitempty"`
}

// Settable attributes for the Service resource.
Expand Down
25 changes: 25 additions & 0 deletions api/v1beta1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions config/crd/bases/rabbitmq.com_rabbitmqclusters.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5069,6 +5069,27 @@ spec:
storage: 10Gi
description: The desired persistent storage configuration for each Pod in the cluster.
properties:
emptyDir:
description: EmptyDir configuration to be used when Storage is set to 0Gi.
properties:
medium:
description: |-
Medium represents the storage medium for the EmptyDir volume.
The default is "" which means to use the node's default medium.
Must be an empty string (default) or Memory.
More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir
type: string
sizeLimit:
anyOf:
- type: integer
- type: string
description: |-
SizeLimit sets the size limit for EmptyDir volumes.
The format of this field matches that defined by kubernetes/apimachinery.
See https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity for more info on the format of this field.
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
x-kubernetes-int-or-string: true
type: object
storage:
anyOf:
- type: integer
Expand Down
24 changes: 24 additions & 0 deletions docs/api/rabbitmq.com.ref.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,29 @@ user.
|===


[id="{anchor_prefix}-github-com-rabbitmq-cluster-operator-v2-api-v1beta1-rabbitmqclusteremptydirspec"]
==== RabbitmqClusterEmptyDirSpec

RabbitmqClusterEmptyDirSpec contains configuration for EmptyDir volumes.

.Appears In:
****
- xref:{anchor_prefix}-github-com-rabbitmq-cluster-operator-v2-api-v1beta1-rabbitmqclusterpersistencespec[$$RabbitmqClusterPersistenceSpec$$]
****

[cols="25a,75a", options="header"]
|===
| Field | Description
| *`medium`* __link:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#storagemedium-v1-core[$$StorageMedium$$]__ | Medium represents the storage medium for the EmptyDir volume.
The default is "" which means to use the node's default medium.
Must be an empty string (default) or Memory.
More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir
| *`sizeLimit`* __link:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#quantity-resource-api[$$Quantity$$]__ | SizeLimit sets the size limit for EmptyDir volumes.
The format of this field matches that defined by kubernetes/apimachinery.
See https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity for more info on the format of this field.
|===


[id="{anchor_prefix}-github-com-rabbitmq-cluster-operator-v2-api-v1beta1-rabbitmqclusterlist"]
==== RabbitmqClusterList

Expand Down Expand Up @@ -289,6 +312,7 @@ The settings for the persistent storage desired for each Pod in the RabbitmqClus
| *`storage`* __link:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#quantity-resource-api[$$Quantity$$]__ | The requested size of the persistent volume attached to each Pod in the RabbitmqCluster.
The format of this field matches that defined by kubernetes/apimachinery.
See https://pkg.go.dev/k8s.io/apimachinery/pkg/api/resource#Quantity for more info on the format of this field.
| *`emptyDir`* __xref:{anchor_prefix}-github-com-rabbitmq-cluster-operator-v2-api-v1beta1-rabbitmqclusteremptydirspec[$$RabbitmqClusterEmptyDirSpec$$]__ | EmptyDir configuration to be used when Storage is set to 0Gi.
|===


Expand Down
12 changes: 9 additions & 3 deletions internal/resource/statefulset.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import (

"k8s.io/apimachinery/pkg/util/intstr"

"maps"

rabbitmqv1beta1 "github.com/rabbitmq/cluster-operator/v2/api/v1beta1"
"github.com/rabbitmq/cluster-operator/v2/internal/metadata"
appsv1 "k8s.io/api/apps/v1"
Expand All @@ -29,7 +31,6 @@ import (
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/strategicpatch"
"k8s.io/utils/ptr"
"maps"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)
Expand Down Expand Up @@ -456,12 +457,17 @@ func (builder *StatefulSetBuilder) podTemplateSpec(previousPodAnnotations map[st

zero := k8sresource.MustParse("0Gi")
if builder.Instance.Spec.Persistence.Storage.Cmp(zero) == 0 {
volumes = append(volumes, corev1.Volume{
volume := corev1.Volume{
Name: "persistence",
VolumeSource: corev1.VolumeSource{
EmptyDir: &corev1.EmptyDirVolumeSource{},
},
})
}
if builder.Instance.Spec.Persistence.EmptyDir != nil {
volume.VolumeSource.EmptyDir.SizeLimit = builder.Instance.Spec.Persistence.EmptyDir.SizeLimit
volume.VolumeSource.EmptyDir.Medium = builder.Instance.Spec.Persistence.EmptyDir.Medium
}
volumes = append(volumes, volume)
}

rabbitmqContainerVolumeMounts := []corev1.VolumeMount{
Expand Down
24 changes: 24 additions & 0 deletions internal/resource/statefulset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1334,6 +1334,30 @@ default_pass = {{ .Data.data.password }}

Expect(statefulSet.Spec.Template.Spec.Volumes).To(ContainElement(expectedVolume))
})

It("defines an emptyDir volume with sizeLimit and medium when storage == 0 and emptyDir config received", func() {
zero, _ := k8sresource.ParseQuantity("0")

stsBuilder := builder.StatefulSet()
stsBuilder.Instance.Spec.Persistence.Storage = &zero
stsBuilder.Instance.Spec.Persistence.EmptyDir = &rabbitmqv1beta1.RabbitmqClusterEmptyDirSpec{
SizeLimit: ptr.To(k8sresource.MustParse("500Mi")),
Medium: corev1.StorageMediumMemory,
}
Expect(stsBuilder.Update(statefulSet)).To(Succeed())

expectedVolume := corev1.Volume{
Name: "persistence",
VolumeSource: corev1.VolumeSource{
EmptyDir: &corev1.EmptyDirVolumeSource{
SizeLimit: ptr.To(k8sresource.MustParse("500Mi")),
Medium: corev1.StorageMediumMemory,
},
},
}

Expect(statefulSet.Spec.Template.Spec.Volumes).To(ContainElement(expectedVolume))
})
})

It("uses the correct service account", func() {
Expand Down