From 5665779d09711fb6e6431ae5adad9ba5f2cf397a Mon Sep 17 00:00:00 2001 From: dmotte <37443982+dmotte@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:40:03 +0200 Subject: [PATCH 1/9] Add empty string cases to patterns for pod resources --- .../crds/operatorconfigurations.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/charts/postgres-operator/crds/operatorconfigurations.yaml b/charts/postgres-operator/crds/operatorconfigurations.yaml index 15783fd38..74897b320 100644 --- a/charts/postgres-operator/crds/operatorconfigurations.yaml +++ b/charts/postgres-operator/crds/operatorconfigurations.yaml @@ -376,28 +376,28 @@ spec: properties: default_cpu_limit: type: string - pattern: '^(\d+m|\d+(\.\d{1,3})?)$' + pattern: '^(\d+m|\d+(\.\d{1,3})?)$|^$' default_cpu_request: type: string - pattern: '^(\d+m|\d+(\.\d{1,3})?)$' + pattern: '^(\d+m|\d+(\.\d{1,3})?)$|^$' default_memory_limit: type: string - pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' + pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$|^$' default_memory_request: type: string - pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' + pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$|^$' max_cpu_request: type: string - pattern: '^(\d+m|\d+(\.\d{1,3})?)$' + pattern: '^(\d+m|\d+(\.\d{1,3})?)$|^$' max_memory_request: type: string - pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' + pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$|^$' min_cpu_limit: type: string - pattern: '^(\d+m|\d+(\.\d{1,3})?)$' + pattern: '^(\d+m|\d+(\.\d{1,3})?)$|^$' min_memory_limit: type: string - pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' + pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$|^$' timeouts: type: object properties: From ce88fe750bfcf35197154570c436d17b65c7a98c Mon Sep 17 00:00:00 2001 From: dmotte <37443982+dmotte@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:41:15 +0200 Subject: [PATCH 2/9] Fixed enforceMinResourceLimits to allow other zero values --- pkg/cluster/k8sres.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index 84da6affb..0ef68b8cc 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -157,7 +157,11 @@ func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) e // setting limits too low can cause unnecessary evictions / OOM kills cpuLimit := resources.Limits[v1.ResourceCPU] minCPULimit := c.OpConfig.MinCPULimit - if minCPULimit != "" { + minCPU, err := resource.ParseQuantity(minCPULimit) + if err != nil { + return fmt.Errorf("could not parse min CPU limit %s: %v", minCPULimit, err) + } + if !minCPU.IsZero() { isSmaller, err = util.IsSmallerQuantity(cpuLimit.String(), minCPULimit) if err != nil { return fmt.Errorf("could not compare defined CPU limit %s for %q container with configured minimum value %s: %v", @@ -168,13 +172,17 @@ func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) e cpuLimit.String(), constants.PostgresContainerName, minCPULimit) c.logger.Warningf(msg) c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) - resources.Limits[v1.ResourceCPU], _ = resource.ParseQuantity(minCPULimit) + resources.Limits[v1.ResourceCPU] = minCPU } } memoryLimit := resources.Limits[v1.ResourceMemory] minMemoryLimit := c.OpConfig.MinMemoryLimit - if minMemoryLimit != "" { + minMemory, err := resource.ParseQuantity(minMemoryLimit) + if err != nil { + return fmt.Errorf("could not parse min memory limit %s: %v", minMemoryLimit, err) + } + if !minMemory.IsZero() { isSmaller, err = util.IsSmallerQuantity(memoryLimit.String(), minMemoryLimit) if err != nil { return fmt.Errorf("could not compare defined memory limit %s for %q container with configured minimum value %s: %v", @@ -185,7 +193,7 @@ func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) e memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit) c.logger.Warningf(msg) c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) - resources.Limits[v1.ResourceMemory], _ = resource.ParseQuantity(minMemoryLimit) + resources.Limits[v1.ResourceMemory] = minMemory } } From 5b0a8a8800803e494f84fddb773d2c6d13f6bb39 Mon Sep 17 00:00:00 2001 From: dmotte <37443982+dmotte@users.noreply.github.com> Date: Tue, 20 Aug 2024 17:25:09 +0200 Subject: [PATCH 3/9] Added outer empty string check to enforceMinResourceLimits --- pkg/cluster/k8sres.go | 62 +++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 29 deletions(-) diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index 0ef68b8cc..e93dfdd73 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -157,43 +157,47 @@ func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) e // setting limits too low can cause unnecessary evictions / OOM kills cpuLimit := resources.Limits[v1.ResourceCPU] minCPULimit := c.OpConfig.MinCPULimit - minCPU, err := resource.ParseQuantity(minCPULimit) - if err != nil { - return fmt.Errorf("could not parse min CPU limit %s: %v", minCPULimit, err) - } - if !minCPU.IsZero() { - isSmaller, err = util.IsSmallerQuantity(cpuLimit.String(), minCPULimit) + if minCPULimit != "" { + minCPU, err := resource.ParseQuantity(minCPULimit) if err != nil { - return fmt.Errorf("could not compare defined CPU limit %s for %q container with configured minimum value %s: %v", - cpuLimit.String(), constants.PostgresContainerName, minCPULimit, err) + return fmt.Errorf("could not parse min CPU limit %s: %v", minCPULimit, err) } - if isSmaller { - msg = fmt.Sprintf("defined CPU limit %s for %q container is below required minimum %s and will be increased", - cpuLimit.String(), constants.PostgresContainerName, minCPULimit) - c.logger.Warningf(msg) - c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) - resources.Limits[v1.ResourceCPU] = minCPU + if !minCPU.IsZero() { + isSmaller, err = util.IsSmallerQuantity(cpuLimit.String(), minCPULimit) + if err != nil { + return fmt.Errorf("could not compare defined CPU limit %s for %q container with configured minimum value %s: %v", + cpuLimit.String(), constants.PostgresContainerName, minCPULimit, err) + } + if isSmaller { + msg = fmt.Sprintf("defined CPU limit %s for %q container is below required minimum %s and will be increased", + cpuLimit.String(), constants.PostgresContainerName, minCPULimit) + c.logger.Warningf(msg) + c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) + resources.Limits[v1.ResourceCPU] = minCPU + } } } memoryLimit := resources.Limits[v1.ResourceMemory] minMemoryLimit := c.OpConfig.MinMemoryLimit - minMemory, err := resource.ParseQuantity(minMemoryLimit) - if err != nil { - return fmt.Errorf("could not parse min memory limit %s: %v", minMemoryLimit, err) - } - if !minMemory.IsZero() { - isSmaller, err = util.IsSmallerQuantity(memoryLimit.String(), minMemoryLimit) + if minMemoryLimit != "" { + minMemory, err := resource.ParseQuantity(minMemoryLimit) if err != nil { - return fmt.Errorf("could not compare defined memory limit %s for %q container with configured minimum value %s: %v", - memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit, err) - } - if isSmaller { - msg = fmt.Sprintf("defined memory limit %s for %q container is below required minimum %s and will be increased", - memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit) - c.logger.Warningf(msg) - c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) - resources.Limits[v1.ResourceMemory] = minMemory + return fmt.Errorf("could not parse min memory limit %s: %v", minMemoryLimit, err) + } + if !minMemory.IsZero() { + isSmaller, err = util.IsSmallerQuantity(memoryLimit.String(), minMemoryLimit) + if err != nil { + return fmt.Errorf("could not compare defined memory limit %s for %q container with configured minimum value %s: %v", + memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit, err) + } + if isSmaller { + msg = fmt.Sprintf("defined memory limit %s for %q container is below required minimum %s and will be increased", + memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit) + c.logger.Warningf(msg) + c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) + resources.Limits[v1.ResourceMemory] = minMemory + } } } From cf72594ca7ecd6649f0ac1069cfe7113173a52dd Mon Sep 17 00:00:00 2001 From: dmotte <37443982+dmotte@users.noreply.github.com> Date: Tue, 20 Aug 2024 17:30:11 +0200 Subject: [PATCH 4/9] Removed unnecessary err var --- pkg/cluster/k8sres.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index e93dfdd73..1b75c9dd1 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -150,7 +150,6 @@ func makeLogicalBackupResources(config *config.Config) acidv1.Resources { func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) error { var ( isSmaller bool - err error msg string ) From 37432667173d1c0b43bfbf5426ff499c12e7744c Mon Sep 17 00:00:00 2001 From: dmotte <37443982+dmotte@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:16:17 +0200 Subject: [PATCH 5/9] Added empty strings test case --- pkg/cluster/k8sres_test.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/pkg/cluster/k8sres_test.go b/pkg/cluster/k8sres_test.go index f18861687..eb468ed54 100644 --- a/pkg/cluster/k8sres_test.go +++ b/pkg/cluster/k8sres_test.go @@ -2993,6 +2993,38 @@ func TestGenerateResourceRequirements(t *testing.T) { ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, }, }, + { + subTest: "test generation of resources when min limits are empty strings", + config: config.Config{ + Resources: config.Resources{ + ClusterLabels: map[string]string{"application": "spilo"}, + ClusterNameLabel: clusterNameLabel, + MinCPULimit: "", + MinMemoryLimit: "", + PodRoleLabel: "spilo-role", + }, + PodManagementPolicy: "ordered_ready", + SetMemoryRequestToLimit: false, + }, + pgSpec: acidv1.Postgresql{ + ObjectMeta: metav1.ObjectMeta{ + Name: clusterName, + Namespace: namespace, + }, + Spec: acidv1.PostgresSpec{ + Resources: &acidv1.Resources{ + ResourceLimits: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("5m"), Memory: k8sutil.StringToPointer("5Mi")}, + }, + TeamID: "acid", + Volume: acidv1.Volume{ + Size: "1G", + }, + }, + }, + expectedResources: acidv1.Resources{ + ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("5m"), Memory: k8sutil.StringToPointer("5Mi")}, + }, + }, { subTest: "test matchLimitsWithRequestsIfSmaller", config: config.Config{ From be50a873d0c3a6fbd1d5930cf59e2699e8a072a9 Mon Sep 17 00:00:00 2001 From: dmotte <37443982+dmotte@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:38:50 +0200 Subject: [PATCH 6/9] Set all config.Resources to empty strings --- pkg/cluster/k8sres_test.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/pkg/cluster/k8sres_test.go b/pkg/cluster/k8sres_test.go index eb468ed54..e464a6f08 100644 --- a/pkg/cluster/k8sres_test.go +++ b/pkg/cluster/k8sres_test.go @@ -2997,11 +2997,17 @@ func TestGenerateResourceRequirements(t *testing.T) { subTest: "test generation of resources when min limits are empty strings", config: config.Config{ Resources: config.Resources{ - ClusterLabels: map[string]string{"application": "spilo"}, - ClusterNameLabel: clusterNameLabel, - MinCPULimit: "", - MinMemoryLimit: "", - PodRoleLabel: "spilo-role", + ClusterLabels: map[string]string{"application": "spilo"}, + ClusterNameLabel: clusterNameLabel, + DefaultCPURequest: "", + DefaultCPULimit: "", + MaxCPURequest: "", + MinCPULimit: "", + DefaultMemoryRequest: "", + DefaultMemoryLimit: "", + MaxMemoryRequest: "", + MinMemoryLimit: "", + PodRoleLabel: "spilo-role", }, PodManagementPolicy: "ordered_ready", SetMemoryRequestToLimit: false, From a6631a868d3798c2d96145b6b7f52c81efce6a71 Mon Sep 17 00:00:00 2001 From: dmotte <37443982+dmotte@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:47:02 +0200 Subject: [PATCH 7/9] Fixed ResourceLimits field name --- pkg/cluster/k8sres_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cluster/k8sres_test.go b/pkg/cluster/k8sres_test.go index e464a6f08..3fa8a46ec 100644 --- a/pkg/cluster/k8sres_test.go +++ b/pkg/cluster/k8sres_test.go @@ -3028,7 +3028,7 @@ func TestGenerateResourceRequirements(t *testing.T) { }, }, expectedResources: acidv1.Resources{ - ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("5m"), Memory: k8sutil.StringToPointer("5Mi")}, + ResourceLimits: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("5m"), Memory: k8sutil.StringToPointer("5Mi")}, }, }, { From 24df5914a93173397fb63d81e99c815523e0538c Mon Sep 17 00:00:00 2001 From: dmotte <37443982+dmotte@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:16:10 +0200 Subject: [PATCH 8/9] Restored k8sres.go and changed test to zeros --- pkg/cluster/k8sres.go | 51 +++++++++++++++----------------------- pkg/cluster/k8sres_test.go | 18 +++++++------- 2 files changed, 29 insertions(+), 40 deletions(-) diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index 6e4ed71c4..4e67dbd94 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -150,6 +150,7 @@ func makeLogicalBackupResources(config *config.Config) acidv1.Resources { func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) error { var ( isSmaller bool + err error msg string ) @@ -157,46 +158,34 @@ func (c *Cluster) enforceMinResourceLimits(resources *v1.ResourceRequirements) e cpuLimit := resources.Limits[v1.ResourceCPU] minCPULimit := c.OpConfig.MinCPULimit if minCPULimit != "" { - minCPU, err := resource.ParseQuantity(minCPULimit) + isSmaller, err = util.IsSmallerQuantity(cpuLimit.String(), minCPULimit) if err != nil { - return fmt.Errorf("could not parse min CPU limit %s: %v", minCPULimit, err) + return fmt.Errorf("could not compare defined CPU limit %s for %q container with configured minimum value %s: %v", + cpuLimit.String(), constants.PostgresContainerName, minCPULimit, err) } - if !minCPU.IsZero() { - isSmaller, err = util.IsSmallerQuantity(cpuLimit.String(), minCPULimit) - if err != nil { - return fmt.Errorf("could not compare defined CPU limit %s for %q container with configured minimum value %s: %v", - cpuLimit.String(), constants.PostgresContainerName, minCPULimit, err) - } - if isSmaller { - msg = fmt.Sprintf("defined CPU limit %s for %q container is below required minimum %s and will be increased", - cpuLimit.String(), constants.PostgresContainerName, minCPULimit) - c.logger.Warningf(msg) - c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) - resources.Limits[v1.ResourceCPU] = minCPU - } + if isSmaller { + msg = fmt.Sprintf("defined CPU limit %s for %q container is below required minimum %s and will be increased", + cpuLimit.String(), constants.PostgresContainerName, minCPULimit) + c.logger.Warningf(msg) + c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) + resources.Limits[v1.ResourceCPU], _ = resource.ParseQuantity(minCPULimit) } } memoryLimit := resources.Limits[v1.ResourceMemory] minMemoryLimit := c.OpConfig.MinMemoryLimit if minMemoryLimit != "" { - minMemory, err := resource.ParseQuantity(minMemoryLimit) + isSmaller, err = util.IsSmallerQuantity(memoryLimit.String(), minMemoryLimit) if err != nil { - return fmt.Errorf("could not parse min memory limit %s: %v", minMemoryLimit, err) - } - if !minMemory.IsZero() { - isSmaller, err = util.IsSmallerQuantity(memoryLimit.String(), minMemoryLimit) - if err != nil { - return fmt.Errorf("could not compare defined memory limit %s for %q container with configured minimum value %s: %v", - memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit, err) - } - if isSmaller { - msg = fmt.Sprintf("defined memory limit %s for %q container is below required minimum %s and will be increased", - memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit) - c.logger.Warningf(msg) - c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) - resources.Limits[v1.ResourceMemory] = minMemory - } + return fmt.Errorf("could not compare defined memory limit %s for %q container with configured minimum value %s: %v", + memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit, err) + } + if isSmaller { + msg = fmt.Sprintf("defined memory limit %s for %q container is below required minimum %s and will be increased", + memoryLimit.String(), constants.PostgresContainerName, minMemoryLimit) + c.logger.Warningf(msg) + c.eventRecorder.Eventf(c.GetReference(), v1.EventTypeWarning, "ResourceLimits", msg) + resources.Limits[v1.ResourceMemory], _ = resource.ParseQuantity(minMemoryLimit) } } diff --git a/pkg/cluster/k8sres_test.go b/pkg/cluster/k8sres_test.go index c375a893b..bea229dda 100644 --- a/pkg/cluster/k8sres_test.go +++ b/pkg/cluster/k8sres_test.go @@ -2994,19 +2994,19 @@ func TestGenerateResourceRequirements(t *testing.T) { }, }, { - subTest: "test generation of resources when min limits are empty strings", + subTest: "test generation of resources when min limits are all set to zero", config: config.Config{ Resources: config.Resources{ ClusterLabels: map[string]string{"application": "spilo"}, ClusterNameLabel: clusterNameLabel, - DefaultCPURequest: "", - DefaultCPULimit: "", - MaxCPURequest: "", - MinCPULimit: "", - DefaultMemoryRequest: "", - DefaultMemoryLimit: "", - MaxMemoryRequest: "", - MinMemoryLimit: "", + DefaultCPURequest: "0", + DefaultCPULimit: "0", + MaxCPURequest: "0", + MinCPULimit: "0", + DefaultMemoryRequest: "0", + DefaultMemoryLimit: "0", + MaxMemoryRequest: "0", + MinMemoryLimit: "0", PodRoleLabel: "spilo-role", }, PodManagementPolicy: "ordered_ready", From 107fe9b7a0894943ebbc88cd15027c733375e41c Mon Sep 17 00:00:00 2001 From: dmotte <37443982+dmotte@users.noreply.github.com> Date: Tue, 3 Sep 2024 19:32:49 +0200 Subject: [PATCH 9/9] Updated validation pattern in manifests/operatorconfiguration.crd.yaml and pkg/apis/acid.zalan.do/v1/crds.go --- manifests/operatorconfiguration.crd.yaml | 16 ++++++++-------- pkg/apis/acid.zalan.do/v1/crds.go | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/manifests/operatorconfiguration.crd.yaml b/manifests/operatorconfiguration.crd.yaml index c2b0cf398..a7b1a7280 100644 --- a/manifests/operatorconfiguration.crd.yaml +++ b/manifests/operatorconfiguration.crd.yaml @@ -374,28 +374,28 @@ spec: properties: default_cpu_limit: type: string - pattern: '^(\d+m|\d+(\.\d{1,3})?)$' + pattern: '^(\d+m|\d+(\.\d{1,3})?)$|^$' default_cpu_request: type: string - pattern: '^(\d+m|\d+(\.\d{1,3})?)$' + pattern: '^(\d+m|\d+(\.\d{1,3})?)$|^$' default_memory_limit: type: string - pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' + pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$|^$' default_memory_request: type: string - pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' + pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$|^$' max_cpu_request: type: string - pattern: '^(\d+m|\d+(\.\d{1,3})?)$' + pattern: '^(\d+m|\d+(\.\d{1,3})?)$|^$' max_memory_request: type: string - pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' + pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$|^$' min_cpu_limit: type: string - pattern: '^(\d+m|\d+(\.\d{1,3})?)$' + pattern: '^(\d+m|\d+(\.\d{1,3})?)$|^$' min_memory_limit: type: string - pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' + pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$|^$' timeouts: type: object properties: diff --git a/pkg/apis/acid.zalan.do/v1/crds.go b/pkg/apis/acid.zalan.do/v1/crds.go index da88b0855..c5c4b2706 100644 --- a/pkg/apis/acid.zalan.do/v1/crds.go +++ b/pkg/apis/acid.zalan.do/v1/crds.go @@ -1573,35 +1573,35 @@ var OperatorConfigCRDResourceValidation = apiextv1.CustomResourceValidation{ Properties: map[string]apiextv1.JSONSchemaProps{ "default_cpu_limit": { Type: "string", - Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$", + Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$|^$", }, "default_cpu_request": { Type: "string", - Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$", + Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$|^$", }, "default_memory_limit": { Type: "string", - Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$", + Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$|^$", }, "default_memory_request": { Type: "string", - Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$", + Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$|^$", }, "max_cpu_request": { Type: "string", - Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$", + Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$|^$", }, "max_memory_request": { Type: "string", - Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$", + Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$|^$", }, "min_cpu_limit": { Type: "string", - Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$", + Pattern: "^(\\d+m|\\d+(\\.\\d{1,3})?)$|^$", }, "min_memory_limit": { Type: "string", - Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$", + Pattern: "^(\\d+(e\\d+)?|\\d+(\\.\\d+)?(e\\d+)?[EPTGMK]i?)$|^$", }, }, },