Use the messages from journal-to-fedora-messaging instead of those from Noggin

Use the messages from
[journal-to-fedora-messaging](https://journal-to-fedora-messaging-messages.readthedocs.io)
instead of those from Noggin, as they are more reliable: they are
emitted even if the action is done directly in IPA.

Signed-off-by: Aurélien Bompard <aurelien@bompard.org>
This commit is contained in:
Aurélien Bompard 2025-04-02 16:59:09 +02:00 committed by abompard
parent 254e00c59a
commit 5775425f16
8 changed files with 181 additions and 148 deletions

View file

@ -134,12 +134,12 @@ Fedora-messaging has a replay and reconsume commands since version 3.7
http get https://apps.fedoraproject.org./datagrepper/v2/search \ http get https://apps.fedoraproject.org./datagrepper/v2/search \
topic==<topic> delta==<delta> topic==<topic> delta==<delta>
Example command for search of messages in topic org.fedoraproject.prod.fas.group.member.removed sent in the last day: Example command for search of messages in topic org.fedoraproject.prod.ipa.group_remove_member.v1 sent in the last day:
:: ::
http get https://apps.fedoraproject.org/datagrepper/v2/search \ http get https://apps.fedoraproject.org/datagrepper/v2/search \
topic==org.fedoraproject.prod.fas.groups.member.removed delta==86400 topic==org.fedoraproject.prod.ipa.group_remove_member.v1 delta==86400
- Get the message ID and supply it to the fedora-messaging reconsume command, with local config: - Get the message ID and supply it to the fedora-messaging reconsume command, with local config:

View file

@ -14,5 +14,5 @@ and remove/add users to pagure group based on the changes in FAS.
The sync toddler accepts following topics. The sync toddler accepts following topics.
* org.fedoraproject.*.fas.group.member.sponsor - New member added to group * `org.fedoraproject.*.ipa.group_add_member.v1` - New member added to group
* org.fedoraproject.*.toddlers.trigger.pagure_fas_groups_sync - Message triggered by toddlers cron * `org.fedoraproject.*.toddlers.trigger.pagure_fas_groups_sync` - Message triggered by toddlers cron

32
poetry.lock generated
View file

@ -1,4 +1,4 @@
# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
[[package]] [[package]]
name = "arrow" name = "arrow"
@ -1019,6 +1019,20 @@ MarkupSafe = ">=2.0"
[package.extras] [package.extras]
i18n = ["Babel (>=2.7)"] i18n = ["Babel (>=2.7)"]
[[package]]
name = "journal-to-fedora-messaging-messages"
version = "1.0.1"
description = "A schema package for messages sent by Journal to Fedora Messaging"
optional = false
python-versions = "<4.0,>=3.9"
files = [
{file = "journal_to_fedora_messaging_messages-1.0.1-py3-none-any.whl", hash = "sha256:6eb7b01054b89bd304d16105066e47a15f6627ef022c56f4c3d05e48519a7ecf"},
{file = "journal_to_fedora_messaging_messages-1.0.1.tar.gz", hash = "sha256:e9cc8295095fadf19285bb0b9439dca2db06dda2bf64fc96f521fa52f85c9d57"},
]
[package.dependencies]
fedora-messaging = ">=3.3.0,<4.0.0"
[[package]] [[package]]
name = "jsonpointer" name = "jsonpointer"
version = "3.0.0" version = "3.0.0"
@ -1409,20 +1423,6 @@ files = [
[package.extras] [package.extras]
nicer-shell = ["ipython"] nicer-shell = ["ipython"]
[[package]]
name = "noggin-messages"
version = "1.1.0"
description = "Fedora Messaging message schemas for Noggin."
optional = false
python-versions = "<4.0.0,>=3.8.0"
files = [
{file = "noggin_messages-1.1.0-py3-none-any.whl", hash = "sha256:c6d049ade672eac0aa81a1dba3f425235af03730a1a603dc728878b35833fdc3"},
{file = "noggin_messages-1.1.0.tar.gz", hash = "sha256:78ce070a0c7b89824eef97ee79773681832bfc1b2eb7737845d7eb0d97dec730"},
]
[package.dependencies]
fedora-messaging = ">=2.0.1"
[[package]] [[package]]
name = "openidc-client" name = "openidc-client"
version = "0.6.0" version = "0.6.0"
@ -2802,4 +2802,4 @@ cffi = ["cffi (>=1.11)"]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.11" python-versions = "^3.11"
content-hash = "8048917cc41a98dbe75498694aff79dc8163adc6c309cad211ffc8840b6990e9" content-hash = "f119d99c27f1863ecd18c636eea8a13305fd5ebfae74d6e883a69560cbf4c8d5"

View file

@ -18,7 +18,6 @@ fedora-messaging-git-hook-messages = "^1.0.1"
gitpython = "^3.1.43" gitpython = "^3.1.43"
koji = "^1.34.2" koji = "^1.34.2"
requests = "^2.32.3" requests = "^2.32.3"
noggin-messages = "^1.1.0"
pagure-messages = "^1.2.0" pagure-messages = "^1.2.0"
pygobject = "^3.48.2" pygobject = "^3.48.2"
python-fedora = "^1.1.1" python-fedora = "^1.1.1"
@ -30,6 +29,7 @@ pylibmc = "^1.6.3"
ipalib = "^4.12.2" ipalib = "^4.12.2"
cryptography = "<44.0.0" cryptography = "<44.0.0"
ipaclient = "^4.12.2" ipaclient = "^4.12.2"
journal-to-fedora-messaging-messages = "^1.0.1"
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]
pytest = "*" pytest = "*"

View file

@ -5,12 +5,37 @@ Unit tests for `toddler.plugins.cleaning_packager_groups`
import logging import logging
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
from journal_to_fedora_messaging_messages.ipa import IpaGroupRemoveMemberV1
import pytest import pytest
from toddlers.exceptions import PagureError from toddlers.exceptions import PagureError
import toddlers.plugins.cleaning_packager_groups as cleaning_packager_groups import toddlers.plugins.cleaning_packager_groups as cleaning_packager_groups
@pytest.fixture
def group_remove_member_message():
return IpaGroupRemoveMemberV1(
{
"IPA_API_PARAMS": (
'{"cn": "packager", "all": false, "raw": false, "version": "2.254", '
'"no_members": false, "user": ["lenkaseg"]}'
),
"__REALTIME_TIMESTAMP": "1742838354523018",
"IPA_API_ACTOR": "agent@EXAMPLE.COM",
"IPA_API_COMMAND": "group_remove_member",
"IPA_API_RESULT": "SUCCESS",
"MESSAGE": (
"[IPA.API] agent@EXAMPLE.COM: group_remove_member: SUCCESS [ldap2_139734790206096] "
'{"cn": "packager", "all": false, "raw": false, "version": "2.254", '
'"no_members": false, "user": ["lenkaseg"]}'
),
"_HOSTNAME": "ipa.example.com",
"_COMM": "httpd",
"PRIORITY": "5",
}
)
class TestAcceptTopic: class TestAcceptTopic:
""" """
Test class for `toddler.plugins.cleaning_packager_groups.CleanPackagerGroups.accepts_topic` Test class for `toddler.plugins.cleaning_packager_groups.CleanPackagerGroups.accepts_topic`
@ -28,9 +53,9 @@ class TestAcceptTopic:
@pytest.mark.parametrize( @pytest.mark.parametrize(
"topic", "topic",
[ [
"org.fedoraproject.*.fas.group.member.removed", "org.fedoraproject.*.ipa.group_remove_member.v1",
"org.fedoraproject.prod.fas.group.member.removed", "org.fedoraproject.prod.ipa.group_remove_member.v1",
"org.fedoraproject.stg.fas.group.member.removed", "org.fedoraproject.stg.ipa.group_remove_member.v1",
], ],
) )
def test_accepts_topic_valid(self, topic, toddler): def test_accepts_topic_valid(self, topic, toddler):
@ -50,35 +75,10 @@ class TestProcess:
self.toddler_cls = cleaning_packager_groups.CleanPackagerGroups() self.toddler_cls = cleaning_packager_groups.CleanPackagerGroups()
self.toddler_cls._ipa_session = MagicMock() self.toddler_cls._ipa_session = MagicMock()
def test_process(self):
"""
Assert that process is called correctly.
"""
config = {"pagure": {"pagure.prod.url"}, "pagure_stg": {"pagure.stg.url"}}
message = MagicMock()
message.body = {
"msg": {"agent": "lenkaseg", "group": "packager", "user": "patrikp"},
"headers": {
"fedora_messaging_group_communishift-admins": True,
"fedora_messaging_schema": "noggin.group.member.sponsor.v1",
"fedora_messaging_severity": 20,
"fedora_messaging_user_lenkaseg": True,
"fedora_messaging_user_patrikp": True,
"priority": 0,
"sent-at": "2024-07-04T15:48:25+00:00",
},
"id": "35d54838-b12c-49d5-949c-c503a71e7ae5",
"priority": 0,
"queue": "null",
"topic": "org.fedoraproject.stg.fas.group.member.remove",
}
self.toddler_cls.process = MagicMock()
self.toddler_cls.process(config, message)
self.toddler_cls.process.assert_called_once_with(config, message)
@patch("toddlers.utils.pagure.set_pagure") @patch("toddlers.utils.pagure.set_pagure")
def test_not_packager_group(self, mock_set_pagure, caplog): def test_not_packager_group(
self, mock_set_pagure, group_remove_member_message, caplog
):
""" """
Assert that if the group in the message is not "packager", plugin stops. Assert that if the group in the message is not "packager", plugin stops.
""" """
@ -90,58 +90,74 @@ class TestProcess:
"pagure_stg": "https://stg.pagure.io", "pagure_stg": "https://stg.pagure.io",
"watched_groups": ["packager"], "watched_groups": ["packager"],
} }
message = MagicMock() group_remove_member_message.body["IPA_API_PARAMS"] = (
message.body = { '{"cn": "not-packager", "all": false, "raw": false, "version": "2.254", '
"msg": { '"no_members": false, "user": ["lenkaseg"]}'
"group": "not-packager", )
"user": "lenkaseg", self.toddler_cls.process(config, group_remove_member_message)
},
"topic": "org.fedoraproject.stg.fas.group.member.remove",
}
self.toddler_cls.process(config, message)
assert ( assert (
caplog.records[-1].message caplog.records[-1].message
== "User lenkaseg was not removed from packager group, but " == "User(s) lenkaseg was not removed from packager group, but "
"from not-packager group, nothing to do." "from not-packager group, nothing to do."
) )
@pytest.mark.parametrize( @pytest.mark.parametrize(
"distgit_groups,ipa_groups,message_1,message_2,message_3,message_4", "distgit_groups,ipa_groups,messages",
( (
( (
["group1", "group2"], ["group1", "group2"],
{"result": {"memberof_group": ["group1", "group3"]}}, {"result": {"memberof_group": ["group1", "group3"]}},
"User lenkaseg removed from distgit group: group1", (
"User lenkaseg removed from ipa group: group1", "Fetching all distgit groups:",
"User lenkaseg should be removed from following groups: ['group1']", "Distgit groups found: ['group1', 'group2']",
"Ipa groups: ['group1', 'group3']", "User lenkaseg was removed from packager group, removing from "
"packager-related groups as well.",
"User lenkaseg removed from distgit group: packager",
"Fetching groups user lenkaseg is member of in ipa:",
"Ipa groups: ['group1', 'group3']",
"User lenkaseg should be removed from following groups: ['group1']",
"User lenkaseg removed from ipa group: group1",
"User lenkaseg removed from distgit group: group1",
),
), ),
( (
None, None,
{"result": {"memberof_group": ["group1", "group3"]}}, {"result": {"memberof_group": ["group1", "group3"]}},
"No distgit groups found, bailing.", (
"Distgit groups found: None", "Fetching all distgit groups:",
"Fetching all distgit groups:", "Distgit groups found: None",
"User lenkaseg was removed from packager group, removing from " "No distgit groups found, bailing.",
"packager-related groups as well.", ),
), ),
( (
["group1", "group2"], ["group1", "group2"],
{"result": {"memberof_group": ["group3", "group4"]}}, {"result": {"memberof_group": ["group3", "group4"]}},
"Seems that user lenkaseg is not member of any groups shared " (
"between ipa and distgit", "Fetching all distgit groups:",
"Ipa groups: ['group3', 'group4']", "Distgit groups found: ['group1', 'group2']",
"Fetching groups user lenkaseg is member of in ipa:", "User lenkaseg was removed from packager group, removing from "
"User lenkaseg removed from distgit group: packager", "packager-related groups as well.",
"User lenkaseg removed from distgit group: packager",
"Fetching groups user lenkaseg is member of in ipa:",
"Ipa groups: ['group3', 'group4']",
"Seems that user lenkaseg is not member of any groups shared "
"between ipa and distgit",
),
), ),
( (
["group1", "group2"], ["group1", "group2"],
{"result": {"memberof_group": []}}, {"result": {"memberof_group": []}},
"Seems that user lenkaseg is not member of any groups " (
"shared between ipa and distgit", "Fetching all distgit groups:",
"Ipa groups: []", "Distgit groups found: ['group1', 'group2']",
"Fetching groups user lenkaseg is member of in ipa:", "User lenkaseg was removed from packager group, removing from "
"User lenkaseg removed from distgit group: packager", "packager-related groups as well.",
"User lenkaseg removed from distgit group: packager",
"Fetching groups user lenkaseg is member of in ipa:",
"Ipa groups: []",
"Seems that user lenkaseg is not member of any groups shared "
"between ipa and distgit",
),
), ),
), ),
ids=( ids=(
@ -157,10 +173,8 @@ class TestProcess:
mock_pagure, mock_pagure,
distgit_groups, distgit_groups,
ipa_groups, ipa_groups,
message_1, messages,
message_2, group_remove_member_message,
message_3,
message_4,
caplog, caplog,
): ):
""" """
@ -178,16 +192,10 @@ class TestProcess:
"pagure_stg": "https://example.stg.io", "pagure_stg": "https://example.stg.io",
"watched_groups": ["packager"], "watched_groups": ["packager"],
} }
message = MagicMock() self.toddler_cls.process(config, group_remove_member_message)
message.body = { recorded_messages = tuple(r.message for r in caplog.records)
"msg": {"group": "packager", "user": "lenkaseg", "agent": "agent"}, print(recorded_messages)
"topic": "org.fedoraproject.stg.fas.group.member.remove", assert recorded_messages == messages
}
self.toddler_cls.process(config, message)
assert caplog.records[-1].message == message_1
assert caplog.records[-2].message == message_2
assert caplog.records[-3].message == message_3
assert caplog.records[-4].message == message_4
@pytest.mark.parametrize( @pytest.mark.parametrize(
"ipa_remove_member,error,message_1,message_2", "ipa_remove_member,error,message_1,message_2",
@ -215,6 +223,7 @@ class TestProcess:
error, error,
message_1, message_1,
message_2, message_2,
group_remove_member_message,
caplog, caplog,
): ):
""" """
@ -238,13 +247,8 @@ class TestProcess:
"pagure_api_key": "pagure_key", "pagure_api_key": "pagure_key",
"watched_groups": ["packager"], "watched_groups": ["packager"],
} }
message = MagicMock()
message.body = {
"msg": {"group": "packager", "user": "lenkaseg", "agent": "agent"},
"topic": "org.fedoraproject.stg.fas.group.member.remove",
}
self.toddler_cls.process(config, message) self.toddler_cls.process(config, group_remove_member_message)
self.toddler_cls._ipa_session.Command.user_show.assert_called_with( self.toddler_cls._ipa_session.Command.user_show.assert_called_with(
uid="lenkaseg" uid="lenkaseg"
) )

