From e29e544ad37dabfe0b50f3bf582c2ddeee2f9853 Mon Sep 17 00:00:00 2001 From: Mayank Shah Date: Wed, 17 Dec 2025 16:33:56 +0530 Subject: [PATCH 1/4] add LogRotate spec to PSMDB CR Signed-off-by: Mayank Shah --- ...mdb.percona.com_perconaservermongodbs.yaml | 12 +++++++++++ deploy/bundle.yaml | 12 +++++++++++ deploy/crd.yaml | 12 +++++++++++ deploy/cw-bundle.yaml | 12 +++++++++++ e2e-tests/version-service/conf/crd.yaml | 12 +++++++++++ pkg/apis/psmdb/v1/psmdb_types.go | 9 ++++++++ pkg/apis/psmdb/v1/zz_generated.deepcopy.go | 21 +++++++++++++++++++ 7 files changed, 90 insertions(+) diff --git a/config/crd/bases/psmdb.percona.com_perconaservermongodbs.yaml b/config/crd/bases/psmdb.percona.com_perconaservermongodbs.yaml index 41b5675582..6d2dc40b1c 100644 --- a/config/crd/bases/psmdb.percona.com_perconaservermongodbs.yaml +++ b/config/crd/bases/psmdb.percona.com_perconaservermongodbs.yaml @@ -698,6 +698,18 @@ spec: type: string imagePullPolicy: type: string + logRotate: + properties: + configuration: + type: string + extraConfigs: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + type: object resources: properties: claims: diff --git a/deploy/bundle.yaml b/deploy/bundle.yaml index b13f31f806..ea60b096da 100644 --- a/deploy/bundle.yaml +++ b/deploy/bundle.yaml @@ -1555,6 +1555,18 @@ spec: type: string imagePullPolicy: type: string + logRotate: + properties: + configuration: + type: string + extraConfigs: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + type: object resources: properties: claims: diff --git a/deploy/crd.yaml b/deploy/crd.yaml index fcbd4349e4..3444a73331 100644 --- a/deploy/crd.yaml +++ b/deploy/crd.yaml @@ -1555,6 +1555,18 @@ spec: type: string imagePullPolicy: type: string + logRotate: + properties: + configuration: + type: string + extraConfigs: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + type: object resources: properties: claims: diff --git a/deploy/cw-bundle.yaml b/deploy/cw-bundle.yaml index bf118dc2ce..ef889553e2 100644 --- a/deploy/cw-bundle.yaml +++ b/deploy/cw-bundle.yaml @@ -1555,6 +1555,18 @@ spec: type: string imagePullPolicy: type: string + logRotate: + properties: + configuration: + type: string + extraConfigs: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + type: object resources: properties: claims: diff --git a/e2e-tests/version-service/conf/crd.yaml b/e2e-tests/version-service/conf/crd.yaml index fcbd4349e4..3444a73331 100644 --- a/e2e-tests/version-service/conf/crd.yaml +++ b/e2e-tests/version-service/conf/crd.yaml @@ -1555,6 +1555,18 @@ spec: type: string imagePullPolicy: type: string + logRotate: + properties: + configuration: + type: string + extraConfigs: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + type: object resources: properties: claims: diff --git a/pkg/apis/psmdb/v1/psmdb_types.go b/pkg/apis/psmdb/v1/psmdb_types.go index 4cfcae332a..39d9d4dc58 100644 --- a/pkg/apis/psmdb/v1/psmdb_types.go +++ b/pkg/apis/psmdb/v1/psmdb_types.go @@ -1502,6 +1502,15 @@ type LogCollectorSpec struct { Configuration string `json:"configuration,omitempty"` ContainerSecurityContext *corev1.SecurityContext `json:"containerSecurityContext,omitempty"` ImagePullPolicy corev1.PullPolicy `json:"imagePullPolicy,omitempty"` + LogRotate *LogRotateSpec `json:"logRotate,omitempty"` +} + +type LogRotateSpec struct { + // Configuration allows overriding the default logrotate configuration. + Configuration string `json:"configuration,omitempty"` + // AdditionalConfig allows specifying an additional configuration file for logrotate. + // This should be a reference to a ConfigMap in the same namespace. + ExtraConfig corev1.LocalObjectReference `json:"extraConfigs,omitempty"` } func (cr *PerconaServerMongoDB) IsLogCollectorEnabled() bool { diff --git a/pkg/apis/psmdb/v1/zz_generated.deepcopy.go b/pkg/apis/psmdb/v1/zz_generated.deepcopy.go index 7d13a2f5e9..b7495c3ba2 100644 --- a/pkg/apis/psmdb/v1/zz_generated.deepcopy.go +++ b/pkg/apis/psmdb/v1/zz_generated.deepcopy.go @@ -588,6 +588,11 @@ func (in *LogCollectorSpec) DeepCopyInto(out *LogCollectorSpec) { *out = new(corev1.SecurityContext) (*in).DeepCopyInto(*out) } + if in.LogRotate != nil { + in, out := &in.LogRotate, &out.LogRotate + *out = new(LogRotateSpec) + **out = **in + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LogCollectorSpec. @@ -600,6 +605,22 @@ func (in *LogCollectorSpec) DeepCopy() *LogCollectorSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LogRotateSpec) DeepCopyInto(out *LogRotateSpec) { + *out = *in + out.ExtraConfig = in.ExtraConfig +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LogRotateSpec. +func (in *LogRotateSpec) DeepCopy() *LogRotateSpec { + if in == nil { + return nil + } + out := new(LogRotateSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *MinioRetryer) DeepCopyInto(out *MinioRetryer) { *out = *in From cfd50e04d84ac8378fb09099b4266ec3c8b72039 Mon Sep 17 00:00:00 2001 From: Mayank Shah Date: Wed, 17 Dec 2025 17:07:26 +0530 Subject: [PATCH 2/4] implement logrotate config override Signed-off-by: Mayank Shah --- build/logcollector/entrypoint.sh | 7 +- .../perconaservermongodb/psmdb_controller.go | 41 +++++++ .../perconaservermongodb/statefulset.go | 35 ++++-- pkg/psmdb/logcollector/container.go | 73 +---------- pkg/psmdb/logcollector/logrotate/container.go | 114 ++++++++++++++++++ pkg/psmdb/statefulset.go | 51 ++++++-- 6 files changed, 233 insertions(+), 88 deletions(-) create mode 100644 pkg/psmdb/logcollector/logrotate/container.go diff --git a/build/logcollector/entrypoint.sh b/build/logcollector/entrypoint.sh index 5a6cf254d7..787081d967 100755 --- a/build/logcollector/entrypoint.sh +++ b/build/logcollector/entrypoint.sh @@ -4,6 +4,11 @@ set -o xtrace export PATH="$PATH":/opt/fluent-bit/bin +LOGROTATE_CONF_DIR="" +if [ -f /opt/percona/logcollector/logrotate/conf.d ]; then + LOGROTATE_CONF_DIR="/opt/percona/logcollector/logrotate/conf.d" +fi + if [ "$1" = 'logrotate' ]; then if [[ $EUID != 1001 ]]; then # logrotate requires UID in /etc/passwd @@ -11,7 +16,7 @@ if [ "$1" = 'logrotate' ]; then cat /tmp/passwd >/etc/passwd rm -rf /tmp/passwd fi - exec go-cron "0 0 * * *" sh -c "logrotate -s /data/db/logs/logrotate.status /opt/percona/logcollector/logrotate/logrotate.conf;" + exec go-cron "0 0 * * *" sh -c "logrotate -s /data/db/logs/logrotate.status /opt/percona/logcollector/logrotate/logrotate.conf ${LOGROTATE_CONF_DIR};" else if [ "$1" = 'fluent-bit' ]; then fluentbit_opt+='-c /opt/percona/logcollector/fluentbit/fluentbit.conf' diff --git a/pkg/controller/perconaservermongodb/psmdb_controller.go b/pkg/controller/perconaservermongodb/psmdb_controller.go index 871f7d4d64..b0064cf3a8 100644 --- a/pkg/controller/perconaservermongodb/psmdb_controller.go +++ b/pkg/controller/perconaservermongodb/psmdb_controller.go @@ -40,6 +40,7 @@ import ( "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/backup" psmdbconfig "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/config" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector" + "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector/logrotate" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/pmm" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/secret" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/tls" @@ -350,6 +351,12 @@ func (r *ReconcilePerconaServerMongoDB) Reconcile(ctx context.Context, request r } } + if cr.CompareVersion("1.22.0") >= 0 { + if err := r.reconcileLogRotateConfigMaps(ctx, cr); err != nil { + return reconcile.Result{}, errors.Wrap(err, "reconcile log rotate config map") + } + } + err = r.reconcileUsers(ctx, cr, repls) if err != nil { return reconcile.Result{}, errors.Wrap(err, "failed to reconcile users") @@ -1249,6 +1256,40 @@ func (r *ReconcilePerconaServerMongoDB) reconcileLogCollectorConfigMaps(ctx cont return nil } +func (r *ReconcilePerconaServerMongoDB) reconcileLogRotateConfigMaps(ctx context.Context, cr *api.PerconaServerMongoDB) error { + if !cr.IsLogCollectorEnabled() { + if err := deleteConfigMapIfExists(ctx, r.client, cr, logrotate.ConfigMapName(cr.Name)); err != nil { + return errors.Wrap(err, "failed to delete log rotate config map when log collector is disabled") + } + return nil + } + + if cr.Spec.LogCollector == nil || cr.Spec.LogCollector.LogRotate == nil || cr.Spec.LogCollector.LogRotate.Configuration == "" { + if err := deleteConfigMapIfExists(ctx, r.client, cr, logrotate.ConfigMapName(cr.Name)); err != nil { + return errors.Wrap(err, "failed to delete log rotate config map when the configuration is empty") + } + return nil + } + + cm := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: logrotate.ConfigMapName(cr.Name), + Namespace: cr.GetNamespace(), + Labels: naming.ClusterLabels(cr), + }, + Data: map[string]string{ + logrotate.MongodbConfig: cr.Spec.LogCollector.LogRotate.Configuration, + }, + } + + err := r.createOrUpdateConfigMap(ctx, cr, cm) + if err != nil { + return errors.Wrap(err, "create or update config map") + } + + return nil +} + func deleteConfigMapIfExists(ctx context.Context, cl client.Client, cr *api.PerconaServerMongoDB, cmName string) error { configMap := &corev1.ConfigMap{} diff --git a/pkg/controller/perconaservermongodb/statefulset.go b/pkg/controller/perconaservermongodb/statefulset.go index ddf43ffaee..30a943fbe7 100644 --- a/pkg/controller/perconaservermongodb/statefulset.go +++ b/pkg/controller/perconaservermongodb/statefulset.go @@ -13,7 +13,9 @@ import ( api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" "github.com/percona/percona-server-mongodb-operator/pkg/naming" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb" + psmdbconfig "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/config" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector" + "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector/logrotate" ) func (r *ReconcilePerconaServerMongoDB) reconcileStatefulSet(ctx context.Context, cr *api.PerconaServerMongoDB, rs *api.ReplsetSpec, ls map[string]string) (*appsv1.StatefulSet, error) { @@ -118,6 +120,19 @@ func (r *ReconcilePerconaServerMongoDB) getStatefulsetFromReplset(ctx context.Co return nil, errors.Wrap(err, "check if log collection custom configuration exists") } + logRotateCustomConfig, err := r.getCustomConfig(ctx, cr.Namespace, logrotate.ConfigMapName(cr.Name)) + if err != nil { + return nil, errors.Wrap(err, "check if log rotate configuration exists") + } + + logRotateExtraConfig := psmdbconfig.CustomConfig{} + if cr.Spec.LogCollector != nil && cr.Spec.LogCollector.LogRotate != nil && cr.Spec.LogCollector.LogRotate.ExtraConfig.Name != "" { + logRotateExtraConfig, err = r.getCustomConfig(ctx, cr.Namespace, cr.Spec.LogCollector.LogRotate.ExtraConfig.Name) + if err != nil { + return nil, errors.Wrap(err, "check if log rotate extra configuration exists") + } + } + usersSecret := new(corev1.Secret) err = r.client.Get(ctx, types.NamespacedName{Name: api.UserSecretName(cr), Namespace: cr.Namespace}, usersSecret) if client.IgnoreNotFound(err) != nil { @@ -130,16 +145,20 @@ func (r *ReconcilePerconaServerMongoDB) getStatefulsetFromReplset(ctx context.Co return nil, errors.Wrap(err, "check ssl secrets") } + configs := psmdb.StatefulConfigParams{ + MongoDConf: mongodCustomConfig, + LogCollectionConf: logCollectionCustomConfig, + LogRotateConf: logRotateCustomConfig, + LogRotateExtraConf: logRotateExtraConfig, + } + secrets := psmdb.StatefulSpecSecretParams{ + UsersSecret: usersSecret, + SSLSecret: sslSecret, + } sfsSpec, err := psmdb.StatefulSpec( ctx, cr, rs, ls, r.initImage, - psmdb.StatefulConfigParams{ - MongoDConf: mongodCustomConfig, - LogCollectionConf: logCollectionCustomConfig, - }, - psmdb.StatefulSpecSecretParams{ - UsersSecret: usersSecret, - SSLSecret: sslSecret, - }, + configs, + secrets, ) if err != nil { return nil, errors.Wrapf(err, "create StatefulSet.Spec %s", sfs.Name) diff --git a/pkg/psmdb/logcollector/container.go b/pkg/psmdb/logcollector/container.go index 5332e21e23..6cff7cdc2d 100644 --- a/pkg/psmdb/logcollector/container.go +++ b/pkg/psmdb/logcollector/container.go @@ -2,13 +2,13 @@ package logcollector import ( "fmt" - "strconv" "github.com/pkg/errors" corev1 "k8s.io/api/core/v1" api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/config" + "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector/logrotate" ) const ( @@ -35,7 +35,7 @@ func Containers(cr *api.PerconaServerMongoDB, mongoPort int32) ([]corev1.Contain return nil, err } - logRotationCont, err := logRotationContainer(cr, mongoPort) + logRotationCont, err := logrotate.Container(cr, mongoPort) if err != nil { return nil, err } @@ -103,72 +103,3 @@ func logContainer(cr *api.PerconaServerMongoDB) (*corev1.Container, error) { return &container, nil } - -func logRotationContainer(cr *api.PerconaServerMongoDB, mongoPort int32) (*corev1.Container, error) { - if cr.Spec.LogCollector == nil { - return nil, errors.New("logcollector can't be nil") - } - - boolFalse := false - - usersSecretName := api.UserSecretName(cr) - - envs := []corev1.EnvVar{ - { - Name: "MONGODB_HOST", - Value: "localhost", - }, - { - Name: "MONGODB_PORT", - Value: strconv.Itoa(int(mongoPort)), - }, - { - Name: "MONGODB_USER", - ValueFrom: &corev1.EnvVarSource{ - SecretKeyRef: &corev1.SecretKeySelector{ - Key: "MONGODB_CLUSTER_ADMIN_USER_ESCAPED", - LocalObjectReference: corev1.LocalObjectReference{ - Name: usersSecretName, - }, - Optional: &boolFalse, - }, - }, - }, - { - Name: "MONGODB_PASSWORD", - ValueFrom: &corev1.EnvVarSource{ - SecretKeyRef: &corev1.SecretKeySelector{ - Key: "MONGODB_CLUSTER_ADMIN_PASSWORD_ESCAPED", - LocalObjectReference: corev1.LocalObjectReference{ - Name: usersSecretName, - }, - Optional: &boolFalse, - }, - }, - }, - } - - container := corev1.Container{ - Name: "logrotate", - Image: cr.Spec.LogCollector.Image, - Env: envs, - ImagePullPolicy: cr.Spec.LogCollector.ImagePullPolicy, - SecurityContext: cr.Spec.LogCollector.ContainerSecurityContext, - Resources: cr.Spec.LogCollector.Resources, - Args: []string{ - "logrotate", - }, - Command: []string{"/opt/percona/logcollector/entrypoint.sh"}, - VolumeMounts: []corev1.VolumeMount{ - { - Name: config.MongodDataVolClaimName, - MountPath: config.MongodContainerDataDir, - }, - { - Name: config.BinVolumeName, - MountPath: config.BinMountPath, - }, - }, - } - return &container, nil -} diff --git a/pkg/psmdb/logcollector/logrotate/container.go b/pkg/psmdb/logcollector/logrotate/container.go new file mode 100644 index 0000000000..ff065b3749 --- /dev/null +++ b/pkg/psmdb/logcollector/logrotate/container.go @@ -0,0 +1,114 @@ +package logrotate + +import ( + "errors" + "fmt" + "strconv" + + api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" + "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/config" + corev1 "k8s.io/api/core/v1" +) + +const ( + ConfigMapNameSuffix = "log-rotate-config" + + VolumeName = "log-rotate-volume" + CustomVolumeName = "custom-log-rotate-volume" + + MongodbConfig = "mongodb.conf" + + custonConfigDir = "/opt/percona/logcollector/logrotate/conf.d" +) + +func ConfigMapName(prefix string) string { + if prefix == "" { + return ConfigMapNameSuffix + } + return fmt.Sprintf("%s-%s", prefix, ConfigMapNameSuffix) +} + +func Container(cr *api.PerconaServerMongoDB, mongoPort int32) (*corev1.Container, error) { + if cr.Spec.LogCollector == nil { + return nil, errors.New("logcollector can't be nil") + } + + boolFalse := false + + usersSecretName := api.UserSecretName(cr) + + envs := []corev1.EnvVar{ + { + Name: "MONGODB_HOST", + Value: "localhost", + }, + { + Name: "MONGODB_PORT", + Value: strconv.Itoa(int(mongoPort)), + }, + { + Name: "MONGODB_USER", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + Key: "MONGODB_CLUSTER_ADMIN_USER_ESCAPED", + LocalObjectReference: corev1.LocalObjectReference{ + Name: usersSecretName, + }, + Optional: &boolFalse, + }, + }, + }, + { + Name: "MONGODB_PASSWORD", + ValueFrom: &corev1.EnvVarSource{ + SecretKeyRef: &corev1.SecretKeySelector{ + Key: "MONGODB_CLUSTER_ADMIN_PASSWORD_ESCAPED", + LocalObjectReference: corev1.LocalObjectReference{ + Name: usersSecretName, + }, + Optional: &boolFalse, + }, + }, + }, + } + + container := corev1.Container{ + Name: "logrotate", + Image: cr.Spec.LogCollector.Image, + Env: envs, + ImagePullPolicy: cr.Spec.LogCollector.ImagePullPolicy, + SecurityContext: cr.Spec.LogCollector.ContainerSecurityContext, + Resources: cr.Spec.LogCollector.Resources, + Args: []string{ + "logrotate", + }, + Command: []string{"/opt/percona/logcollector/entrypoint.sh"}, + VolumeMounts: []corev1.VolumeMount{ + { + Name: config.MongodDataVolClaimName, + MountPath: config.MongodContainerDataDir, + }, + { + Name: config.BinVolumeName, + MountPath: config.BinMountPath, + }, + }, + } + + if cr.Spec.LogCollector != nil && cr.Spec.LogCollector.LogRotate != nil { + if cr.Spec.LogCollector.LogRotate.Configuration != "" { + container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{ + Name: VolumeName, + MountPath: custonConfigDir, + }) + } + if cr.Spec.LogCollector.LogRotate.ExtraConfig.Name != "" { + container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{ + Name: CustomVolumeName, + MountPath: custonConfigDir, + }) + } + } + + return &container, nil +} diff --git a/pkg/psmdb/statefulset.go b/pkg/psmdb/statefulset.go index f764e3d2ed..50906dd391 100644 --- a/pkg/psmdb/statefulset.go +++ b/pkg/psmdb/statefulset.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "strconv" + "strings" "github.com/pkg/errors" appsv1 "k8s.io/api/apps/v1" @@ -15,6 +16,7 @@ import ( "github.com/percona/percona-server-mongodb-operator/pkg/naming" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/config" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector" + "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector/logrotate" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/pmm" ) @@ -41,8 +43,31 @@ type StatefulSpecSecretParams struct { } type StatefulConfigParams struct { - MongoDConf config.CustomConfig - LogCollectionConf config.CustomConfig + MongoDConf config.CustomConfig + LogCollectionConf config.CustomConfig + LogRotateConf config.CustomConfig + LogRotateExtraConf config.CustomConfig +} + +func (p *StatefulConfigParams) HashHex(cr *api.PerconaServerMongoDB) string { + var b strings.Builder + if p.MongoDConf.Type.IsUsable() { + b.WriteString(p.MongoDConf.HashHex) + } + + if cr.CompareVersion("1.21.0") >= 0 && p.LogCollectionConf.Type.IsUsable() { + b.WriteString(p.LogCollectionConf.HashHex) + } + + if cr.CompareVersion("1.22.0") >= 0 { + if p.LogRotateConf.Type.IsUsable() { + b.WriteString(p.LogRotateConf.HashHex) + } + if p.LogRotateExtraConf.Type.IsUsable() { + b.WriteString(p.LogRotateExtraConf.HashHex) + } + } + return b.String() } // StatefulSpec returns spec for stateful set @@ -62,6 +87,7 @@ func StatefulSpec(ctx context.Context, cr *api.PerconaServerMongoDB, replset *ap readinessProbe := replset.ReadinessProbe configName := naming.MongodCustomConfigName(cr, replset) logCollectionConfigName := logcollector.ConfigMapName(cr.Name) + logRotateConfigName := logrotate.ConfigMapName(cr.Name) switch ls[naming.LabelKubernetesComponent] { case naming.ComponentArbiter: @@ -149,6 +175,19 @@ func StatefulSpec(ctx context.Context, cr *api.PerconaServerMongoDB, replset *ap VolumeSource: configs.LogCollectionConf.Type.VolumeSource(logCollectionConfigName), }) } + if cr.CompareVersion("1.22.0") >= 0 && configs.LogRotateConf.Type.IsUsable() { + volumes = append(volumes, corev1.Volume{ + Name: logrotate.VolumeName, + VolumeSource: configs.LogRotateConf.Type.VolumeSource(logRotateConfigName), + }) + } + if cr.CompareVersion("1.22.0") >= 0 && configs.LogRotateExtraConf.Type.IsUsable() { + volumes = append(volumes, corev1.Volume{ + Name: logrotate.CustomVolumeName, + VolumeSource: configs.LogRotateConf.Type.VolumeSource(cr.Spec.LogCollector.LogRotate.ExtraConfig.Name), + }) + } + encryptionEnabled, err := replset.IsEncryptionEnabled() if err != nil { return appsv1.StatefulSetSpec{}, errors.Wrap(err, "failed to check if encryption is enabled") @@ -206,12 +245,8 @@ func StatefulSpec(ctx context.Context, cr *api.PerconaServerMongoDB, replset *ap annotations = make(map[string]string) } - if configs.MongoDConf.Type.IsUsable() { - annotations["percona.com/configuration-hash"] = configs.MongoDConf.HashHex - } - - if cr.CompareVersion("1.21.0") >= 0 && configs.LogCollectionConf.Type.IsUsable() { - annotations["percona.com/configuration-hash"] = annotations["percona.com/configuration-hash"] + configs.LogCollectionConf.HashHex + if hash := configs.HashHex(cr); hash != "" { + annotations["percona.com/configuration-hash"] = hash } volumeClaimTemplates := []corev1.PersistentVolumeClaim{} From 8f2e658a8ed0ded18b9a987b142b124de1e66128 Mon Sep 17 00:00:00 2001 From: Mayank Shah Date: Wed, 17 Dec 2025 18:02:42 +0530 Subject: [PATCH 3/4] fix field name Signed-off-by: Mayank Shah --- config/crd/bases/psmdb.percona.com_perconaservermongodbs.yaml | 2 +- deploy/bundle.yaml | 2 +- deploy/crd.yaml | 2 +- deploy/cw-bundle.yaml | 2 +- e2e-tests/version-service/conf/crd.yaml | 2 +- pkg/apis/psmdb/v1/psmdb_types.go | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/crd/bases/psmdb.percona.com_perconaservermongodbs.yaml b/config/crd/bases/psmdb.percona.com_perconaservermongodbs.yaml index 6d2dc40b1c..2f1bf7df1e 100644 --- a/config/crd/bases/psmdb.percona.com_perconaservermongodbs.yaml +++ b/config/crd/bases/psmdb.percona.com_perconaservermongodbs.yaml @@ -702,7 +702,7 @@ spec: properties: configuration: type: string - extraConfigs: + extraConfig: properties: name: default: "" diff --git a/deploy/bundle.yaml b/deploy/bundle.yaml index ea60b096da..9918a28831 100644 --- a/deploy/bundle.yaml +++ b/deploy/bundle.yaml @@ -1559,7 +1559,7 @@ spec: properties: configuration: type: string - extraConfigs: + extraConfig: properties: name: default: "" diff --git a/deploy/crd.yaml b/deploy/crd.yaml index 3444a73331..f7676a4e30 100644 --- a/deploy/crd.yaml +++ b/deploy/crd.yaml @@ -1559,7 +1559,7 @@ spec: properties: configuration: type: string - extraConfigs: + extraConfig: properties: name: default: "" diff --git a/deploy/cw-bundle.yaml b/deploy/cw-bundle.yaml index ef889553e2..4146b7cdb1 100644 --- a/deploy/cw-bundle.yaml +++ b/deploy/cw-bundle.yaml @@ -1559,7 +1559,7 @@ spec: properties: configuration: type: string - extraConfigs: + extraConfig: properties: name: default: "" diff --git a/e2e-tests/version-service/conf/crd.yaml b/e2e-tests/version-service/conf/crd.yaml index 3444a73331..f7676a4e30 100644 --- a/e2e-tests/version-service/conf/crd.yaml +++ b/e2e-tests/version-service/conf/crd.yaml @@ -1559,7 +1559,7 @@ spec: properties: configuration: type: string - extraConfigs: + extraConfig: properties: name: default: "" diff --git a/pkg/apis/psmdb/v1/psmdb_types.go b/pkg/apis/psmdb/v1/psmdb_types.go index 39d9d4dc58..2e523b3289 100644 --- a/pkg/apis/psmdb/v1/psmdb_types.go +++ b/pkg/apis/psmdb/v1/psmdb_types.go @@ -1510,7 +1510,7 @@ type LogRotateSpec struct { Configuration string `json:"configuration,omitempty"` // AdditionalConfig allows specifying an additional configuration file for logrotate. // This should be a reference to a ConfigMap in the same namespace. - ExtraConfig corev1.LocalObjectReference `json:"extraConfigs,omitempty"` + ExtraConfig corev1.LocalObjectReference `json:"extraConfig,omitempty"` } func (cr *PerconaServerMongoDB) IsLogCollectorEnabled() bool { From 135050b2e68518322bf9c2e57f0c13b3366d73fa Mon Sep 17 00:00:00 2001 From: Mayank Shah Date: Wed, 17 Dec 2025 18:27:47 +0530 Subject: [PATCH 4/4] update comment Signed-off-by: Mayank Shah --- pkg/apis/psmdb/v1/psmdb_types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/apis/psmdb/v1/psmdb_types.go b/pkg/apis/psmdb/v1/psmdb_types.go index 2e523b3289..71f1f31f9f 100644 --- a/pkg/apis/psmdb/v1/psmdb_types.go +++ b/pkg/apis/psmdb/v1/psmdb_types.go @@ -1508,7 +1508,7 @@ type LogCollectorSpec struct { type LogRotateSpec struct { // Configuration allows overriding the default logrotate configuration. Configuration string `json:"configuration,omitempty"` - // AdditionalConfig allows specifying an additional configuration file for logrotate. + // ExtraConfig allows specifying logrotate configuration file in addition to the main configuration file. // This should be a reference to a ConfigMap in the same namespace. ExtraConfig corev1.LocalObjectReference `json:"extraConfig,omitempty"` }