1# -*- coding: utf-8 -*- 2# (c) 2020, Alexei Znamensky <russoz@gmail.com> 3# Copyright: (c) 2020, Ansible Project 4# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause) 5 6from __future__ import absolute_import, division, print_function 7__metaclass__ = type 8 9import traceback 10from functools import wraps 11 12from ansible_collections.community.general.plugins.module_utils.mh.exceptions import ModuleHelperException 13 14 15def cause_changes(on_success=None, on_failure=None): 16 17 def deco(func): 18 if on_success is None and on_failure is None: 19 return func 20 21 @wraps(func) 22 def wrapper(*args, **kwargs): 23 try: 24 self = args[0] 25 func(*args, **kwargs) 26 if on_success is not None: 27 self.changed = on_success 28 except Exception: 29 if on_failure is not None: 30 self.changed = on_failure 31 raise 32 33 return wrapper 34 35 return deco 36 37 38def module_fails_on_exception(func): 39 @wraps(func) 40 def wrapper(self, *args, **kwargs): 41 try: 42 func(self, *args, **kwargs) 43 except SystemExit: 44 raise 45 except ModuleHelperException as e: 46 if e.update_output: 47 self.update_output(e.update_output) 48 self.module.fail_json(msg=e.msg, exception=traceback.format_exc(), 49 output=self.output, vars=self.vars.output(), **self.output) 50 except Exception as e: 51 msg = "Module failed with exception: {0}".format(str(e).strip()) 52 self.module.fail_json(msg=msg, exception=traceback.format_exc(), 53 output=self.output, vars=self.vars.output(), **self.output) 54 return wrapper 55