View file

@ -6,13 +6,37 @@ import logging
from unittest.mock import Mock, patch from unittest.mock import Mock, patch
from fedora_messaging.api import Message from fedora_messaging.api import Message
from noggin_messages import MemberSponsorV1 from journal_to_fedora_messaging_messages.ipa import IpaGroupAddMemberV1
import pytest import pytest
from toddlers.exceptions import PagureError from toddlers.exceptions import PagureError
from toddlers.plugins import pagure_fas_groups_sync from toddlers.plugins import pagure_fas_groups_sync
@pytest.fixture
def group_add_member_message():
return IpaGroupAddMemberV1(
{
"IPA_API_PARAMS": (
'{"cn": "fas_group", "all": false, "raw": false, "version": "2.254", '
'"no_members": false, "user": ["user"]}'
),
"__REALTIME_TIMESTAMP": "1742838354523018",
"IPA_API_ACTOR": "agent@EXAMPLE.COM",
"IPA_API_COMMAND": "group_add_member",
"IPA_API_RESULT": "SUCCESS",
"MESSAGE": (
"[IPA.API] agent@EXAMPLE.COM: group_add_member: SUCCESS [ldap2_139734790206096] "
'{"cn": "fas_group", "all": false, "raw": false, "version": "2.254", '
'"no_members": false, "user": ["user"]}'
),
"_HOSTNAME": "ipa.example.com",
"_COMM": "httpd",
"PRIORITY": "5",
}
)
class TestAcceptsTopic: class TestAcceptsTopic:
""" """
Test class for `toddlers.plugins.pagure_fas_groups_sync.PagureFASGroupsSync.accepts_topic` Test class for `toddlers.plugins.pagure_fas_groups_sync.PagureFASGroupsSync.accepts_topic`
@ -30,11 +54,11 @@ class TestAcceptsTopic:
@pytest.mark.parametrize( @pytest.mark.parametrize(
"topic", "topic",
[ [
"org.fedoraproject.*.fas.group.member.sponsor", "org.fedoraproject.*.ipa.group_add_member.v1",
"org.fedoraproject.*.toddlers.trigger.pagure_fas_groups_sync", "org.fedoraproject.*.toddlers.trigger.pagure_fas_groups_sync",
"org.fedoraproject.stg.fas.group.member.sponsor", "org.fedoraproject.stg.ipa.group_add_member.v1",
"org.fedoraproject.stg.toddlers.trigger.pagure_fas_groups_sync", "org.fedoraproject.stg.toddlers.trigger.pagure_fas_groups_sync",
"org.fedoraproject.prod.fas.group.member.sponsor", "org.fedoraproject.prod.ipa.group_add_member.v1",
"org.fedoraproject.prod.toddlers.trigger.pagure_fas_groups_sync", "org.fedoraproject.prod.toddlers.trigger.pagure_fas_groups_sync",
], ],
) )
@ -77,7 +101,9 @@ class TestProcess:
@patch("toddlers.utils.pagure.set_pagure") @patch("toddlers.utils.pagure.set_pagure")
@patch("toddlers.utils.fedora_account.set_fasjson") @patch("toddlers.utils.fedora_account.set_fasjson")
def test_process_sponsor_message(self, mock_fas, mock_pagure, toddler): def test_process_sponsor_message(
self, mock_fas, mock_pagure, toddler, group_add_member_message
):
""" """
Assert that sponsor message is processed correctly. Assert that sponsor message is processed correctly.
""" """
@ -85,12 +111,9 @@ class TestProcess:
mock_pagure_obj = Mock() mock_pagure_obj = Mock()
mock_pagure.return_value = mock_pagure_obj mock_pagure.return_value = mock_pagure_obj
config = {"group_map": {"fas_group": "pagure_group"}} config = {"group_map": {"fas_group": "pagure_group"}}
msg = MemberSponsorV1(
{"msg": {"agent": "agent", "user": "user", "group": "fas_group"}}
)
# Test # Test
toddler.process(config, msg) toddler.process(config, group_add_member_message)
# Assertions # Assertions
mock_pagure_obj.add_member_to_group.assert_called_with("user", "pagure_group") mock_pagure_obj.add_member_to_group.assert_called_with("user", "pagure_group")
@ -101,7 +124,11 @@ class TestProcess:
@patch("toddlers.utils.pagure.set_pagure") @patch("toddlers.utils.pagure.set_pagure")
@patch("toddlers.utils.fedora_account.set_fasjson") @patch("toddlers.utils.fedora_account.set_fasjson")
def test_process_sponsor_message_user_not_in_pagure( def test_process_sponsor_message_user_not_in_pagure(
self, mock_fas, mock_pagure, toddler self,
mock_fas,
mock_pagure,
toddler,
group_add_member_message,
): ):
""" """
Assert that sponsor message is processed correctly when user Assert that sponsor message is processed correctly when user
@ -112,12 +139,9 @@ class TestProcess:
mock_pagure_obj.user_exists.return_value = False mock_pagure_obj.user_exists.return_value = False
mock_pagure.return_value = mock_pagure_obj mock_pagure.return_value = mock_pagure_obj
config = {"group_map": {"fas_group": "pagure_group"}} config = {"group_map": {"fas_group": "pagure_group"}}
msg = MemberSponsorV1(
{"msg": {"agent": "agent", "user": "user", "group": "fas_group"}}
)
# Test # Test
toddler.process(config, msg) toddler.process(config, group_add_member_message)
# Assertions # Assertions
mock_pagure_obj.add_member_to_group.assert_not_called() mock_pagure_obj.add_member_to_group.assert_not_called()
@ -128,7 +152,12 @@ class TestProcess:
@patch("toddlers.utils.pagure.set_pagure") @patch("toddlers.utils.pagure.set_pagure")
@patch("toddlers.utils.fedora_account.set_fasjson") @patch("toddlers.utils.fedora_account.set_fasjson")
def test_process_sponsor_message_failure( def test_process_sponsor_message_failure(
self, mock_fas, mock_pagure, caplog, toddler self,
mock_fas,
mock_pagure,
caplog,
toddler,
group_add_member_message,
): ):
""" """
Assert that failure during processing sponsor message is handled correctly. Assert that failure during processing sponsor message is handled correctly.
@ -139,12 +168,9 @@ class TestProcess:
mock_pagure_obj.add_member_to_group.side_effect = PagureError("PagureError") mock_pagure_obj.add_member_to_group.side_effect = PagureError("PagureError")
mock_pagure.return_value = mock_pagure_obj mock_pagure.return_value = mock_pagure_obj
config = {"group_map": {"fas_group": "pagure_group"}} config = {"group_map": {"fas_group": "pagure_group"}}
msg = MemberSponsorV1(
{"msg": {"agent": "agent", "user": "user", "group": "fas_group"}}
)
# Test # Test
toddler.process(config, msg) toddler.process(config, group_add_member_message)
# Assertions # Assertions
mock_pagure_obj.add_member_to_group.assert_called_with("user", "pagure_group") mock_pagure_obj.add_member_to_group.assert_called_with("user", "pagure_group")
@ -157,7 +183,7 @@ class TestProcess:
@patch("toddlers.utils.pagure.set_pagure") @patch("toddlers.utils.pagure.set_pagure")
@patch("toddlers.utils.fedora_account.set_fasjson") @patch("toddlers.utils.fedora_account.set_fasjson")
def test_process_sponsor_message_skipping( def test_process_sponsor_message_skipping(
self, mock_fas, mock_pagure, caplog, toddler self, mock_fas, mock_pagure, caplog, toddler, group_add_member_message
): ):
""" """
Assert that group is skipped when we don't care about it. Assert that group is skipped when we don't care about it.
@ -167,12 +193,13 @@ class TestProcess:
mock_pagure_obj = Mock() mock_pagure_obj = Mock()
mock_pagure.return_value = mock_pagure_obj mock_pagure.return_value = mock_pagure_obj
config = {"group_map": {"fas_group": "pagure_group"}} config = {"group_map": {"fas_group": "pagure_group"}}
msg = MemberSponsorV1( group_add_member_message.body["IPA_API_PARAMS"] = (
{"msg": {"agent": "agent", "user": "user", "group": "some_group"}} '{"cn": "some_group", "all": false, "raw": false, "version": "2.254", '
'"no_members": false, "user": ["user"]}'
) )
# Test # Test
toddler.process(config, msg) toddler.process(config, group_add_member_message)
# Assertions # Assertions
mock_pagure_obj.add_member_to_group.assert_not_called() mock_pagure_obj.add_member_to_group.assert_not_called()

