1017 lines
37 KiB
Python
1017 lines
37 KiB
Python
import logging
|
|
from unittest.mock import ANY, call, MagicMock, Mock, patch
|
|
|
|
import beanbag.bbexcept
|
|
import fedora_messaging.api
|
|
import pytest
|
|
|
|
import toddlers.plugins.pdc_import_compose
|
|
|
|
|
|
APACHE_FILE_LIST = """
|
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
|
<html>
|
|
<head>
|
|
<title>Index of /compose/rawhide/Fedora-Rawhide-20200715.n.2/compose/metadata</title>
|
|
</head>
|
|
<body>
|
|
<h1>Index of /compose/rawhide/Fedora-Rawhide-20200715.n.2/compose/metadata</h1>
|
|
<pre><img src="/icons/blank.gif" alt="Icon "> <a href="?C=N;O=D">Name</a> <a href="?C=M;O=A">Last modified</a> <a href="?C=S;O=A">Size</a> <a href="?C=D;O=A">Description</a>
|
|
<hr><img src="/icons/back.gif" alt="[PARENTDIR]"> <a href="/compose/rawhide/Fedora-Rawhide-20200715.n.2/compose/">Parent Directory</a> -
|
|
<img src="/icons/unknown.gif" alt="[ ]"> <a href="composeinfo.json">composeinfo.json</a> 2020-07-16 03:40 15K
|
|
<img src="/icons/unknown.gif" alt="[ ]"> <a href="images.json">images.json</a> 2020-07-16 03:40 39K
|
|
<img src="/icons/unknown.gif" alt="[ ]"> <a href="modules.json">modules.json</a> 2020-07-16 00:42 1.4M
|
|
<img src="/icons/unknown.gif" alt="[ ]"> <a href="rpms.json">rpms.json</a> 2020-07-16 00:17 168M
|
|
<img src="/icons/unknown.gif" alt="[ ]"> <a>invalid</a> 2020-07-16 00:18 0M
|
|
<hr></pre>
|
|
</body></html>
|
|
""" # noqa: E501
|
|
|
|
|
|
class TestPDCImportComposeToddler:
|
|
toddler_cls = toddlers.plugins.pdc_import_compose.PDCImportCompose
|
|
|
|
def test_accepts_topic_invalid(self, toddler):
|
|
assert toddler.accepts_topic("foo.bar") is False
|
|
|
|
@pytest.mark.parametrize(
|
|
"topic",
|
|
[
|
|
"org.fedoraproject.*.toddlers.trigger.pdc_import_compose",
|
|
"org.fedoraproject.prod.toddlers.trigger.pdc_import_compose",
|
|
"org.fedoraproject.stg.toddlers.trigger.pdc_import_compose",
|
|
"org.fedoraproject.*.pungi.compose.status.change",
|
|
"org.fedoraproject.prod.pungi.compose.status.change",
|
|
"org.fedoraproject.stg.pungi.compose.status.change",
|
|
],
|
|
)
|
|
def test_accepts_topic_valid(self, topic, toddler):
|
|
assert toddler.accepts_topic(topic)
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._process_all_composes")
|
|
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
|
|
def test_process_full_dist_git(self, pdc, process_dg, toddler):
|
|
client = Mock()
|
|
pdc.return_value = client
|
|
|
|
msg = fedora_messaging.api.Message()
|
|
msg.id = 123
|
|
msg.topic = "org.fedoraproject.prod.toddlers.trigger.pdc_retired_packages"
|
|
msg.body = {}
|
|
|
|
toddler.process({"config": "foobar"}, msg)
|
|
|
|
process_dg.assert_called_once_with({"config": "foobar"}, client)
|
|
|
|
@patch(
|
|
"toddlers.plugins.pdc_import_compose.PDCImportCompose._process_single_compose"
|
|
)
|
|
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
|
|
def test_process_single_package(self, pdc, process_dg, toddler):
|
|
client = Mock()
|
|
pdc.return_value = client
|
|
|
|
msg = fedora_messaging.api.Message()
|
|
msg.id = 123
|
|
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
|
|
msg.body = {}
|
|
|
|
toddler.process({"config": "foobar"}, msg)
|
|
|
|
process_dg.assert_called_once_with({"config": "foobar"}, client, msg)
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
|
|
@patch("toddlers.plugins.pdc_import_compose._old_composes")
|
|
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
|
|
def test__process_all_composes(self, pdc, old_composes, import_compose, toddler):
|
|
client = Mock()
|
|
pdc.return_value = client
|
|
|
|
old_composes.return_value = [
|
|
("branch", 42, "https://kojipkgs.../42"),
|
|
("branch", 123, "https://kojipkgs.../123"),
|
|
]
|
|
|
|
msg = fedora_messaging.api.Message()
|
|
msg.id = 123
|
|
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
|
|
msg.body = {}
|
|
|
|
toddler._process_all_composes(
|
|
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"}, client
|
|
)
|
|
old_composes.assert_called_once_with(
|
|
"https://kojipkgs.fedoraproject.org/compose/"
|
|
)
|
|
import_compose.assert_has_calls(
|
|
calls=[
|
|
call(client, 42, "https://kojipkgs.../42"),
|
|
call(client, 123, "https://kojipkgs.../123"),
|
|
]
|
|
)
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
|
|
@patch("toddlers.plugins.pdc_import_compose._old_composes")
|
|
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
|
|
def test__process_all_composes_fail(
|
|
self, pdc, old_composes, import_compose, caplog, toddler
|
|
):
|
|
caplog.set_level(logging.DEBUG)
|
|
client = Mock()
|
|
pdc.return_value = client
|
|
import_compose.side_effect = Exception("A generic error")
|
|
|
|
old_composes.return_value = [
|
|
("branch", 42, "https://kojipkgs.../42"),
|
|
("branch", 123, "https://kojipkgs.../123"),
|
|
]
|
|
|
|
msg = fedora_messaging.api.Message()
|
|
msg.id = 123
|
|
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
|
|
msg.body = {}
|
|
|
|
toddler._process_all_composes(
|
|
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"}, client
|
|
)
|
|
old_composes.assert_called_once_with(
|
|
"https://kojipkgs.fedoraproject.org/compose/"
|
|
)
|
|
import_compose.assert_has_calls(
|
|
calls=[
|
|
call(client, 42, "https://kojipkgs.../42"),
|
|
call(client, 123, "https://kojipkgs.../123"),
|
|
]
|
|
)
|
|
|
|
assert len(caplog.records) == 3
|
|
assert (
|
|
caplog.records[-1].message == "Failed to import 'https://kojipkgs.../123'"
|
|
)
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
|
|
@patch("toddlers.plugins.pdc_import_compose._old_composes")
|
|
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
|
|
def test__process_all_composes_fail_request(
|
|
self, pdc, old_composes, import_compose, caplog, toddler
|
|
):
|
|
caplog.set_level(logging.DEBUG)
|
|
client = Mock()
|
|
pdc.return_value = client
|
|
|
|
response = Mock()
|
|
response.url = "https://kojipkgs/..../42"
|
|
response.text = "AHAH"
|
|
error = beanbag.bbexcept.BeanBagException(
|
|
response, msg="Failed to query resource"
|
|
)
|
|
import_compose.side_effect = error
|
|
|
|
old_composes.return_value = [
|
|
("branch", 42, "https://kojipkgs.../42"),
|
|
("branch", 123, "https://kojipkgs.../123"),
|
|
]
|
|
|
|
msg = fedora_messaging.api.Message()
|
|
msg.id = 123
|
|
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
|
|
msg.body = {}
|
|
|
|
toddler._process_all_composes(
|
|
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"}, client
|
|
)
|
|
old_composes.assert_called_once_with(
|
|
"https://kojipkgs.fedoraproject.org/compose/"
|
|
)
|
|
import_compose.assert_has_calls(
|
|
calls=[
|
|
call(client, 42, "https://kojipkgs.../42"),
|
|
call(client, 123, "https://kojipkgs.../123"),
|
|
]
|
|
)
|
|
|
|
assert len(caplog.records) == 9
|
|
assert caplog.records[-3].message == "Failed to query resource"
|
|
assert caplog.records[-2].message == "https://kojipkgs/..../42"
|
|
assert caplog.records[-1].message == "AHAH"
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
|
|
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
|
|
def test__process_single_compose_invalid_status(
|
|
self, pdc, import_compose, caplog, toddler
|
|
):
|
|
caplog.set_level(logging.INFO)
|
|
client = Mock()
|
|
pdc.return_value = client
|
|
|
|
msg = fedora_messaging.api.Message()
|
|
msg.id = 123
|
|
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
|
|
msg.body = {"status": "INVALID"}
|
|
|
|
toddler._process_single_compose(
|
|
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"},
|
|
pdc,
|
|
msg,
|
|
)
|
|
|
|
import_compose.assert_not_called()
|
|
assert len(caplog.records) == 1
|
|
assert (
|
|
caplog.records[-1].message
|
|
== "The compose that finished isn't in a state we care: INVALID, bailing"
|
|
)
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
|
|
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
|
|
def test__process_single_compose_invalid_location(
|
|
self, pdc, import_compose, caplog, toddler
|
|
):
|
|
caplog.set_level(logging.INFO)
|
|
client = Mock()
|
|
pdc.return_value = client
|
|
|
|
msg = fedora_messaging.api.Message()
|
|
msg.id = 123
|
|
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
|
|
msg.body = {
|
|
"status": "FINISHED",
|
|
"compose_id": 42,
|
|
"location": "/mnt/koji/compose/rawhide/42/compose",
|
|
}
|
|
|
|
toddler._process_single_compose(
|
|
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"},
|
|
pdc,
|
|
msg,
|
|
)
|
|
|
|
import_compose.assert_not_called()
|
|
assert len(caplog.records) == 1
|
|
assert (
|
|
caplog.records[-1].message
|
|
== "The compose: 42 has nt/koji/compose/rawhide/42 for location while it must "
|
|
"be an actual url for us to deal with it, bailing"
|
|
)
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.PDCImportCompose._import_compose")
|
|
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
|
|
def test__process_single_compose(self, pdc, import_compose, toddler):
|
|
client = Mock()
|
|
pdc.return_value = client
|
|
|
|
msg = fedora_messaging.api.Message()
|
|
msg.id = 123
|
|
msg.topic = "org.fedoraproject.prod.pungi.compose.status.change"
|
|
msg.body = {
|
|
"status": "FINISHED",
|
|
"compose_id": 42,
|
|
"location": "http://kojipkgs.fedoraproject.org/compose/rawhide/42/compose",
|
|
}
|
|
|
|
toddler._process_single_compose(
|
|
{"old_composes_url": "https://kojipkgs.fedoraproject.org/compose/"},
|
|
pdc,
|
|
msg,
|
|
)
|
|
|
|
import_compose.assert_called_once_with(
|
|
pdc, 42, "http://kojipkgs.fedoraproject.org/compose/rawhide/42"
|
|
)
|
|
|
|
def test__import_compose_failed_to_retrieve_composeinfo(self, caplog, toddler):
|
|
caplog.set_level(logging.INFO)
|
|
req = Mock()
|
|
resp = Mock()
|
|
resp.ok = False
|
|
resp.status_code = 404
|
|
req.get.return_value = resp
|
|
toddler.requests_session.get.return_value = resp
|
|
|
|
toddler._import_compose(
|
|
Mock(),
|
|
"Fedora-Rawhide-20200715.n.2",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2",
|
|
)
|
|
assert len(caplog.records) == 1
|
|
assert (
|
|
caplog.records[-1].message
|
|
== "Failed to get https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose/metadata/composeinfo.json: 404"
|
|
)
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.compose_exists")
|
|
def test__import_compose_compose_exists(self, compose_exists, caplog, toddler):
|
|
caplog.set_level(logging.INFO)
|
|
req = Mock()
|
|
resp = Mock()
|
|
resp.ok = True
|
|
resp.json.return_value = {
|
|
"payload": {"compose": {"id": "Fedora-Rawhide-20200715.n.2"}}
|
|
}
|
|
req.get.return_value = resp
|
|
toddler.requests_session = req
|
|
compose_exists.return_value = True
|
|
|
|
toddler._import_compose(
|
|
Mock(),
|
|
"Fedora-Rawhide-20200715.n.2",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2",
|
|
)
|
|
assert len(caplog.records) == 2
|
|
assert (
|
|
caplog.records[-1].message
|
|
== "'Fedora-Rawhide-20200715.n.2' already exists in PDC."
|
|
)
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.compose_exists")
|
|
def test__import_compose_failed_to_retrieve_images(
|
|
self, compose_exists, caplog, toddler
|
|
):
|
|
caplog.set_level(logging.INFO)
|
|
req = Mock()
|
|
resp_composeinfo = Mock()
|
|
resp_composeinfo.ok = True
|
|
resp_composeinfo.json.return_value = {
|
|
"payload": {"compose": {"id": "Fedora-Rawhide-20200715.n.2"}}
|
|
}
|
|
resp_images = Mock()
|
|
resp_images.ok = False
|
|
resp_images.status_code = 404
|
|
req.get.side_effect = (resp_composeinfo, resp_images)
|
|
toddler.requests_session = req
|
|
compose_exists.return_value = False
|
|
|
|
toddler._import_compose(
|
|
Mock(),
|
|
"Fedora-Rawhide-20200715.n.2",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2",
|
|
)
|
|
assert len(caplog.records) == 2
|
|
assert (
|
|
caplog.records[-1].message
|
|
== "Failed to get https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose/metadata/images.json: 404"
|
|
)
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.compose_exists")
|
|
def test__import_compose_failed_to_retrieve_rpms(
|
|
self, compose_exists, caplog, toddler
|
|
):
|
|
caplog.set_level(logging.INFO)
|
|
req = Mock()
|
|
resp_composeinfo = Mock()
|
|
resp_composeinfo.ok = True
|
|
resp_composeinfo.json.return_value = {
|
|
"payload": {"compose": {"id": "Fedora-Rawhide-20200715.n.2"}}
|
|
}
|
|
resp_images = Mock()
|
|
resp_images.ok = True
|
|
resp_images.json.return_value = {"foor": "bar"}
|
|
resp_rpms = Mock()
|
|
resp_rpms.ok = False
|
|
resp_rpms.status_code = 500
|
|
req.get.side_effect = (resp_composeinfo, resp_images, resp_rpms)
|
|
toddler.requests_session = req
|
|
compose_exists.return_value = False
|
|
|
|
toddler._import_compose(
|
|
Mock(),
|
|
"Fedora-Rawhide-20200715.n.2",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2",
|
|
)
|
|
assert len(caplog.records) == 2
|
|
assert (
|
|
caplog.records[-1].message
|
|
== "Failed to get https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose/metadata/rpms.json: 500"
|
|
)
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.ensure_release_exists")
|
|
@patch("toddlers.plugins.pdc_import_compose.compose_exists")
|
|
def test__import_compose(
|
|
self, compose_exists, ensure_release_exists, caplog, toddler
|
|
):
|
|
caplog.set_level(logging.INFO)
|
|
req = Mock()
|
|
resp_composeinfo = Mock()
|
|
resp_composeinfo.ok = True
|
|
resp_composeinfo.json.return_value = {
|
|
"payload": {
|
|
"compose": {"id": "Fedora-Rawhide-20200715.n.2"},
|
|
"release": {
|
|
"internal": False,
|
|
"name": "Fedora",
|
|
"short": "Fedora",
|
|
"type": "ga",
|
|
"version": "Rawhide",
|
|
},
|
|
}
|
|
}
|
|
resp_images = Mock()
|
|
resp_images.ok = True
|
|
resp_images.json.return_value = {"foor": "bar"}
|
|
resp_rpms = Mock()
|
|
resp_rpms.ok = True
|
|
resp_rpms.json.return_value = {"foo": "bar"}
|
|
req.get.side_effect = (resp_composeinfo, resp_images, resp_rpms)
|
|
toddler.requests_session = req
|
|
compose_exists.return_value = False
|
|
|
|
pdc = MagicMock()
|
|
|
|
toddler._import_compose(
|
|
pdc,
|
|
"Fedora-Rawhide-20200715.n.2",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2",
|
|
)
|
|
ensure_release_exists.assert_called_once_with(
|
|
pdc,
|
|
"fedora-Rawhide",
|
|
{
|
|
"name": "Fedora",
|
|
"short": "fedora",
|
|
"version": "Rawhide",
|
|
"release_type": "ga",
|
|
},
|
|
)
|
|
|
|
# They are not actually called twice, this is a side-effect of using Mock/MagicMock
|
|
pdc["compose-images"]._.assert_has_calls(
|
|
calls=[
|
|
call(
|
|
{
|
|
"release_id": "fedora-Rawhide",
|
|
"composeinfo": {
|
|
"payload": {
|
|
"compose": {"id": "Fedora-Rawhide-20200715.n.2"},
|
|
"release": {
|
|
"internal": False,
|
|
"name": "Fedora",
|
|
"short": "fedora",
|
|
"type": "ga",
|
|
"version": "Rawhide",
|
|
},
|
|
}
|
|
},
|
|
"image_manifest": {"foor": "bar"},
|
|
}
|
|
),
|
|
call(
|
|
{
|
|
"release_id": "fedora-Rawhide",
|
|
"composeinfo": {
|
|
"payload": {
|
|
"compose": {"id": "Fedora-Rawhide-20200715.n.2"},
|
|
"release": {
|
|
"internal": False,
|
|
"name": "Fedora",
|
|
"short": "fedora",
|
|
"type": "ga",
|
|
"version": "Rawhide",
|
|
},
|
|
}
|
|
},
|
|
"rpm_manifest": {"foo": "bar"},
|
|
}
|
|
),
|
|
]
|
|
)
|
|
pdc["compose-rpms"]._.assert_has_calls(
|
|
calls=[
|
|
call(
|
|
{
|
|
"release_id": "fedora-Rawhide",
|
|
"composeinfo": {
|
|
"payload": {
|
|
"compose": {"id": "Fedora-Rawhide-20200715.n.2"},
|
|
"release": {
|
|
"internal": False,
|
|
"name": "Fedora",
|
|
"short": "fedora",
|
|
"type": "ga",
|
|
"version": "Rawhide",
|
|
},
|
|
}
|
|
},
|
|
"image_manifest": {"foor": "bar"},
|
|
}
|
|
),
|
|
call(
|
|
{
|
|
"release_id": "fedora-Rawhide",
|
|
"composeinfo": {
|
|
"payload": {
|
|
"compose": {"id": "Fedora-Rawhide-20200715.n.2"},
|
|
"release": {
|
|
"internal": False,
|
|
"name": "Fedora",
|
|
"short": "fedora",
|
|
"type": "ga",
|
|
"version": "Rawhide",
|
|
},
|
|
}
|
|
},
|
|
"rpm_manifest": {"foo": "bar"},
|
|
}
|
|
),
|
|
]
|
|
)
|
|
assert len(caplog.records) == 2
|
|
assert (
|
|
caplog.records[-2].message
|
|
== "Importing compose 'Fedora-Rawhide-20200715.n.2'"
|
|
)
|
|
assert caplog.records[-1].message == "Import done."
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose.ensure_release_exists")
|
|
@patch("toddlers.plugins.pdc_import_compose.compose_exists")
|
|
def test__import_compose_no_rpms(
|
|
self, compose_exists, ensure_release_exists, caplog, toddler
|
|
):
|
|
caplog.set_level(logging.INFO)
|
|
req = Mock()
|
|
resp_composeinfo = Mock()
|
|
resp_composeinfo.ok = True
|
|
resp_composeinfo.json.return_value = {
|
|
"payload": {
|
|
"compose": {"id": "Fedora-32-20200715.n.2"},
|
|
"release": {
|
|
"internal": False,
|
|
"name": "Fedora",
|
|
"short": "Fedora",
|
|
"type": "updates-testing",
|
|
"version": "32",
|
|
},
|
|
}
|
|
}
|
|
resp_images = Mock()
|
|
resp_images.ok = True
|
|
resp_images.json.return_value = {"foor": "bar"}
|
|
resp_rpms = Mock()
|
|
resp_rpms.ok = False
|
|
resp_rpms.status_code = 404
|
|
req.get.side_effect = (resp_composeinfo, resp_images, resp_rpms)
|
|
toddler.requests_session = req
|
|
compose_exists.return_value = False
|
|
|
|
pdc = MagicMock()
|
|
|
|
toddler._import_compose(
|
|
pdc,
|
|
"Fedora-32-20200715.n.2",
|
|
"https://kojipkgs.fedoraproject.org/compose/32/Fedora-32-20200715.n.2",
|
|
)
|
|
ensure_release_exists.assert_called_once_with(
|
|
pdc,
|
|
"fedora-32-updates-testing",
|
|
{
|
|
"name": "Fedora",
|
|
"short": "fedora",
|
|
"version": "32",
|
|
"release_type": "updates-testing",
|
|
},
|
|
)
|
|
|
|
pdc["compose-images"]._.assert_called_once_with(
|
|
{
|
|
"release_id": "fedora-32-updates-testing",
|
|
"composeinfo": {
|
|
"payload": {
|
|
"compose": {"id": "Fedora-32-20200715.n.2"},
|
|
"release": {
|
|
"internal": False,
|
|
"name": "Fedora",
|
|
"short": "fedora",
|
|
"type": "updates-testing",
|
|
"version": "32",
|
|
},
|
|
}
|
|
},
|
|
"image_manifest": {"foor": "bar"},
|
|
}
|
|
)
|
|
# It's not actually called, this is a side-effect of using Mock/MagicMock
|
|
pdc["compose-rpms"]._.assert_called_once_with(
|
|
{
|
|
"release_id": "fedora-32-updates-testing",
|
|
"composeinfo": {
|
|
"payload": {
|
|
"compose": {"id": "Fedora-32-20200715.n.2"},
|
|
"release": {
|
|
"internal": False,
|
|
"name": "Fedora",
|
|
"short": "fedora",
|
|
"type": "updates-testing",
|
|
"version": "32",
|
|
},
|
|
}
|
|
},
|
|
"image_manifest": {"foor": "bar"},
|
|
}
|
|
)
|
|
assert len(caplog.records) == 3
|
|
assert (
|
|
caplog.records[-2].message
|
|
== "Found no rpms.json file at 'https://kojipkgs.fedoraproject.org/compose/"
|
|
"32/Fedora-32-20200715.n.2/compose/metadata/rpms.json'"
|
|
)
|
|
assert caplog.records[-1].message == "Import done."
|
|
|
|
def test__scrape_links_failed(self, caplog):
|
|
caplog.set_level(logging.DEBUG)
|
|
session = Mock()
|
|
resp = Mock()
|
|
resp.ok = False
|
|
resp.status_code = 500
|
|
session.get.return_value = resp
|
|
|
|
output = list(
|
|
toddlers.plugins.pdc_import_compose._scrape_links(
|
|
session=session,
|
|
url="https://kojipkgs.fedoraproject.org/..",
|
|
)
|
|
)
|
|
assert (
|
|
caplog.records[-1].message
|
|
== "Couldn't talk to 'https://kojipkgs.fedoraproject.org/..', 500"
|
|
)
|
|
assert output == []
|
|
|
|
def test__scrape_links(self, caplog):
|
|
caplog.set_level(logging.DEBUG)
|
|
session = Mock()
|
|
resp = Mock()
|
|
resp.ok = True
|
|
resp.text = APACHE_FILE_LIST
|
|
session.get.return_value = resp
|
|
|
|
output = list(
|
|
toddlers.plugins.pdc_import_compose._scrape_links(
|
|
session=session,
|
|
url="https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose/metadata",
|
|
)
|
|
)
|
|
assert (
|
|
caplog.records[-1].message
|
|
== "Scraping https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose/metadata"
|
|
)
|
|
assert output == [
|
|
(
|
|
"Parent Directory",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose/metadata/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose",
|
|
),
|
|
(
|
|
"composeinfo.json",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose/metadata/composeinfo.json",
|
|
),
|
|
(
|
|
"images.json",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose/metadata/images.json",
|
|
),
|
|
(
|
|
"modules.json",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose/metadata/modules.json",
|
|
),
|
|
(
|
|
"rpms.json",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/compose/metadata/rpms.json",
|
|
),
|
|
]
|
|
|
|
@patch("toddlers.plugins.pdc_import_compose._scrape_links")
|
|
@patch("toddlers.plugins.pdc_import_compose.make_session")
|
|
def test__old_composes(self, make_sess, scrape_links, caplog):
|
|
caplog.set_level(logging.DEBUG)
|
|
|
|
scrape_links.side_effect = (
|
|
(
|
|
["F31", "https://kojipkgs.fedoraproject.org/compose/F31"],
|
|
["F32", "https://kojipkgs.fedoraproject.org/compose/F32"],
|
|
["rawhide", "https://kojipkgs.fedoraproject.org/compose/rawhide"],
|
|
),
|
|
(
|
|
[
|
|
"Parent Directory",
|
|
"https://kojipkgs.fedoraproject.org/compose/F31/",
|
|
],
|
|
[
|
|
"Fedora-31-20190715.n.1/",
|
|
"https://kojipkgs.fedoraproject.org/compose/F31/Fedora-31-20190715.n.1/",
|
|
],
|
|
),
|
|
(
|
|
[
|
|
"Parent Directory",
|
|
"https://kojipkgs.fedoraproject.org/compose/F32/",
|
|
],
|
|
[
|
|
"Fedora-Rawhide-20200715.n.1/",
|
|
"https://kojipkgs.fedoraproject.org/compose/F32/Fedora-32-20200715.n.1/",
|
|
],
|
|
[
|
|
"Fedora-Rawhide-20200715.n.2/",
|
|
"https://kojipkgs.fedoraproject.org/compose/F32/Fedora-32-20200715.n.2/",
|
|
],
|
|
),
|
|
(
|
|
[
|
|
"Parent Directory",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/",
|
|
],
|
|
[
|
|
"Fedora-Rawhide-20200715.n.1",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.1/",
|
|
],
|
|
[
|
|
"Fedora-Rawhide-20200715.n.2",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-"
|
|
"Rawhide-20200715.n.2/",
|
|
],
|
|
[
|
|
"latest-Fedora-Rawhide",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/latest-Fedora-Rawhide/",
|
|
],
|
|
),
|
|
)
|
|
|
|
req = Mock()
|
|
resp = Mock()
|
|
resp.ok = True
|
|
resp.text = "FINISHED"
|
|
resp_not_ok = Mock()
|
|
resp_not_ok.ok = False
|
|
resp_not_done = Mock()
|
|
resp_not_done.ok = True
|
|
resp_not_done.text = "ONGOING"
|
|
req.get.side_effect = (
|
|
resp, # F31
|
|
resp_not_ok,
|
|
resp,
|
|
resp, # F32
|
|
resp_not_ok,
|
|
resp,
|
|
resp_not_done, # rawhide
|
|
)
|
|
req.head.side_effect = (
|
|
resp,
|
|
resp_not_ok,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp, # F31
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp, # F32
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp,
|
|
resp, # rawhide
|
|
)
|
|
make_sess.return_value = req
|
|
|
|
output = list(
|
|
toddlers.plugins.pdc_import_compose._old_composes(
|
|
"https://kojipkgs.fedoraproject.org/compose/"
|
|
)
|
|
)
|
|
assert output == [
|
|
(
|
|
"F31",
|
|
"Fedora-31-20190715.n.1/",
|
|
"https://kojipkgs.fedoraproject.org/compose/F31/Fedora-31-20190715.n.1/",
|
|
),
|
|
(
|
|
"F32",
|
|
"Fedora-Rawhide-20200715.n.1/",
|
|
"https://kojipkgs.fedoraproject.org/compose/F32/Fedora-32-20200715.n.1/",
|
|
),
|
|
(
|
|
"F32",
|
|
"Fedora-Rawhide-20200715.n.2/",
|
|
"https://kojipkgs.fedoraproject.org/compose/F32/Fedora-32-20200715.n.2/",
|
|
),
|
|
(
|
|
"rawhide",
|
|
"Fedora-Rawhide-20200715.n.1",
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.1/",
|
|
),
|
|
]
|
|
|
|
assert (
|
|
"Looking for old composes at: https://kojipkgs.fedoraproject.org/compose/"
|
|
in caplog.text
|
|
)
|
|
assert (
|
|
"Skipping https://kojipkgs.fedoraproject.org/compose/rawhide/"
|
|
"latest-Fedora-Rawhide/. Just a symlink." in caplog.text
|
|
)
|
|
assert (
|
|
"Bailing, could not retrieve the STATUS file at: "
|
|
"https://kojipkgs.fedoraproject.org/compose/F32/" in caplog.text
|
|
)
|
|
assert (
|
|
"Bailing, STATUS is not final at: "
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/Fedora-Rawhide-20200715.n.2/"
|
|
in caplog.text
|
|
)
|
|
assert (
|
|
"Bailing, could not retrieve the STATUS file at: "
|
|
"https://kojipkgs.fedoraproject.org/compose/rawhide/" in caplog.text
|
|
)
|
|
|
|
def test_compose_exists_failed(self, caplog):
|
|
caplog.set_level(logging.DEBUG)
|
|
pdc = MagicMock()
|
|
resp = Mock()
|
|
resp.status_code = 500
|
|
pdc["composes"]["compose-id"]._.side_effect = beanbag.bbexcept.BeanBagException(
|
|
msg="Failed to do something", response=resp
|
|
)
|
|
|
|
assert (
|
|
toddlers.plugins.pdc_import_compose.compose_exists(pdc, "compose-id")
|
|
is False
|
|
)
|
|
assert caplog.records[-1].message.startswith(
|
|
"Failed to check if the compose compose-id exists: Failed to do something - response:"
|
|
)
|
|
|
|
def test_compose_exists(self, caplog):
|
|
caplog.set_level(logging.DEBUG)
|
|
pdc = MagicMock()
|
|
resp = Mock()
|
|
resp.status_code = 200
|
|
|
|
assert (
|
|
toddlers.plugins.pdc_import_compose.compose_exists(pdc, "compose-id")
|
|
is True
|
|
)
|
|
|
|
def test_ensure_release_exists_failed(self, caplog):
|
|
caplog.set_level(logging.DEBUG)
|
|
pdc = MagicMock()
|
|
resp = Mock()
|
|
resp.status_code = 500
|
|
resp.text = "html content"
|
|
pdc["releases"]["release-id"]._.side_effect = beanbag.bbexcept.BeanBagException(
|
|
msg="Failed to do something", response=resp
|
|
)
|
|
|
|
toddlers.plugins.pdc_import_compose.ensure_release_exists(
|
|
pdc, "release-id", {"foo": "bar"}
|
|
)
|
|
assert caplog.records[-3].message.startswith(
|
|
"Failed to check if the release release-id exists: Failed to do something - response:"
|
|
)
|
|
assert caplog.records[-2].message.startswith("Failed to do something")
|
|
assert caplog.records[-1].message.startswith("html content")
|
|
|
|
def test_ensure_release_exists_create(self, caplog):
|
|
caplog.set_level(logging.DEBUG)
|
|
pdc = MagicMock()
|
|
resp = Mock()
|
|
resp.status_code = 404
|
|
pdc["releases"]["release-id"]._.side_effect = beanbag.bbexcept.BeanBagException(
|
|
msg="Failed to do something", response=resp
|
|
)
|
|
|
|
toddlers.plugins.pdc_import_compose.ensure_release_exists(
|
|
pdc, "release-id", {"foo": "bar"}
|
|
)
|
|
pdc["releases"]._.assert_called_once_with({"foo": "bar", "active": True})
|
|
assert (
|
|
caplog.records[-1].message
|
|
== "Creating release {'foo': 'bar', 'active': True}"
|
|
)
|
|
|
|
def test_ensure_release_exists_create_then_fail(self, caplog):
|
|
caplog.set_level(logging.DEBUG)
|
|
pdc = MagicMock()
|
|
resp = Mock()
|
|
resp.status_code = 404
|
|
resp.text = "html content"
|
|
pdc["releases"]["release-id"]._.side_effect = beanbag.bbexcept.BeanBagException(
|
|
msg="Failed to do something", response=resp
|
|
)
|
|
pdc["releases"]._.side_effect = beanbag.bbexcept.BeanBagException(
|
|
msg="Failed to create the release", response=resp
|
|
)
|
|
|
|
with pytest.raises(
|
|
beanbag.bbexcept.BeanBagException,
|
|
match=r"Failed to create the release .*",
|
|
):
|
|
toddlers.plugins.pdc_import_compose.ensure_release_exists(
|
|
pdc, "release-id", {"foo": "bar"}
|
|
)
|
|
pdc["releases"]._.assert_called_once_with({"foo": "bar", "active": True})
|
|
assert caplog.records[-2].message.startswith("Failed to create the release")
|
|
assert caplog.records[-1].message.startswith("html content")
|
|
|
|
|
|
class TestPDCImportComposeToddlerCLI:
|
|
toddler_cls = toddlers.plugins.pdc_import_compose.PDCImportCompose
|
|
|
|
def test_main_no_args(self, capsys):
|
|
with pytest.raises(SystemExit):
|
|
toddlers.plugins.pdc_import_compose.main([])
|
|
|
|
out, err = capsys.readouterr()
|
|
assert out == ""
|
|
# Expecting something along these lines, but don't make the test too tight:
|
|
#
|
|
# usage: pytest [-h] [--dry-run] [-q | --debug] conf [username]
|
|
# pytest: error: the following arguments are required: conf
|
|
assert err.startswith("usage:")
|
|
assert "error: the following arguments are required:" in err
|
|
|
|
@patch(
|
|
"toddlers.plugins.pdc_import_compose.PDCImportCompose._process_single_compose"
|
|
)
|
|
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
|
|
@patch("toml.load", new=Mock(return_value={}))
|
|
def test_main_debug(self, pdc, process_dg, msg_file, capsys):
|
|
client = Mock()
|
|
pdc.return_value = client
|
|
|
|
msg = fedora_messaging.api.Message()
|
|
msg.id = ANY
|
|
msg.topic = "toddlers.cli.pungi.compose.status.change"
|
|
msg.body = {
|
|
"status": "FINISHED",
|
|
"release_type": "ga",
|
|
"compose_label": "RC-1.2",
|
|
"compose_respin": 0,
|
|
"compose_date": "20201019",
|
|
"release_short": "Fedora",
|
|
"release_version": "33",
|
|
"location": "https://kojipkgs.fedoraproject.org/compose/33/"
|
|
"Fedora-33-20201019.0/compose",
|
|
"compose_type": "production",
|
|
"release_is_layered": False,
|
|
"release_name": "Fedora",
|
|
"compose_path": "/mnt/koji/compose/33/Fedora-33-20201019.0",
|
|
"compose_id": "Fedora-33-20201019.0",
|
|
}
|
|
|
|
toddlers.plugins.pdc_import_compose.main(["test.cfg", "--debug", msg_file])
|
|
process_dg.assert_called_once_with({}, client, msg)
|
|
out, err = capsys.readouterr()
|
|
assert out == ""
|
|
assert err == ""
|
|
|
|
@patch(
|
|
"toddlers.plugins.pdc_import_compose.PDCImportCompose._process_single_compose"
|
|
)
|
|
@patch("toddlers.plugins.pdc_import_compose.pdc_client_for_config")
|
|
@patch("toml.load", new=Mock(return_value={}))
|
|
def test_main(self, pdc, process_dg, msg_file, capsys):
|
|
client = Mock()
|
|
pdc.return_value = client
|
|
|
|
msg = fedora_messaging.api.Message()
|
|
msg.id = ANY
|
|
msg.topic = "toddlers.cli.pungi.compose.status.change"
|
|
msg.body = {
|
|
"status": "FINISHED",
|
|
"release_type": "ga",
|
|
"compose_label": "RC-1.2",
|
|
"compose_respin": 0,
|
|
"compose_date": "20201019",
|
|
"release_short": "Fedora",
|
|
"release_version": "33",
|
|
"location": "https://kojipkgs.fedoraproject.org/compose/33/"
|
|
"Fedora-33-20201019.0/compose",
|
|
"compose_type": "production",
|
|
"release_is_layered": False,
|
|
"release_name": "Fedora",
|
|
"compose_path": "/mnt/koji/compose/33/Fedora-33-20201019.0",
|
|
"compose_id": "Fedora-33-20201019.0",
|
|
}
|
|
|
|
toddlers.plugins.pdc_import_compose.main(["test.cfg", msg_file])
|
|
process_dg.assert_called_once_with({}, client, msg)
|
|
out, err = capsys.readouterr()
|
|
assert out == ""
|
|
assert err == ""
|