fixed code for v1 callback runtime compatiblity

old exception code obsoleted by exception avoidance
errors on callback produce warnings and don't stop play
pull/14202/head
Brian Coca 9 years ago
parent 5587b08335
commit 1aae6499ca

@ -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)))

Loading…
Cancel
Save