Add wait_timeout option to route53 module
This option is used to make sure the module does not block forever.
This commit is contained in:
parent
e91bcba078
commit
267dcc8eb6
1 changed files with 26 additions and 6 deletions
|
@ -156,6 +156,13 @@ options:
|
||||||
required: false
|
required: false
|
||||||
default: no
|
default: no
|
||||||
version_added: "2.0"
|
version_added: "2.0"
|
||||||
|
wait_timeout:
|
||||||
|
description:
|
||||||
|
- How long to wait for the changes to be replicated, in seconds.
|
||||||
|
required: false
|
||||||
|
default: 300
|
||||||
|
version_added: "2.0"
|
||||||
|
author: "Bruce Pennypacker (@bpennypacker)"
|
||||||
author:
|
author:
|
||||||
- "Bruce Pennypacker (@bpennypacker)"
|
- "Bruce Pennypacker (@bpennypacker)"
|
||||||
- "Mike Buzzetti <mike.buzzetti@gmail.com>"
|
- "Mike Buzzetti <mike.buzzetti@gmail.com>"
|
||||||
|
@ -272,6 +279,7 @@ EXAMPLES = '''
|
||||||
|
|
||||||
WAIT_RETRY_SLEEP = 5 # how many seconds to wait between propagation status polls
|
WAIT_RETRY_SLEEP = 5 # how many seconds to wait between propagation status polls
|
||||||
|
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -284,6 +292,11 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
HAS_BOTO = False
|
HAS_BOTO = False
|
||||||
|
|
||||||
|
|
||||||
|
class TimeoutError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def get_zone_by_name(conn, module, zone_name, want_private, zone_id, want_vpc_id):
|
def get_zone_by_name(conn, module, zone_name, want_private, zone_id, want_vpc_id):
|
||||||
"""Finds a zone by name or zone_id"""
|
"""Finds a zone by name or zone_id"""
|
||||||
for zone in conn.get_zones():
|
for zone in conn.get_zones():
|
||||||
|
@ -307,7 +320,7 @@ def get_zone_by_name(conn, module, zone_name, want_private, zone_id, want_vpc_id
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def commit(changes, retry_interval, wait):
|
def commit(changes, retry_interval, wait, wait_timeout):
|
||||||
"""Commit changes, but retry PriorRequestNotComplete errors."""
|
"""Commit changes, but retry PriorRequestNotComplete errors."""
|
||||||
result = None
|
result = None
|
||||||
retry = 10
|
retry = 10
|
||||||
|
@ -324,12 +337,15 @@ def commit(changes, retry_interval, wait):
|
||||||
time.sleep(float(retry_interval))
|
time.sleep(float(retry_interval))
|
||||||
|
|
||||||
if wait:
|
if wait:
|
||||||
|
timeout_time = time.time() + wait_timeout
|
||||||
connection = changes.connection
|
connection = changes.connection
|
||||||
change = result['ChangeResourceRecordSetsResponse']['ChangeInfo']
|
change = result['ChangeResourceRecordSetsResponse']['ChangeInfo']
|
||||||
status = Status(connection, change)
|
status = Status(connection, change)
|
||||||
while status.status != 'INSYNC':
|
while status.status != 'INSYNC' and time.time() < timeout_time:
|
||||||
time.sleep(WAIT_RETRY_SLEEP)
|
time.sleep(WAIT_RETRY_SLEEP)
|
||||||
status.update()
|
status.update()
|
||||||
|
if time.time() >= timeout_time:
|
||||||
|
raise TimeoutError()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
@ -354,7 +370,8 @@ def main():
|
||||||
health_check = dict(required=False),
|
health_check = dict(required=False),
|
||||||
failover = dict(required=False),
|
failover = dict(required=False),
|
||||||
vpc_id = dict(required=False),
|
vpc_id = dict(required=False),
|
||||||
wait = dict(required=False, type='bool'),
|
wait = dict(required=False, type='bool', default=False),
|
||||||
|
wait_timeout = dict(required=False, type='int', default=300),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
module = AnsibleModule(argument_spec=argument_spec)
|
module = AnsibleModule(argument_spec=argument_spec)
|
||||||
|
@ -381,6 +398,7 @@ def main():
|
||||||
failover_in = module.params.get('failover')
|
failover_in = module.params.get('failover')
|
||||||
vpc_id_in = module.params.get('vpc_id')
|
vpc_id_in = module.params.get('vpc_id')
|
||||||
wait_in = module.params.get('wait')
|
wait_in = module.params.get('wait')
|
||||||
|
wait_timeout_in = module.params.get('wait_timeout')
|
||||||
|
|
||||||
region, ec2_url, aws_connect_kwargs = get_aws_connection_info(module)
|
region, ec2_url, aws_connect_kwargs = get_aws_connection_info(module)
|
||||||
|
|
||||||
|
@ -515,11 +533,13 @@ def main():
|
||||||
changes.add_change_record(command, wanted_rset)
|
changes.add_change_record(command, wanted_rset)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = commit(changes, retry_interval_in, wait_in)
|
result = commit(changes, retry_interval_in, wait_in, wait_timeout_in)
|
||||||
except boto.route53.exception.DNSServerError, e:
|
except boto.route53.exception.DNSServerError, e:
|
||||||
txt = e.body.split("<Message>")[1]
|
txt = e.body.split("<Message>")[1]
|
||||||
txt = txt.split("</Message>")[0]
|
txt = txt.split("</Message>")[0]
|
||||||
module.fail_json(msg = txt)
|
module.fail_json(msg = txt)
|
||||||
|
except TimeoutError:
|
||||||
|
module.fail_json(msg='Timeout waiting for changes to replicate')
|
||||||
|
|
||||||
module.exit_json(changed=True)
|
module.exit_json(changed=True)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue