koji_block_retired: Make use of bodhi module

Signed-off-by: Lenka Segura <lsegura@redhat.com>
This commit is contained in:
Lenka Segura 2024-10-04 15:35:38 +02:00
parent be5fd23e09
commit a40d21de0d
2 changed files with 118 additions and 103 deletions

View file

@ -435,17 +435,21 @@ class TestProcessBlockRetired:
@patch("requests.get")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_tag_from_target")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_active_releases")
@patch("toddlers.plugins.koji_block_retired.bodhi.set_bodhi")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired._create_session")
def test_playtime_call_epel_not_blocked(
self,
mock_create_session,
mock_active,
mock_set_bodhi,
mock_tag,
mock_req,
caplog,
):
mock_active.return_value = ["epel9"]
mock_bodhi = MagicMock()
mock_bodhi.get_active_branches.return_value = [
"epel9",
]
mock_set_bodhi.return_value = mock_bodhi
mock_tag.return_value = "epel9"
caplog.set_level(logging.INFO)
message = MagicMock()
@ -467,6 +471,11 @@ class TestProcessBlockRetired:
mock_req.side_effect = req
config = MagicMock()
config = {
"dist_git_url": "https://src.fedoraproject.org",
"principal": "principal",
"keytab": "keytab",
}
self.toddler_cls.koji_session.listPackages.return_value = [
{
"blocked": False,
@ -488,17 +497,21 @@ class TestProcessBlockRetired:
@patch("requests.get")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_tag_from_target")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_active_releases")
@patch("toddlers.plugins.koji_block_retired.bodhi.set_bodhi")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired._create_session")
def test_playtime_call_epel_blocked(
self,
mock_create_session,
mock_active,
mock_set_bodhi,
mock_tag,
mock_req,
caplog,
):
mock_active.return_value = ["epel9"]
mock_bodhi = MagicMock()
mock_bodhi.get_active_branches.return_value = [
"epel9",
]
mock_set_bodhi.return_value = mock_bodhi
mock_tag.return_value = "epel9"
caplog.set_level(logging.INFO)
message = MagicMock()
@ -520,6 +533,11 @@ class TestProcessBlockRetired:
mock_req.side_effect = req
config = MagicMock()
config = {
"dist_git_url": "https://src.fedoraproject.org",
"principal": "principal",
"keytab": "keytab",
}
self.toddler_cls.koji_session.listPackages.return_value = [
{
"blocked": True,
@ -535,12 +553,16 @@ class TestProcessBlockRetired:
@patch("requests.get")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_tag_from_target")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_active_releases")
@patch("toddlers.plugins.koji_block_retired.bodhi.set_bodhi")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired._create_session")
def test_playtime_call_rawhide_blocked(
self, mock_create_session, mock_active, mock_rawhide, mock_req, caplog
self, mock_create_session, mock_set_bodhi, mock_rawhide, mock_req, caplog
):
mock_active.return_value = ["rawhide"]
mock_bodhi = MagicMock()
mock_bodhi.get_active_branches.return_value = [
"rawhide",
]
mock_set_bodhi.return_value = mock_bodhi
caplog.set_level(logging.INFO)
message = MagicMock()
message.topic = "toddlers.trigger.koji_block_retired"
@ -562,6 +584,11 @@ class TestProcessBlockRetired:
mock_req.side_effect = req
mock_rawhide.return_value = "f42"
config = MagicMock()
config = {
"dist_git_url": "https://src.fedoraproject.org",
"principal": "principal",
"keytab": "keytab",
}
self.toddler_cls.koji_session.listPackages.return_value = [
{
"blocked": True,
@ -576,12 +603,16 @@ class TestProcessBlockRetired:
@patch("requests.get")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_tag_from_target")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_active_releases")
@patch("toddlers.plugins.koji_block_retired.bodhi.set_bodhi")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired._create_session")
def test_playtime_call_rawhide_block_pkg_error(
self, mock_create_session, mock_active, mock_rawhide, mock_req, caplog
self, mock_create_session, mock_set_bodhi, mock_rawhide, mock_req, caplog
):
mock_active.return_value = ["rawhide"]
mock_bodhi = MagicMock()
mock_bodhi.get_active_branches.return_value = [
"rawhide",
]
mock_set_bodhi.return_value = mock_bodhi
caplog.set_level(logging.INFO)
message = MagicMock()
message.topic = "toddlers.trigger.koji_block_retired"
@ -603,6 +634,11 @@ class TestProcessBlockRetired:
mock_req.side_effect = req
mock_rawhide.return_value = "f42"
config = MagicMock()
config = {
"dist_git_url": "https://src.fedoraproject.org",
"principal": "principal",
"keytab": "keytab",
}
self.toddler_cls.koji_session.listPackages.return_value = [
{
"blocked": False,
@ -621,12 +657,16 @@ class TestProcessBlockRetired:
@patch("requests.get")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_tag_from_target")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_active_releases")
@patch("toddlers.plugins.koji_block_retired.bodhi.set_bodhi")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired._create_session")
def test_playtime_call_rawhide_list_pkg_error(
self, mock_create_session, mock_active, mock_rawhide, mock_req, caplog
self, mock_create_session, mock_set_bodhi, mock_rawhide, mock_req, caplog
):
mock_active.return_value = ["rawhide"]
mock_bodhi = MagicMock()
mock_bodhi.get_active_branches.return_value = [
"rawhide",
]
mock_set_bodhi.return_value = mock_bodhi
caplog.set_level(logging.INFO)
message = MagicMock()
message.topic = "toddlers.trigger.koji_block_retired"
@ -648,6 +688,11 @@ class TestProcessBlockRetired:
mock_req.side_effect = req
mock_rawhide.return_value = "f42"
config = MagicMock()
config = {
"dist_git_url": "https://src.fedoraproject.org",
"principal": "principal",
"keytab": "keytab",
}
self.toddler_cls.koji_session.listPackages.side_effect = koji.GenericError(
"fail"
)
@ -662,12 +707,16 @@ class TestProcessBlockRetired:
@patch("requests.get")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_tag_from_target")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired.get_active_releases")
@patch("toddlers.plugins.koji_block_retired.bodhi.set_bodhi")
@patch("toddlers.plugins.koji_block_retired.KojiBlockRetired._create_session")
def test_playtime_call_rawhide_not_blocked(
self, mock_create_session, mock_active, mock_rawhide, mock_req, caplog
self, mock_create_session, mock_set_bodhi, mock_rawhide, mock_req, caplog
):
mock_active.return_value = ["rawhide"]
mock_bodhi = MagicMock()
mock_bodhi.get_active_branches.return_value = [
"rawhide",
]
mock_set_bodhi.return_value = mock_bodhi
caplog.set_level(logging.INFO)
message = MagicMock()
message.topic = "toddlers.trigger.koji_block_retired"
@ -689,6 +738,12 @@ class TestProcessBlockRetired:
mock_req.side_effect = req
mock_rawhide.return_value = "f42"
config = MagicMock()
config = {
"dist_git_url": "https://src.fedoraproject.org",
"principal": "principal",
"keytab": "keytab",
}
self.toddler_cls.koji_session.listPackages.return_value = [
{
"blocked": False,
@ -703,73 +758,34 @@ class TestProcessBlockRetired:
taginfo="f42", pkginfo="fedora_pkg"
)
@patch("requests.get")
def test_get_active_releases(self, mock_req, caplog):
mock_response = MagicMock()
mock_response.status_code = 200
mock_response.json.return_value = {
"releases": [
{
"name": "epel9",
"branch": "epel9",
},
{
"name": "f42",
"branch": "f42",
},
{
"name": "f41",
"branch": "f41",
},
{
"name": "epel10",
"branch": "epel10",
},
{
"name": "f39",
"branch": "f39",
},
{
"name": "epel8",
"branch": "epel8",
},
]
}
def req(*args, **kwargs):
if (
args[0]
== "https://bodhi.fedoraproject.org/releases?exclude_archived=true"
):
return mock_response
mock_req.side_effect = req
assert self.toddler_cls.get_active_releases() == [
def test_adjust_releases_for_lookaside(self):
releases = ["epel8", "epel9", "epel10", "f40", "f41", "f42"]
assert self.toddler_cls.adjust_releases_for_lookaside(releases) == [
"epel10",
"epel8",
"epel9",
"f39",
"f40",
"f41",
"rawhide",
]
@patch("requests.get")
def test_get_active_releases_error(self, mock_req, caplog):
mock_response = MagicMock()
def req(*args, **kwargs):
if (
args[0]
== "https://bodhi.fedoraproject.org/releases?exclude_archived=true"
):
return mock_response
mock_response.status_code = 404
mock_response.ok = False
mock_req.side_effect = req
assert self.toddler_cls.get_active_releases() is None
assert (
caplog.records[-1].message
== "Unable to retrieve active releases from Bodhi."
)
# @patch("requests.get")
# def test_get_active_releases_error(self, mock_req, caplog):
# mock_response = MagicMock()
#
# def req(*args, **kwargs):
# if (
# args[0]
# == "https://bodhi.fedoraproject.org/releases?exclude_archived=true"
# ):
# return mock_response
#
# mock_response.status_code = 404
# mock_response.ok = False
# mock_req.side_effect = req
# assert self.toddler_cls.get_active_releases() is None
# assert (
# caplog.records[-1].message
# == "Unable to retrieve active releases from Bodhi."
# )
#

View file

@ -17,7 +17,8 @@ import koji
import requests
import toml
from ..base import ToddlerBase
from toddlers.base import ToddlerBase
from toddlers.utils import bodhi
_log = logging.getLogger(__name__)
@ -40,6 +41,7 @@ class KojiBlockRetired(ToddlerBase):
self.koji_url = None
self.koji_principal = None
self.koji_keytab = None
self.bodhi = None
def accepts_topic(self, topic):
"""Returns a boolean whether this toddler is interested in messages
@ -69,30 +71,25 @@ class KojiBlockRetired(ToddlerBase):
_log.exception(f"Failed to get {branch} tag in koji: {e}")
return None
def get_active_releases(self):
releases = []
url = "https://bodhi.fedoraproject.org/releases?exclude_archived=true"
resp = requests.get(url)
if not resp.ok:
_log.error("Unable to retrieve active releases from Bodhi.")
return None
response = resp.json()
for b in response["releases"]:
if re.match(r"^(f|epel)\d{1,2}$", b["branch"]):
releases.append(b["branch"])
def adjust_releases_for_lookaside(self, releases):
releases = list(set(releases)) # Let's remove duplicates
# Remove the highest value, which should be the rawhide
releases.remove(max(releases))
# And add rawhide instead
releases.append("rawhide")
if any(re.match(r"^f\d{2,}$", regex) for regex in releases):
# Remove the highest value, which should be the rawhide
releases.remove(max(releases))
# And add rawhide instead
releases.append("rawhide")
releases.sort()
return releases
def find_and_block(self):
active_releases = self.get_active_releases()
base_url = "https://src.fedoraproject.org/lookaside"
def find_and_block(self, config):
self.bodhi = bodhi.set_bodhi(config)
active_releases = self.bodhi.get_active_branches()
adjusted = self.adjust_releases_for_lookaside(active_releases)
print(adjusted)
base_url = f"{config['dist_git_url']}/lookaside"
print(base_url)
needs_blocking = defaultdict(list)
for active_release in active_releases:
for active_release in adjusted:
retired_url = f"{base_url}/retired_in_{active_release}.json"
response = requests.get(retired_url)
packages = response.json()[active_release]
@ -139,14 +136,16 @@ class KojiBlockRetired(ToddlerBase):
msg = message.body
header = message._headers
self.koji_url = f"{config['koji_url']}/kojihub"
self.config = config
self.koji_url = f"{self.config}/kojihub"
self.principal = config["principal"]
self.keytab = config["keytab"]
if topic.endswith("toddlers.trigger.koji_block_retired"):
if self.koji_session is None:
self._create_session() # pragma: no cover
self.find_and_block()
self.find_and_block(config)
if topic.endswith("git.receive"):
# If there is no dead.package file in commit, then it can be ignored