add test for taint-based eviction
This commit is contained in:
parent
becb05e3b8
commit
a00f0476ea
|
|
@ -90,6 +90,46 @@ class SmokeTestCase(unittest.TestCase):
|
|||
Utils.wait_for_pg_to_scale(k8s, 2, self.RETRY_TIMEOUT_SEC)
|
||||
self.assertEqual(2, Utils.count_pods_with_label(k8s, labels))
|
||||
|
||||
@timeout_decorator.timeout(TEST_TIMEOUT_SEC)
|
||||
def test_taint_based_eviction(self):
|
||||
"""
|
||||
Add taint "postgres=:NoExecute" to node with master.
|
||||
"""
|
||||
k8s = K8sApi()
|
||||
labels = 'version=acid-minimal-cluster'
|
||||
master_pod_node = ''
|
||||
new_master_pod_node = ''
|
||||
|
||||
body = {
|
||||
"spec": {
|
||||
"taints": [
|
||||
{
|
||||
"effect": "NoExecute",
|
||||
"key": "postgres"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
podsList = k8s.core_v1.list_namespaced_pod("default", label_selector=labels)
|
||||
for pod in podsList.items:
|
||||
if ('spilo-role', 'master') in pod.metadata.labels.items():
|
||||
master_pod_node = pod.spec.node_name
|
||||
elif ('spilo-role', 'replica') in pod.metadata.labels.items():
|
||||
new_master_pod_node = pod.spec.node_name
|
||||
|
||||
k8s.core_v1.patch_node(master_pod_node, body)
|
||||
Utils.wait_for_master_failover(k8s, new_master_pod_node, self.RETRY_TIMEOUT_SEC)
|
||||
|
||||
self.assertTrue(master_pod_node != new_master_pod_node, "Master on {} did not fail over to {}".format(master_pod_node, new_master_pod_node))
|
||||
|
||||
# undo the tainting
|
||||
body = {
|
||||
"spec": {
|
||||
"taints": []
|
||||
}
|
||||
}
|
||||
k8s.core_v1.patch_node(new_master_pod_node, body)
|
||||
|
||||
|
||||
class K8sApi:
|
||||
|
||||
|
|
@ -135,6 +175,17 @@ class Utils:
|
|||
def count_pods_with_label(k8s_api, labels):
|
||||
return len(k8s_api.core_v1.list_namespaced_pod('default', label_selector=labels).items)
|
||||
|
||||
@staticmethod
|
||||
def wait_for_master_failover(k8s_api, expected_master_pod_node, retry_timeout_sec):
|
||||
pod_phase = 'Failing over'
|
||||
new_master_pod_node = ''
|
||||
while (pod_phase != 'Running') & (new_master_pod_node != expected_master_pod_node):
|
||||
pods = k8s_api.core_v1.list_namespaced_pod('default', label_selector='spilo-role=master,version=acid-minimal-cluster').items
|
||||
if pods:
|
||||
new_master_pod_node = pods[0].spec.node_name
|
||||
pod_phase = pods[0].status.phase
|
||||
time.sleep(retry_timeout_sec)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
|
|||
Loading…
Reference in New Issue