From 5ba34572d9067f69ae4769b1a80be1127d9bd4b3 Mon Sep 17 00:00:00 2001 From: Jeroen Hoekx Date: Fri, 24 Aug 2012 19:08:45 +0200 Subject: [PATCH 1/3] Add a state parameter to the wait_for module. This takes started, stopped and restarted. Started returns when connecting is possible. Stopped when connecting is not possible. Restarted first waits for connecting to be impossible and returns when it is possible again. --- library/wait_for | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/library/wait_for b/library/wait_for index 201063d6a0..0c6045e0a4 100644 --- a/library/wait_for +++ b/library/wait_for @@ -30,6 +30,7 @@ def main(): name=dict(required=True), timeout=dict(default=300), port=dict(default=22), + state=dict(default='started', choices=['started', 'stopped', 'restarted']), ), ) @@ -38,21 +39,40 @@ def main(): host = params['name'] timeout = int(params['timeout']) port = int(params['port']) + state = params['state'] - end = datetime.datetime.now() + datetime.timedelta(seconds=timeout) + if state in [ 'stopped', 'restarted']: + ### first wait for the host to go down + end = datetime.datetime.now() + datetime.timedelta(seconds=timeout) - while datetime.datetime.now() < end: - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - try: - s.connect( (host, port) ) - s.close() - break - except: - time.sleep(1) - else: - module.fail_json(msg="Timeout when waiting for %s"%(host)) + while datetime.datetime.now() < end: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(5) + try: + s.connect( (host, port) ) + s.close() + time.sleep(1) + except: + break + else: + module.fail_json(msg="Timeout when waiting for %s to stop."%(host)) - module.exit_json(msg="%s responds on %s"%(host, port)) + if state in [ 'started', 'restarted' ]: + ### wait for the host to come up + end = datetime.datetime.now() + datetime.timedelta(seconds=timeout) + + while datetime.datetime.now() < end: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.connect( (host, port) ) + s.close() + break + except: + time.sleep(1) + else: + module.fail_json(msg="Timeout when waiting for %s"%(host)) + + module.exit_json(msg="State of %s on %s is %s."%(host, port, state)) # this is magic, see lib/ansible/module_common.py #<> From 18d5c875d012bf9a9b2a8d5d007846156b796b12 Mon Sep 17 00:00:00 2001 From: Jeroen Hoekx Date: Fri, 24 Aug 2012 20:47:55 +0200 Subject: [PATCH 2/3] Change wait_for return message to be machine readable. --- library/wait_for | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/wait_for b/library/wait_for index 0c6045e0a4..8a20bb3c49 100644 --- a/library/wait_for +++ b/library/wait_for @@ -72,7 +72,7 @@ def main(): else: module.fail_json(msg="Timeout when waiting for %s"%(host)) - module.exit_json(msg="State of %s on %s is %s."%(host, port, state)) + module.exit_json(state=state, port=port) # this is magic, see lib/ansible/module_common.py #<> From 81c9a0cb78ee1d8ad9a5928eb3400deabd965fa7 Mon Sep 17 00:00:00 2001 From: Jeroen Hoekx Date: Fri, 24 Aug 2012 20:58:05 +0200 Subject: [PATCH 3/3] wait_for: remove restarted, add delay, rename name to host, make port required. --- library/wait_for | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/library/wait_for b/library/wait_for index 8a20bb3c49..e1cc1b38e0 100644 --- a/library/wait_for +++ b/library/wait_for @@ -27,21 +27,26 @@ def main(): module = AnsibleModule( argument_spec = dict( - name=dict(required=True), + host=dict(default='127.0.0.1'), timeout=dict(default=300), - port=dict(default=22), - state=dict(default='started', choices=['started', 'stopped', 'restarted']), + delay=dict(default=0), + port=dict(required=True), + state=dict(default='started', choices=['started', 'stopped']), ), ) params = module.params - host = params['name'] + host = params['host'] timeout = int(params['timeout']) + delay = int(params['delay']) port = int(params['port']) state = params['state'] - if state in [ 'stopped', 'restarted']: + if delay: + time.sleep(delay) + + if state is 'stopped': ### first wait for the host to go down end = datetime.datetime.now() + datetime.timedelta(seconds=timeout) @@ -57,7 +62,7 @@ def main(): else: module.fail_json(msg="Timeout when waiting for %s to stop."%(host)) - if state in [ 'started', 'restarted' ]: + if state is 'started': ### wait for the host to come up end = datetime.datetime.now() + datetime.timedelta(seconds=timeout)