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