On Sat, Nov 09, 2019 at 01:38:32AM +0100, karsten@fedoraproject.org wrote:
Hello,
There is work in progress to migrate our applications from the current message bus 'fedmsg' to the AMPG based 'fedora-messaging'.
Attached are a couple of patches that prepare our ansible scripts for this.
Please review those patches and comment, thanks !
Karsten
From 538f112bc17a511b0117ccac31f6c2e5ff0ee97a Mon Sep 17 00:00:00 2001 From: Karsten Hopp karsten@redhat.com Date: Fri, 8 Nov 2019 22:34:47 +0100 Subject: [PATCH 14/14] add callbacks for fedora-messaging
The subject here doesn't reflect at all what is in the patch, which is pure style changes.
Signed-off-by: Karsten Hopp karsten@redhat.com
callback_plugins/fedora_messaging_callback.py | 16 ++++++---------- callback_plugins/fedora_messaging_callback2.py | 17 +++++++---------- 2 files changed, 13 insertions(+), 20 deletions(-)
diff --git a/callback_plugins/fedora_messaging_callback.py b/callback_plugins/fedora_messaging_callback.py index c83785e9b..31e918dde 100644 --- a/callback_plugins/fedora_messaging_callback.py +++ b/callback_plugins/fedora_messaging_callback.py @@ -29,10 +29,11 @@ except ImportError: # Ansible v1 compat CallbackBase = object
def getlogin(): try: user = os.getlogin()
- except OSError, e:
- except OSError as e: user = pwd.getpwuid(os.geteuid())[0] return user
@@ -45,11 +46,10 @@ class CallbackModule(CallbackBase): def __init__(self): pass
- def playbook_on_play_start(self, pattern): # This gets called once for each play.. but we just issue a message once # for the first one. One per "playbook"
play = getattr(self, 'play', None)
play = getattr(self, "play", None) if play: # figure out where the playbook FILE is path = os.path.abspath(play.playbook.filename)
@@ -60,7 +60,7 @@ class CallbackModule(CallbackBase):
if not self.playbook_path: msg = Message(
topic='ansible.playbook.start',
topic="ansible.playbook.start", body=dict( playbook=path, userid=getlogin(),
@@ -79,11 +79,7 @@ class CallbackModule(CallbackBase):
results = dict([(h, stats.summarize(h)) for h in stats.processed]) msg = Message(
topic='ansible.playbook.complete',
body=dict(
playbook=self.playbook_path,
userid=getlogin(),
results=results,
),
topic="ansible.playbook.complete",
body=dict(playbook=self.playbook_path, userid=getlogin(), results=results), ) publish(msg)
diff --git a/callback_plugins/fedora_messaging_callback2.py b/callback_plugins/fedora_messaging_callback2.py index 733e159a7..3d1e357ac 100644 --- a/callback_plugins/fedora_messaging_callback2.py +++ b/callback_plugins/fedora_messaging_callback2.py @@ -34,10 +34,11 @@ try: except ImportError: from ansible.utils import md5 as secure_hash
def getlogin(): try: user = os.getlogin()
- except OSError, e:
- except OSError as e: user = pwd.getpwuid(os.geteuid())[0] return user
@@ -45,8 +46,8 @@ def getlogin(): class CallbackModule(CallbackBase): """ Publish playbook starts and stops to fedora_messaging. """
- CALLBACK_NAME = 'fedora_messaging_callback2'
- CALLBACK_TYPE = 'notification'
- CALLBACK_NAME = "fedora_messaging_callback2"
- CALLBACK_TYPE = "notification" CALLBACK_VERSION = 2.0 CALLBACK_NEEDS_WHITELIST = True
@@ -77,7 +78,7 @@ class CallbackModule(CallbackBase):
if not self.playbook_path: msg = Message(
topic='ansible.playbook.start',
topic="ansible.playbook.start", body=dict( playbook=path, userid=getlogin(),
@@ -96,11 +97,7 @@ class CallbackModule(CallbackBase):
results = dict([(h, stats.summarize(h)) for h in stats.processed]) msg = Message(
topic='ansible.playbook.complete',
body=dict(
playbook=self.playbook_path,
userid=getlogin(),
results=results,
),
topic="ansible.playbook.complete",
body=dict(playbook=self.playbook_path, userid=getlogin(), results=results), ) publish(msg)
-- 2.21.0
From 1563b45d15092cd86a636fd32e90a2f02f952169 Mon Sep 17 00:00:00 2001 From: Karsten Hopp karsten@redhat.com Date: Fri, 8 Nov 2019 22:34:47 +0100 Subject: [PATCH 13/14] add callbacks for fedora-messaging
Signed-off-by: Karsten Hopp karsten@redhat.com
callback_plugins/fedora_messaging_callback.py | 89 +++++++++++++++ .../fedora_messaging_callback2.py | 106 ++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 callback_plugins/fedora_messaging_callback.py create mode 100644 callback_plugins/fedora_messaging_callback2.py
diff --git a/callback_plugins/fedora_messaging_callback.py b/callback_plugins/fedora_messaging_callback.py new file mode 100644 index 000000000..c83785e9b --- /dev/null +++ b/callback_plugins/fedora_messaging_callback.py @@ -0,0 +1,89 @@ +# (C) 2012, Michael DeHaan, michael.dehaan@gmail.com +# based on the log_plays example +# skvidal@fedoraproject.org +# rbean@redhat.com +# karsten@redhat.com changes for fedora-messaging
+# 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 pwd
+from fedora_messaging.api import Message, publish +from fedora_messaging.exceptions import PublishReturned, ConnectionException
+try:
- from ansible.plugins.callback import CallbackBase
+except ImportError:
- # Ansible v1 compat
- CallbackBase = object
+def getlogin():
- try:
user = os.getlogin()
- except OSError, e:
user = pwd.getpwuid(os.geteuid())[0]
- return user
+class CallbackModule(CallbackBase):
- """ Publish playbook starts and stops to fedora-messaging. """
- playbook_path = None
- def __init__(self):
pass
- def playbook_on_play_start(self, pattern):
# This gets called once for each play.. but we just issue a message once
# for the first one. One per "playbook"
play = getattr(self, 'play', None)
if play:
# figure out where the playbook FILE is
path = os.path.abspath(play.playbook.filename)
# Bail out early without publishing if we're in --check mode
if play.playbook.check:
return
if not self.playbook_path:
msg = Message(
topic='ansible.playbook.start',
body=dict(
playbook=path,
userid=getlogin(),
extra_vars=play.playbook.extra_vars,
inventory=play.playbook.inventory.host_list,
playbook_checksum=play.playbook.check,
check=play.playbook.check,
),
)
publish(msg)
You're importing the exceptions, but not actually handling them here.
self.playbook_path = path
- def playbook_on_stats(self, stats):
if not self.playbook_path:
return
results = dict([(h, stats.summarize(h)) for h in stats.processed])
msg = Message(
topic='ansible.playbook.complete',
body=dict(
playbook=self.playbook_path,
userid=getlogin(),
results=results,
),
)
publish(msg)
diff --git a/callback_plugins/fedora_messaging_callback2.py b/callback_plugins/fedora_messaging_callback2.py new file mode 100644 index 000000000..733e159a7 --- /dev/null +++ b/callback_plugins/fedora_messaging_callback2.py @@ -0,0 +1,106 @@ +# (C) 2012, Michael DeHaan, michael.dehaan@gmail.com +# based on the log_plays example +# skvidal@fedoraproject.org +# rbean@redhat.com +# karsten@redhat.com changes for fedora-messaging
+# 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 pwd
+from fedora_messaging.api import Message, publish +from fedora_messaging.exceptions import PublishReturned, ConnectionException
+try:
- from ansible.plugins.callback import CallbackBase
+except ImportError:
- # Ansible v1 compat
- CallbackBase = object
+try:
- from ansible.utils.hashing import secure_hash
+except ImportError:
- from ansible.utils import md5 as secure_hash
+def getlogin():
- try:
user = os.getlogin()
- except OSError, e:
user = pwd.getpwuid(os.geteuid())[0]
- return user
+class CallbackModule(CallbackBase):
- """ Publish playbook starts and stops to fedora_messaging. """
- CALLBACK_NAME = 'fedora_messaging_callback2'
- CALLBACK_TYPE = 'notification'
- CALLBACK_VERSION = 2.0
- CALLBACK_NEEDS_WHITELIST = True
- playbook_path = None
- def __init__(self):
self.play = None
self.playbook = None
super(CallbackModule, self).__init__()
- def set_play_context(self, play_context):
self.play_context = play_context
- def v2_playbook_on_start(self, playbook):
self.playbook = playbook
- def v2_playbook_on_play_start(self, play):
# This gets called once for each play.. but we just issue a message once
# for the first one. One per "playbook"
if self.playbook:
# figure out where the playbook FILE is
path = os.path.abspath(self.playbook._file_name)
# Bail out early without publishing if we're in --check mode
if self.play_context.check_mode:
return
if not self.playbook_path:
msg = Message(
topic='ansible.playbook.start',
body=dict(
playbook=path,
userid=getlogin(),
extra_vars=play._variable_manager.extra_vars,
inventory=play._variable_manager._inventory._sources,
playbook_checksum=secure_hash(path),
check=self.play_context.check_mode,
),
)
publish(msg)
Same deal here as above with the exceptions.
self.playbook_path = path
- def v2_playbook_on_stats(self, stats):
if not self.playbook_path:
return
results = dict([(h, stats.summarize(h)) for h in stats.processed])
msg = Message(
topic='ansible.playbook.complete',
body=dict(
playbook=self.playbook_path,
userid=getlogin(),
results=results,
),
)
publish(msg)
-- 2.21.0
I have no comments on the Ansible side of things.