| |
@@ -0,0 +1,866 @@
|
| |
+ import logging
|
| |
+ from unittest.mock import 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("pdc_client.PDCClient")
|
| |
+ 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("pdc_client.PDCClient")
|
| |
+ 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("pdc_client.PDCClient")
|
| |
+ 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("pdc_client.PDCClient")
|
| |
+ 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("pdc_client.PDCClient")
|
| |
+ 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
|
| |
+
|
| |
+ error = Exception("Failed to query resource")
|
| |
+ error.response = Mock()
|
| |
+ error.response.url = "https://kojipkgs/..../42"
|
| |
+ error.response.text = "AHAH"
|
| |
+ 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) == 3
|
| |
+ assert (
|
| |
+ caplog.records[-1].message
|
| |
+ == "Failed to import 'https://kojipkgs.../123' - 'https://kojipkgs/..../42' 'AHAH'"
|
| |
+ )
|
| |
+
|
| |
+ @patch("pdc_client.PDCClient")
|
| |
+ def test__process_single_compose_invalid_status(self, pdc, 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,
|
| |
+ )
|
| |
+
|
| |
+ 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("pdc_client.PDCClient")
|
| |
+ 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-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 = 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-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",
|
| |
+ },
|
| |
+ )
|
| |
+
|
| |
+ pdc["compose-images"]._.assert_called_once_with(
|
| |
+ {
|
| |
+ "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"},
|
| |
+ }
|
| |
+ )
|
| |
+ # It's not actually called, this is a side-effect of using Mock/MagicMock
|
| |
+ pdc["compose-rpms"]._.assert_called_once_with(
|
| |
+ {
|
| |
+ "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"},
|
| |
+ }
|
| |
+ )
|
| |
+ assert len(caplog.records) == 3
|
| |
+ assert (
|
| |
+ caplog.records[-2].message
|
| |
+ == "Found no rpms.json file at 'https://kojipkgs.fedoraproject.org/compose/"
|
| |
+ "rawhide/Fedora-Rawhide-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
|
| |
+ 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[-1].message.startswith(
|
| |
+ "Failed to check if the release release-id exists: Failed to do something - response:"
|
| |
+ )
|
| |
+
|
| |
+ 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}"
|
| |
+ )
|
| |
This toddler reacts to messages coming from pungi or playtime and inserts
into PDC either the compose that was just done (when the notification
comes from pungi) or finds in koji all the old composes and inserts them
all (when the notification is coming from playtime).
This toddler is the equivalent of the following handler in pdc-updater:
https://github.com/fedora-infra/pdc-updater/blob/develop/pdcupdater/handlers/compose.py
Signed-off-by: Pierre-Yves Chibon pingou@pingoured.fr