@@ -19,7 +19,13 @@ class Node:
1919 DEFAULT_DISK_PATH = "/var/lib/longhorn/"
2020 DEFAULT_VOLUME_PATH = "/dev/longhorn/"
2121
22+ all_nodes = None
23+ control_plane_nodes = None
24+ worker_nodes = None
25+
2226 def __init__ (self ):
27+ if not Node .all_nodes :
28+ self .init_node_list ()
2329 self .retry_count , self .retry_interval = get_retry_count_and_interval ()
2430
2531 def mount_disk (self , disk_name , node_name ):
@@ -162,13 +168,21 @@ def list_node_names_by_role(self, role="all"):
162168 if role not in ["all" , "control-plane" , "worker" ]:
163169 raise ValueError ("Role must be one of 'all', 'master' or 'worker'" )
164170
171+ if role == "all" :
172+ return Node .all_nodes
173+ elif role == "control-plane" :
174+ return Node .control_plane_nodes
175+ elif role == "worker" :
176+ return Node .worker_nodes
177+
178+ def init_node_list (self ):
179+
165180 def filter_nodes (nodes , condition ):
166181 return [node .metadata .name for node in nodes if condition (node )]
167182
168183 core_api = client .CoreV1Api ()
169184 nodes = core_api .list_node ().items
170-
171- all_nodes = sorted (filter_nodes (nodes , lambda node : True ))
185+ Node .all_nodes = sorted (filter_nodes (nodes , lambda node : True ))
172186
173187 control_plane_labels = {
174188 "node-role.kubernetes.io/master" : ["true" ],
@@ -180,16 +194,14 @@ def filter_nodes(nodes, condition):
180194 label in node .metadata .labels and node .metadata .labels [label ] in values
181195 for label , values in control_plane_labels .items ()
182196 )
183- control_plane_nodes = sorted (filter_nodes (nodes , condition ))
197+ Node . control_plane_nodes = sorted (filter_nodes (nodes , condition ))
184198
185- worker_nodes = sorted ([node for node in all_nodes if node not in control_plane_nodes ])
199+ def has_no_schedule_taint (node ):
200+ if not node .spec .taints :
201+ return False
202+ return any (taint .effect == "NoSchedule" for taint in node .spec .taints )
186203
187- if role == "all" :
188- return all_nodes
189- elif role == "control-plane" :
190- return control_plane_nodes
191- elif role == "worker" :
192- return worker_nodes
204+ Node .worker_nodes = sorted ([node .metadata .name for node in nodes if not has_no_schedule_taint (node )])
193205
194206 def set_node (self , node_name : str , allowScheduling : bool , evictionRequested : bool ) -> object :
195207 for _ in range (self .retry_count ):
0 commit comments