From 041b9eec5262c845711d28ce83b2493ddfe1d6d7 Mon Sep 17 00:00:00 2001 From: Rafia Sabih Date: Tue, 3 Nov 2020 15:36:52 +0100 Subject: [PATCH] Enhance e2e test and other fixes --- e2e/tests/test_e2e.py | 36 ++++++++++++++++++++++++++++++-- pkg/cluster/cluster.go | 2 +- pkg/cluster/connection_pooler.go | 14 +++++++++---- pkg/cluster/database.go | 6 ++++-- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/e2e/tests/test_e2e.py b/e2e/tests/test_e2e.py index 62a3dda9e..926888e9f 100644 --- a/e2e/tests/test_e2e.py +++ b/e2e/tests/test_e2e.py @@ -189,6 +189,39 @@ class EndToEndTestCase(unittest.TestCase): self.eventuallyEqual(lambda: k8s.count_running_pods("connection-pooler-name=acid-minimal-cluster-pooler-repl"), 2, "No pooler replica pods found") self.eventuallyEqual(lambda: k8s.count_services_with_label('application=db-connection-pooler,cluster-name=acid-minimal-cluster'), 2, "No pooler service found") + #Turn off only master connection pooler + k8s.api.custom_objects_api.patch_namespaced_custom_object( + 'acid.zalan.do', 'v1', 'default', + 'postgresqls', 'acid-minimal-cluster', + { + 'spec': { + 'enableConnectionPooler': False, + 'enableReplicaConnectionPooler': True, + } + }) + + self.eventuallyEqual(lambda: k8s.get_deployment_replica_count(), 2, "Deployment replicas is 2 default") + self.eventuallyEqual(lambda: k8s.count_running_pods("connection-pooler-name=acid-minimal-cluster-pooler"), 0, "Master pooler pods not deleted") + self.eventuallyEqual(lambda: k8s.count_running_pods("connection-pooler-name=acid-minimal-cluster-pooler-repl"), 2, "Pooler replica pods not found") + self.eventuallyEqual(lambda: k8s.count_services_with_label('application=db-connection-pooler,cluster-name=acid-minimal-cluster'), 1, "No pooler service found") + + #Turn off only replica connection pooler + k8s.api.custom_objects_api.patch_namespaced_custom_object( + 'acid.zalan.do', 'v1', 'default', + 'postgresqls', 'acid-minimal-cluster', + { + 'spec': { + 'enableConnectionPooler': True, + 'enableReplicaConnectionPooler': False, + } + }) + + self.eventuallyEqual(lambda: k8s.get_deployment_replica_count(), 2, "Deployment replicas is 2 default") + self.eventuallyEqual(lambda: k8s.count_running_pods("connection-pooler-name=acid-minimal-cluster-pooler"), 2, "Master pooler pods not found") + self.eventuallyEqual(lambda: k8s.count_running_pods("connection-pooler-name=acid-minimal-cluster-pooler-repl"), 0, "Pooler replica pods not deleted") + self.eventuallyEqual(lambda: k8s.count_services_with_label('application=db-connection-pooler,cluster-name=acid-minimal-cluster'), 1, "No pooler service found") + + # scale up connection pooler deployment k8s.api.custom_objects_api.patch_namespaced_custom_object( 'acid.zalan.do', 'v1', 'default', @@ -203,7 +236,6 @@ class EndToEndTestCase(unittest.TestCase): self.eventuallyEqual(lambda: k8s.get_deployment_replica_count(), 3, "Deployment replicas is scaled to 3") self.eventuallyEqual(lambda: k8s.count_running_pods("connection-pooler-name=acid-minimal-cluster-pooler"), 3, "Scale up of pooler pods does not work") - self.eventuallyEqual(lambda: k8s.count_running_pods("connection-pooler-name=acid-minimal-cluster-pooler-repl"), 3, "Scale up of pooler replica pods does not work") # turn it off, keeping config should be overwritten by false k8s.api.custom_objects_api.patch_namespaced_custom_object( @@ -423,7 +455,7 @@ class EndToEndTestCase(unittest.TestCase): } k8s.update_config(patch_lazy_spilo_upgrade, step="Init baseline image version") - self.eventuallyEqual(lambda: k8s.get_statefulset_image(), SPILO_CURRENT, "Stagefulset not updated initially") + self.eventuallyEqual(lambda: k8s.get_statefulset_image(), SPILO_CURRENT, "Statefulset not updated initially") self.eventuallyEqual(lambda: k8s.count_running_pods(), 2, "No 2 pods running") self.eventuallyEqual(lambda: len(k8s.get_patroni_running_members(pod0)), 2, "Postgres status did not enter running") diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index a5e7d5d28..6719a3cdf 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -331,7 +331,7 @@ func (c *Cluster) Create() error { // // Do not consider connection pooler as a strict requirement, and if // something fails, report warning - c.createConnectionPooler(c.installLookupFunction) + c.createConnectionPooler() return nil } diff --git a/pkg/cluster/connection_pooler.go b/pkg/cluster/connection_pooler.go index 8fedf48ed..627479038 100644 --- a/pkg/cluster/connection_pooler.go +++ b/pkg/cluster/connection_pooler.go @@ -108,12 +108,12 @@ func (c *Cluster) connectionPoolerLabelsSelector(name string, role PostgresRole) // have connectionpooler name in the cp object to have it immutable name // add these cp related functions to a new cp file // opConfig, cluster, and database name -func (c *Cluster) createConnectionPooler(lookup InstallFunction) (SyncReason, error) { +func (c *Cluster) createConnectionPooler() (SyncReason, error) { var reason SyncReason c.setProcessName("creating connection pooler") //this is essentially sync with nil as oldSpec - if reason, err := c.syncConnectionPooler(nil, &c.Postgresql, lookup); err != nil { + if reason, err := c.syncConnectionPooler(nil, &c.Postgresql, c.installLookupFunction); err != nil { return reason, err } return reason, nil @@ -692,6 +692,13 @@ func (c *Cluster) syncConnectionPooler(oldSpec, newSpec *acidv1.Postgresql, inst } } if newNeedConnectionPooler { + //Sync pooler secrets in case they were deleted + c.logger.Debugf("syncing secrets") + + if err := c.syncSecrets(); err != nil { + c.logger.Errorf("could not sync secrets: %v", err) + } + // Try to sync in any case. If we didn't needed connection pooler before, // it means we want to create it. If it was already present, still sync // since it could happen that there is no difference in specs, and all @@ -723,6 +730,7 @@ func (c *Cluster) syncConnectionPooler(oldSpec, newSpec *acidv1.Postgresql, inst return NoSync, err } } + if reason, err = c.syncConnectionPoolerWorker(oldSpec, newSpec, role); err != nil { c.logger.Errorf("could not sync connection pooler: %v", err) return reason, err @@ -820,8 +828,6 @@ func (c *Cluster) syncConnectionPoolerWorker(oldSpec, newSpec *acidv1.Postgresql return reason, fmt.Errorf(msg, err) } - //oldDeploymentSpec := c.ConnectionPooler[role].Deployment - deployment, err := updateConnectionPoolerDeployment(c.KubeClient, newDeploymentSpec) diff --git a/pkg/cluster/database.go b/pkg/cluster/database.go index 111088fa0..760b68d72 100644 --- a/pkg/cluster/database.go +++ b/pkg/cluster/database.go @@ -567,10 +567,12 @@ func (c *Cluster) installLookupFunction(poolerSchema, poolerUser string, role Po failedDatabases = append(failedDatabases, dbname) continue } - c.logger.Infof("pooler lookup function installed into %s", dbname) } - c.ConnectionPooler[role].LookupFunction = true + if len(failedDatabases) == 0 { + c.ConnectionPooler[role].LookupFunction = true + } + return nil }