diff --git a/salt/config.py b/salt/config.py index 31776aaa1ba4..3b313ab1ca49 100644 --- a/salt/config.py +++ b/salt/config.py @@ -189,6 +189,7 @@ 'random_master': bool, 'syndic_event_forward_timeout': float, 'syndic_max_event_process_time': float, + 'salt_fails_if_highstate_fails': bool, } # default configurations @@ -401,6 +402,7 @@ 'gather_job_timeout': 2, 'syndic_event_forward_timeout': 0.5, 'syndic_max_event_process_time': 0.5, + 'salt_fails_if_highstate_fails': False } # ----- Salt Cloud Configuration Defaults -----------------------------------> diff --git a/salt/output/__init__.py b/salt/output/__init__.py index 1d57ba5f4ae3..8b78ae751676 100644 --- a/salt/output/__init__.py +++ b/salt/output/__init__.py @@ -16,6 +16,8 @@ import salt.loader import salt.utils +from salt.exceptions import SaltSystemExit + log = logging.getLogger(__name__) @@ -39,6 +41,7 @@ def display_output(data, out, opts=None): display_data = get_printout('nested', opts)(data).rstrip() output_filename = opts.get('output_file', None) + salt_fails_if_highstate_fails = opts.get('salt_fails_if_highstate_fails', False) try: if output_filename is not None: with salt.utils.fopen(output_filename, 'a') as ofh: @@ -47,11 +50,21 @@ def display_output(data, out, opts=None): return if display_data: print(display_data) + if salt_fails_if_highstate_fails: + if not get_highstate_success(highstate_data=data): + raise SaltSystemExit(code=1) + except IOError as exc: # Only raise if it's NOT a broken pipe if exc.errno != errno.EPIPE: raise exc +def get_highstate_success(highstate_data): + for i in highstate_data.keys(): + for j in highstate_data[i].keys(): + if not highstate_data[i][j]['result']: + return False + return True def get_printout(out, opts=None, **kwargs): '''