From 9030520e24006392846fc7725f5da0aa20ed362f Mon Sep 17 00:00:00 2001 From: Felix Kunde Date: Fri, 26 Jun 2026 17:02:50 +0200 Subject: [PATCH] fix array validation for global maintenance window and protected role names (#3120) * change type of maintenance windows in config crd * fix default array type for protected role names --- .../crds/operatorconfigurations.yaml | 8 +++++++- manifests/operatorconfiguration.crd.yaml | 8 +++++++- .../acid.zalan.do/v1/operator_configuration_type.go | 8 ++++---- .../acid.zalan.do/v1/operatorconfiguration.crd.yaml | 8 +++++++- pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go | 6 ++---- pkg/controller/operator_config.go | 11 +---------- 6 files changed, 28 insertions(+), 21 deletions(-) diff --git a/charts/postgres-operator/crds/operatorconfigurations.yaml b/charts/postgres-operator/crds/operatorconfigurations.yaml index a6d9a97d0..19d957431 100644 --- a/charts/postgres-operator/crds/operatorconfigurations.yaml +++ b/charts/postgres-operator/crds/operatorconfigurations.yaml @@ -706,6 +706,10 @@ spec: type: integer type: object maintenance_windows: + items: + pattern: ^\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))-((2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))\ + *$ + type: string type: array major_version_upgrade: description: MajorVersionUpgradeConfiguration defines how to execute @@ -851,7 +855,9 @@ spec: type: string type: array protected_role_names: - default: '["admin", "cron_admin"]' + default: + - admin + - cron_admin items: type: string type: array diff --git a/manifests/operatorconfiguration.crd.yaml b/manifests/operatorconfiguration.crd.yaml index a6d9a97d0..19d957431 100644 --- a/manifests/operatorconfiguration.crd.yaml +++ b/manifests/operatorconfiguration.crd.yaml @@ -706,6 +706,10 @@ spec: type: integer type: object maintenance_windows: + items: + pattern: ^\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))-((2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))\ + *$ + type: string type: array major_version_upgrade: description: MajorVersionUpgradeConfiguration defines how to execute @@ -851,7 +855,9 @@ spec: type: string type: array protected_role_names: - default: '["admin", "cron_admin"]' + default: + - admin + - cron_admin items: type: string type: array diff --git a/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go b/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go index a55fdd7a8..0d98d487a 100644 --- a/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go +++ b/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go @@ -284,7 +284,7 @@ type TeamsAPIConfiguration struct { PamRoleName string `json:"pam_role_name,omitempty"` // +kubebuilder:default="https://info.example.com/oauth2/tokeninfo?access_token= uid realm=/employees" PamConfiguration string `json:"pam_configuration,omitempty"` - // +kubebuilder:default="[\"admin\", \"cron_admin\"]" + // +kubebuilder:default={"admin", "cron_admin"} ProtectedRoles []string `json:"protected_role_names,omitempty"` PostgresSuperuserTeams []string `json:"postgres_superuser_teams,omitempty"` // +kubebuilder:default=true @@ -426,10 +426,10 @@ type OperatorConfigurationData struct { RepairPeriod Duration `json:"repair_period,omitempty"` // +kubebuilder:default=true EnableMaintenanceWindows *bool `json:"enable_maintenance_windows,omitempty"` - // +kubebuilder:validation:Schemaless // +kubebuilder:validation:Type=array - MaintenanceWindows []MaintenanceWindow `json:"maintenance_windows,omitempty"` - SetMemoryRequestToLimit bool `json:"set_memory_request_to_limit,omitempty"` + // +kubebuilder:validation:items:Pattern=`^\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))-((2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))\ *$` + MaintenanceWindows []string `json:"maintenance_windows,omitempty"` + SetMemoryRequestToLimit bool `json:"set_memory_request_to_limit,omitempty"` // +kubebuilder:default=true ShmVolume *bool `json:"enable_shm_volume,omitempty"` SidecarImages map[string]string `json:"sidecar_docker_images,omitempty"` // deprecated in favour of SidecarContainers diff --git a/pkg/apis/acid.zalan.do/v1/operatorconfiguration.crd.yaml b/pkg/apis/acid.zalan.do/v1/operatorconfiguration.crd.yaml index a6d9a97d0..19d957431 100644 --- a/pkg/apis/acid.zalan.do/v1/operatorconfiguration.crd.yaml +++ b/pkg/apis/acid.zalan.do/v1/operatorconfiguration.crd.yaml @@ -706,6 +706,10 @@ spec: type: integer type: object maintenance_windows: + items: + pattern: ^\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))-((2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))\ + *$ + type: string type: array major_version_upgrade: description: MajorVersionUpgradeConfiguration defines how to execute @@ -851,7 +855,9 @@ spec: type: string type: array protected_role_names: - default: '["admin", "cron_admin"]' + default: + - admin + - cron_admin items: type: string type: array diff --git a/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go b/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go index 7d18c2cf2..4fd9c4a00 100644 --- a/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go +++ b/pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go @@ -440,10 +440,8 @@ func (in *OperatorConfigurationData) DeepCopyInto(out *OperatorConfigurationData } if in.MaintenanceWindows != nil { in, out := &in.MaintenanceWindows, &out.MaintenanceWindows - *out = make([]MaintenanceWindow, len(*in)) - for i := range *in { - (*in)[i].DeepCopyInto(&(*out)[i]) - } + *out = make([]string, len(*in)) + copy(*out, *in) } if in.ShmVolume != nil { in, out := &in.ShmVolume, &out.ShmVolume diff --git a/pkg/controller/operator_config.go b/pkg/controller/operator_config.go index 66fc7a731..94ef86d7c 100644 --- a/pkg/controller/operator_config.go +++ b/pkg/controller/operator_config.go @@ -51,16 +51,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur result.SidecarImages = fromCRD.SidecarImages result.SidecarContainers = fromCRD.SidecarContainers result.EnableMaintenanceWindows = util.CoalesceBool(fromCRD.EnableMaintenanceWindows, util.True()) - if len(fromCRD.MaintenanceWindows) > 0 { - result.MaintenanceWindows = make([]string, 0, len(fromCRD.MaintenanceWindows)) - for _, window := range fromCRD.MaintenanceWindows { - w, err := window.MarshalJSON() - if err != nil { - panic(fmt.Errorf("could not marshal configured maintenance window: %v", err)) - } - result.MaintenanceWindows = append(result.MaintenanceWindows, string(w)) - } - } + result.MaintenanceWindows = fromCRD.MaintenanceWindows // user config result.SuperUsername = util.Coalesce(fromCRD.PostgresUsersConfiguration.SuperUsername, "postgres")