|
|
@ -19,7 +19,6 @@
|
|
|
|
from __future__ import (absolute_import, division, print_function)
|
|
|
|
from __future__ import (absolute_import, division, print_function)
|
|
|
|
__metaclass__ = type
|
|
|
|
__metaclass__ = type
|
|
|
|
|
|
|
|
|
|
|
|
from multiprocessing.managers import SyncManager, DictProxy
|
|
|
|
|
|
|
|
import multiprocessing
|
|
|
|
import multiprocessing
|
|
|
|
import os
|
|
|
|
import os
|
|
|
|
import tempfile
|
|
|
|
import tempfile
|
|
|
@ -27,7 +26,6 @@ import tempfile
|
|
|
|
from ansible import constants as C
|
|
|
|
from ansible import constants as C
|
|
|
|
from ansible.errors import AnsibleError
|
|
|
|
from ansible.errors import AnsibleError
|
|
|
|
from ansible.executor.play_iterator import PlayIterator
|
|
|
|
from ansible.executor.play_iterator import PlayIterator
|
|
|
|
from ansible.executor.process.worker import WorkerProcess
|
|
|
|
|
|
|
|
from ansible.executor.process.result import ResultProcess
|
|
|
|
from ansible.executor.process.result import ResultProcess
|
|
|
|
from ansible.executor.stats import AggregateStats
|
|
|
|
from ansible.executor.stats import AggregateStats
|
|
|
|
from ansible.playbook.play_context import PlayContext
|
|
|
|
from ansible.playbook.play_context import PlayContext
|
|
|
@ -284,18 +282,22 @@ class TaskQueueManager:
|
|
|
|
# see osx_say.py example for such a plugin
|
|
|
|
# see osx_say.py example for such a plugin
|
|
|
|
if getattr(callback_plugin, 'disabled', False):
|
|
|
|
if getattr(callback_plugin, 'disabled', False):
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
methods = [
|
|
|
|
|
|
|
|
getattr(callback_plugin, method_name, None),
|
|
|
|
# try to find v2 method, fallback to v1 method, ignore callback if no method found
|
|
|
|
getattr(callback_plugin, 'v2_on_any', None)
|
|
|
|
methods = []
|
|
|
|
]
|
|
|
|
for possible in [method_name, 'v2_on_any']:
|
|
|
|
|
|
|
|
gotit = getattr(callback_plugin, possible, None)
|
|
|
|
|
|
|
|
if gotit is None:
|
|
|
|
|
|
|
|
gotit = getattr(callback_plugin, possible.replace('v2_',''), None)
|
|
|
|
|
|
|
|
if gotit is not None:
|
|
|
|
|
|
|
|
methods.append(gotit)
|
|
|
|
|
|
|
|
|
|
|
|
for method in methods:
|
|
|
|
for method in methods:
|
|
|
|
if method is not None:
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
# temporary hack, required due to a change in the callback API, so
|
|
|
|
# temporary hack, required due to a change in the callback API, so
|
|
|
|
# we don't break backwards compatibility with callbacks which were
|
|
|
|
# we don't break backwards compatibility with callbacks which were
|
|
|
|
# designed to use the original API
|
|
|
|
# designed to use the original API
|
|
|
|
# FIXME: target for removal and revert to the original code here
|
|
|
|
# FIXME: target for removal and revert to the original code here after a year (2017-01-14)
|
|
|
|
# after a year (2017-01-14)
|
|
|
|
|
|
|
|
if method_name == 'v2_playbook_on_start':
|
|
|
|
if method_name == 'v2_playbook_on_start':
|
|
|
|
import inspect
|
|
|
|
import inspect
|
|
|
|
(f_args, f_varargs, f_keywords, f_defaults) = inspect.getargspec(method)
|
|
|
|
(f_args, f_varargs, f_keywords, f_defaults) = inspect.getargspec(method)
|
|
|
@ -306,13 +308,5 @@ class TaskQueueManager:
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
method(*args, **kwargs)
|
|
|
|
method(*args, **kwargs)
|
|
|
|
except Exception as e:
|
|
|
|
except Exception as e:
|
|
|
|
import traceback
|
|
|
|
#TODO: add config toggle to make this fatal or not?
|
|
|
|
orig_tb = to_unicode(traceback.format_exc())
|
|
|
|
display.warning(u"Failure when attempting to use callback plugin (%s): %s" % (to_unicode(callback_plugin), to_unicode(e)))
|
|
|
|
try:
|
|
|
|
|
|
|
|
v1_method = method.replace('v2_','')
|
|
|
|
|
|
|
|
v1_method(*args, **kwargs)
|
|
|
|
|
|
|
|
except Exception:
|
|
|
|
|
|
|
|
if display.verbosity >= 3:
|
|
|
|
|
|
|
|
display.warning(orig_tb, formatted=True)
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
display.warning('Error when using %s: %s' % (method, str(e)))
|
|
|
|
|
|
|
|