11import json
2+ from typing import Dict , List
23
34from chaoslib .types import Configuration , Secrets
45from kubernetes import client
6+ from logzero import logger
57
68from chaosk8s import create_k8s_api_client
79
8- __all__ = ["get_nodes" ]
10+ __all__ = [
11+ "get_nodes" ,
12+ "all_nodes_must_be_ready_to_schedule" ,
13+ "get_all_node_status_conditions" ,
14+ ]
915
1016
1117def get_nodes (
@@ -26,3 +32,43 @@ def get_nodes(
2632 ret = v1 .list_node (_preload_content = False )
2733
2834 return json .loads (ret .read ().decode ("utf-8" ))
35+
36+
37+ def get_all_node_status_conditions (
38+ configuration : Configuration = None , secrets : Secrets = None
39+ ) -> List [Dict [str , str ]]:
40+ """
41+ Get all nodes conditions.
42+ """
43+ api = create_k8s_api_client (secrets )
44+
45+ v1 = client .CoreV1Api (api )
46+ nodes = v1 .list_node ()
47+
48+ result = []
49+
50+ for node in nodes .items :
51+ n = {"name" : node .metadata .name }
52+ for cond in node .status .conditions :
53+ n [cond .type ] = cond .status
54+ result .append (n )
55+
56+ logger .debug (f"Nodes statuses: { result } " )
57+
58+ return result
59+
60+
61+ def all_nodes_must_be_ready_to_schedule (
62+ configuration : Configuration = None , secrets : Secrets = None
63+ ) -> bool :
64+ """
65+ Verifies that all nodes in the cluster are in `Ready` condition and can
66+ be scheduled.
67+ """
68+ result = get_all_node_status_conditions (configuration , secrets )
69+
70+ for statuses in result :
71+ if statuses .get ("Ready" ) != "True" :
72+ return False
73+
74+ return True
0 commit comments