allow empty resources when defaults are empty (#2524)
* allow empty resources when defaults are empty * update codegen * add more unit tests and remove internal resources defaults * a unit test for min limit and raising to request * uncomment defaults in example configmap * simplifying pooler pod generation unit test
This commit is contained in:
		
							parent
							
								
									bf5db676b1
								
							
						
					
					
						commit
						29ea863faf
					
				|  | @ -365,19 +365,15 @@ spec: | ||||||
|                   default_cpu_limit: |                   default_cpu_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|                     default: "1" |  | ||||||
|                   default_cpu_request: |                   default_cpu_request: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|                     default: "100m" |  | ||||||
|                   default_memory_limit: |                   default_memory_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' |                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' | ||||||
|                     default: "500Mi" |  | ||||||
|                   default_memory_request: |                   default_memory_request: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' |                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' | ||||||
|                     default: "100Mi" |  | ||||||
|                   max_cpu_request: |                   max_cpu_request: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|  | @ -387,11 +383,9 @@ spec: | ||||||
|                   min_cpu_limit: |                   min_cpu_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|                     default: "250m" |  | ||||||
|                   min_memory_limit: |                   min_memory_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' |                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' | ||||||
|                     default: "250Mi" |  | ||||||
|               timeouts: |               timeouts: | ||||||
|                 type: object |                 type: object | ||||||
|                 properties: |                 properties: | ||||||
|  | @ -672,19 +666,15 @@ spec: | ||||||
|                   connection_pooler_default_cpu_limit: |                   connection_pooler_default_cpu_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|                     default: "1" |  | ||||||
|                   connection_pooler_default_cpu_request: |                   connection_pooler_default_cpu_request: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|                     default: "500m" |  | ||||||
|                   connection_pooler_default_memory_limit: |                   connection_pooler_default_memory_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' |                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' | ||||||
|                     default: "100Mi" |  | ||||||
|                   connection_pooler_default_memory_request: |                   connection_pooler_default_memory_request: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' |                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' | ||||||
|                     default: "100Mi" |  | ||||||
|               patroni: |               patroni: | ||||||
|                 type: object |                 type: object | ||||||
|                 properties: |                 properties: | ||||||
|  |  | ||||||
|  | @ -549,19 +549,19 @@ CRD-based configuration. | ||||||
| 
 | 
 | ||||||
| * **default_cpu_request** | * **default_cpu_request** | ||||||
|   CPU request value for the Postgres containers, unless overridden by |   CPU request value for the Postgres containers, unless overridden by | ||||||
|   cluster-specific settings. The default is `100m`. |   cluster-specific settings. Empty string or `0` disables the default. | ||||||
| 
 | 
 | ||||||
| * **default_memory_request** | * **default_memory_request** | ||||||
|   memory request value for the Postgres containers, unless overridden by |   memory request value for the Postgres containers, unless overridden by | ||||||
|   cluster-specific settings. The default is `100Mi`. |   cluster-specific settings. Empty string or `0` disables the default. | ||||||
| 
 | 
 | ||||||
| * **default_cpu_limit** | * **default_cpu_limit** | ||||||
|   CPU limits for the Postgres containers, unless overridden by cluster-specific |   CPU limits for the Postgres containers, unless overridden by cluster-specific | ||||||
|   settings. The default is `1`. |   settings.  Empty string or `0` disables the default. | ||||||
| 
 | 
 | ||||||
| * **default_memory_limit** | * **default_memory_limit** | ||||||
|   memory limits for the Postgres containers, unless overridden by cluster-specific |   memory limits for the Postgres containers, unless overridden by cluster-specific | ||||||
|   settings. The default is `500Mi`. |   settings. Empty string or `0` disables the default. | ||||||
| 
 | 
 | ||||||
| * **max_cpu_request** | * **max_cpu_request** | ||||||
|   optional upper boundary for CPU request |   optional upper boundary for CPU request | ||||||
|  | @ -571,11 +571,11 @@ CRD-based configuration. | ||||||
| 
 | 
 | ||||||
| * **min_cpu_limit** | * **min_cpu_limit** | ||||||
|   hard CPU minimum what we consider to be required to properly run Postgres |   hard CPU minimum what we consider to be required to properly run Postgres | ||||||
|   clusters with Patroni on Kubernetes. The default is `250m`. |   clusters with Patroni on Kubernetes. | ||||||
| 
 | 
 | ||||||
| * **min_memory_limit** | * **min_memory_limit** | ||||||
|   hard memory minimum what we consider to be required to properly run Postgres |   hard memory minimum what we consider to be required to properly run Postgres | ||||||
|   clusters with Patroni on Kubernetes. The default is `250Mi`. |   clusters with Patroni on Kubernetes. | ||||||
| 
 | 
 | ||||||
| ## Patroni options | ## Patroni options | ||||||
| 
 | 
 | ||||||
|  | @ -1026,5 +1026,4 @@ operator being able to provide some reasonable defaults. | ||||||
|   **connection_pooler_default_memory_reques** |   **connection_pooler_default_memory_reques** | ||||||
|   **connection_pooler_default_cpu_limit** |   **connection_pooler_default_cpu_limit** | ||||||
|   **connection_pooler_default_memory_limit** |   **connection_pooler_default_memory_limit** | ||||||
|   Default resource configuration for connection pooler deployment. The internal |   Default resource configuration for connection pooler deployment. | ||||||
|   default for memory request and limit is `100Mi`, for CPU it is `500m` and `1`. |  | ||||||
|  |  | ||||||
|  | @ -689,6 +689,9 @@ The minimum limits to properly run the `postgresql` resource are configured to | ||||||
| manifest the operator will raise the limits to the configured minimum values. | manifest the operator will raise the limits to the configured minimum values. | ||||||
| If no resources are defined in the manifest they will be obtained from the | If no resources are defined in the manifest they will be obtained from the | ||||||
| configured [default requests](reference/operator_parameters.md#kubernetes-resource-requests). | configured [default requests](reference/operator_parameters.md#kubernetes-resource-requests). | ||||||
|  | If neither defaults nor minimum limits are configured the operator will not | ||||||
|  | specify any resources and it's up to K8s (or your own) admission hooks to | ||||||
|  | handle it. | ||||||
| 
 | 
 | ||||||
| ### HugePages support | ### HugePages support | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -13,10 +13,10 @@ data: | ||||||
|   cluster_history_entries: "1000" |   cluster_history_entries: "1000" | ||||||
|   cluster_labels: application:spilo |   cluster_labels: application:spilo | ||||||
|   cluster_name_label: cluster-name |   cluster_name_label: cluster-name | ||||||
|   # connection_pooler_default_cpu_limit: "1" |   connection_pooler_default_cpu_limit: "1" | ||||||
|   # connection_pooler_default_cpu_request: "500m" |   connection_pooler_default_cpu_request: "500m" | ||||||
|   # connection_pooler_default_memory_limit: 100Mi |   connection_pooler_default_memory_limit: 100Mi | ||||||
|   # connection_pooler_default_memory_request: 100Mi |   connection_pooler_default_memory_request: 100Mi | ||||||
|   connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-32" |   connection_pooler_image: "registry.opensource.zalan.do/acid/pgbouncer:master-32" | ||||||
|   # connection_pooler_max_db_connections: 60 |   # connection_pooler_max_db_connections: 60 | ||||||
|   # connection_pooler_mode: "transaction" |   # connection_pooler_mode: "transaction" | ||||||
|  | @ -28,10 +28,10 @@ data: | ||||||
|   # custom_pod_annotations: "keya:valuea,keyb:valueb" |   # custom_pod_annotations: "keya:valuea,keyb:valueb" | ||||||
|   db_hosted_zone: db.example.com |   db_hosted_zone: db.example.com | ||||||
|   debug_logging: "true" |   debug_logging: "true" | ||||||
|   # default_cpu_limit: "1" |   default_cpu_limit: "1" | ||||||
|   # default_cpu_request: 100m |   default_cpu_request: 100m | ||||||
|   # default_memory_limit: 500Mi |   default_memory_limit: 500Mi | ||||||
|   # default_memory_request: 100Mi |   default_memory_request: 100Mi | ||||||
|   # delete_annotation_date_key: delete-date |   # delete_annotation_date_key: delete-date | ||||||
|   # delete_annotation_name_key: delete-clustername |   # delete_annotation_name_key: delete-clustername | ||||||
|   docker_image: ghcr.io/zalando/spilo-15:3.0-p1 |   docker_image: ghcr.io/zalando/spilo-15:3.0-p1 | ||||||
|  |  | ||||||
|  | @ -363,19 +363,15 @@ spec: | ||||||
|                   default_cpu_limit: |                   default_cpu_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|                     default: "1" |  | ||||||
|                   default_cpu_request: |                   default_cpu_request: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|                     default: "100m" |  | ||||||
|                   default_memory_limit: |                   default_memory_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' |                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' | ||||||
|                     default: "500Mi" |  | ||||||
|                   default_memory_request: |                   default_memory_request: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' |                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' | ||||||
|                     default: "100Mi" |  | ||||||
|                   max_cpu_request: |                   max_cpu_request: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|  | @ -385,11 +381,9 @@ spec: | ||||||
|                   min_cpu_limit: |                   min_cpu_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|                     default: "250m" |  | ||||||
|                   min_memory_limit: |                   min_memory_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' |                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' | ||||||
|                     default: "250Mi" |  | ||||||
|               timeouts: |               timeouts: | ||||||
|                 type: object |                 type: object | ||||||
|                 properties: |                 properties: | ||||||
|  | @ -670,19 +664,15 @@ spec: | ||||||
|                   connection_pooler_default_cpu_limit: |                   connection_pooler_default_cpu_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|                     default: "1" |  | ||||||
|                   connection_pooler_default_cpu_request: |                   connection_pooler_default_cpu_request: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' |                     pattern: '^(\d+m|\d+(\.\d{1,3})?)$' | ||||||
|                     default: "500m" |  | ||||||
|                   connection_pooler_default_memory_limit: |                   connection_pooler_default_memory_limit: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' |                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' | ||||||
|                     default: "100Mi" |  | ||||||
|                   connection_pooler_default_memory_request: |                   connection_pooler_default_memory_request: | ||||||
|                     type: string |                     type: string | ||||||
|                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' |                     pattern: '^(\d+(e\d+)?|\d+(\.\d+)?(e\d+)?[EPTGMK]i?)$' | ||||||
|                     default: "100Mi" |  | ||||||
|               patroni: |               patroni: | ||||||
|                 type: object |                 type: object | ||||||
|                 properties: |                 properties: | ||||||
|  |  | ||||||
|  | @ -153,10 +153,10 @@ type PostgresqlParam struct { | ||||||
| 
 | 
 | ||||||
| // ResourceDescription describes CPU and memory resources defined for a cluster.
 | // ResourceDescription describes CPU and memory resources defined for a cluster.
 | ||||||
| type ResourceDescription struct { | type ResourceDescription struct { | ||||||
| 	CPU          string  `json:"cpu"` | 	CPU          *string `json:"cpu,omitempty"` | ||||||
| 	Memory       string  `json:"memory"` | 	Memory       *string `json:"memory,omitempty"` | ||||||
| 	HugePages2Mi *string `json:"hugepages-2Mi"` | 	HugePages2Mi *string `json:"hugepages-2Mi,omitempty"` | ||||||
| 	HugePages1Gi *string `json:"hugepages-1Gi"` | 	HugePages1Gi *string `json:"hugepages-1Gi,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Resources describes requests and limits for the cluster resouces.
 | // Resources describes requests and limits for the cluster resouces.
 | ||||||
|  | @ -260,7 +260,7 @@ type Stream struct { | ||||||
| // StreamTable defines properties of outbox tables for FabricEventStreams
 | // StreamTable defines properties of outbox tables for FabricEventStreams
 | ||||||
| type StreamTable struct { | type StreamTable struct { | ||||||
| 	EventType         string  `json:"eventType"` | 	EventType         string  `json:"eventType"` | ||||||
| 	RecoveryEventType string  `json:"recoveryEventType"` | 	RecoveryEventType string  `json:"recoveryEventType,omitempty"` | ||||||
| 	IdColumn          *string `json:"idColumn,omitempty"` | 	IdColumn          *string `json:"idColumn,omitempty"` | ||||||
| 	PayloadColumn     *string `json:"payloadColumn,omitempty"` | 	PayloadColumn     *string `json:"payloadColumn,omitempty"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -26,6 +26,10 @@ var parseTimeTests = []struct { | ||||||
| 	{"expect error as minute is out of range", "23:69", metav1.Now(), errors.New(`parsing time "23:69": minute out of range`)}, | 	{"expect error as minute is out of range", "23:69", metav1.Now(), errors.New(`parsing time "23:69": minute out of range`)}, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func stringToPointer(str string) *string { | ||||||
|  | 	return &str | ||||||
|  | } | ||||||
|  | 
 | ||||||
| var parseWeekdayTests = []struct { | var parseWeekdayTests = []struct { | ||||||
| 	about string | 	about string | ||||||
| 	in    string | 	in    string | ||||||
|  | @ -301,8 +305,8 @@ var unmarshalCluster = []struct { | ||||||
| 					Slots:                map[string]map[string]string{"permanent_logical_1": {"type": "logical", "database": "foo", "plugin": "pgoutput"}}, | 					Slots:                map[string]map[string]string{"permanent_logical_1": {"type": "logical", "database": "foo", "plugin": "pgoutput"}}, | ||||||
| 				}, | 				}, | ||||||
| 				Resources: &Resources{ | 				Resources: &Resources{ | ||||||
| 					ResourceRequests: ResourceDescription{CPU: "10m", Memory: "50Mi"}, | 					ResourceRequests: ResourceDescription{CPU: stringToPointer("10m"), Memory: stringToPointer("50Mi")}, | ||||||
| 					ResourceLimits:   ResourceDescription{CPU: "300m", Memory: "3000Mi"}, | 					ResourceLimits:   ResourceDescription{CPU: stringToPointer("300m"), Memory: stringToPointer("3000Mi")}, | ||||||
| 				}, | 				}, | ||||||
| 
 | 
 | ||||||
| 				TeamID:              "acid", | 				TeamID:              "acid", | ||||||
|  |  | ||||||
|  | @ -1165,6 +1165,16 @@ func (in *PreparedSchema) DeepCopy() *PreparedSchema { | ||||||
| // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 | ||||||
| func (in *ResourceDescription) DeepCopyInto(out *ResourceDescription) { | func (in *ResourceDescription) DeepCopyInto(out *ResourceDescription) { | ||||||
| 	*out = *in | 	*out = *in | ||||||
|  | 	if in.CPU != nil { | ||||||
|  | 		in, out := &in.CPU, &out.CPU | ||||||
|  | 		*out = new(string) | ||||||
|  | 		**out = **in | ||||||
|  | 	} | ||||||
|  | 	if in.Memory != nil { | ||||||
|  | 		in, out := &in.Memory, &out.Memory | ||||||
|  | 		*out = new(string) | ||||||
|  | 		**out = **in | ||||||
|  | 	} | ||||||
| 	if in.HugePages2Mi != nil { | 	if in.HugePages2Mi != nil { | ||||||
| 		in, out := &in.HugePages2Mi, &out.HugePages2Mi | 		in, out := &in.HugePages2Mi, &out.HugePages2Mi | ||||||
| 		*out = new(string) | 		*out = new(string) | ||||||
|  |  | ||||||
|  | @ -161,8 +161,8 @@ func TestStatefulSetAnnotations(t *testing.T) { | ||||||
| 	spec := acidv1.PostgresSpec{ | 	spec := acidv1.PostgresSpec{ | ||||||
| 		TeamID: "myapp", NumberOfInstances: 1, | 		TeamID: "myapp", NumberOfInstances: 1, | ||||||
| 		Resources: &acidv1.Resources{ | 		Resources: &acidv1.Resources{ | ||||||
| 			ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 			ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 			ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 			ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 		}, | 		}, | ||||||
| 		Volume: acidv1.Volume{ | 		Volume: acidv1.Volume{ | ||||||
| 			Size: "1G", | 			Size: "1G", | ||||||
|  | @ -184,8 +184,8 @@ func TestStatefulSetUpdateWithEnv(t *testing.T) { | ||||||
| 	oldSpec := &acidv1.PostgresSpec{ | 	oldSpec := &acidv1.PostgresSpec{ | ||||||
| 		TeamID: "myapp", NumberOfInstances: 1, | 		TeamID: "myapp", NumberOfInstances: 1, | ||||||
| 		Resources: &acidv1.Resources{ | 		Resources: &acidv1.Resources{ | ||||||
| 			ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 			ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 			ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 			ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 		}, | 		}, | ||||||
| 		Volume: acidv1.Volume{ | 		Volume: acidv1.Volume{ | ||||||
| 			Size: "1G", | 			Size: "1G", | ||||||
|  |  | ||||||
|  | @ -821,12 +821,12 @@ func (c *Cluster) needSyncConnectionPoolerDefaults(Config *Config, spec *acidv1. | ||||||
| func makeDefaultConnectionPoolerResources(config *config.Config) acidv1.Resources { | func makeDefaultConnectionPoolerResources(config *config.Config) acidv1.Resources { | ||||||
| 
 | 
 | ||||||
| 	defaultRequests := acidv1.ResourceDescription{ | 	defaultRequests := acidv1.ResourceDescription{ | ||||||
| 		CPU:    config.ConnectionPooler.ConnectionPoolerDefaultCPURequest, | 		CPU:    &config.ConnectionPooler.ConnectionPoolerDefaultCPURequest, | ||||||
| 		Memory: config.ConnectionPooler.ConnectionPoolerDefaultMemoryRequest, | 		Memory: &config.ConnectionPooler.ConnectionPoolerDefaultMemoryRequest, | ||||||
| 	} | 	} | ||||||
| 	defaultLimits := acidv1.ResourceDescription{ | 	defaultLimits := acidv1.ResourceDescription{ | ||||||
| 		CPU:    config.ConnectionPooler.ConnectionPoolerDefaultCPULimit, | 		CPU:    &config.ConnectionPooler.ConnectionPoolerDefaultCPULimit, | ||||||
| 		Memory: config.ConnectionPooler.ConnectionPoolerDefaultMemoryLimit, | 		Memory: &config.ConnectionPooler.ConnectionPoolerDefaultMemoryLimit, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return acidv1.Resources{ | 	return acidv1.Resources{ | ||||||
|  |  | ||||||
|  | @ -2,7 +2,6 @@ package cluster | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"errors" |  | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"testing" | 	"testing" | ||||||
|  | @ -713,7 +712,6 @@ func TestConnectionPoolerPodSpec(t *testing.T) { | ||||||
| 	tests := []struct { | 	tests := []struct { | ||||||
| 		subTest string | 		subTest string | ||||||
| 		spec    *acidv1.PostgresSpec | 		spec    *acidv1.PostgresSpec | ||||||
| 		expected error |  | ||||||
| 		cluster *Cluster | 		cluster *Cluster | ||||||
| 		check   func(cluster *Cluster, podSpec *v1.PodTemplateSpec, role PostgresRole) error | 		check   func(cluster *Cluster, podSpec *v1.PodTemplateSpec, role PostgresRole) error | ||||||
| 	}{ | 	}{ | ||||||
|  | @ -722,7 +720,6 @@ func TestConnectionPoolerPodSpec(t *testing.T) { | ||||||
| 			spec: &acidv1.PostgresSpec{ | 			spec: &acidv1.PostgresSpec{ | ||||||
| 				ConnectionPooler: &acidv1.ConnectionPooler{}, | 				ConnectionPooler: &acidv1.ConnectionPooler{}, | ||||||
| 			}, | 			}, | ||||||
| 			expected: nil, |  | ||||||
| 			cluster: cluster, | 			cluster: cluster, | ||||||
| 			check:   noCheck, | 			check:   noCheck, | ||||||
| 		}, | 		}, | ||||||
|  | @ -731,7 +728,6 @@ func TestConnectionPoolerPodSpec(t *testing.T) { | ||||||
| 			spec: &acidv1.PostgresSpec{ | 			spec: &acidv1.PostgresSpec{ | ||||||
| 				ConnectionPooler: &acidv1.ConnectionPooler{}, | 				ConnectionPooler: &acidv1.ConnectionPooler{}, | ||||||
| 			}, | 			}, | ||||||
| 			expected: nil, |  | ||||||
| 			cluster: cluster, | 			cluster: cluster, | ||||||
| 			check:   testServiceAccount, | 			check:   testServiceAccount, | ||||||
| 		}, | 		}, | ||||||
|  | @ -740,7 +736,6 @@ func TestConnectionPoolerPodSpec(t *testing.T) { | ||||||
| 			spec: &acidv1.PostgresSpec{ | 			spec: &acidv1.PostgresSpec{ | ||||||
| 				ConnectionPooler: &acidv1.ConnectionPooler{}, | 				ConnectionPooler: &acidv1.ConnectionPooler{}, | ||||||
| 			}, | 			}, | ||||||
| 			expected: errors.New(`could not generate resource requirements: could not fill resource requests: could not parse default CPU quantity: quantities must match the regular expression '^([+-]?[0-9.]+)([eEinumkKMGTP]*[-+]?[0-9]*)$'`), |  | ||||||
| 			cluster: clusterNoDefaultRes, | 			cluster: clusterNoDefaultRes, | ||||||
| 			check:   noCheck, | 			check:   noCheck, | ||||||
| 		}, | 		}, | ||||||
|  | @ -749,7 +744,6 @@ func TestConnectionPoolerPodSpec(t *testing.T) { | ||||||
| 			spec: &acidv1.PostgresSpec{ | 			spec: &acidv1.PostgresSpec{ | ||||||
| 				ConnectionPooler: &acidv1.ConnectionPooler{}, | 				ConnectionPooler: &acidv1.ConnectionPooler{}, | ||||||
| 			}, | 			}, | ||||||
| 			expected: nil, |  | ||||||
| 			cluster: cluster, | 			cluster: cluster, | ||||||
| 			check:   testResources, | 			check:   testResources, | ||||||
| 		}, | 		}, | ||||||
|  | @ -759,7 +753,6 @@ func TestConnectionPoolerPodSpec(t *testing.T) { | ||||||
| 				ConnectionPooler:              &acidv1.ConnectionPooler{}, | 				ConnectionPooler:              &acidv1.ConnectionPooler{}, | ||||||
| 				EnableReplicaConnectionPooler: boolToPointer(true), | 				EnableReplicaConnectionPooler: boolToPointer(true), | ||||||
| 			}, | 			}, | ||||||
| 			expected: nil, |  | ||||||
| 			cluster: cluster, | 			cluster: cluster, | ||||||
| 			check:   testLabels, | 			check:   testLabels, | ||||||
| 		}, | 		}, | ||||||
|  | @ -768,21 +761,15 @@ func TestConnectionPoolerPodSpec(t *testing.T) { | ||||||
| 			spec: &acidv1.PostgresSpec{ | 			spec: &acidv1.PostgresSpec{ | ||||||
| 				ConnectionPooler: &acidv1.ConnectionPooler{}, | 				ConnectionPooler: &acidv1.ConnectionPooler{}, | ||||||
| 			}, | 			}, | ||||||
| 			expected: nil, |  | ||||||
| 			cluster: cluster, | 			cluster: cluster, | ||||||
| 			check:   testEnvs, | 			check:   testEnvs, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	for _, role := range [2]PostgresRole{Master, Replica} { | 	for _, role := range [2]PostgresRole{Master, Replica} { | ||||||
| 		for _, tt := range tests { | 		for _, tt := range tests { | ||||||
| 			podSpec, err := tt.cluster.generateConnectionPoolerPodTemplate(role) | 			podSpec, _ := tt.cluster.generateConnectionPoolerPodTemplate(role) | ||||||
| 
 | 
 | ||||||
| 			if err != tt.expected && err.Error() != tt.expected.Error() { | 			err := tt.check(cluster, podSpec, role) | ||||||
| 				t.Errorf("%s [%s]: Could not generate pod template,\n %+v, expected\n %+v", |  | ||||||
| 					testName, tt.subTest, err, tt.expected) |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			err = tt.check(cluster, podSpec, role) |  | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				t.Errorf("%s [%s]: Pod spec is incorrect, %+v", | 				t.Errorf("%s [%s]: Pod spec is incorrect, %+v", | ||||||
| 					testName, tt.subTest, err) | 					testName, tt.subTest, err) | ||||||
|  | @ -973,8 +960,8 @@ func TestPoolerTLS(t *testing.T) { | ||||||
| 			TeamID: "myapp", NumberOfInstances: 1, | 			TeamID: "myapp", NumberOfInstances: 1, | ||||||
| 			EnableConnectionPooler: util.True(), | 			EnableConnectionPooler: util.True(), | ||||||
| 			Resources: &acidv1.Resources{ | 			Resources: &acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 			}, | 			}, | ||||||
| 			Volume: acidv1.Volume{ | 			Volume: acidv1.Volume{ | ||||||
| 				Size: "1G", | 				Size: "1G", | ||||||
|  |  | ||||||
|  | @ -21,6 +21,7 @@ import ( | ||||||
| 	"k8s.io/apimachinery/pkg/util/intstr" | 	"k8s.io/apimachinery/pkg/util/intstr" | ||||||
| 
 | 
 | ||||||
| 	"golang.org/x/exp/maps" | 	"golang.org/x/exp/maps" | ||||||
|  | 	"golang.org/x/exp/slices" | ||||||
| 	batchv1 "k8s.io/api/batch/v1" | 	batchv1 "k8s.io/api/batch/v1" | ||||||
| 	"k8s.io/apimachinery/pkg/labels" | 	"k8s.io/apimachinery/pkg/labels" | ||||||
| 
 | 
 | ||||||
|  | @ -126,12 +127,12 @@ func (c *Cluster) podDisruptionBudgetName() string { | ||||||
| func makeDefaultResources(config *config.Config) acidv1.Resources { | func makeDefaultResources(config *config.Config) acidv1.Resources { | ||||||
| 
 | 
 | ||||||
| 	defaultRequests := acidv1.ResourceDescription{ | 	defaultRequests := acidv1.ResourceDescription{ | ||||||
| 		CPU:    config.Resources.DefaultCPURequest, | 		CPU:    &config.Resources.DefaultCPURequest, | ||||||
| 		Memory: config.Resources.DefaultMemoryRequest, | 		Memory: &config.Resources.DefaultMemoryRequest, | ||||||
| 	} | 	} | ||||||
| 	defaultLimits := acidv1.ResourceDescription{ | 	defaultLimits := acidv1.ResourceDescription{ | ||||||
| 		CPU:    config.Resources.DefaultCPULimit, | 		CPU:    &config.Resources.DefaultCPULimit, | ||||||
| 		Memory: config.Resources.DefaultMemoryLimit, | 		Memory: &config.Resources.DefaultMemoryLimit, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return acidv1.Resources{ | 	return acidv1.Resources{ | ||||||
|  | @ -143,12 +144,12 @@ func makeDefaultResources(config *config.Config) acidv1.Resources { | ||||||
| func makeLogicalBackupResources(config *config.Config) acidv1.Resources { | func makeLogicalBackupResources(config *config.Config) acidv1.Resources { | ||||||
| 
 | 
 | ||||||
| 	logicalBackupResourceRequests := acidv1.ResourceDescription{ | 	logicalBackupResourceRequests := acidv1.ResourceDescription{ | ||||||
| 		CPU:    config.LogicalBackup.LogicalBackupCPURequest, | 		CPU:    &config.LogicalBackup.LogicalBackupCPURequest, | ||||||
| 		Memory: config.LogicalBackup.LogicalBackupMemoryRequest, | 		Memory: &config.LogicalBackup.LogicalBackupMemoryRequest, | ||||||
| 	} | 	} | ||||||
| 	logicalBackupResourceLimits := acidv1.ResourceDescription{ | 	logicalBackupResourceLimits := acidv1.ResourceDescription{ | ||||||
| 		CPU:    config.LogicalBackup.LogicalBackupCPULimit, | 		CPU:    &config.LogicalBackup.LogicalBackupCPULimit, | ||||||
| 		Memory: config.LogicalBackup.LogicalBackupMemoryLimit, | 		Memory: &config.LogicalBackup.LogicalBackupMemoryLimit, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return acidv1.Resources{ | 	return acidv1.Resources{ | ||||||
|  | @ -214,7 +215,9 @@ func (c *Cluster) enforceMaxResourceRequests(resources *v1.ResourceRequirements) | ||||||
| 		return fmt.Errorf("could not compare defined CPU request %s for %q container with configured maximum value %s: %v", | 		return fmt.Errorf("could not compare defined CPU request %s for %q container with configured maximum value %s: %v", | ||||||
| 			cpuRequest.String(), constants.PostgresContainerName, maxCPURequest, err) | 			cpuRequest.String(), constants.PostgresContainerName, maxCPURequest, err) | ||||||
| 	} | 	} | ||||||
|  | 	if !maxCPU.IsZero() { | ||||||
| 		resources.Requests[v1.ResourceCPU] = maxCPU | 		resources.Requests[v1.ResourceCPU] = maxCPU | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	memoryRequest := resources.Requests[v1.ResourceMemory] | 	memoryRequest := resources.Requests[v1.ResourceMemory] | ||||||
| 	maxMemoryRequest := c.OpConfig.MaxMemoryRequest | 	maxMemoryRequest := c.OpConfig.MaxMemoryRequest | ||||||
|  | @ -223,7 +226,9 @@ func (c *Cluster) enforceMaxResourceRequests(resources *v1.ResourceRequirements) | ||||||
| 		return fmt.Errorf("could not compare defined memory request %s for %q container with configured maximum value %s: %v", | 		return fmt.Errorf("could not compare defined memory request %s for %q container with configured maximum value %s: %v", | ||||||
| 			memoryRequest.String(), constants.PostgresContainerName, maxMemoryRequest, err) | 			memoryRequest.String(), constants.PostgresContainerName, maxMemoryRequest, err) | ||||||
| 	} | 	} | ||||||
|  | 	if !maxMemory.IsZero() { | ||||||
| 		resources.Requests[v1.ResourceMemory] = maxMemory | 		resources.Requests[v1.ResourceMemory] = maxMemory | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  | @ -240,32 +245,55 @@ func setMemoryRequestToLimit(resources *v1.ResourceRequirements, containerName s | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func matchLimitsWithRequestsIfSmaller(resources *v1.ResourceRequirements, containerName string, logger *logrus.Entry) { | ||||||
|  | 	requests := resources.Requests | ||||||
|  | 	limits := resources.Limits | ||||||
|  | 	requestCPU, cpuRequestsExists := requests[v1.ResourceCPU] | ||||||
|  | 	limitCPU, cpuLimitExists := limits[v1.ResourceCPU] | ||||||
|  | 	if cpuRequestsExists && cpuLimitExists && limitCPU.Cmp(requestCPU) == -1 { | ||||||
|  | 		logger.Warningf("CPU limit of %s for %q container is increased to match CPU requests of %s", limitCPU.String(), containerName, requestCPU.String()) | ||||||
|  | 		resources.Limits[v1.ResourceCPU] = requestCPU | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	requestMemory, memoryRequestsExists := requests[v1.ResourceMemory] | ||||||
|  | 	limitMemory, memoryLimitExists := limits[v1.ResourceMemory] | ||||||
|  | 	if memoryRequestsExists && memoryLimitExists && limitMemory.Cmp(requestMemory) == -1 { | ||||||
|  | 		logger.Warningf("memory limit of %s for %q container is increased to match memory requests of %s", limitMemory.String(), containerName, requestMemory.String()) | ||||||
|  | 		resources.Limits[v1.ResourceMemory] = requestMemory | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func fillResourceList(spec acidv1.ResourceDescription, defaults acidv1.ResourceDescription) (v1.ResourceList, error) { | func fillResourceList(spec acidv1.ResourceDescription, defaults acidv1.ResourceDescription) (v1.ResourceList, error) { | ||||||
| 	var err error | 	var err error | ||||||
| 	requests := v1.ResourceList{} | 	requests := v1.ResourceList{} | ||||||
|  | 	emptyResourceExamples := []string{"", "0", "null"} | ||||||
| 
 | 
 | ||||||
| 	if spec.CPU != "" { | 	if spec.CPU != nil && !slices.Contains(emptyResourceExamples, *spec.CPU) { | ||||||
| 		requests[v1.ResourceCPU], err = resource.ParseQuantity(spec.CPU) | 		requests[v1.ResourceCPU], err = resource.ParseQuantity(*spec.CPU) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, fmt.Errorf("could not parse CPU quantity: %v", err) | 			return nil, fmt.Errorf("could not parse CPU quantity: %v", err) | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		requests[v1.ResourceCPU], err = resource.ParseQuantity(defaults.CPU) | 		if defaults.CPU != nil && !slices.Contains(emptyResourceExamples, *defaults.CPU) { | ||||||
|  | 			requests[v1.ResourceCPU], err = resource.ParseQuantity(*defaults.CPU) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return nil, fmt.Errorf("could not parse default CPU quantity: %v", err) | 				return nil, fmt.Errorf("could not parse default CPU quantity: %v", err) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	if spec.Memory != "" { | 	} | ||||||
| 		requests[v1.ResourceMemory], err = resource.ParseQuantity(spec.Memory) | 	if spec.Memory != nil && !slices.Contains(emptyResourceExamples, *spec.Memory) { | ||||||
|  | 		requests[v1.ResourceMemory], err = resource.ParseQuantity(*spec.Memory) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil, fmt.Errorf("could not parse memory quantity: %v", err) | 			return nil, fmt.Errorf("could not parse memory quantity: %v", err) | ||||||
| 		} | 		} | ||||||
| 	} else { | 	} else { | ||||||
| 		requests[v1.ResourceMemory], err = resource.ParseQuantity(defaults.Memory) | 		if defaults.Memory != nil && !slices.Contains(emptyResourceExamples, *defaults.Memory) { | ||||||
|  | 			requests[v1.ResourceMemory], err = resource.ParseQuantity(*defaults.Memory) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return nil, fmt.Errorf("could not parse default memory quantity: %v", err) | 				return nil, fmt.Errorf("could not parse default memory quantity: %v", err) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if spec.HugePages2Mi != nil { | 	if spec.HugePages2Mi != nil { | ||||||
| 		requests[v1.ResourceHugePagesPrefix+"2Mi"], err = resource.ParseQuantity(*spec.HugePages2Mi) | 		requests[v1.ResourceHugePagesPrefix+"2Mi"], err = resource.ParseQuantity(*spec.HugePages2Mi) | ||||||
|  | @ -314,6 +342,10 @@ func (c *Cluster) generateResourceRequirements( | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// make sure after reflecting default and enforcing min limit values we don't have requests > limits
 | ||||||
|  | 	matchLimitsWithRequestsIfSmaller(&result, containerName, c.logger) | ||||||
|  | 
 | ||||||
|  | 	// vice versa set memory requests to limit if option is enabled
 | ||||||
| 	if c.OpConfig.SetMemoryRequestToLimit { | 	if c.OpConfig.SetMemoryRequestToLimit { | ||||||
| 		setMemoryRequestToLimit(&result, containerName, c.logger) | 		setMemoryRequestToLimit(&result, containerName, c.logger) | ||||||
| 	} | 	} | ||||||
|  | @ -1208,12 +1240,12 @@ func getBucketScopeSuffix(uid string) string { | ||||||
| func makeResources(cpuRequest, memoryRequest, cpuLimit, memoryLimit string) acidv1.Resources { | func makeResources(cpuRequest, memoryRequest, cpuLimit, memoryLimit string) acidv1.Resources { | ||||||
| 	return acidv1.Resources{ | 	return acidv1.Resources{ | ||||||
| 		ResourceRequests: acidv1.ResourceDescription{ | 		ResourceRequests: acidv1.ResourceDescription{ | ||||||
| 			CPU:    cpuRequest, | 			CPU:    &cpuRequest, | ||||||
| 			Memory: memoryRequest, | 			Memory: &memoryRequest, | ||||||
| 		}, | 		}, | ||||||
| 		ResourceLimits: acidv1.ResourceDescription{ | 		ResourceLimits: acidv1.ResourceDescription{ | ||||||
| 			CPU:    cpuLimit, | 			CPU:    &cpuLimit, | ||||||
| 			Memory: memoryLimit, | 			Memory: &memoryLimit, | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1421,8 +1421,8 @@ func TestNodeAffinity(t *testing.T) { | ||||||
| 		return acidv1.PostgresSpec{ | 		return acidv1.PostgresSpec{ | ||||||
| 			TeamID: "myapp", NumberOfInstances: 1, | 			TeamID: "myapp", NumberOfInstances: 1, | ||||||
| 			Resources: &acidv1.Resources{ | 			Resources: &acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 			}, | 			}, | ||||||
| 			Volume: acidv1.Volume{ | 			Volume: acidv1.Volume{ | ||||||
| 				Size: "1G", | 				Size: "1G", | ||||||
|  | @ -1514,8 +1514,8 @@ func TestPodAffinity(t *testing.T) { | ||||||
| 		Spec: acidv1.PostgresSpec{ | 		Spec: acidv1.PostgresSpec{ | ||||||
| 			NumberOfInstances: 1, | 			NumberOfInstances: 1, | ||||||
| 			Resources: &acidv1.Resources{ | 			Resources: &acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 			}, | 			}, | ||||||
| 			Volume: acidv1.Volume{ | 			Volume: acidv1.Volume{ | ||||||
| 				Size: "1G", | 				Size: "1G", | ||||||
|  | @ -1658,8 +1658,8 @@ func TestTLS(t *testing.T) { | ||||||
| 		Spec: acidv1.PostgresSpec{ | 		Spec: acidv1.PostgresSpec{ | ||||||
| 			TeamID: "myapp", NumberOfInstances: 1, | 			TeamID: "myapp", NumberOfInstances: 1, | ||||||
| 			Resources: &acidv1.Resources{ | 			Resources: &acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 			}, | 			}, | ||||||
| 			Volume: acidv1.Volume{ | 			Volume: acidv1.Volume{ | ||||||
| 				Size: "1G", | 				Size: "1G", | ||||||
|  | @ -1899,8 +1899,8 @@ func TestAdditionalVolume(t *testing.T) { | ||||||
| 		Spec: acidv1.PostgresSpec{ | 		Spec: acidv1.PostgresSpec{ | ||||||
| 			TeamID: "myapp", NumberOfInstances: 1, | 			TeamID: "myapp", NumberOfInstances: 1, | ||||||
| 			Resources: &acidv1.Resources{ | 			Resources: &acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 			}, | 			}, | ||||||
| 			Volume: acidv1.Volume{ | 			Volume: acidv1.Volume{ | ||||||
| 				Size: "1G", | 				Size: "1G", | ||||||
|  | @ -1975,8 +1975,8 @@ func TestVolumeSelector(t *testing.T) { | ||||||
| 			TeamID:            "myapp", | 			TeamID:            "myapp", | ||||||
| 			NumberOfInstances: 0, | 			NumberOfInstances: 0, | ||||||
| 			Resources: &acidv1.Resources{ | 			Resources: &acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 			}, | 			}, | ||||||
| 			Volume: volume, | 			Volume: volume, | ||||||
| 		} | 		} | ||||||
|  | @ -2107,8 +2107,8 @@ func TestSidecars(t *testing.T) { | ||||||
| 		}, | 		}, | ||||||
| 		TeamID: "myapp", NumberOfInstances: 1, | 		TeamID: "myapp", NumberOfInstances: 1, | ||||||
| 		Resources: &acidv1.Resources{ | 		Resources: &acidv1.Resources{ | ||||||
| 			ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 			ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 			ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 			ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 		}, | 		}, | ||||||
| 		Volume: acidv1.Volume{ | 		Volume: acidv1.Volume{ | ||||||
| 			Size: "1G", | 			Size: "1G", | ||||||
|  | @ -2120,8 +2120,8 @@ func TestSidecars(t *testing.T) { | ||||||
| 			acidv1.Sidecar{ | 			acidv1.Sidecar{ | ||||||
| 				Name: "cluster-specific-sidecar-with-resources", | 				Name: "cluster-specific-sidecar-with-resources", | ||||||
| 				Resources: &acidv1.Resources{ | 				Resources: &acidv1.Resources{ | ||||||
| 					ResourceRequests: acidv1.ResourceDescription{CPU: "210m", Memory: "0.8Gi"}, | 					ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("210m"), Memory: k8sutil.StringToPointer("0.8Gi")}, | ||||||
| 					ResourceLimits:   acidv1.ResourceDescription{CPU: "510m", Memory: "1.4Gi"}, | 					ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("510m"), Memory: k8sutil.StringToPointer("1.4Gi")}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			acidv1.Sidecar{ | 			acidv1.Sidecar{ | ||||||
|  | @ -2419,8 +2419,8 @@ func TestGenerateService(t *testing.T) { | ||||||
| 	spec = acidv1.PostgresSpec{ | 	spec = acidv1.PostgresSpec{ | ||||||
| 		TeamID: "myapp", NumberOfInstances: 1, | 		TeamID: "myapp", NumberOfInstances: 1, | ||||||
| 		Resources: &acidv1.Resources{ | 		Resources: &acidv1.Resources{ | ||||||
| 			ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 			ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 			ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 			ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 		}, | 		}, | ||||||
| 		Volume: acidv1.Volume{ | 		Volume: acidv1.Volume{ | ||||||
| 			Size: "1G", | 			Size: "1G", | ||||||
|  | @ -2432,8 +2432,8 @@ func TestGenerateService(t *testing.T) { | ||||||
| 			acidv1.Sidecar{ | 			acidv1.Sidecar{ | ||||||
| 				Name: "cluster-specific-sidecar-with-resources", | 				Name: "cluster-specific-sidecar-with-resources", | ||||||
| 				Resources: &acidv1.Resources{ | 				Resources: &acidv1.Resources{ | ||||||
| 					ResourceRequests: acidv1.ResourceDescription{CPU: "210m", Memory: "0.8Gi"}, | 					ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("210m"), Memory: k8sutil.StringToPointer("0.8Gi")}, | ||||||
| 					ResourceLimits:   acidv1.ResourceDescription{CPU: "510m", Memory: "1.4Gi"}, | 					ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("510m"), Memory: k8sutil.StringToPointer("1.4Gi")}, | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			acidv1.Sidecar{ | 			acidv1.Sidecar{ | ||||||
|  | @ -2646,8 +2646,8 @@ func TestEnableLoadBalancers(t *testing.T) { | ||||||
| 					EnableReplicaPoolerLoadBalancer: util.False(), | 					EnableReplicaPoolerLoadBalancer: util.False(), | ||||||
| 					NumberOfInstances:               1, | 					NumberOfInstances:               1, | ||||||
| 					Resources: &acidv1.Resources{ | 					Resources: &acidv1.Resources{ | ||||||
| 						ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 						ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 						ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 						ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 					}, | 					}, | ||||||
| 					TeamID: "acid", | 					TeamID: "acid", | ||||||
| 					Volume: acidv1.Volume{ | 					Volume: acidv1.Volume{ | ||||||
|  | @ -2693,8 +2693,8 @@ func TestEnableLoadBalancers(t *testing.T) { | ||||||
| 					EnableReplicaPoolerLoadBalancer: util.True(), | 					EnableReplicaPoolerLoadBalancer: util.True(), | ||||||
| 					NumberOfInstances:               1, | 					NumberOfInstances:               1, | ||||||
| 					Resources: &acidv1.Resources{ | 					Resources: &acidv1.Resources{ | ||||||
| 						ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 						ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 						ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "10"}, | 						ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("10")}, | ||||||
| 					}, | 					}, | ||||||
| 					TeamID: "acid", | 					TeamID: "acid", | ||||||
| 					Volume: acidv1.Volume{ | 					Volume: acidv1.Volume{ | ||||||
|  | @ -2786,8 +2786,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "500Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -2815,8 +2815,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "500Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -2833,7 +2833,7 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 				Spec: acidv1.PostgresSpec{ | 				Spec: acidv1.PostgresSpec{ | ||||||
| 					Resources: &acidv1.Resources{ | 					Resources: &acidv1.Resources{ | ||||||
| 						ResourceRequests: acidv1.ResourceDescription{CPU: "50m", Memory: "50Mi"}, | 						ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("50m"), Memory: k8sutil.StringToPointer("50Mi")}, | ||||||
| 					}, | 					}, | ||||||
| 					TeamID: "acid", | 					TeamID: "acid", | ||||||
| 					Volume: acidv1.Volume{ | 					Volume: acidv1.Volume{ | ||||||
|  | @ -2842,8 +2842,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "50m", Memory: "50Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("50m"), Memory: k8sutil.StringToPointer("50Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "500Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -2860,8 +2860,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 				Spec: acidv1.PostgresSpec{ | 				Spec: acidv1.PostgresSpec{ | ||||||
| 					Resources: &acidv1.Resources{ | 					Resources: &acidv1.Resources{ | ||||||
| 						ResourceRequests: acidv1.ResourceDescription{Memory: "100Mi"}, | 						ResourceRequests: acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 						ResourceLimits:   acidv1.ResourceDescription{Memory: "1Gi"}, | 						ResourceLimits:   acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("1Gi")}, | ||||||
| 					}, | 					}, | ||||||
| 					TeamID: "acid", | 					TeamID: "acid", | ||||||
| 					Volume: acidv1.Volume{ | 					Volume: acidv1.Volume{ | ||||||
|  | @ -2870,8 +2870,97 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "1Gi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("1Gi")}, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			subTest: "test generation of resources when default is not defined", | ||||||
|  | 			config: config.Config{ | ||||||
|  | 				Resources: config.Resources{ | ||||||
|  | 					ClusterLabels:        map[string]string{"application": "spilo"}, | ||||||
|  | 					ClusterNameLabel:     clusterNameLabel, | ||||||
|  | 					DefaultCPURequest:    "100m", | ||||||
|  | 					DefaultMemoryRequest: "100Mi", | ||||||
|  | 					PodRoleLabel:         "spilo-role", | ||||||
|  | 				}, | ||||||
|  | 				PodManagementPolicy:     "ordered_ready", | ||||||
|  | 				SetMemoryRequestToLimit: false, | ||||||
|  | 			}, | ||||||
|  | 			pgSpec: acidv1.Postgresql{ | ||||||
|  | 				ObjectMeta: metav1.ObjectMeta{ | ||||||
|  | 					Name:      clusterName, | ||||||
|  | 					Namespace: namespace, | ||||||
|  | 				}, | ||||||
|  | 				Spec: acidv1.PostgresSpec{ | ||||||
|  | 					TeamID: "acid", | ||||||
|  | 					Volume: acidv1.Volume{ | ||||||
|  | 						Size: "1G", | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			expectedResources: acidv1.Resources{ | ||||||
|  | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			subTest: "test matchLimitsWithRequestsIfSmaller", | ||||||
|  | 			config: config.Config{ | ||||||
|  | 				Resources:               configResources, | ||||||
|  | 				PodManagementPolicy:     "ordered_ready", | ||||||
|  | 				SetMemoryRequestToLimit: false, | ||||||
|  | 			}, | ||||||
|  | 			pgSpec: acidv1.Postgresql{ | ||||||
|  | 				ObjectMeta: metav1.ObjectMeta{ | ||||||
|  | 					Name:      clusterName, | ||||||
|  | 					Namespace: namespace, | ||||||
|  | 				}, | ||||||
|  | 				Spec: acidv1.PostgresSpec{ | ||||||
|  | 					Resources: &acidv1.Resources{ | ||||||
|  | 						ResourceRequests: acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("750Mi")}, | ||||||
|  | 						ResourceLimits:   acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("300Mi")}, | ||||||
|  | 					}, | ||||||
|  | 					TeamID: "acid", | ||||||
|  | 					Volume: acidv1.Volume{ | ||||||
|  | 						Size: "1G", | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			expectedResources: acidv1.Resources{ | ||||||
|  | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("750Mi")}, | ||||||
|  | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("750Mi")}, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			subTest: "defaults are not defined but minimum limit is", | ||||||
|  | 			config: config.Config{ | ||||||
|  | 				Resources: config.Resources{ | ||||||
|  | 					ClusterLabels:    map[string]string{"application": "spilo"}, | ||||||
|  | 					ClusterNameLabel: clusterNameLabel, | ||||||
|  | 					MinMemoryLimit:   "250Mi", | ||||||
|  | 					PodRoleLabel:     "spilo-role", | ||||||
|  | 				}, | ||||||
|  | 				PodManagementPolicy:     "ordered_ready", | ||||||
|  | 				SetMemoryRequestToLimit: false, | ||||||
|  | 			}, | ||||||
|  | 			pgSpec: acidv1.Postgresql{ | ||||||
|  | 				ObjectMeta: metav1.ObjectMeta{ | ||||||
|  | 					Name:      clusterName, | ||||||
|  | 					Namespace: namespace, | ||||||
|  | 				}, | ||||||
|  | 				Spec: acidv1.PostgresSpec{ | ||||||
|  | 					Resources: &acidv1.Resources{ | ||||||
|  | 						ResourceRequests: acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
|  | 					}, | ||||||
|  | 					TeamID: "acid", | ||||||
|  | 					Volume: acidv1.Volume{ | ||||||
|  | 						Size: "1G", | ||||||
|  | 					}, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			expectedResources: acidv1.Resources{ | ||||||
|  | 				ResourceRequests: acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
|  | 				ResourceLimits:   acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -2888,8 +2977,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 				Spec: acidv1.PostgresSpec{ | 				Spec: acidv1.PostgresSpec{ | ||||||
| 					Resources: &acidv1.Resources{ | 					Resources: &acidv1.Resources{ | ||||||
| 						ResourceRequests: acidv1.ResourceDescription{Memory: "200Mi"}, | 						ResourceRequests: acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("200Mi")}, | ||||||
| 						ResourceLimits:   acidv1.ResourceDescription{Memory: "300Mi"}, | 						ResourceLimits:   acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("300Mi")}, | ||||||
| 					}, | 					}, | ||||||
| 					TeamID: "acid", | 					TeamID: "acid", | ||||||
| 					Volume: acidv1.Volume{ | 					Volume: acidv1.Volume{ | ||||||
|  | @ -2898,8 +2987,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "300Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("300Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "300Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("300Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -2919,8 +3008,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 						acidv1.Sidecar{ | 						acidv1.Sidecar{ | ||||||
| 							Name: sidecarName, | 							Name: sidecarName, | ||||||
| 							Resources: &acidv1.Resources{ | 							Resources: &acidv1.Resources{ | ||||||
| 								ResourceRequests: acidv1.ResourceDescription{CPU: "10m", Memory: "10Mi"}, | 								ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("10m"), Memory: k8sutil.StringToPointer("10Mi")}, | ||||||
| 								ResourceLimits:   acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 								ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
|  | @ -2931,8 +3020,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "10m", Memory: "100Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("10m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -2949,8 +3038,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 				Spec: acidv1.PostgresSpec{ | 				Spec: acidv1.PostgresSpec{ | ||||||
| 					Resources: &acidv1.Resources{ | 					Resources: &acidv1.Resources{ | ||||||
| 						ResourceRequests: acidv1.ResourceDescription{CPU: "10m", Memory: "250Mi"}, | 						ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("10m"), Memory: k8sutil.StringToPointer("250Mi")}, | ||||||
| 						ResourceLimits:   acidv1.ResourceDescription{CPU: "400m", Memory: "800Mi"}, | 						ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("400m"), Memory: k8sutil.StringToPointer("800Mi")}, | ||||||
| 					}, | 					}, | ||||||
| 					TeamID: "acid", | 					TeamID: "acid", | ||||||
| 					Volume: acidv1.Volume{ | 					Volume: acidv1.Volume{ | ||||||
|  | @ -2959,8 +3048,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "10m", Memory: "250Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("10m"), Memory: k8sutil.StringToPointer("250Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "400m", Memory: "800Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("400m"), Memory: k8sutil.StringToPointer("800Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -2977,8 +3066,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 				Spec: acidv1.PostgresSpec{ | 				Spec: acidv1.PostgresSpec{ | ||||||
| 					Resources: &acidv1.Resources{ | 					Resources: &acidv1.Resources{ | ||||||
| 						ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 						ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 						ResourceLimits:   acidv1.ResourceDescription{CPU: "200m", Memory: "200Mi"}, | 						ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("200m"), Memory: k8sutil.StringToPointer("200Mi")}, | ||||||
| 					}, | 					}, | ||||||
| 					TeamID: "acid", | 					TeamID: "acid", | ||||||
| 					Volume: acidv1.Volume{ | 					Volume: acidv1.Volume{ | ||||||
|  | @ -2987,8 +3076,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "250m", Memory: "250Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("250m"), Memory: k8sutil.StringToPointer("250Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -3008,8 +3097,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 						acidv1.Sidecar{ | 						acidv1.Sidecar{ | ||||||
| 							Name: sidecarName, | 							Name: sidecarName, | ||||||
| 							Resources: &acidv1.Resources{ | 							Resources: &acidv1.Resources{ | ||||||
| 								ResourceRequests: acidv1.ResourceDescription{CPU: "10m", Memory: "10Mi"}, | 								ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("10m"), Memory: k8sutil.StringToPointer("10Mi")}, | ||||||
| 								ResourceLimits:   acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 								ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 							}, | 							}, | ||||||
| 						}, | 						}, | ||||||
| 					}, | 					}, | ||||||
|  | @ -3020,8 +3109,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "10m", Memory: "10Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("10m"), Memory: k8sutil.StringToPointer("10Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -3038,8 +3127,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 				Spec: acidv1.PostgresSpec{ | 				Spec: acidv1.PostgresSpec{ | ||||||
| 					Resources: &acidv1.Resources{ | 					Resources: &acidv1.Resources{ | ||||||
| 						ResourceRequests: acidv1.ResourceDescription{CPU: "1", Memory: "2Gi"}, | 						ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("2Gi")}, | ||||||
| 						ResourceLimits:   acidv1.ResourceDescription{CPU: "2", Memory: "4Gi"}, | 						ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("2"), Memory: k8sutil.StringToPointer("4Gi")}, | ||||||
| 					}, | 					}, | ||||||
| 					TeamID: "acid", | 					TeamID: "acid", | ||||||
| 					Volume: acidv1.Volume{ | 					Volume: acidv1.Volume{ | ||||||
|  | @ -3048,8 +3137,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "500m", Memory: "1Gi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("500m"), Memory: k8sutil.StringToPointer("1Gi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "2", Memory: "4Gi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("2"), Memory: k8sutil.StringToPointer("4Gi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -3066,8 +3155,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 				Spec: acidv1.PostgresSpec{ | 				Spec: acidv1.PostgresSpec{ | ||||||
| 					Resources: &acidv1.Resources{ | 					Resources: &acidv1.Resources{ | ||||||
| 						ResourceRequests: acidv1.ResourceDescription{Memory: "500Mi"}, | 						ResourceRequests: acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
| 						ResourceLimits:   acidv1.ResourceDescription{Memory: "2Gi"}, | 						ResourceLimits:   acidv1.ResourceDescription{Memory: k8sutil.StringToPointer("2Gi")}, | ||||||
| 					}, | 					}, | ||||||
| 					TeamID: "acid", | 					TeamID: "acid", | ||||||
| 					Volume: acidv1.Volume{ | 					Volume: acidv1.Volume{ | ||||||
|  | @ -3076,8 +3165,8 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "1Gi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("1Gi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "2Gi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("2Gi")}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
|  | @ -3104,12 +3193,12 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{ | 				ResourceRequests: acidv1.ResourceDescription{ | ||||||
| 					CPU:    "100m", | 					CPU:    k8sutil.StringToPointer("100m"), | ||||||
| 					Memory: "100Mi", | 					Memory: k8sutil.StringToPointer("100Mi"), | ||||||
| 				}, | 				}, | ||||||
| 				ResourceLimits: acidv1.ResourceDescription{ | 				ResourceLimits: acidv1.ResourceDescription{ | ||||||
| 					CPU:    "1", | 					CPU:    k8sutil.StringToPointer("1"), | ||||||
| 					Memory: "500Mi", | 					Memory: k8sutil.StringToPointer("500Mi"), | ||||||
| 				}, | 				}, | ||||||
| 			}, | 			}, | ||||||
| 		}, | 		}, | ||||||
|  | @ -3143,14 +3232,14 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{ | 				ResourceRequests: acidv1.ResourceDescription{ | ||||||
| 					CPU:          "100m", | 					CPU:          k8sutil.StringToPointer("100m"), | ||||||
| 					Memory:       "100Mi", | 					Memory:       k8sutil.StringToPointer("100Mi"), | ||||||
| 					HugePages2Mi: k8sutil.StringToPointer("128Mi"), | 					HugePages2Mi: k8sutil.StringToPointer("128Mi"), | ||||||
| 					HugePages1Gi: k8sutil.StringToPointer("1Gi"), | 					HugePages1Gi: k8sutil.StringToPointer("1Gi"), | ||||||
| 				}, | 				}, | ||||||
| 				ResourceLimits: acidv1.ResourceDescription{ | 				ResourceLimits: acidv1.ResourceDescription{ | ||||||
| 					CPU:          "1", | 					CPU:          k8sutil.StringToPointer("1"), | ||||||
| 					Memory:       "500Mi", | 					Memory:       k8sutil.StringToPointer("500Mi"), | ||||||
| 					HugePages2Mi: k8sutil.StringToPointer("256Mi"), | 					HugePages2Mi: k8sutil.StringToPointer("256Mi"), | ||||||
| 					HugePages1Gi: k8sutil.StringToPointer("2Gi"), | 					HugePages1Gi: k8sutil.StringToPointer("2Gi"), | ||||||
| 				}, | 				}, | ||||||
|  | @ -3192,14 +3281,14 @@ func TestGenerateResourceRequirements(t *testing.T) { | ||||||
| 			}, | 			}, | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{ | 				ResourceRequests: acidv1.ResourceDescription{ | ||||||
| 					CPU:          "100m", | 					CPU:          k8sutil.StringToPointer("100m"), | ||||||
| 					Memory:       "100Mi", | 					Memory:       k8sutil.StringToPointer("100Mi"), | ||||||
| 					HugePages2Mi: k8sutil.StringToPointer("128Mi"), | 					HugePages2Mi: k8sutil.StringToPointer("128Mi"), | ||||||
| 					HugePages1Gi: k8sutil.StringToPointer("1Gi"), | 					HugePages1Gi: k8sutil.StringToPointer("1Gi"), | ||||||
| 				}, | 				}, | ||||||
| 				ResourceLimits: acidv1.ResourceDescription{ | 				ResourceLimits: acidv1.ResourceDescription{ | ||||||
| 					CPU:          "1", | 					CPU:          k8sutil.StringToPointer("1"), | ||||||
| 					Memory:       "500Mi", | 					Memory:       k8sutil.StringToPointer("500Mi"), | ||||||
| 					HugePages2Mi: k8sutil.StringToPointer("256Mi"), | 					HugePages2Mi: k8sutil.StringToPointer("256Mi"), | ||||||
| 					HugePages1Gi: k8sutil.StringToPointer("2Gi"), | 					HugePages1Gi: k8sutil.StringToPointer("2Gi"), | ||||||
| 				}, | 				}, | ||||||
|  | @ -3269,8 +3358,8 @@ func TestGenerateLogicalBackupJob(t *testing.T) { | ||||||
| 			expectedSchedule: "30 00 * * *", | 			expectedSchedule: "30 00 * * *", | ||||||
| 			expectedJobName:  "logical-backup-acid-test-cluster", | 			expectedJobName:  "logical-backup-acid-test-cluster", | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "500Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedLabel:      map[string]string{configResources.ClusterNameLabel: clusterName, "team": teamId}, | 			expectedLabel:      map[string]string{configResources.ClusterNameLabel: clusterName, "team": teamId}, | ||||||
| 			expectedAnnotation: nil, | 			expectedAnnotation: nil, | ||||||
|  | @ -3294,8 +3383,8 @@ func TestGenerateLogicalBackupJob(t *testing.T) { | ||||||
| 			expectedSchedule: "30 00 * * 7", | 			expectedSchedule: "30 00 * * 7", | ||||||
| 			expectedJobName:  "lb-acid-test-cluster", | 			expectedJobName:  "lb-acid-test-cluster", | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "10m", Memory: "50Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("10m"), Memory: k8sutil.StringToPointer("50Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "300m", Memory: "300Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("300m"), Memory: k8sutil.StringToPointer("300Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedLabel:      map[string]string{configResources.ClusterNameLabel: clusterName, "team": teamId}, | 			expectedLabel:      map[string]string{configResources.ClusterNameLabel: clusterName, "team": teamId}, | ||||||
| 			expectedAnnotation: nil, | 			expectedAnnotation: nil, | ||||||
|  | @ -3317,8 +3406,8 @@ func TestGenerateLogicalBackupJob(t *testing.T) { | ||||||
| 			expectedSchedule: "30 00 * * *", | 			expectedSchedule: "30 00 * * *", | ||||||
| 			expectedJobName:  "acid-test-cluster", | 			expectedJobName:  "acid-test-cluster", | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "50m", Memory: "100Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("50m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "250m", Memory: "500Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("250m"), Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedLabel:      map[string]string{configResources.ClusterNameLabel: clusterName, "team": teamId}, | 			expectedLabel:      map[string]string{configResources.ClusterNameLabel: clusterName, "team": teamId}, | ||||||
| 			expectedAnnotation: nil, | 			expectedAnnotation: nil, | ||||||
|  | @ -3340,8 +3429,8 @@ func TestGenerateLogicalBackupJob(t *testing.T) { | ||||||
| 			expectedSchedule: "30 00 * * *", | 			expectedSchedule: "30 00 * * *", | ||||||
| 			expectedJobName:  "test-long-prefix-so-name-must-be-trimmed-acid-test-c", | 			expectedJobName:  "test-long-prefix-so-name-must-be-trimmed-acid-test-c", | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "200Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("200Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "200Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("200Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedLabel:      map[string]string{configResources.ClusterNameLabel: clusterName, "team": teamId}, | 			expectedLabel:      map[string]string{configResources.ClusterNameLabel: clusterName, "team": teamId}, | ||||||
| 			expectedAnnotation: nil, | 			expectedAnnotation: nil, | ||||||
|  | @ -3362,8 +3451,8 @@ func TestGenerateLogicalBackupJob(t *testing.T) { | ||||||
| 			expectedJobName:  "acid-test-cluster", | 			expectedJobName:  "acid-test-cluster", | ||||||
| 			expectedSchedule: "", | 			expectedSchedule: "", | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "500Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedLabel:      map[string]string{"labelKey": "labelValue", "cluster-name": clusterName, "team": teamId}, | 			expectedLabel:      map[string]string{"labelKey": "labelValue", "cluster-name": clusterName, "team": teamId}, | ||||||
| 			expectedAnnotation: nil, | 			expectedAnnotation: nil, | ||||||
|  | @ -3384,8 +3473,8 @@ func TestGenerateLogicalBackupJob(t *testing.T) { | ||||||
| 			expectedJobName:  "acid-test-cluster", | 			expectedJobName:  "acid-test-cluster", | ||||||
| 			expectedSchedule: "", | 			expectedSchedule: "", | ||||||
| 			expectedResources: acidv1.Resources{ | 			expectedResources: acidv1.Resources{ | ||||||
| 				ResourceRequests: acidv1.ResourceDescription{CPU: "100m", Memory: "100Mi"}, | 				ResourceRequests: acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("100m"), Memory: k8sutil.StringToPointer("100Mi")}, | ||||||
| 				ResourceLimits:   acidv1.ResourceDescription{CPU: "1", Memory: "500Mi"}, | 				ResourceLimits:   acidv1.ResourceDescription{CPU: k8sutil.StringToPointer("1"), Memory: k8sutil.StringToPointer("500Mi")}, | ||||||
| 			}, | 			}, | ||||||
| 			expectedLabel:      map[string]string{configResources.ClusterNameLabel: clusterName, "team": teamId}, | 			expectedLabel:      map[string]string{configResources.ClusterNameLabel: clusterName, "team": teamId}, | ||||||
| 			expectedAnnotation: map[string]string{"annotationKey": "annotationValue"}, | 			expectedAnnotation: map[string]string{"annotationKey": "annotationValue"}, | ||||||
|  |  | ||||||
|  | @ -130,12 +130,12 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur | ||||||
| 	result.PodToleration = fromCRD.Kubernetes.PodToleration | 	result.PodToleration = fromCRD.Kubernetes.PodToleration | ||||||
| 
 | 
 | ||||||
| 	// Postgres Pod resources
 | 	// Postgres Pod resources
 | ||||||
| 	result.DefaultCPURequest = util.Coalesce(fromCRD.PostgresPodResources.DefaultCPURequest, "100m") | 	result.DefaultCPURequest = fromCRD.PostgresPodResources.DefaultCPURequest | ||||||
| 	result.DefaultMemoryRequest = util.Coalesce(fromCRD.PostgresPodResources.DefaultMemoryRequest, "100Mi") | 	result.DefaultMemoryRequest = fromCRD.PostgresPodResources.DefaultMemoryRequest | ||||||
| 	result.DefaultCPULimit = util.Coalesce(fromCRD.PostgresPodResources.DefaultCPULimit, "1") | 	result.DefaultCPULimit = fromCRD.PostgresPodResources.DefaultCPULimit | ||||||
| 	result.DefaultMemoryLimit = util.Coalesce(fromCRD.PostgresPodResources.DefaultMemoryLimit, "500Mi") | 	result.DefaultMemoryLimit = fromCRD.PostgresPodResources.DefaultMemoryLimit | ||||||
| 	result.MinCPULimit = util.Coalesce(fromCRD.PostgresPodResources.MinCPULimit, "250m") | 	result.MinCPULimit = fromCRD.PostgresPodResources.MinCPULimit | ||||||
| 	result.MinMemoryLimit = util.Coalesce(fromCRD.PostgresPodResources.MinMemoryLimit, "250Mi") | 	result.MinMemoryLimit = fromCRD.PostgresPodResources.MinMemoryLimit | ||||||
| 	result.MaxCPURequest = fromCRD.PostgresPodResources.MaxCPURequest | 	result.MaxCPURequest = fromCRD.PostgresPodResources.MaxCPURequest | ||||||
| 	result.MaxMemoryRequest = fromCRD.PostgresPodResources.MaxMemoryRequest | 	result.MaxMemoryRequest = fromCRD.PostgresPodResources.MaxMemoryRequest | ||||||
| 
 | 
 | ||||||
|  | @ -265,21 +265,10 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur | ||||||
| 		fromCRD.ConnectionPooler.Mode, | 		fromCRD.ConnectionPooler.Mode, | ||||||
| 		constants.ConnectionPoolerDefaultMode) | 		constants.ConnectionPoolerDefaultMode) | ||||||
| 
 | 
 | ||||||
| 	result.ConnectionPooler.ConnectionPoolerDefaultCPURequest = util.Coalesce( | 	result.ConnectionPooler.ConnectionPoolerDefaultCPURequest = fromCRD.ConnectionPooler.DefaultCPURequest | ||||||
| 		fromCRD.ConnectionPooler.DefaultCPURequest, | 	result.ConnectionPooler.ConnectionPoolerDefaultMemoryRequest = fromCRD.ConnectionPooler.DefaultMemoryRequest | ||||||
| 		constants.ConnectionPoolerDefaultCpuRequest) | 	result.ConnectionPooler.ConnectionPoolerDefaultCPULimit = fromCRD.ConnectionPooler.DefaultCPULimit | ||||||
| 
 | 	result.ConnectionPooler.ConnectionPoolerDefaultMemoryLimit = fromCRD.ConnectionPooler.DefaultMemoryLimit | ||||||
| 	result.ConnectionPooler.ConnectionPoolerDefaultMemoryRequest = util.Coalesce( |  | ||||||
| 		fromCRD.ConnectionPooler.DefaultMemoryRequest, |  | ||||||
| 		constants.ConnectionPoolerDefaultMemoryRequest) |  | ||||||
| 
 |  | ||||||
| 	result.ConnectionPooler.ConnectionPoolerDefaultCPULimit = util.Coalesce( |  | ||||||
| 		fromCRD.ConnectionPooler.DefaultCPULimit, |  | ||||||
| 		constants.ConnectionPoolerDefaultCpuLimit) |  | ||||||
| 
 |  | ||||||
| 	result.ConnectionPooler.ConnectionPoolerDefaultMemoryLimit = util.Coalesce( |  | ||||||
| 		fromCRD.ConnectionPooler.DefaultMemoryLimit, |  | ||||||
| 		constants.ConnectionPoolerDefaultMemoryLimit) |  | ||||||
| 
 | 
 | ||||||
| 	result.ConnectionPooler.MaxDBConnections = util.CoalesceInt32( | 	result.ConnectionPooler.MaxDBConnections = util.CoalesceInt32( | ||||||
| 		fromCRD.ConnectionPooler.MaxDBConnections, | 		fromCRD.ConnectionPooler.MaxDBConnections, | ||||||
|  |  | ||||||
|  | @ -48,12 +48,12 @@ type Resources struct { | ||||||
| 	DeleteAnnotationNameKey       string              `name:"delete_annotation_name_key"` | 	DeleteAnnotationNameKey       string              `name:"delete_annotation_name_key"` | ||||||
| 	PodRoleLabel                  string              `name:"pod_role_label" default:"spilo-role"` | 	PodRoleLabel                  string              `name:"pod_role_label" default:"spilo-role"` | ||||||
| 	PodToleration                 map[string]string   `name:"toleration" default:""` | 	PodToleration                 map[string]string   `name:"toleration" default:""` | ||||||
| 	DefaultCPURequest             string              `name:"default_cpu_request" default:"100m"` | 	DefaultCPURequest             string              `name:"default_cpu_request"` | ||||||
| 	DefaultMemoryRequest          string              `name:"default_memory_request" default:"100Mi"` | 	DefaultMemoryRequest          string              `name:"default_memory_request"` | ||||||
| 	DefaultCPULimit               string              `name:"default_cpu_limit" default:"1"` | 	DefaultCPULimit               string              `name:"default_cpu_limit"` | ||||||
| 	DefaultMemoryLimit            string              `name:"default_memory_limit" default:"500Mi"` | 	DefaultMemoryLimit            string              `name:"default_memory_limit"` | ||||||
| 	MinCPULimit                   string              `name:"min_cpu_limit" default:"250m"` | 	MinCPULimit                   string              `name:"min_cpu_limit"` | ||||||
| 	MinMemoryLimit                string              `name:"min_memory_limit" default:"250Mi"` | 	MinMemoryLimit                string              `name:"min_memory_limit"` | ||||||
| 	MaxCPURequest                 string              `name:"max_cpu_request"` | 	MaxCPURequest                 string              `name:"max_cpu_request"` | ||||||
| 	MaxMemoryRequest              string              `name:"max_memory_request"` | 	MaxMemoryRequest              string              `name:"max_memory_request"` | ||||||
| 	PodEnvironmentConfigMap       spec.NamespacedName `name:"pod_environment_configmap"` | 	PodEnvironmentConfigMap       spec.NamespacedName `name:"pod_environment_configmap"` | ||||||
|  | @ -155,10 +155,10 @@ type ConnectionPooler struct { | ||||||
| 	Image                                string `name:"connection_pooler_image" default:"registry.opensource.zalan.do/acid/pgbouncer"` | 	Image                                string `name:"connection_pooler_image" default:"registry.opensource.zalan.do/acid/pgbouncer"` | ||||||
| 	Mode                                 string `name:"connection_pooler_mode" default:"transaction"` | 	Mode                                 string `name:"connection_pooler_mode" default:"transaction"` | ||||||
| 	MaxDBConnections                     *int32 `name:"connection_pooler_max_db_connections" default:"60"` | 	MaxDBConnections                     *int32 `name:"connection_pooler_max_db_connections" default:"60"` | ||||||
| 	ConnectionPoolerDefaultCPURequest    string `name:"connection_pooler_default_cpu_request" default:"500m"` | 	ConnectionPoolerDefaultCPURequest    string `name:"connection_pooler_default_cpu_request"` | ||||||
| 	ConnectionPoolerDefaultMemoryRequest string `name:"connection_pooler_default_memory_request" default:"100Mi"` | 	ConnectionPoolerDefaultMemoryRequest string `name:"connection_pooler_default_memory_request"` | ||||||
| 	ConnectionPoolerDefaultCPULimit      string `name:"connection_pooler_default_cpu_limit" default:"1"` | 	ConnectionPoolerDefaultCPULimit      string `name:"connection_pooler_default_cpu_limit"` | ||||||
| 	ConnectionPoolerDefaultMemoryLimit   string `name:"connection_pooler_default_memory_limit" default:"100Mi"` | 	ConnectionPoolerDefaultMemoryLimit   string `name:"connection_pooler_default_memory_limit"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Config describes operator config
 | // Config describes operator config
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue