Skip to content

Commit 47b11f7

Browse files
hlihhovacpashagolubFxKu
authored
change Clone attribute of PostgresSpec to *CloneDescription (zalando#1020)
* change Clone attribute of PostgresSpec to *ConnectionPooler * update go.mod from master * fix TestConnectionPoolerSynchronization() * Update pkg/apis/acid.zalan.do/v1/postgresql_type.go Co-authored-by: Felix Kunde <[email protected]> Co-authored-by: Pavlo Golub <[email protected]> Co-authored-by: Felix Kunde <[email protected]>
1 parent 3bee590 commit 47b11f7

File tree

8 files changed

+50
-41
lines changed

8 files changed

+50
-41
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ _testmain.go
3030
/docker/build/
3131
/github.com/
3232
.idea
33+
.vscode
3334

3435
scm-source.json
3536

pkg/apis/acid.zalan.do/v1/marshal.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,9 @@ func (p *Postgresql) UnmarshalJSON(data []byte) error {
112112

113113
if clusterName, err := extractClusterName(tmp2.ObjectMeta.Name, tmp2.Spec.TeamID); err != nil {
114114
tmp2.Error = err.Error()
115-
tmp2.Status.PostgresClusterStatus = ClusterStatusInvalid
116-
} else if err := validateCloneClusterDescription(&tmp2.Spec.Clone); err != nil {
115+
tmp2.Status = PostgresStatus{PostgresClusterStatus: ClusterStatusInvalid}
116+
} else if err := validateCloneClusterDescription(tmp2.Spec.Clone); err != nil {
117+
117118
tmp2.Error = err.Error()
118119
tmp2.Status.PostgresClusterStatus = ClusterStatusInvalid
119120
} else {

pkg/apis/acid.zalan.do/v1/postgresql_type.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ type PostgresSpec struct {
5353
NumberOfInstances int32 `json:"numberOfInstances"`
5454
Users map[string]UserFlags `json:"users"`
5555
MaintenanceWindows []MaintenanceWindow `json:"maintenanceWindows,omitempty"`
56-
Clone CloneDescription `json:"clone"`
56+
Clone *CloneDescription `json:"clone"`
5757
ClusterName string `json:"-"`
5858
Databases map[string]string `json:"databases,omitempty"`
5959
PreparedDatabases map[string]PreparedDatabase `json:"preparedDatabases,omitempty"`

pkg/apis/acid.zalan.do/v1/util.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func extractClusterName(clusterName string, teamName string) (string, error) {
7272

7373
func validateCloneClusterDescription(clone *CloneDescription) error {
7474
// when cloning from the basebackup (no end timestamp) check that the cluster name is a valid service name
75-
if clone.ClusterName != "" && clone.EndTimestamp == "" {
75+
if clone != nil && clone.ClusterName != "" && clone.EndTimestamp == "" {
7676
if !serviceNameRegex.MatchString(clone.ClusterName) {
7777
return fmt.Errorf("clone cluster name must confirm to DNS-1035, regex used for validation is %q",
7878
serviceNameRegexString)

pkg/apis/acid.zalan.do/v1/util_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ var unmarshalCluster = []struct {
163163
"kind": "Postgresql","apiVersion": "acid.zalan.do/v1",
164164
"metadata": {"name": "acid-testcluster1"}, "spec": {"teamId": 100}}`), &tmp).Error(),
165165
},
166-
marshal: []byte(`{"kind":"Postgresql","apiVersion":"acid.zalan.do/v1","metadata":{"name":"acid-testcluster1","creationTimestamp":null},"spec":{"postgresql":{"version":"","parameters":null},"volume":{"size":"","storageClass":""},"patroni":{"initdb":null,"pg_hba":null,"ttl":0,"loop_wait":0,"retry_timeout":0,"maximum_lag_on_failover":0,"slots":null},"resources":{"requests":{"cpu":"","memory":""},"limits":{"cpu":"","memory":""}},"teamId":"","allowedSourceRanges":null,"numberOfInstances":0,"users":null,"clone":{}},"status":"Invalid"}`),
166+
marshal: []byte(`{"kind":"Postgresql","apiVersion":"acid.zalan.do/v1","metadata":{"name":"acid-testcluster1","creationTimestamp":null},"spec":{"postgresql":{"version":"","parameters":null},"volume":{"size":"","storageClass":""},"patroni":{"initdb":null,"pg_hba":null,"ttl":0,"loop_wait":0,"retry_timeout":0,"maximum_lag_on_failover":0,"slots":null},"resources":{"requests":{"cpu":"","memory":""},"limits":{"cpu":"","memory":""}},"teamId":"","allowedSourceRanges":null,"numberOfInstances":0,"users":null,"clone":null},"status":"Invalid"}`),
167167
err: nil},
168168
{
169169
about: "example with /status subresource",
@@ -184,7 +184,7 @@ var unmarshalCluster = []struct {
184184
"kind": "Postgresql","apiVersion": "acid.zalan.do/v1",
185185
"metadata": {"name": "acid-testcluster1"}, "spec": {"teamId": 100}}`), &tmp).Error(),
186186
},
187-
marshal: []byte(`{"kind":"Postgresql","apiVersion":"acid.zalan.do/v1","metadata":{"name":"acid-testcluster1","creationTimestamp":null},"spec":{"postgresql":{"version":"","parameters":null},"volume":{"size":"","storageClass":""},"patroni":{"initdb":null,"pg_hba":null,"ttl":0,"loop_wait":0,"retry_timeout":0,"maximum_lag_on_failover":0,"slots":null},"resources":{"requests":{"cpu":"","memory":""},"limits":{"cpu":"","memory":""}},"teamId":"","allowedSourceRanges":null,"numberOfInstances":0,"users":null,"clone":{}},"status":{"PostgresClusterStatus":"Invalid"}}`),
187+
marshal: []byte(`{"kind":"Postgresql","apiVersion":"acid.zalan.do/v1","metadata":{"name":"acid-testcluster1","creationTimestamp":null},"spec":{"postgresql":{"version":"","parameters":null},"volume":{"size":"","storageClass":""},"patroni":{"initdb":null,"pg_hba":null,"ttl":0,"loop_wait":0,"retry_timeout":0,"maximum_lag_on_failover":0,"slots":null},"resources":{"requests":{"cpu":"","memory":""},"limits":{"cpu":"","memory":""}},"teamId":"","allowedSourceRanges":null,"numberOfInstances":0,"users":null,"clone":null},"status":{"PostgresClusterStatus":"Invalid"}}`),
188188
err: nil},
189189
{
190190
about: "example with detailed input manifest and deprecated pod_priority_class_name -> podPriorityClassName",
@@ -327,7 +327,7 @@ var unmarshalCluster = []struct {
327327
EndTime: mustParseTime("05:15"),
328328
},
329329
},
330-
Clone: CloneDescription{
330+
Clone: &CloneDescription{
331331
ClusterName: "acid-batman",
332332
},
333333
ClusterName: "testcluster1",
@@ -351,7 +351,7 @@ var unmarshalCluster = []struct {
351351
Status: PostgresStatus{PostgresClusterStatus: ClusterStatusInvalid},
352352
Error: errors.New("name must match {TEAM}-{NAME} format").Error(),
353353
},
354-
marshal: []byte(`{"kind":"Postgresql","apiVersion":"acid.zalan.do/v1","metadata":{"name":"teapot-testcluster1","creationTimestamp":null},"spec":{"postgresql":{"version":"","parameters":null},"volume":{"size":"","storageClass":""},"patroni":{"initdb":null,"pg_hba":null,"ttl":0,"loop_wait":0,"retry_timeout":0,"maximum_lag_on_failover":0,"slots":null} ,"resources":{"requests":{"cpu":"","memory":""},"limits":{"cpu":"","memory":""}},"teamId":"acid","allowedSourceRanges":null,"numberOfInstances":0,"users":null,"clone":{}},"status":{"PostgresClusterStatus":"Invalid"}}`),
354+
marshal: []byte(`{"kind":"Postgresql","apiVersion":"acid.zalan.do/v1","metadata":{"name":"teapot-testcluster1","creationTimestamp":null},"spec":{"postgresql":{"version":"","parameters":null},"volume":{"size":"","storageClass":""},"patroni":{"initdb":null,"pg_hba":null,"ttl":0,"loop_wait":0,"retry_timeout":0,"maximum_lag_on_failover":0,"slots":null} ,"resources":{"requests":{"cpu":"","memory":""},"limits":{"cpu":"","memory":""}},"teamId":"acid","allowedSourceRanges":null,"numberOfInstances":0,"users":null,"clone":null},"status":{"PostgresClusterStatus":"Invalid"}}`),
355355
err: nil},
356356
{
357357
about: "example with clone",
@@ -366,7 +366,7 @@ var unmarshalCluster = []struct {
366366
},
367367
Spec: PostgresSpec{
368368
TeamID: "acid",
369-
Clone: CloneDescription{
369+
Clone: &CloneDescription{
370370
ClusterName: "team-batman",
371371
},
372372
ClusterName: "testcluster1",
@@ -405,7 +405,7 @@ var unmarshalCluster = []struct {
405405
err: errors.New("unexpected end of JSON input")},
406406
{
407407
about: "expect error on JSON with field's value malformatted",
408-
in: []byte(`{"kind":"Postgresql","apiVersion":"acid.zalan.do/v1","metadata":{"name":"acid-testcluster","creationTimestamp":qaz},"spec":{"postgresql":{"version":"","parameters":null},"volume":{"size":"","storageClass":""},"patroni":{"initdb":null,"pg_hba":null,"ttl":0,"loop_wait":0,"retry_timeout":0,"maximum_lag_on_failover":0,"slots":null},"resources":{"requests":{"cpu":"","memory":""},"limits":{"cpu":"","memory":""}},"teamId":"acid","allowedSourceRanges":null,"numberOfInstances":0,"users":null,"clone":{}},"status":{"PostgresClusterStatus":"Invalid"}}`),
408+
in: []byte(`{"kind":"Postgresql","apiVersion":"acid.zalan.do/v1","metadata":{"name":"acid-testcluster","creationTimestamp":qaz},"spec":{"postgresql":{"version":"","parameters":null},"volume":{"size":"","storageClass":""},"patroni":{"initdb":null,"pg_hba":null,"ttl":0,"loop_wait":0,"retry_timeout":0,"maximum_lag_on_failover":0,"slots":null},"resources":{"requests":{"cpu":"","memory":""},"limits":{"cpu":"","memory":""}},"teamId":"acid","allowedSourceRanges":null,"numberOfInstances":0,"users":null,"clone":null},"status":{"PostgresClusterStatus":"Invalid"}}`),
409409
out: Postgresql{},
410410
marshal: []byte{},
411411
err: errors.New("invalid character 'q' looking for beginning of value"),

pkg/apis/acid.zalan.do/v1/zz_generated.deepcopy.go

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/cluster/k8sres.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,7 @@ func (c *Cluster) generateSpiloPodEnvVars(uid types.UID, spiloConfiguration stri
725725
envVars = append(envVars, v1.EnvVar{Name: "KUBERNETES_USE_CONFIGMAPS", Value: "true"})
726726
}
727727

728-
if cloneDescription.ClusterName != "" {
728+
if cloneDescription != nil && cloneDescription.ClusterName != "" {
729729
envVars = append(envVars, c.generateCloneEnvironment(cloneDescription)...)
730730
}
731731

@@ -1065,7 +1065,7 @@ func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.Statef
10651065
spiloEnvVars := c.generateSpiloPodEnvVars(
10661066
c.Postgresql.GetUID(),
10671067
spiloConfiguration,
1068-
&spec.Clone,
1068+
spec.Clone,
10691069
spec.StandbyCluster,
10701070
customPodEnvVarsList,
10711071
)

pkg/cluster/sync_test.go

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -63,44 +63,47 @@ func noEmptySync(cluster *Cluster, err error, reason SyncReason) error {
6363

6464
func TestConnectionPoolerSynchronization(t *testing.T) {
6565
testName := "Test connection pooler synchronization"
66-
var cluster = New(
67-
Config{
68-
OpConfig: config.Config{
69-
ProtectedRoles: []string{"admin"},
70-
Auth: config.Auth{
71-
SuperUsername: superUserName,
72-
ReplicationUsername: replicationUserName,
73-
},
74-
ConnectionPooler: config.ConnectionPooler{
75-
ConnectionPoolerDefaultCPURequest: "100m",
76-
ConnectionPoolerDefaultCPULimit: "100m",
77-
ConnectionPoolerDefaultMemoryRequest: "100Mi",
78-
ConnectionPoolerDefaultMemoryLimit: "100Mi",
79-
NumberOfInstances: int32ToPointer(1),
66+
newCluster := func() *Cluster {
67+
return New(
68+
Config{
69+
OpConfig: config.Config{
70+
ProtectedRoles: []string{"admin"},
71+
Auth: config.Auth{
72+
SuperUsername: superUserName,
73+
ReplicationUsername: replicationUserName,
74+
},
75+
ConnectionPooler: config.ConnectionPooler{
76+
ConnectionPoolerDefaultCPURequest: "100m",
77+
ConnectionPoolerDefaultCPULimit: "100m",
78+
ConnectionPoolerDefaultMemoryRequest: "100Mi",
79+
ConnectionPoolerDefaultMemoryLimit: "100Mi",
80+
NumberOfInstances: int32ToPointer(1),
81+
},
8082
},
81-
},
82-
}, k8sutil.KubernetesClient{}, acidv1.Postgresql{}, logger, eventRecorder)
83+
}, k8sutil.KubernetesClient{}, acidv1.Postgresql{}, logger, eventRecorder)
84+
}
85+
cluster := newCluster()
8386

8487
cluster.Statefulset = &appsv1.StatefulSet{
8588
ObjectMeta: metav1.ObjectMeta{
8689
Name: "test-sts",
8790
},
8891
}
8992

90-
clusterMissingObjects := *cluster
93+
clusterMissingObjects := newCluster()
9194
clusterMissingObjects.KubeClient = k8sutil.ClientMissingObjects()
9295

93-
clusterMock := *cluster
96+
clusterMock := newCluster()
9497
clusterMock.KubeClient = k8sutil.NewMockKubernetesClient()
9598

96-
clusterDirtyMock := *cluster
99+
clusterDirtyMock := newCluster()
97100
clusterDirtyMock.KubeClient = k8sutil.NewMockKubernetesClient()
98101
clusterDirtyMock.ConnectionPooler = &ConnectionPoolerObjects{
99102
Deployment: &appsv1.Deployment{},
100103
Service: &v1.Service{},
101104
}
102105

103-
clusterNewDefaultsMock := *cluster
106+
clusterNewDefaultsMock := newCluster()
104107
clusterNewDefaultsMock.KubeClient = k8sutil.NewMockKubernetesClient()
105108

106109
tests := []struct {
@@ -124,7 +127,7 @@ func TestConnectionPoolerSynchronization(t *testing.T) {
124127
ConnectionPooler: &acidv1.ConnectionPooler{},
125128
},
126129
},
127-
cluster: &clusterMissingObjects,
130+
cluster: clusterMissingObjects,
128131
defaultImage: "pooler:1.0",
129132
defaultInstances: 1,
130133
check: objectsAreSaved,
@@ -139,7 +142,7 @@ func TestConnectionPoolerSynchronization(t *testing.T) {
139142
EnableConnectionPooler: boolToPointer(true),
140143
},
141144
},
142-
cluster: &clusterMissingObjects,
145+
cluster: clusterMissingObjects,
143146
defaultImage: "pooler:1.0",
144147
defaultInstances: 1,
145148
check: objectsAreSaved,
@@ -154,7 +157,7 @@ func TestConnectionPoolerSynchronization(t *testing.T) {
154157
ConnectionPooler: &acidv1.ConnectionPooler{},
155158
},
156159
},
157-
cluster: &clusterMissingObjects,
160+
cluster: clusterMissingObjects,
158161
defaultImage: "pooler:1.0",
159162
defaultInstances: 1,
160163
check: objectsAreSaved,
@@ -169,7 +172,7 @@ func TestConnectionPoolerSynchronization(t *testing.T) {
169172
newSpec: &acidv1.Postgresql{
170173
Spec: acidv1.PostgresSpec{},
171174
},
172-
cluster: &clusterMock,
175+
cluster: clusterMock,
173176
defaultImage: "pooler:1.0",
174177
defaultInstances: 1,
175178
check: objectsAreDeleted,
@@ -182,7 +185,7 @@ func TestConnectionPoolerSynchronization(t *testing.T) {
182185
newSpec: &acidv1.Postgresql{
183186
Spec: acidv1.PostgresSpec{},
184187
},
185-
cluster: &clusterDirtyMock,
188+
cluster: clusterDirtyMock,
186189
defaultImage: "pooler:1.0",
187190
defaultInstances: 1,
188191
check: objectsAreDeleted,
@@ -203,7 +206,7 @@ func TestConnectionPoolerSynchronization(t *testing.T) {
203206
},
204207
},
205208
},
206-
cluster: &clusterMock,
209+
cluster: clusterMock,
207210
defaultImage: "pooler:1.0",
208211
defaultInstances: 1,
209212
check: deploymentUpdated,
@@ -220,7 +223,7 @@ func TestConnectionPoolerSynchronization(t *testing.T) {
220223
ConnectionPooler: &acidv1.ConnectionPooler{},
221224
},
222225
},
223-
cluster: &clusterNewDefaultsMock,
226+
cluster: clusterNewDefaultsMock,
224227
defaultImage: "pooler:2.0",
225228
defaultInstances: 2,
226229
check: deploymentUpdated,
@@ -239,7 +242,7 @@ func TestConnectionPoolerSynchronization(t *testing.T) {
239242
ConnectionPooler: &acidv1.ConnectionPooler{},
240243
},
241244
},
242-
cluster: &clusterMock,
245+
cluster: clusterMock,
243246
defaultImage: "pooler:1.0",
244247
defaultInstances: 1,
245248
check: noEmptySync,

0 commit comments

Comments
 (0)