View file

@ -1,6 +1,6 @@
""" """
The script is triggered by fedora-messaging messages published under the topic The script is triggered by fedora-messaging messages published under the topic
``toddlers.trigger.fas.group.member.remove`` and checks if a user was removed ``ipa.group_remove_member.v1`` and checks if a user was removed
from group "packagers". If yes, user is removed from packager related groups from group "packagers". If yes, user is removed from packager related groups
as well. as well.
""" """
@ -22,7 +22,7 @@ class CleanPackagerGroups(ToddlerBase):
name: str = "clean_packagers_groups" name: str = "clean_packagers_groups"
amqp_topics: list[str] = [ amqp_topics: list[str] = [
"org.fedoraproject.*.fas.group.member.removed", "org.fedoraproject.*.ipa.group_remove_member.v1",
] ]
pagure: pagure.Pagure pagure: pagure.Pagure
@ -37,7 +37,7 @@ class CleanPackagerGroups(ToddlerBase):
from this specific topic. from this specific topic.
""" """
return topic.startswith("org.fedoraproject.") and topic.endswith( return topic.startswith("org.fedoraproject.") and topic.endswith(
"fas.group.member.removed" "ipa.group_remove_member.v1"
) )
def _get_ipa_session(self, config): # pragma: no cover def _get_ipa_session(self, config): # pragma: no cover
@ -58,24 +58,17 @@ class CleanPackagerGroups(ToddlerBase):
def process(self, config, message): def process(self, config, message):
"""Process a given message. Remove user that is being removed from """Process a given message. Remove user that is being removed from
a packager group from all groups in distgit""" a packager group from all groups in distgit"""
msg = message.body group = message.group
user = msg["msg"]["user"]
group = msg["msg"]["group"]
watched_groups = config.get("watched_groups") watched_groups = config.get("watched_groups")
# If user is not removed from packager group, bail # If user is not removed from packager group, bail
if group not in watched_groups: if group not in watched_groups:
_log.info( _log.info(
f"User {user} was not removed from packager group, " f"User(s) {', '.join(message.user_names)} was not removed from packager group, "
f"but from {group} group, nothing to do." f"but from {group} group, nothing to do."
) )
return return
_log.info(
f"User {user} was removed from {group} group, removing from "
"packager-related groups as well."
)
self.dist_git = pagure.set_pagure( self.dist_git = pagure.set_pagure(
{ {
"pagure_url": config.get("dist_git_url"), "pagure_url": config.get("dist_git_url"),
@ -90,6 +83,17 @@ class CleanPackagerGroups(ToddlerBase):
_log.info("No distgit groups found, bailing.") _log.info("No distgit groups found, bailing.")
return return
ipa_session = self._get_ipa_session(config)
for user in message.user_names:
self._process_removal(config, user, group, distgit_groups, ipa_session)
def _process_removal(self, config, user, group, distgit_groups, ipa_session):
_log.info(
f"User {user} was removed from {group} group, removing from "
"packager-related groups as well."
)
# Remove user from the distgit group that triggered the toddler # Remove user from the distgit group that triggered the toddler
try: try:
self.dist_git.remove_member_from_group(user, group) self.dist_git.remove_member_from_group(user, group)
@ -99,7 +103,6 @@ class CleanPackagerGroups(ToddlerBase):
f"Error while removing user {user} from distgit group {group}" f"Error while removing user {user} from distgit group {group}"
) )
ipa_session = self._get_ipa_session(config)
_log.info(f"Fetching groups user {user} is member of in ipa:") _log.info(f"Fetching groups user {user} is member of in ipa:")
ipa_user = ipa_session.Command.user_show(uid=user) ipa_user = ipa_session.Command.user_show(uid=user)
ipa_groups = ipa_user["result"]["memberof_group"] ipa_groups = ipa_user["result"]["memberof_group"]

View file

@ -12,7 +12,6 @@ import sys
from typing import Dict from typing import Dict
from fedora_messaging.api import Message from fedora_messaging.api import Message
from noggin_messages import MemberSponsorV1
from toddlers.base import ToddlerBase from toddlers.base import ToddlerBase
from toddlers.exceptions import PagureError from toddlers.exceptions import PagureError
@ -32,7 +31,7 @@ class PagureFASGroupsSync(ToddlerBase):
name: str = "pagure_fas_groups_sync" name: str = "pagure_fas_groups_sync"
amqp_topics: list = [ amqp_topics: list = [
"org.fedoraproject.*.fas.group.member.sponsor", "org.fedoraproject.*.ipa.group_add_member.v1",
"org.fedoraproject.*.toddlers.trigger.pagure_fas_groups_sync", "org.fedoraproject.*.toddlers.trigger.pagure_fas_groups_sync",
] ]
@ -51,7 +50,7 @@ class PagureFASGroupsSync(ToddlerBase):
:returns: True if topic is accepted, False otherwise. :returns: True if topic is accepted, False otherwise.
""" """
if topic.startswith("org.fedoraproject."): if topic.startswith("org.fedoraproject."):
if topic.endswith("fas.group.member.sponsor"): if topic.endswith("ipa.group_add_member.v1"):
return True return True
if topic.endswith("toddlers.trigger.pagure_fas_groups_sync"): if topic.endswith("toddlers.trigger.pagure_fas_groups_sync"):
return True return True
@ -81,14 +80,14 @@ class PagureFASGroupsSync(ToddlerBase):
for group in group_map: for group in group_map:
self.sync_group(group, group_map[group]) self.sync_group(group, group_map[group])
if topic.endswith("fas.group.member.sponsor"): if topic.endswith("ipa.group_add_member.v1"):
member_sponsor_message = MemberSponsorV1(message.body) for user in message.user_names:
user = member_sponsor_message.user_name if message.group in group_map:
for group in member_sponsor_message.groups:
if group in group_map:
try: try:
if self.pagure.user_exists(user): if self.pagure.user_exists(user):
self.pagure.add_member_to_group(user, group_map[group]) self.pagure.add_member_to_group(
user, group_map[message.group]
)
except PagureError as e: except PagureError as e:
_log.exception(str(e)) _log.exception(str(e))
else: else:
@ -97,7 +96,7 @@ class PagureFASGroupsSync(ToddlerBase):
"but we don't care about this group. " "but we don't care about this group. "
"Skipping.", "Skipping.",
user, user,
group, message.group,
) )
def sync_group(self, fas_group: str, pagure_group: str): def sync_group(self, fas_group: str, pagure_group: str):