add skeleton for e2e test

This commit is contained in:
Sergey Dudoladov 2020-04-09 10:40:11 +02:00
parent 3e639676c4
commit e9db2f07e1
1 changed files with 69 additions and 3 deletions

View File

@ -268,6 +268,66 @@ class EndToEndTestCase(unittest.TestCase):
self.assertEqual(0, len(jobs),
"Expected 0 logical backup jobs, found {}".format(len(jobs)))
@timeout_decorator.timeout(TEST_TIMEOUT_SEC)
def test_safe_pod_recreation(self):
'''
Operator skips pods re-creation if there is at least one pod for which patroni reports "creating replica" state
'''
k8s = self.k8s
nodes = self.get_pg_nodes()
# get test data for re-init
master = nodes[0]
cmd = 'pgbench -i -s 30 -n'
k8s.exec_into_pod(master, cmd)
# start reinit
replica = nodes[1][0]
cmd = 'patronictl reinit $SCOPE ' + replica
k8s.exec_into_pod(master, cmd)
# force rolling upgrade
patch = {
"spec": {
"resources": {
"requests": {
"cpu": "100m",
"memory": "50Mi"
},
"limits": {
"cpu": "200m",
"memory": "200Mi"
}
}
}
}
k8s.api.custom_objects_api.patch_namespaced_custom_object(
"acid.zalan.do", "v1", "default", "postgresqls", "acid-minimal-cluster", patch)
replica_state = ""
while replica_state != "running":
replica_state = k8s.get_patroni_state(self, replica)
time.sleep(k8s.RETRY_TIMEOUT_SEC)
# next Sync does the update
k8s.delete_operator_pod()
k8s.wait_for_pod_start('spilo-role=replica')
cluster_label = 'application=spilo,cluster-name=acid-minimal-cluster'
labels = 'spilo-role=master,' + cluster_label
pods = k8s.api.core_v1.list_namespaced_pod(
'default', label_selector=labels).items
self.assert_master_is_unique()
masterPod = pods[0]
self.assertEqual(masterPod.spec.containers[0].resources.requests['cpu'], "100m",
"Expected CPU requests {}, found {}"
.format("100cpu", masterPod.spec.containers[0].resources.requests['cpu']))
@timeout_decorator.timeout(TEST_TIMEOUT_SEC)
def test_min_resource_limits(self):
'''
@ -709,20 +769,26 @@ class K8s:
def wait_for_logical_backup_job_creation(self):
self.wait_for_logical_backup_job(expected_num_of_jobs=1)
def update_config(self, config_map_patch):
self.api.core_v1.patch_namespaced_config_map("postgres-operator", "default", config_map_patch)
def delete_operator_pod(self):
operator_pod = self.api.core_v1.list_namespaced_pod(
'default', label_selector="name=postgres-operator").items[0].metadata.name
self.api.core_v1.delete_namespaced_pod(operator_pod, "default") # restart reloads the conf
self.wait_for_operator_pod_start()
def update_config(self, config_map_patch):
self.api.core_v1.patch_namespaced_config_map("postgres-operator", "default", config_map_patch)
self.delete_operator_pod()
def create_with_kubectl(self, path):
return subprocess.run(
["kubectl", "create", "-f", path],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
def get_patroni_state(self, pod):
return pod.metadata.annotations["status"]["state"]
if __name__ == '__main__':
unittest.main()