From 8669c687a75a00106b055add49b82fee826b8fe8 Mon Sep 17 00:00:00 2001 From: Dan Radez Date: Fri, 8 Sep 2017 12:40:05 -0400 Subject: Show ansible tasks as they complete Change-Id: I1b68d70fd97076a7f2ca68091a6e94d87b72efa2 Signed-off-by: Dan Radez --- apex/common/utils.py | 43 ++++++++++++++++++++------ apex/tests/playbooks/test_failed_playbook.yaml | 5 +++ apex/tests/test_apex_common_utils.py | 8 ++++- 3 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 apex/tests/playbooks/test_failed_playbook.yaml diff --git a/apex/common/utils.py b/apex/common/utils.py index e21ab835..b1837b9b 100644 --- a/apex/common/utils.py +++ b/apex/common/utils.py @@ -95,13 +95,36 @@ def run_ansible(ansible_vars, playbook, host='localhost', user='root', with open(ansible_tmp, 'w') as fh: fh.write("ANSIBLE_HOST_KEY_CHECKING=FALSE {}".format( ' '.join(ansible_command))) - try: - my_env = os.environ.copy() - my_env['ANSIBLE_HOST_KEY_CHECKING'] = 'False' - logging.info("Executing playbook...this may take some time") - logging.info(subprocess.check_output(ansible_command, env=my_env, - stderr=subprocess.STDOUT).decode('utf-8')) - except subprocess.CalledProcessError as e: - logging.error("Error executing ansible: {}".format( - pprint.pformat(e.output.decode('utf-8')))) - raise + + my_env = os.environ.copy() + my_env['ANSIBLE_HOST_KEY_CHECKING'] = 'False' + logging.info("Executing playbook...this may take some time") + p = subprocess.Popen(ansible_command, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + bufsize=1, + env=my_env, + universal_newlines=True) + # read first line + x = p.stdout.readline() + # initialize task + task = '' + while x: + # append lines to task + task += x + # log the line and read another + x = p.stdout.readline() + # deliver the task to info when we get a blank line + if not x.strip(): + task += x + logging.info(task.replace('\\n', '\n')) + task = '' + x = p.stdout.readline() + # clean up and get return code + p.stdout.close() + rc = p.wait() + if rc: + # raise errors + e = "Ansible playbook failed. See Ansible logs for details." + logging.error(e) + raise Exception(e) diff --git a/apex/tests/playbooks/test_failed_playbook.yaml b/apex/tests/playbooks/test_failed_playbook.yaml new file mode 100644 index 00000000..d12cefb1 --- /dev/null +++ b/apex/tests/playbooks/test_failed_playbook.yaml @@ -0,0 +1,5 @@ +--- +- hosts: localhost + tasks: + - fail: + msg: "Failure to test with" diff --git a/apex/tests/test_apex_common_utils.py b/apex/tests/test_apex_common_utils.py index 12aeaf2c..aee39a75 100644 --- a/apex/tests/test_apex_common_utils.py +++ b/apex/tests/test_apex_common_utils.py @@ -19,7 +19,8 @@ from apex.tests.constants import ( from nose.tools import ( assert_equal, assert_is_instance, - assert_not_is_instance) + assert_not_is_instance, + assert_raises) NET_SETS = os.path.join(TEST_CONFIG_DIR, 'network', 'network_settings.yaml') @@ -60,3 +61,8 @@ class TestCommonUtils: playbook = 'apex/tests/playbooks/test_playbook.yaml' assert_equal(utils.run_ansible(None, os.path.join(playbook), dry_run=True), None) + + def test_failed_run_ansible(self): + playbook = 'apex/tests/playbooks/test_failed_playbook.yaml' + assert_raises(Exception, utils.run_ansible, None, + os.path.join(playbook), dry_run=True) -- cgit 1.2.3-korg