| |
@@ -0,0 +1,217 @@
|
| |
+ from unittest.mock import call, MagicMock, patch
|
| |
+
|
| |
+ import fedora_messaging.api
|
| |
+ import pytest
|
| |
+
|
| |
+ import toddlers.plugins.clean_retired_packages
|
| |
+
|
| |
+
|
| |
+ class TestCleanRetiredPackagesToddler:
|
| |
+
|
| |
+ toddler_cls = toddlers.plugins.clean_retired_packages.CleanRetiredPackages
|
| |
+
|
| |
+ def test_accepts_topic_invalid(self, toddler):
|
| |
+ assert toddler.accepts_topic("foo.bar") is False
|
| |
+
|
| |
+ @pytest.mark.parametrize(
|
| |
+ "topic",
|
| |
+ [
|
| |
+ "org.fedoraproject.*.toddlers.trigger.clean_retired_packages",
|
| |
+ "org.fedoraproject.prod.toddlers.trigger.clean_retired_packages",
|
| |
+ "org.fedoraproject.stg.toddlers.trigger.clean_retired_packages",
|
| |
+ ],
|
| |
+ )
|
| |
+ def test_accepts_topic_valid(self, topic, toddler):
|
| |
+ assert toddler.accepts_topic(topic)
|
| |
+
|
| |
+ def test_process_config_missing_pdc_url(self, toddler):
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.clean_retired_packages"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ with pytest.raises(
|
| |
+ Exception,
|
| |
+ match=r"Invalid toddler configuration, no `pdc_active_branches` defined",
|
| |
+ ):
|
| |
+ assert toddler.process(config={}, message=msg) is None
|
| |
+
|
| |
+ def test_process_config_missing_distgit_url(self, toddler):
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.clean_retired_packages"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ config = {
|
| |
+ "pdc_active_branches": "https://pdc.fedoraproject.org/extras/active_branches.json"
|
| |
+ }
|
| |
+
|
| |
+ with pytest.raises(
|
| |
+ Exception,
|
| |
+ match=r"Invalid toddler configuration, no `dist_git_url` defined",
|
| |
+ ):
|
| |
+ assert toddler.process(config=config, message=msg) is None
|
| |
+
|
| |
+ def test_process_config_missing_distgit_token(self, toddler):
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.clean_retired_packages"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ config = {
|
| |
+ "pdc_active_branches": "https://pdc.fedoraproject.org/extras/active_branches.json",
|
| |
+ "dist_git_url": "https://src.fedoraproject.org/",
|
| |
+ }
|
| |
+
|
| |
+ with pytest.raises(
|
| |
+ Exception,
|
| |
+ match=r"Invalid toddler configuration, no `dist_git_token` defined",
|
| |
+ ):
|
| |
+ assert toddler.process(config=config, message=msg) is None
|
| |
+
|
| |
+ @patch("toddlers.plugins.clean_retired_packages.send_email")
|
| |
+ def test_process(self, send_email, toddler, caplog):
|
| |
+ pdc_branches = MagicMock()
|
| |
+ pdc_branches.json.return_value = {
|
| |
+ "flatpak": {
|
| |
+ "bluez-gnome": [["master", False], ["epel8", False], ["epel7", False]],
|
| |
+ },
|
| |
+ "rpm": {
|
| |
+ "trojan": [["master", True], ["f33", True], ["f32", True]],
|
| |
+ "pigment": [["master", False], ["epel8", True], ["epel7", True]],
|
| |
+ "bluez-gnome": [["master", False], ["epel8", False], ["epel7", False]],
|
| |
+ "guake": [["master", False], ["epel8", False], ["epel7", False]],
|
| |
+ },
|
| |
+ }
|
| |
+ distgit_info_bluez_gnome = MagicMock()
|
| |
+ distgit_info_bluez_gnome.json.return_value = {
|
| |
+ "user": {"name": "pingou"},
|
| |
+ "access_groups": {
|
| |
+ "admin": [],
|
| |
+ "collaborator": [],
|
| |
+ "commit": ["infra-sig"],
|
| |
+ "ticket": [],
|
| |
+ },
|
| |
+ "access_users": {
|
| |
+ "admin": [],
|
| |
+ "collaborator": [],
|
| |
+ "commit": ["ohaessler"],
|
| |
+ "owner": ["pingou"],
|
| |
+ "ticket": [],
|
| |
+ },
|
| |
+ }
|
| |
+ distgit_info_guake = MagicMock()
|
| |
+ distgit_info_guake.json.return_value = {
|
| |
+ "user": {"name": "orphan"},
|
| |
+ "access_groups": {
|
| |
+ "admin": [],
|
| |
+ "collaborator": [],
|
| |
+ "commit": [],
|
| |
+ "ticket": [],
|
| |
+ },
|
| |
+ "access_users": {
|
| |
+ "admin": ["orphan"],
|
| |
+ "collaborator": [],
|
| |
+ "commit": [],
|
| |
+ "owner": ["pingou"],
|
| |
+ "ticket": [],
|
| |
+ },
|
| |
+ }
|
| |
+
|
| |
+ toddler.requests_session.get.side_effect = (
|
| |
+ pdc_branches,
|
| |
+ distgit_info_bluez_gnome,
|
| |
+ distgit_info_guake,
|
| |
+ )
|
| |
+ toddler.requests_session.patch.return_value = MagicMock(ok=False)
|
| |
+ toddler.requests_session.post.return_value = MagicMock(ok=False)
|
| |
+
|
| |
+ msg = fedora_messaging.api.Message()
|
| |
+ msg.id = 123
|
| |
+ msg.topic = "org.fedoraproject.prod.toddlers.trigger.clean_retired_packages"
|
| |
+ msg.body = {"foo": "bar"}
|
| |
+
|
| |
+ config = {
|
| |
+ "pdc_active_branches": "https://pdc.fedoraproject.org/extras/active_branches.json",
|
| |
+ "dist_git_url": "https://src.fedoraproject.org/",
|
| |
+ "dist_git_token": "foobar",
|
| |
+ "admin_email": "admin@fp.o",
|
| |
+ "mail_server": "mail_server",
|
| |
+ }
|
| |
+
|
| |
+ assert toddler.process(config=config, message=msg) is None
|
| |
+ send_email.assert_called_with(
|
| |
+ to_addresses=["admin@fp.o"],
|
| |
+ from_address="admin@fp.o",
|
| |
+ subject="Toddlers cleaned up some retired packages",
|
| |
+ content="Dear Admin,\n\n"
|
| |
+ "The clean_retired_packages toddler just ran and adjusted some retired packages\n"
|
| |
+ "for recording purposes, here is what it did:\n"
|
| |
+ "- Orphaning rpms/bluez-gnome from pingou\n"
|
| |
+ "- Removing access on rpms/bluez-gnome to ohaessler\n"
|
| |
+ "- Removing access on rpms/bluez-gnome to pingou\n"
|
| |
+ "- Removing access on rpms/bluez-gnome to @infra-sig\n"
|
| |
+ "- Removing access on rpms/guake to pingou\n\n"
|
| |
+ "In case someone asks, you can come back to this email but there isn't really\n"
|
| |
+ "anything else to do with it.\n\n"
|
| |
+ "Have a wonderful day and see you (maybe?) at the next run!\n\n",
|
| |
+ mail_server="mail_server",
|
| |
+ )
|
| |
+ toddler.requests_session.patch.assert_called()
|
| |
+ toddler.requests_session.patch.assert_has_calls(
|
| |
+ calls=[
|
| |
+ call(
|
| |
+ "https://src.fedoraproject.org/api/0/rpms/bluez-gnome/git/modifyacls",
|
| |
+ data={"user_type": "user", "name": "ohaessler"},
|
| |
+ headers={"Authorization": "token foobar"},
|
| |
+ ),
|
| |
+ call(
|
| |
+ "https://src.fedoraproject.org/api/0/rpms/bluez-gnome/git/modifyacls",
|
| |
+ data={"user_type": "user", "name": "pingou"},
|
| |
+ headers={"Authorization": "token foobar"},
|
| |
+ ),
|
| |
+ call(
|
| |
+ "https://src.fedoraproject.org/api/0/rpms/bluez-gnome/git/modifyacls",
|
| |
+ data={"user_type": "group", "name": "infra-sig"},
|
| |
+ headers={"Authorization": "token foobar"},
|
| |
+ ),
|
| |
+ call(
|
| |
+ "https://src.fedoraproject.org/api/0/rpms/guake/git/modifyacls",
|
| |
+ data={"user_type": "user", "name": "pingou"},
|
| |
+ headers={"Authorization": "token foobar"},
|
| |
+ ),
|
| |
+ ]
|
| |
+ )
|
| |
+ toddler.requests_session.post.assert_called()
|
| |
+ toddler.requests_session.post.assert_has_calls(
|
| |
+ calls=[
|
| |
+ call(
|
| |
+ "https://src.fedoraproject.org/_dg/orphan/rpms/bluez-gnome",
|
| |
+ data={
|
| |
+ "orphan_reason": "other",
|
| |
+ "orphan_reason_info": "Package was retired before it was orphaned",
|
| |
+ },
|
| |
+ headers={"Authorization": "token foobar"},
|
| |
+ ),
|
| |
+ call(
|
| |
+ "https://src.fedoraproject.org/_dg/bzoverrides/rpms/bluez-gnome",
|
| |
+ data={"fedora_assignee": None, "epel_assignee": None},
|
| |
+ headers={"Authorization": "token foobar"},
|
| |
+ ),
|
| |
+ call(
|
| |
+ "https://src.fedoraproject.org/api/0/rpms/bluez-gnome/watchers/update",
|
| |
+ data={"status": -1, "watcher": "ohaessler"},
|
| |
+ headers={"Authorization": "token foobar"},
|
| |
+ ),
|
| |
+ call(
|
| |
+ "https://src.fedoraproject.org/api/0/rpms/bluez-gnome/watchers/update",
|
| |
+ data={"status": -1, "watcher": "pingou"},
|
| |
+ headers={"Authorization": "token foobar"},
|
| |
+ ),
|
| |
+ call(
|
| |
+ "https://src.fedoraproject.org/api/0/rpms/guake/watchers/update",
|
| |
+ data={"status": -1, "watcher": "pingou"},
|
| |
+ headers={"Authorization": "token foobar"},
|
| |
+ ),
|
| |
+ ]
|
| |
+ )
|
| |
This toddler ensures retired packages are properly orphaned and
have no (co)maintainers set to properly reflect in the dist-git's UI
that these packages are not maintained by anyone.
Fixes https://pagure.io/fedora-infrastructure/issue/8600
(which contains all the references to how we came to do this,
including link to the FESCo ticket approving this).
Signed-off-by: Pierre-Yves Chibon pingou@pingoured.fr