88 'play_hosts' : {'required' : True , 'type' : 'list' },
99 'console_sock' : {'required' : True , 'type' : 'str' },
1010 'app_name' : {'required' : True , 'type' : 'str' },
11+ 'leader_only' : {'required' : False , 'type' : 'bool' , 'default' : False },
1112}
1213
1314GET_TWOPHASE_COMMIT_VERSION_TIMEOUT = 60
@@ -94,14 +95,26 @@ def candidate_is_ok(uri, names_by_uris, module_hostvars, cluster_disabled_instan
9495 return helpers .is_enabled (instance_vars )
9596
9697
97- def get_control_instance_name (module_hostvars , cluster_disabled_instances , play_hosts , control_console ):
98+ def get_control_instance_name (
99+ module_hostvars ,
100+ cluster_disabled_instances ,
101+ play_hosts ,
102+ control_console ,
103+ leader_only = False ,
104+ ):
98105 members , err = get_membership_members (control_console )
106+ if err is not None :
107+ return None , err
108+ leaders , err = helpers .get_active_leaders (control_console )
99109 if err is not None :
100110 return None , err
101111
112+ leaders_uuid = set (leaders .values ())
113+
102114 alien_members_uris = []
103115 members_without_uuid = []
104116 members_by_uuid = {}
117+ leaders_uris = []
105118
106119 for uri , member in sorted (members .items ()):
107120 if not member :
@@ -130,6 +143,8 @@ def get_control_instance_name(module_hostvars, cluster_disabled_instances, play_
130143 continue
131144
132145 members_by_uuid [member_uuid ] = member
146+ if member_uuid in leaders_uuid :
147+ leaders_uris .append (uri )
133148
134149 if alien_members_uris :
135150 helpers .warn ('Incorrect members with the following URIs ignored: %s' % ', ' .join (alien_members_uris ))
@@ -206,9 +221,17 @@ def get_control_instance_name(module_hostvars, cluster_disabled_instances, play_
206221 if err is not None :
207222 return None , "Failed to check instances two-phase commit version: %s" % err
208223
209- idx = twophase_commit_versions .index (min (twophase_commit_versions ))
210- control_instance_uri = candidates_uris [idx ]
224+ min_version = min (twophase_commit_versions )
225+ min_version_candidates = filter (lambda c : twophase_commit_versions [c [0 ]] == min_version , enumerate (candidates_uris ))
226+ candidates_uris = list (map (lambda c : c [1 ], min_version_candidates ))
227+
228+ if leader_only :
229+ leader_candidates_uris = list (filter (lambda uri : uri in leaders_uris , candidates_uris ))
230+ if len (leader_candidates_uris ) == 0 :
231+ return None , "Not found any leader instance between the candidates: %s" % ', ' .join (candidates_uris )
232+ candidates_uris = leader_candidates_uris
211233
234+ control_instance_uri = candidates_uris [0 ]
212235 control_instance_name = names_by_uris [control_instance_uri ]
213236
214237 return control_instance_name , None
@@ -220,11 +243,12 @@ def get_control_instance(params):
220243 play_hosts = params ['play_hosts' ]
221244 console_sock = params ['console_sock' ]
222245 app_name = params ['app_name' ]
246+ leader_only = params .get ('leader_only' , False )
223247
224248 control_console = helpers .get_control_console (console_sock )
225249
226250 control_instance_name , err = get_control_instance_name (
227- module_hostvars , cluster_disabled_instances , play_hosts , control_console
251+ module_hostvars , cluster_disabled_instances , play_hosts , control_console , leader_only
228252 )
229253 if err is not None :
230254 return helpers .ModuleRes (failed = True , msg = err )
0 commit comments