diff --git a/e2e/Makefile b/e2e/Makefile index b904ad76369f33f6766745d4d36918c2393939b2..6e46d7238b0ab4139bb32e99948a775ee1c775c7 100644 --- a/e2e/Makefile +++ b/e2e/Makefile @@ -47,7 +47,7 @@ tools: # install pinned version of 'kind' # go get must run outside of a dir with a (module-based) Go project ! # otherwise go get updates project's dependencies and/or behaves differently - cd "/tmp" && GO111MODULE=on go get sigs.k8s.io/kind@v0.9.0 + cd "/tmp" && GO111MODULE=on go get sigs.k8s.io/kind@v0.11.1 e2etest: tools copy clean ./run.sh main diff --git a/e2e/tests/test_e2e.py b/e2e/tests/test_e2e.py index 6a4bf78ca4a5216fc400ea40d497ec5429117353..e4c215eff1ceb9de4211b0fdb5264ade530d649e 100644 --- a/e2e/tests/test_e2e.py +++ b/e2e/tests/test_e2e.py @@ -161,6 +161,7 @@ class EndToEndTestCase(unittest.TestCase): ''' Extend postgres container capabilities ''' + k8s = self.k8s cluster_label = 'application=spilo,cluster-name=acid-minimal-cluster' capabilities = ["SYS_NICE","CHOWN"] patch_capabilities = { @@ -170,18 +171,18 @@ class EndToEndTestCase(unittest.TestCase): } # get node and replica (expected target of new master) - _, replica_nodes = self.k8s.get_pg_nodes(cluster_label) + _, replica_nodes = k8s.get_pg_nodes(cluster_label) try: - self.k8s.update_config(patch_capabilities) - self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"}, + k8s.update_config(patch_capabilities) + self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") # changed security context of postrges container should trigger a rolling update - self.k8s.wait_for_pod_failover(replica_nodes, 'spilo-role=master,' + cluster_label) - self.k8s.wait_for_pod_start('spilo-role=replica,' + cluster_label) + k8s.wait_for_pod_failover(replica_nodes, 'spilo-role=master,' + cluster_label) + k8s.wait_for_pod_start('spilo-role=replica,' + cluster_label) - self.eventuallyEqual(lambda: self.k8s.count_pods_with_container_capabilities(capabilities, cluster_label), + self.eventuallyEqual(lambda: k8s.count_pods_with_container_capabilities(capabilities, cluster_label), 2, "Container capabilities not updated") except timeout_decorator.TimeoutError: @@ -193,6 +194,8 @@ class EndToEndTestCase(unittest.TestCase): ''' Test PostgresTeam CRD with extra teams and members ''' + k8s = self.k8s + # enable PostgresTeam CRD and lower resync enable_postgres_team_crd = { "data": { @@ -202,11 +205,11 @@ class EndToEndTestCase(unittest.TestCase): "resync_period": "15s" }, } - self.k8s.update_config(enable_postgres_team_crd) - self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"}, + k8s.update_config(enable_postgres_team_crd) + self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") - self.k8s.api.custom_objects_api.patch_namespaced_custom_object( + k8s.api.custom_objects_api.patch_namespaced_custom_object( 'acid.zalan.do', 'v1', 'default', 'postgresteams', 'custom-team-membership', { @@ -224,7 +227,7 @@ class EndToEndTestCase(unittest.TestCase): } }) - leader = self.k8s.get_cluster_leader_pod() + leader = k8s.get_cluster_leader_pod() user_query = """ SELECT rolname FROM pg_catalog.pg_roles @@ -234,7 +237,7 @@ class EndToEndTestCase(unittest.TestCase): "Not all additional users found in database", 10, 5) # replace additional member and check if the removed member's role is renamed - self.k8s.api.custom_objects_api.patch_namespaced_custom_object( + k8s.api.custom_objects_api.patch_namespaced_custom_object( 'acid.zalan.do', 'v1', 'default', 'postgresteams', 'custom-team-membership', { @@ -257,7 +260,7 @@ class EndToEndTestCase(unittest.TestCase): "Database role of replaced member in PostgresTeam not renamed", 10, 5) # re-add additional member and check if the role is renamed back - self.k8s.api.custom_objects_api.patch_namespaced_custom_object( + k8s.api.custom_objects_api.patch_namespaced_custom_object( 'acid.zalan.do', 'v1', 'default', 'postgresteams', 'custom-team-membership', { @@ -285,8 +288,8 @@ class EndToEndTestCase(unittest.TestCase): "resync_period": "30m", }, } - self.k8s.update_config(revert_resync) - self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"}, + k8s.update_config(revert_resync) + self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") @timeout_decorator.timeout(TEST_TIMEOUT_SEC) @@ -302,13 +305,13 @@ class EndToEndTestCase(unittest.TestCase): "enable_cross_namespace_secret": "true" } } - self.k8s.update_config(patch_cross_namespace_secret, + k8s.update_config(patch_cross_namespace_secret, step="cross namespace secrets enabled") self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") # create secret in test namespace - self.k8s.api.custom_objects_api.patch_namespaced_custom_object( + k8s.api.custom_objects_api.patch_namespaced_custom_object( 'acid.zalan.do', 'v1', 'default', 'postgresqls', 'acid-minimal-cluster', { @@ -321,7 +324,7 @@ class EndToEndTestCase(unittest.TestCase): self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") - self.eventuallyEqual(lambda: self.k8s.count_secrets_with_label("cluster-name=acid-minimal-cluster,application=spilo", self.test_namespace), + self.eventuallyEqual(lambda: k8s.count_secrets_with_label("cluster-name=acid-minimal-cluster,application=spilo", self.test_namespace), 1, "Secret not created for user in namespace") @timeout_decorator.timeout(TEST_TIMEOUT_SEC) @@ -928,7 +931,7 @@ class EndToEndTestCase(unittest.TestCase): plural="postgresqls", name="acid-minimal-cluster", body=patch_node_affinity_config) - self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") + self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") # node affinity change should cause replica to relocate from replica node to master node due to node affinity requirement k8s.wait_for_pod_failover(master_node, 'spilo-role=replica,' + cluster_label) @@ -960,7 +963,7 @@ class EndToEndTestCase(unittest.TestCase): plural="postgresqls", name="acid-minimal-cluster", body=patch_node_remove_affinity_config) - self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") + self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") self.eventuallyEqual(lambda: k8s.count_running_pods(), 2, "No 2 pods running") self.eventuallyEqual(lambda: len(k8s.get_patroni_running_members("acid-minimal-cluster-0")), 2, "Postgres status did not enter running") @@ -1024,12 +1027,13 @@ class EndToEndTestCase(unittest.TestCase): @timeout_decorator.timeout(TEST_TIMEOUT_SEC) def test_overwrite_pooler_deployment(self): - self.k8s.create_with_kubectl("manifests/minimal-fake-pooler-deployment.yaml") - self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") - self.eventuallyEqual(lambda: self.k8s.get_deployment_replica_count(name="acid-minimal-cluster-pooler"), 1, + k8s = self.k8s + k8s.create_with_kubectl("manifests/minimal-fake-pooler-deployment.yaml") + self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") + self.eventuallyEqual(lambda: k8s.get_deployment_replica_count(name="acid-minimal-cluster-pooler"), 1, "Initial broken deployment not rolled out") - self.k8s.api.custom_objects_api.patch_namespaced_custom_object( + k8s.api.custom_objects_api.patch_namespaced_custom_object( 'acid.zalan.do', 'v1', 'default', 'postgresqls', 'acid-minimal-cluster', { @@ -1038,11 +1042,11 @@ class EndToEndTestCase(unittest.TestCase): } }) - self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") - self.eventuallyEqual(lambda: self.k8s.get_deployment_replica_count(name="acid-minimal-cluster-pooler"), 2, + self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") + self.eventuallyEqual(lambda: k8s.get_deployment_replica_count(name="acid-minimal-cluster-pooler"), 2, "Operator did not succeed in overwriting labels") - self.k8s.api.custom_objects_api.patch_namespaced_custom_object( + k8s.api.custom_objects_api.patch_namespaced_custom_object( 'acid.zalan.do', 'v1', 'default', 'postgresqls', 'acid-minimal-cluster', { @@ -1051,8 +1055,8 @@ class EndToEndTestCase(unittest.TestCase): } }) - self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") - self.eventuallyEqual(lambda: self.k8s.count_running_pods("connection-pooler=acid-minimal-cluster-pooler"), + self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") + self.eventuallyEqual(lambda: k8s.count_running_pods("connection-pooler=acid-minimal-cluster-pooler"), 0, "Pooler pods not scaled down") @timeout_decorator.timeout(TEST_TIMEOUT_SEC) @@ -1094,7 +1098,7 @@ class EndToEndTestCase(unittest.TestCase): k8s.api.custom_objects_api.patch_namespaced_custom_object( "acid.zalan.do", "v1", "default", "postgresqls", "acid-minimal-cluster", pg_patch_config) - self.eventuallyEqual(lambda: self.k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") + self.eventuallyEqual(lambda: k8s.get_operator_state(), {"0": "idle"}, "Operator does not get in sync") def compare_config(): effective_config = k8s.patroni_rest(masterPod.metadata.name, "config")