Fix to better handle concurrent runs of module against same pool
This commit is contained in:
parent
09e0e973d3
commit
4ca5e7b01d
1 changed files with 48 additions and 16 deletions
|
@ -200,6 +200,10 @@ def pool_exists(api, pool):
|
|||
return result
|
||||
|
||||
def create_pool(api, pool, lb_method):
|
||||
# create requires lb_method but we don't want to default
|
||||
# to a value on subsequent runs
|
||||
if not lb_method:
|
||||
lb_method = 'round_robin'
|
||||
lb_method = "LB_METHOD_%s" % lb_method.strip().upper()
|
||||
api.LocalLB.Pool.create_v2(pool_names=[pool], lb_methods=[lb_method],
|
||||
members=[[]])
|
||||
|
@ -390,18 +394,41 @@ def main():
|
|||
elif pool_exists(api, pool):
|
||||
# no host/port supplied, must be pool removal
|
||||
if not module.check_mode:
|
||||
# hack to handle concurrent runs of module
|
||||
# pool might be gone before we actually remove it
|
||||
try:
|
||||
remove_pool(api, pool)
|
||||
result = {'changed': True}
|
||||
except bigsuds.OperationFailed, e:
|
||||
if "was not found" in str(e):
|
||||
result = {'changed': False}
|
||||
else:
|
||||
# genuine exception
|
||||
raise
|
||||
else:
|
||||
# check-mode return value
|
||||
result = {'changed': True}
|
||||
|
||||
elif state == 'present':
|
||||
update = False
|
||||
if not pool_exists(api, pool):
|
||||
# pool does not exist -- need to create it
|
||||
if not module.check_mode:
|
||||
# create requires lb_method but we don't want to default
|
||||
# to a value on subsequent runs
|
||||
if not lb_method:
|
||||
lb_method = 'round_robin'
|
||||
# a bit of a hack to handle concurrent runs of this module.
|
||||
# even though we've checked the pool doesn't exist,
|
||||
# it may exist by the time we run create_pool().
|
||||
# this catches the exception and does something smart
|
||||
# about it!
|
||||
try:
|
||||
create_pool(api, pool, lb_method)
|
||||
result = {'changed': True}
|
||||
except bigsuds.OperationFailed, e:
|
||||
if "already exists" in str(e):
|
||||
update = True
|
||||
else:
|
||||
# genuine exception
|
||||
raise
|
||||
else:
|
||||
if monitors:
|
||||
set_monitors(api, pool, monitor_type, quorum, monitors)
|
||||
if slow_ramp_time:
|
||||
|
@ -410,9 +437,14 @@ def main():
|
|||
set_action_on_service_down(api, pool, service_down_action)
|
||||
if host and port:
|
||||
add_pool_member(api, pool, address, port)
|
||||
else:
|
||||
# check-mode return value
|
||||
result = {'changed': True}
|
||||
else:
|
||||
# pool exists -- potentially modify attributes
|
||||
update = True
|
||||
|
||||
if update:
|
||||
if lb_method and lb_method != get_lb_method(api, pool):
|
||||
if not module.check_mode:
|
||||
set_lb_method(api, pool, lb_method)
|
||||
|
|
Loading…
Reference in a new issue