summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apex/common/utils.py43
-rw-r--r--apex/tests/playbooks/test_failed_playbook.yaml5
-rw-r--r--apex/tests/test_apex_common_utils.py8
3 files changed, 45 insertions, 11 deletions
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)