1"""
2Utilities to enable exception reraising across the master commands
3
4"""
5
6import builtins
7
8import salt.exceptions
9import salt.utils.event
10
11
12def raise_error(name=None, args=None, message=""):
13    """
14    Raise an exception with __name__ from name, args from args
15    If args is None Otherwise message from message\
16    If name is empty then use "Exception"
17    """
18    name = name or "Exception"
19    if hasattr(salt.exceptions, name):
20        ex = getattr(salt.exceptions, name)
21    elif hasattr(builtins, name):
22        ex = getattr(builtins, name)
23    else:
24        name = "SaltException"
25        ex = getattr(salt.exceptions, name)
26    if args is not None:
27        raise ex(*args)
28    else:
29        raise ex(message)
30
31
32def pack_exception(exc):
33    if hasattr(exc, "pack"):
34        packed_exception = exc.pack()
35    else:
36        packed_exception = {"message": exc.__unicode__(), "args": exc.args}
37    return packed_exception
38
39
40def fire_exception(exc, opts, job=None, node="minion"):
41    """
42    Fire raw exception across the event bus
43    """
44    if job is None:
45        job = {}
46    event = salt.utils.event.SaltEvent(node, opts=opts, listen=False)
47    event.fire_event(pack_exception(exc), "_salt_error")
48