diff --git a/api/rediscluster/v1beta2/rediscluster_types.go b/api/rediscluster/v1beta2/rediscluster_types.go index 4a54343b85..2d3df2c8ce 100644 --- a/api/rediscluster/v1beta2/rediscluster_types.go +++ b/api/rediscluster/v1beta2/rediscluster_types.go @@ -48,6 +48,9 @@ type RedisClusterSpec struct { PersistenceEnabled *bool `json:"persistenceEnabled,omitempty"` EnvVars *[]corev1.EnvVar `json:"env,omitempty"` HostPort *int `json:"hostPort,omitempty"` + // +optional + // +kubebuilder:validation:Enum=OrderedReady;Parallel + PodManagementPolicy *string `json:"podManagementPolicy,omitempty"` } // Node-conf needs to be added only in redis cluster diff --git a/api/rediscluster/v1beta2/zz_generated.deepcopy.go b/api/rediscluster/v1beta2/zz_generated.deepcopy.go index ad62b559a3..2897a721e8 100644 --- a/api/rediscluster/v1beta2/zz_generated.deepcopy.go +++ b/api/rediscluster/v1beta2/zz_generated.deepcopy.go @@ -200,6 +200,11 @@ func (in *RedisClusterSpec) DeepCopyInto(out *RedisClusterSpec) { *out = new(int) **out = **in } + if in.PodManagementPolicy != nil { + in, out := &in.PodManagementPolicy, &out.PodManagementPolicy + *out = new(string) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RedisClusterSpec. diff --git a/api/redisreplication/v1beta2/redisreplication_types.go b/api/redisreplication/v1beta2/redisreplication_types.go index c02630a390..35d717ef52 100644 --- a/api/redisreplication/v1beta2/redisreplication_types.go +++ b/api/redisreplication/v1beta2/redisreplication_types.go @@ -30,6 +30,9 @@ type RedisReplicationSpec struct { EnvVars *[]corev1.EnvVar `json:"env,omitempty"` TopologySpreadConstrains []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"` HostPort *int `json:"hostPort,omitempty"` + // +optional + // +kubebuilder:validation:Enum=OrderedReady;Parallel + PodManagementPolicy *string `json:"podManagementPolicy,omitempty"` } func (cr *RedisReplicationSpec) GetReplicationCounts(t string) int32 { diff --git a/api/redisreplication/v1beta2/zz_generated.deepcopy.go b/api/redisreplication/v1beta2/zz_generated.deepcopy.go index 647262acc8..84457e57fc 100644 --- a/api/redisreplication/v1beta2/zz_generated.deepcopy.go +++ b/api/redisreplication/v1beta2/zz_generated.deepcopy.go @@ -216,6 +216,11 @@ func (in *RedisReplicationSpec) DeepCopyInto(out *RedisReplicationSpec) { *out = new(int) **out = **in } + if in.PodManagementPolicy != nil { + in, out := &in.PodManagementPolicy, &out.PodManagementPolicy + *out = new(string) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RedisReplicationSpec. diff --git a/api/redissentinel/v1beta2/redissentinel_types.go b/api/redissentinel/v1beta2/redissentinel_types.go index 5e087e0d0a..1676167923 100644 --- a/api/redissentinel/v1beta2/redissentinel_types.go +++ b/api/redissentinel/v1beta2/redissentinel_types.go @@ -31,6 +31,9 @@ type RedisSentinelSpec struct { VolumeMount *common.AdditionalVolume `json:"volumeMount,omitempty"` TopologySpreadConstrains []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints,omitempty"` HostPort *int `json:"hostPort,omitempty"` + // +optional + // +kubebuilder:validation:Enum=OrderedReady;Parallel + PodManagementPolicy *string `json:"podManagementPolicy,omitempty"` } func (cr *RedisSentinelSpec) GetSentinelCounts(t string) int32 { diff --git a/api/redissentinel/v1beta2/zz_generated.deepcopy.go b/api/redissentinel/v1beta2/zz_generated.deepcopy.go index 242116dd4b..ab2c0f4003 100644 --- a/api/redissentinel/v1beta2/zz_generated.deepcopy.go +++ b/api/redissentinel/v1beta2/zz_generated.deepcopy.go @@ -227,6 +227,11 @@ func (in *RedisSentinelSpec) DeepCopyInto(out *RedisSentinelSpec) { *out = new(int) **out = **in } + if in.PodManagementPolicy != nil { + in, out := &in.PodManagementPolicy, &out.PodManagementPolicy + *out = new(string) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RedisSentinelSpec. diff --git a/charts/redis-cluster/README.md b/charts/redis-cluster/README.md index b65f46230c..5bfa8a0105 100644 --- a/charts/redis-cluster/README.md +++ b/charts/redis-cluster/README.md @@ -65,6 +65,7 @@ helm delete --namespace | initContainer.imagePullPolicy | string | `"IfNotPresent"` | | | initContainer.resources | object | `{}` | | | labels | object | `{}` | | +| podManagementPolicy | string | `"OrderedReady"` | | | podSecurityContext.fsGroup | int | `1000` | | | podSecurityContext.runAsUser | int | `1000` | | | priorityClassName | string | `""` | | diff --git a/charts/redis-cluster/templates/redis-cluster.yaml b/charts/redis-cluster/templates/redis-cluster.yaml index 5fce347b49..4c4583b513 100644 --- a/charts/redis-cluster/templates/redis-cluster.yaml +++ b/charts/redis-cluster/templates/redis-cluster.yaml @@ -102,3 +102,6 @@ spec: {{- if and .Values.serviceAccountName (ne .Values.serviceAccountName "") }} serviceAccountName: "{{ .Values.serviceAccountName }}" {{- end }} + {{- if and .Values.podManagementPolicy (ne .Values.podManagementPolicy "") }} + podManagementPolicy: "{{ .Values.podManagementPolicy }}" + {{- end }} diff --git a/charts/redis-cluster/values.yaml b/charts/redis-cluster/values.yaml index cfb7622965..3d65738000 100644 --- a/charts/redis-cluster/values.yaml +++ b/charts/redis-cluster/values.yaml @@ -228,3 +228,5 @@ env: [] # value: "value1" serviceAccountName: "" + +podManagementPolicy: OrderedReady \ No newline at end of file diff --git a/charts/redis-operator/crds/crds.yaml b/charts/redis-operator/crds/crds.yaml index d342c8e38d..f273c683a2 100644 --- a/charts/redis-operator/crds/crds.yaml +++ b/charts/redis-operator/crds/crds.yaml @@ -6303,6 +6303,11 @@ spec: type: object persistenceEnabled: type: boolean + podManagementPolicy: + enum: + - OrderedReady + - Parallel + type: string podSecurityContext: description: |- PodSecurityContext holds pod-level security attributes and common container settings. @@ -15188,6 +15193,11 @@ spec: format: int32 type: integer type: object + podManagementPolicy: + enum: + - OrderedReady + - Parallel + type: string podSecurityContext: description: |- PodSecurityContext holds pod-level security attributes and common container settings. @@ -20707,6 +20717,11 @@ spec: format: int32 type: integer type: object + podManagementPolicy: + enum: + - OrderedReady + - Parallel + type: string podSecurityContext: description: |- PodSecurityContext holds pod-level security attributes and common container settings. diff --git a/charts/redis-replication/README.md b/charts/redis-replication/README.md index 824707c04e..4dfcb787a5 100644 --- a/charts/redis-replication/README.md +++ b/charts/redis-replication/README.md @@ -68,6 +68,7 @@ helm delete --namespace | pdb.enabled | bool | `false` | | | pdb.maxUnavailable | string | `nil` | | | pdb.minAvailable | int | `1` | | +| podManagementPolicy | string | `"OrderedReady"` | | | podSecurityContext.fsGroup | int | `1000` | | | podSecurityContext.runAsUser | int | `1000` | | | priorityClassName | string | `""` | | diff --git a/charts/redis-replication/templates/redis-replication.yaml b/charts/redis-replication/templates/redis-replication.yaml index 2bc3a4f9bf..a8d9dd5ff7 100644 --- a/charts/redis-replication/templates/redis-replication.yaml +++ b/charts/redis-replication/templates/redis-replication.yaml @@ -106,4 +106,6 @@ spec: minAvailable: {{ .Values.pdb.minAvailable }} maxUnavailable: {{ .Values.pdb.maxUnavailable }} {{- end }} - + {{- if and .Values.podManagementPolicy (ne .Values.podManagementPolicy "") }} + podManagementPolicy: "{{ .Values.podManagementPolicy }}" + {{- end }} diff --git a/charts/redis-replication/values.yaml b/charts/redis-replication/values.yaml index b6da45db90..1ad3217a41 100644 --- a/charts/redis-replication/values.yaml +++ b/charts/redis-replication/values.yaml @@ -166,3 +166,5 @@ pdb: enabled: false minAvailable: 1 maxUnavailable: null + +podManagementPolicy: OrderedReady \ No newline at end of file diff --git a/charts/redis-sentinel/README.md b/charts/redis-sentinel/README.md index 4a02809b84..1f8022120b 100644 --- a/charts/redis-sentinel/README.md +++ b/charts/redis-sentinel/README.md @@ -72,6 +72,7 @@ helm delete --namespace | pdb.enabled | bool | `false` | | | pdb.maxUnavailable | string | `nil` | | | pdb.minAvailable | int | `1` | | +| podManagementPolicy | string | `"OrderedReady"` | | | podSecurityContext.fsGroup | int | `1000` | | | podSecurityContext.runAsUser | int | `1000` | | | priorityClassName | string | `""` | | diff --git a/charts/redis-sentinel/templates/redis-sentinel.yaml b/charts/redis-sentinel/templates/redis-sentinel.yaml index 65a2d5244c..38cde0debb 100644 --- a/charts/redis-sentinel/templates/redis-sentinel.yaml +++ b/charts/redis-sentinel/templates/redis-sentinel.yaml @@ -118,3 +118,6 @@ spec: {{- if .Values.env }} env: {{ toYaml .Values.env | nindent 4 }} {{- end }} + {{- if and .Values.podManagementPolicy (ne .Values.podManagementPolicy "") }} + podManagementPolicy: "{{ .Values.podManagementPolicy }}" + {{- end }} diff --git a/charts/redis-sentinel/values.yaml b/charts/redis-sentinel/values.yaml index 2273451d0f..b357fa4d7b 100644 --- a/charts/redis-sentinel/values.yaml +++ b/charts/redis-sentinel/values.yaml @@ -177,3 +177,5 @@ readinessProbe: env: [] # - name: VAR_NAME # value: "value1" + +podManagementPolicy: OrderedReady \ No newline at end of file diff --git a/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml b/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml index aade043f84..432afc8d30 100644 --- a/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml +++ b/config/crd/bases/redis.redis.opstreelabs.in_redisclusters.yaml @@ -912,6 +912,11 @@ spec: type: object persistenceEnabled: type: boolean + podManagementPolicy: + enum: + - OrderedReady + - Parallel + type: string podSecurityContext: description: |- PodSecurityContext holds pod-level security attributes and common container settings. diff --git a/config/crd/bases/redis.redis.opstreelabs.in_redisreplications.yaml b/config/crd/bases/redis.redis.opstreelabs.in_redisreplications.yaml index 51d2ab9686..d7aa08c207 100644 --- a/config/crd/bases/redis.redis.opstreelabs.in_redisreplications.yaml +++ b/config/crd/bases/redis.redis.opstreelabs.in_redisreplications.yaml @@ -1935,6 +1935,11 @@ spec: format: int32 type: integer type: object + podManagementPolicy: + enum: + - OrderedReady + - Parallel + type: string podSecurityContext: description: |- PodSecurityContext holds pod-level security attributes and common container settings. diff --git a/config/crd/bases/redis.redis.opstreelabs.in_redissentinels.yaml b/config/crd/bases/redis.redis.opstreelabs.in_redissentinels.yaml index b87a175356..01ebc7fff8 100644 --- a/config/crd/bases/redis.redis.opstreelabs.in_redissentinels.yaml +++ b/config/crd/bases/redis.redis.opstreelabs.in_redissentinels.yaml @@ -1861,6 +1861,11 @@ spec: format: int32 type: integer type: object + podManagementPolicy: + enum: + - OrderedReady + - Parallel + type: string podSecurityContext: description: |- PodSecurityContext holds pod-level security attributes and common container settings. diff --git a/docs/content/en/docs/CRD Reference/API Reference/_index.md b/docs/content/en/docs/CRD Reference/API Reference/_index.md index a84da865be..bc5321030d 100644 --- a/docs/content/en/docs/CRD Reference/API Reference/_index.md +++ b/docs/content/en/docs/CRD Reference/API Reference/_index.md @@ -225,6 +225,7 @@ _Appears in:_ | `persistenceEnabled` _boolean_ | | | | | `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#envvar-v1-core)_ | | | | | `hostPort` _integer_ | | | | +| `podManagementPolicy` _string_ | | | Enum: [OrderedReady Parallel]
| @@ -409,6 +410,7 @@ _Appears in:_ | `env` _[EnvVar](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#envvar-v1-core)_ | | | | | `topologySpreadConstraints` _[TopologySpreadConstraint](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#topologyspreadconstraint-v1-core) array_ | | | | | `hostPort` _integer_ | | | | +| `podManagementPolicy` _string_ | | | Enum: [OrderedReady Parallel]
| #### RedisSentinel @@ -490,6 +492,7 @@ _Appears in:_ | `volumeMount` _[AdditionalVolume](#additionalvolume)_ | | | | | `topologySpreadConstraints` _[TopologySpreadConstraint](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.31/#topologyspreadconstraint-v1-core) array_ | | | | | `hostPort` _integer_ | | | | +| `podManagementPolicy` _string_ | | | Enum: [OrderedReady Parallel]
| #### RedisSpec diff --git a/internal/k8sutils/redis-cluster.go b/internal/k8sutils/redis-cluster.go index 3a79ee6ae5..44c49df507 100644 --- a/internal/k8sutils/redis-cluster.go +++ b/internal/k8sutils/redis-cluster.go @@ -59,6 +59,11 @@ func generateRedisClusterParams(ctx context.Context, cr *rcvb2.RedisCluster, rep HostNetwork: cr.Spec.HostNetwork, MinReadySeconds: minreadyseconds, } + + if cr.Spec.PodManagementPolicy != nil { + res.PodManagementPolicy = cr.Spec.PodManagementPolicy + } + if cr.Spec.RedisExporter != nil { res.EnableMetrics = cr.Spec.RedisExporter.Enabled } diff --git a/internal/k8sutils/redis-replication.go b/internal/k8sutils/redis-replication.go index aabe545dd8..9e18d942ab 100644 --- a/internal/k8sutils/redis-replication.go +++ b/internal/k8sutils/redis-replication.go @@ -109,6 +109,11 @@ func generateRedisReplicationParams(cr *rrvb2.RedisReplication) statefulSetParam IgnoreAnnotations: cr.Spec.KubernetesConfig.IgnoreAnnotations, MinReadySeconds: minreadyseconds, } + + if cr.Spec.PodManagementPolicy != nil { + res.PodManagementPolicy = cr.Spec.PodManagementPolicy + } + if cr.Spec.KubernetesConfig.ImagePullSecrets != nil { res.ImagePullSecrets = cr.Spec.KubernetesConfig.ImagePullSecrets } diff --git a/internal/k8sutils/redis-sentinel.go b/internal/k8sutils/redis-sentinel.go index 336de4106c..f71cfdd59e 100644 --- a/internal/k8sutils/redis-sentinel.go +++ b/internal/k8sutils/redis-sentinel.go @@ -109,6 +109,10 @@ func generateRedisSentinelParams(ctx context.Context, cr *rsvb2.RedisSentinel, r MinReadySeconds: minreadyseconds, } + if cr.Spec.PodManagementPolicy != nil { + res.PodManagementPolicy = cr.Spec.PodManagementPolicy + } + if cr.Spec.KubernetesConfig.ImagePullSecrets != nil { res.ImagePullSecrets = cr.Spec.KubernetesConfig.ImagePullSecrets } diff --git a/internal/k8sutils/statefulset.go b/internal/k8sutils/statefulset.go index edac10da5a..ee08c7bf2e 100644 --- a/internal/k8sutils/statefulset.go +++ b/internal/k8sutils/statefulset.go @@ -121,6 +121,7 @@ type statefulSetParameters struct { IgnoreAnnotations []string HostNetwork bool MinReadySeconds int32 + PodManagementPolicy *string } // containerParameters will define container input params @@ -316,6 +317,10 @@ func generateStatefulSetsDef(stsMeta metav1.ObjectMeta, params statefulSetParame statefulset.Spec.Template.Spec.InitContainers = generateInitContainerDef(containerParams.Role, stsMeta.GetName(), initcontainerParams, params.ExternalConfig, initcontainerParams.AdditionalMountPath, containerParams, params.ClusterVersion) + if params.PodManagementPolicy != nil { + statefulset.Spec.PodManagementPolicy = appsv1.PodManagementPolicyType(*params.PodManagementPolicy) + } + if params.Tolerations != nil { statefulset.Spec.Template.Spec.Tolerations = *params.Tolerations }