From c6df079d2bd12d567c4648d17b345f0132302eb2 Mon Sep 17 00:00:00 2001 From: Sergey Dudoladov Date: Thu, 8 Nov 2018 18:41:23 +0100 Subject: [PATCH] 1) Handle per-cluster sidecars 2) Add this option to operator CRD 3) ad parsing for proepr comparison --- .../v1/operator_configuration_type.go | 1 + pkg/cluster/k8sres.go | 14 ++++++++++++-- pkg/controller/controller.go | 4 ++-- pkg/controller/operator_config.go | 1 + pkg/util/util.go | 17 +++++++++++++++++ 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go b/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go index de7681db4..da163620b 100644 --- a/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go +++ b/pkg/apis/acid.zalan.do/v1/operator_configuration_type.go @@ -131,6 +131,7 @@ type OperatorConfigurationData struct { PostgresUsersConfiguration PostgresUsersConfiguration `json:"users"` Kubernetes KubernetesMetaConfiguration `json:"kubernetes"` PostgresPodResources PostgresPodResourcesDefaults `json:"postgres_pod_resources"` + SetMemoryRequestToLimit bool `json:"set_memory_request_to_limit,omitempty"` Timeouts OperatorTimeouts `json:"timeouts"` LoadBalancer LoadBalancerConfiguration `json:"load_balancer"` AWSGCP AWSGCPConfiguration `json:"aws_or_gcp"` diff --git a/pkg/cluster/k8sres.go b/pkg/cluster/k8sres.go index 3f1795915..15b918225 100644 --- a/pkg/cluster/k8sres.go +++ b/pkg/cluster/k8sres.go @@ -647,12 +647,22 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*v1beta1.State if c.OpConfig.SetMemoryRequestToLimit { - if spec.Resources.ResourceLimits.Memory > spec.Resources.ResourceRequests.Memory { + if util.RequestIsSmallerThanLimit(spec.Resources.ResourceRequests.Memory, spec.Resources.ResourceLimits.Memory) { c.logger.Warningf("The memory request of %v for the Postgres container is increased to match the memory limit of %v.", spec.Resources.ResourceRequests.Memory, spec.Resources.ResourceLimits.Memory) spec.Resources.ResourceRequests.Memory = spec.Resources.ResourceLimits.Memory + } - // controller adjusts default and Spilo sidecar container requests (those do not need Sync) + // adjust sidecar containers defined for that particular cluster + for _, sidecar := range spec.Sidecars { + if util.RequestIsSmallerThanLimit(sidecar.Resources.ResourceRequests.Memory, sidecar.Resources.ResourceLimits.Memory) { + c.logger.Warningf("The memory request of %v for the %v sidecar container is increased to match the memory limit of %v.", sidecar.Resources.ResourceRequests.Memory, sidecar.Name, sidecar.Resources.ResourceLimits.Memory) + sidecar.Resources.ResourceRequests.Memory = sidecar.Resources.ResourceLimits.Memory + } + } + + // controller adjusts default memory request and Scalyr sidecar container's request + // as those do not need to be synced } diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 8bff4cba1..c16e9c67d 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -112,12 +112,12 @@ func (c *Controller) initOperatorConfig() { if c.opConfig.SetMemoryRequestToLimit { - if c.opConfig.DefaultMemoryLimit > c.opConfig.DefaultMemoryRequest { + if util.RequestIsSmallerThanLimit(c.opConfig.DefaultMemoryRequest, c.opConfig.DefaultMemoryLimit) { c.logger.Warningf("The default memory request of %v for Postgres containers is increased to match the default memory limit of %v.", c.opConfig.DefaultMemoryRequest, c.opConfig.DefaultMemoryLimit) c.opConfig.DefaultMemoryRequest = c.opConfig.DefaultMemoryLimit } - if c.opConfig.ScalyrMemoryLimit > c.opConfig.ScalyrMemoryRequest { + if util.RequestIsSmallerThanLimit(c.opConfig.ScalyrMemoryRequest, c.opConfig.ScalyrMemoryLimit) { c.logger.Warningf("The memory request of %v for the Scalyr sidecar container is increased to match the memory limit of %v.", c.opConfig.ScalyrMemoryRequest, c.opConfig.ScalyrMemoryLimit) c.opConfig.ScalyrMemoryRequest = c.opConfig.ScalyrMemoryLimit } diff --git a/pkg/controller/operator_config.go b/pkg/controller/operator_config.go index 93ba1a0f4..006cfd2d1 100644 --- a/pkg/controller/operator_config.go +++ b/pkg/controller/operator_config.go @@ -55,6 +55,7 @@ func (c *Controller) importConfigurationFromCRD(fromCRD *acidv1.OperatorConfigur result.DefaultMemoryRequest = fromCRD.PostgresPodResources.DefaultMemoryRequest result.DefaultCPULimit = fromCRD.PostgresPodResources.DefaultCPULimit result.DefaultMemoryLimit = fromCRD.PostgresPodResources.DefaultMemoryLimit + result.SetMemoryRequestToLimit = fromCRD.SetMemoryRequestToLimit result.ResourceCheckInterval = time.Duration(fromCRD.Timeouts.ResourceCheckInterval) result.ResourceCheckTimeout = time.Duration(fromCRD.Timeouts.ResourceCheckTimeout) diff --git a/pkg/util/util.go b/pkg/util/util.go index 7b7b58fc4..16e35f115 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -9,6 +9,7 @@ import ( "time" "github.com/motomux/pretty" + resource "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/zalando-incubator/postgres-operator/pkg/spec" @@ -127,3 +128,19 @@ func Coalesce(val, defaultVal string) string { } return val } + +// RequestIsSmallerThanLimit +func RequestIsSmallerThanLimit(requestStr, limitStr string) bool { + + request, err := resource.ParseQuantity(requestStr) + if err != nil { + + } + + limit, err2 := resource.ParseQuantity(requestStr) + if err2 != nil { + + } + + return request.Cmp(limit) == -1 +}