Merge 4ed854eb1e into d495825f4b
This commit is contained in:
commit
b92bb825d8
|
|
@ -227,6 +227,10 @@ spec:
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
pattern: '^\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))-((2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))\ *$'
|
pattern: '^\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))-((2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))\ *$'
|
||||||
|
masterPoolerServiceAnnotations:
|
||||||
|
type: object
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
masterServiceAnnotations:
|
masterServiceAnnotations:
|
||||||
type: object
|
type: object
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
|
|
@ -408,6 +412,10 @@ spec:
|
||||||
replicaLoadBalancer:
|
replicaLoadBalancer:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: deprecated
|
description: deprecated
|
||||||
|
replicaPoolerServiceAnnotations:
|
||||||
|
type: object
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
replicaServiceAnnotations:
|
replicaServiceAnnotations:
|
||||||
type: object
|
type: object
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
|
|
|
||||||
|
|
@ -905,6 +905,7 @@ precedence):
|
||||||
2. Globally configured `custom_service_annotations`
|
2. Globally configured `custom_service_annotations`
|
||||||
3. `serviceAnnotations` specified in the cluster manifest
|
3. `serviceAnnotations` specified in the cluster manifest
|
||||||
4. `masterServiceAnnotations` and `replicaServiceAnnotations` specified in the cluster manifest
|
4. `masterServiceAnnotations` and `replicaServiceAnnotations` specified in the cluster manifest
|
||||||
|
5. `masterPoolerServiceAnnotations` and `replicaPoolerServiceAnnotations` specified in the cluster manifest (only for connection pooler services)
|
||||||
|
|
||||||
To limit the range of IP addresses that can reach a load balancer, specify the
|
To limit the range of IP addresses that can reach a load balancer, specify the
|
||||||
desired ranges in the `allowedSourceRanges` field (applies to both master and
|
desired ranges in the `allowedSourceRanges` field (applies to both master and
|
||||||
|
|
|
||||||
|
|
@ -203,6 +203,18 @@ These parameters are grouped directly under the `spec` key in the manifest.
|
||||||
This field overrides `serviceAnnotations` with the same key for the replica
|
This field overrides `serviceAnnotations` with the same key for the replica
|
||||||
service if not empty.
|
service if not empty.
|
||||||
|
|
||||||
|
* **masterPoolerServiceAnnotations**
|
||||||
|
A map of key value pairs that gets attached as [annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/)
|
||||||
|
to the master connection pooler service created for the database cluster.
|
||||||
|
This field overrides `serviceAnnotations` and `masterServiceAnnotations`
|
||||||
|
with the same key for the master pooler service if not empty.
|
||||||
|
|
||||||
|
* **replicaPoolerServiceAnnotations**
|
||||||
|
A map of key value pairs that gets attached as [annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/)
|
||||||
|
to the replica connection pooler service created for the database cluster.
|
||||||
|
This field overrides `serviceAnnotations` and `replicaServiceAnnotations`
|
||||||
|
with the same key for the replica pooler service if not empty.
|
||||||
|
|
||||||
* **enableShmVolume**
|
* **enableShmVolume**
|
||||||
Start a database pod without limitations on shm memory. By default Docker
|
Start a database pod without limitations on shm memory. By default Docker
|
||||||
limit `/dev/shm` to `64M` (see e.g. the [docker
|
limit `/dev/shm` to `64M` (see e.g. the [docker
|
||||||
|
|
|
||||||
|
|
@ -3256,6 +3256,12 @@ spec:
|
||||||
pattern: '^\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))-((2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))\ *$'
|
pattern: '^\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))-((2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))\ *$'
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
masterPoolerServiceAnnotations:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: MasterPoolerServiceAnnotations takes precedence over other
|
||||||
|
annotations for master pooler service if not empty
|
||||||
|
type: object
|
||||||
masterServiceAnnotations:
|
masterServiceAnnotations:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: string
|
type: string
|
||||||
|
|
@ -3560,6 +3566,12 @@ spec:
|
||||||
replicaLoadBalancer:
|
replicaLoadBalancer:
|
||||||
description: deprecated
|
description: deprecated
|
||||||
type: boolean
|
type: boolean
|
||||||
|
replicaPoolerServiceAnnotations:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: ReplicaPoolerServiceAnnotations takes precedence over other
|
||||||
|
annotations for replica pooler service if not empty
|
||||||
|
type: object
|
||||||
replicaServiceAnnotations:
|
replicaServiceAnnotations:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: string
|
type: string
|
||||||
|
|
|
||||||
|
|
@ -3256,6 +3256,12 @@ spec:
|
||||||
pattern: '^\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))-((2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))\ *$'
|
pattern: '^\ *((Mon|Tue|Wed|Thu|Fri|Sat|Sun):(2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))-((2[0-3]|[01]?\d):([0-5]?\d)|(2[0-3]|[01]?\d):([0-5]?\d))\ *$'
|
||||||
type: string
|
type: string
|
||||||
type: array
|
type: array
|
||||||
|
masterPoolerServiceAnnotations:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: MasterPoolerServiceAnnotations takes precedence over other
|
||||||
|
annotations for master pooler service if not empty
|
||||||
|
type: object
|
||||||
masterServiceAnnotations:
|
masterServiceAnnotations:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: string
|
type: string
|
||||||
|
|
@ -3560,6 +3566,12 @@ spec:
|
||||||
replicaLoadBalancer:
|
replicaLoadBalancer:
|
||||||
description: deprecated
|
description: deprecated
|
||||||
type: boolean
|
type: boolean
|
||||||
|
replicaPoolerServiceAnnotations:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: ReplicaPoolerServiceAnnotations takes precedence over other
|
||||||
|
annotations for replica pooler service if not empty
|
||||||
|
type: object
|
||||||
replicaServiceAnnotations:
|
replicaServiceAnnotations:
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: string
|
type: string
|
||||||
|
|
|
||||||
|
|
@ -111,8 +111,12 @@ type PostgresSpec struct {
|
||||||
// MasterServiceAnnotations takes precedence over ServiceAnnotations for master role if not empty
|
// MasterServiceAnnotations takes precedence over ServiceAnnotations for master role if not empty
|
||||||
MasterServiceAnnotations map[string]string `json:"masterServiceAnnotations,omitempty"`
|
MasterServiceAnnotations map[string]string `json:"masterServiceAnnotations,omitempty"`
|
||||||
// ReplicaServiceAnnotations takes precedence over ServiceAnnotations for replica role if not empty
|
// ReplicaServiceAnnotations takes precedence over ServiceAnnotations for replica role if not empty
|
||||||
ReplicaServiceAnnotations map[string]string `json:"replicaServiceAnnotations,omitempty"`
|
ReplicaServiceAnnotations map[string]string `json:"replicaServiceAnnotations,omitempty"`
|
||||||
TLS *TLSDescription `json:"tls,omitempty"`
|
// MasterPoolerServiceAnnotations takes precedence over other annotations for master pooler service if not empty
|
||||||
|
MasterPoolerServiceAnnotations map[string]string `json:"masterPoolerServiceAnnotations,omitempty"`
|
||||||
|
// ReplicaPoolerServiceAnnotations takes precedence over other annotations for replica pooler service if not empty
|
||||||
|
ReplicaPoolerServiceAnnotations map[string]string `json:"replicaPoolerServiceAnnotations,omitempty"`
|
||||||
|
TLS *TLSDescription `json:"tls,omitempty"`
|
||||||
AdditionalVolumes []AdditionalVolume `json:"additionalVolumes,omitempty"`
|
AdditionalVolumes []AdditionalVolume `json:"additionalVolumes,omitempty"`
|
||||||
Streams []Stream `json:"streams,omitempty"`
|
Streams []Stream `json:"streams,omitempty"`
|
||||||
Env []v1.EnvVar `json:"env,omitempty"`
|
Env []v1.EnvVar `json:"env,omitempty"`
|
||||||
|
|
|
||||||
|
|
@ -855,6 +855,20 @@ func (in *PostgresSpec) DeepCopyInto(out *PostgresSpec) {
|
||||||
(*out)[key] = val
|
(*out)[key] = val
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if in.MasterPoolerServiceAnnotations != nil {
|
||||||
|
in, out := &in.MasterPoolerServiceAnnotations, &out.MasterPoolerServiceAnnotations
|
||||||
|
*out = make(map[string]string, len(*in))
|
||||||
|
for key, val := range *in {
|
||||||
|
(*out)[key] = val
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if in.ReplicaPoolerServiceAnnotations != nil {
|
||||||
|
in, out := &in.ReplicaPoolerServiceAnnotations, &out.ReplicaPoolerServiceAnnotations
|
||||||
|
*out = make(map[string]string, len(*in))
|
||||||
|
for key, val := range *in {
|
||||||
|
(*out)[key] = val
|
||||||
|
}
|
||||||
|
}
|
||||||
if in.TLS != nil {
|
if in.TLS != nil {
|
||||||
in, out := &in.TLS, &out.TLS
|
in, out := &in.TLS, &out.TLS
|
||||||
*out = new(TLSDescription)
|
*out = new(TLSDescription)
|
||||||
|
|
|
||||||
|
|
@ -1026,6 +1026,136 @@ func TestServiceAnnotations(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPoolerServiceAnnotations(t *testing.T) {
|
||||||
|
enabled := true
|
||||||
|
tests := []struct {
|
||||||
|
about string
|
||||||
|
role PostgresRole
|
||||||
|
enableMasterPoolerLoadBalancer *bool
|
||||||
|
enableReplicaPoolerLoadBalancer *bool
|
||||||
|
operatorAnnotations map[string]string
|
||||||
|
serviceAnnotations map[string]string
|
||||||
|
masterServiceAnnotations map[string]string
|
||||||
|
replicaServiceAnnotations map[string]string
|
||||||
|
masterPoolerServiceAnnotations map[string]string
|
||||||
|
replicaPoolerServiceAnnotations map[string]string
|
||||||
|
expect map[string]string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
about: "Master pooler annotations override service annotations",
|
||||||
|
role: "master",
|
||||||
|
operatorAnnotations: make(map[string]string),
|
||||||
|
serviceAnnotations: map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
},
|
||||||
|
masterServiceAnnotations: map[string]string{
|
||||||
|
"baz": "qux",
|
||||||
|
},
|
||||||
|
masterPoolerServiceAnnotations: map[string]string{
|
||||||
|
"foo": "pooler-bar",
|
||||||
|
"pooler": "master",
|
||||||
|
},
|
||||||
|
expect: map[string]string{
|
||||||
|
"foo": "pooler-bar",
|
||||||
|
"baz": "qux",
|
||||||
|
"pooler": "master",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
about: "Replica pooler annotations override service annotations",
|
||||||
|
role: "replica",
|
||||||
|
operatorAnnotations: make(map[string]string),
|
||||||
|
serviceAnnotations: map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
},
|
||||||
|
replicaServiceAnnotations: map[string]string{
|
||||||
|
"baz": "qux",
|
||||||
|
},
|
||||||
|
replicaPoolerServiceAnnotations: map[string]string{
|
||||||
|
"foo": "pooler-bar",
|
||||||
|
"pooler": "replica",
|
||||||
|
},
|
||||||
|
expect: map[string]string{
|
||||||
|
"foo": "pooler-bar",
|
||||||
|
"baz": "qux",
|
||||||
|
"pooler": "replica",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
about: "Master pooler with load balancer and pooler annotations",
|
||||||
|
role: "master",
|
||||||
|
enableMasterPoolerLoadBalancer: &enabled,
|
||||||
|
operatorAnnotations: make(map[string]string),
|
||||||
|
serviceAnnotations: make(map[string]string),
|
||||||
|
masterPoolerServiceAnnotations: map[string]string{
|
||||||
|
"pooler-key": "pooler-value",
|
||||||
|
},
|
||||||
|
expect: map[string]string{
|
||||||
|
"external-dns.alpha.kubernetes.io/hostname": "acid-test-pooler-stg.test.db.example.com",
|
||||||
|
"service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout": "3600",
|
||||||
|
"pooler-key": "pooler-value",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
about: "Master pooler annotations not applied to replica pooler",
|
||||||
|
role: "replica",
|
||||||
|
operatorAnnotations: make(map[string]string),
|
||||||
|
serviceAnnotations: make(map[string]string),
|
||||||
|
masterPoolerServiceAnnotations: map[string]string{
|
||||||
|
"master-only": "value",
|
||||||
|
},
|
||||||
|
expect: make(map[string]string),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
about: "Replica pooler annotations not applied to master pooler",
|
||||||
|
role: "master",
|
||||||
|
operatorAnnotations: make(map[string]string),
|
||||||
|
serviceAnnotations: make(map[string]string),
|
||||||
|
replicaPoolerServiceAnnotations: map[string]string{
|
||||||
|
"replica-only": "value",
|
||||||
|
},
|
||||||
|
expect: make(map[string]string),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.about, func(t *testing.T) {
|
||||||
|
cl.OpConfig.CustomServiceAnnotations = tt.operatorAnnotations
|
||||||
|
cl.OpConfig.EnableMasterPoolerLoadBalancer = false
|
||||||
|
cl.OpConfig.EnableReplicaPoolerLoadBalancer = false
|
||||||
|
cl.OpConfig.MasterDNSNameFormat = "{cluster}-stg.{namespace}.{hostedzone}"
|
||||||
|
cl.OpConfig.MasterLegacyDNSNameFormat = "{cluster}-stg.{team}.{hostedzone}"
|
||||||
|
cl.OpConfig.ReplicaDNSNameFormat = "{cluster}-stg-repl.{namespace}.{hostedzone}"
|
||||||
|
cl.OpConfig.ReplicaLegacyDNSNameFormat = "{cluster}-stg-repl.{team}.{hostedzone}"
|
||||||
|
cl.OpConfig.DbHostedZone = "db.example.com"
|
||||||
|
|
||||||
|
cl.Postgresql.Spec.ClusterName = ""
|
||||||
|
cl.Postgresql.Spec.TeamID = "acid"
|
||||||
|
cl.Postgresql.Spec.ServiceAnnotations = tt.serviceAnnotations
|
||||||
|
cl.Postgresql.Spec.MasterServiceAnnotations = tt.masterServiceAnnotations
|
||||||
|
cl.Postgresql.Spec.ReplicaServiceAnnotations = tt.replicaServiceAnnotations
|
||||||
|
cl.Postgresql.Spec.MasterPoolerServiceAnnotations = tt.masterPoolerServiceAnnotations
|
||||||
|
cl.Postgresql.Spec.ReplicaPoolerServiceAnnotations = tt.replicaPoolerServiceAnnotations
|
||||||
|
cl.Postgresql.Spec.EnableMasterPoolerLoadBalancer = tt.enableMasterPoolerLoadBalancer
|
||||||
|
cl.Postgresql.Spec.EnableReplicaPoolerLoadBalancer = tt.enableReplicaPoolerLoadBalancer
|
||||||
|
|
||||||
|
got := cl.generatePoolerServiceAnnotations(tt.role, &cl.Postgresql.Spec)
|
||||||
|
if got == nil {
|
||||||
|
got = make(map[string]string)
|
||||||
|
}
|
||||||
|
if len(tt.expect) != len(got) {
|
||||||
|
t.Errorf("expected %d annotation(s), got %d: %v", len(tt.expect), len(got), got)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for k, v := range got {
|
||||||
|
if tt.expect[k] != v {
|
||||||
|
t.Errorf("expected annotation '%v' with value '%v', got value '%v'", k, tt.expect[k], v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestInitSystemUsers(t *testing.T) {
|
func TestInitSystemUsers(t *testing.T) {
|
||||||
// reset system users, pooler and stream section
|
// reset system users, pooler and stream section
|
||||||
cl.systemUsers = make(map[string]spec.PgUser)
|
cl.systemUsers = make(map[string]spec.PgUser)
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ import (
|
||||||
"github.com/zalando/postgres-operator/pkg/util/constants"
|
"github.com/zalando/postgres-operator/pkg/util/constants"
|
||||||
"github.com/zalando/postgres-operator/pkg/util/k8sutil"
|
"github.com/zalando/postgres-operator/pkg/util/k8sutil"
|
||||||
"github.com/zalando/postgres-operator/pkg/util/retryutil"
|
"github.com/zalando/postgres-operator/pkg/util/retryutil"
|
||||||
|
"maps"
|
||||||
)
|
)
|
||||||
|
|
||||||
var poolerRunAsUser = int64(100)
|
var poolerRunAsUser = int64(100)
|
||||||
|
|
@ -532,6 +533,15 @@ func (c *Cluster) generatePoolerServiceAnnotations(role PostgresRole, spec *acid
|
||||||
var dnsString string
|
var dnsString string
|
||||||
annotations := c.getCustomServiceAnnotations(role, spec)
|
annotations := c.getCustomServiceAnnotations(role, spec)
|
||||||
|
|
||||||
|
if spec != nil {
|
||||||
|
switch role {
|
||||||
|
case Master:
|
||||||
|
maps.Copy(annotations, spec.MasterPoolerServiceAnnotations)
|
||||||
|
case Replica:
|
||||||
|
maps.Copy(annotations, spec.ReplicaPoolerServiceAnnotations)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if c.shouldCreateLoadBalancerForPoolerService(role, spec) {
|
if c.shouldCreateLoadBalancerForPoolerService(role, spec) {
|
||||||
// set ELB Timeout annotation with default value
|
// set ELB Timeout annotation with default value
|
||||||
if _, ok := annotations[constants.ElbTimeoutAnnotationName]; !ok {
|
if _, ok := annotations[constants.ElbTimeoutAnnotationName]; !ok {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue