fixed code for v1 callback runtime compatiblity

old exception code obsoleted by exception avoidance
errors on callback produce warnings and don't stop play
This commit is contained in:
Brian Coca 2016-01-29 02:00:40 -05:00
parent 5587b08335
commit 1aae6499ca

View file

@ -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,35 +282,31 @@ 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 after a year (2017-01-14)
# FIXME: target for removal and revert to the original code here if method_name == 'v2_playbook_on_start':
# after a year (2017-01-14) import inspect
if method_name == 'v2_playbook_on_start': (f_args, f_varargs, f_keywords, f_defaults) = inspect.getargspec(method)
import inspect if 'playbook' in f_args:
(f_args, f_varargs, f_keywords, f_defaults) = inspect.getargspec(method)
if 'playbook' in f_args:
method(*args, **kwargs)
else:
method()
else:
method(*args, **kwargs) method(*args, **kwargs)
except Exception as e: else:
import traceback method()
orig_tb = to_unicode(traceback.format_exc()) else:
try: method(*args, **kwargs)
v1_method = method.replace('v2_','') except Exception as e:
v1_method(*args, **kwargs) #TODO: add config toggle to make this fatal or not?
except Exception: display.warning(u"Failure when attempting to use callback plugin (%s): %s" % (to_unicode(callback_plugin), to_unicode(e)))
if display.verbosity >= 3:
display.warning(orig_tb, formatted=True)
else:
display.warning('Error when using %s: %s' % (method, str(e)))