mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Merge pull request #3827 from mscherer/disable_callbacks
add a way for callback to disable itself
This commit is contained in:
commit
43df00550d
6 changed files with 112 additions and 2 deletions
|
@ -21,11 +21,16 @@ class CallbackModule(object):
|
||||||
"""
|
"""
|
||||||
this is an example ansible callback file that does nothing. You can drop
|
this is an example ansible callback file that does nothing. You can drop
|
||||||
other classes in the same directory to define your own handlers. Methods
|
other classes in the same directory to define your own handlers. Methods
|
||||||
you do not use can be omitted.
|
you do not use can be omitted. If self.disabled is set to True, the plugin
|
||||||
|
methods will not be called.
|
||||||
|
|
||||||
example uses include: logging, emailing, storing info, etc
|
example uses include: logging, emailing, storing info, etc
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
#if foo:
|
||||||
|
# self.disabled = True
|
||||||
|
pass
|
||||||
|
|
||||||
def on_any(self, *args, **kwargs):
|
def on_any(self, *args, **kwargs):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -144,6 +144,10 @@ def display(msg, color=None, stderr=False, screen_only=False, log_only=False, ru
|
||||||
def call_callback_module(method_name, *args, **kwargs):
|
def call_callback_module(method_name, *args, **kwargs):
|
||||||
|
|
||||||
for callback_plugin in callback_plugins:
|
for callback_plugin in callback_plugins:
|
||||||
|
# a plugin that set self.disabled to True will not be called
|
||||||
|
# see osx_say.py example for such a plugin
|
||||||
|
if getattr(callback_plugin, 'disabled', False):
|
||||||
|
continue
|
||||||
methods = [
|
methods = [
|
||||||
getattr(callback_plugin, method_name, None),
|
getattr(callback_plugin, method_name, None),
|
||||||
getattr(callback_plugin, 'on_any', None)
|
getattr(callback_plugin, 'on_any', None)
|
||||||
|
|
|
@ -17,19 +17,28 @@
|
||||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import os
|
||||||
|
|
||||||
FAILED_VOICE="Zarvox"
|
FAILED_VOICE="Zarvox"
|
||||||
REGULAR_VOICE="Trinoids"
|
REGULAR_VOICE="Trinoids"
|
||||||
HAPPY_VOICE="Cellos"
|
HAPPY_VOICE="Cellos"
|
||||||
LASER_VOICE="Princess"
|
LASER_VOICE="Princess"
|
||||||
|
SAY_CMD="/usr/bin/say"
|
||||||
|
|
||||||
def say(msg, voice):
|
def say(msg, voice):
|
||||||
subprocess.call(["/usr/bin/say", msg, "--voice=%s" % (voice)])
|
subprocess.call([SAY_CMD, msg, "--voice=%s" % (voice)])
|
||||||
|
|
||||||
class CallbackModule(object):
|
class CallbackModule(object):
|
||||||
"""
|
"""
|
||||||
makes Ansible much more exciting on OS X.
|
makes Ansible much more exciting on OS X.
|
||||||
"""
|
"""
|
||||||
|
def __init__(self):
|
||||||
|
# plugin disable itself if say is not present
|
||||||
|
# ansible will not call any callback if disabled is set to True
|
||||||
|
if not os.path.exists(SAY_CMD):
|
||||||
|
self.disabled = True
|
||||||
|
print "%s does not exist, plugin %s disabled" % \
|
||||||
|
(SAY_CMD, os.path.basename(__file__))
|
||||||
|
|
||||||
def on_any(self, *args, **kwargs):
|
def on_any(self, *args, **kwargs):
|
||||||
pass
|
pass
|
||||||
|
|
60
test/TestCallback.py
Normal file
60
test/TestCallback.py
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
# (C) 2013, Michael Scherer, <misc@zarb.org>
|
||||||
|
|
||||||
|
# This file is part of Ansible
|
||||||
|
#
|
||||||
|
# Ansible is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Ansible is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
|
import unittest
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
# if you change here, also change in the plugin
|
||||||
|
FILE_DISABLE = '/tmp/ansible_test_disable'
|
||||||
|
FILE_RUN = '/tmp/ansible_test_finish'
|
||||||
|
|
||||||
|
|
||||||
|
class TestInventory(unittest.TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.cwd = os.getcwd()
|
||||||
|
os.chdir(os.path.join(os.path.dirname(__file__), 'test_callbacks'))
|
||||||
|
|
||||||
|
def clean_file(self):
|
||||||
|
if os.path.exists(FILE_RUN):
|
||||||
|
os.unlink(FILE_RUN)
|
||||||
|
if os.path.exists(FILE_DISABLE):
|
||||||
|
os.unlink(FILE_DISABLE)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
os.chdir(self.cwd)
|
||||||
|
|
||||||
|
def run_ansible_playbook(self):
|
||||||
|
subprocess.call('source ../../hacking/env-setup 2>&1 >/dev/null; ansible-playbook -i "127.0.0.1," test_playbook.yml 2>&1 >/dev/null', shell=True)
|
||||||
|
|
||||||
|
def test_callback(self):
|
||||||
|
self.clean_file()
|
||||||
|
|
||||||
|
self.run_ansible_playbook()
|
||||||
|
assert os.path.exists(FILE_RUN)
|
||||||
|
self.clean_file()
|
||||||
|
|
||||||
|
def test_callback_disabled(self):
|
||||||
|
self.clean_file()
|
||||||
|
open(FILE_DISABLE, 'w').close()
|
||||||
|
|
||||||
|
self.run_ansible_playbook()
|
||||||
|
assert not os.path.exists(FILE_RUN)
|
||||||
|
|
||||||
|
self.clean_file()
|
27
test/test_callbacks/callback_plugins/test_log.py
Normal file
27
test/test_callbacks/callback_plugins/test_log.py
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
# (C) 2013, Michael Scherer, <misc@zarb.org>
|
||||||
|
|
||||||
|
# This file is part of Ansible
|
||||||
|
#
|
||||||
|
# Ansible is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Ansible is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
class CallbackModule(object):
|
||||||
|
def playbook_on_play_start(self, foo):
|
||||||
|
if os.path.exists('/tmp/ansible_test_disable'):
|
||||||
|
self.disabled = True
|
||||||
|
|
||||||
|
def playbook_on_stats(self, stats):
|
||||||
|
open('/tmp/ansible_test_finish', 'w').close()
|
5
test/test_callbacks/test_playbook.yml
Normal file
5
test/test_callbacks/test_playbook.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
- hosts: 127.0.0.1
|
||||||
|
connection: local
|
||||||
|
tasks:
|
||||||
|
shell: id
|
Loading…
Reference in a new issue