From e1ab4edd082c669051e3ea586425b0bde53f904b Mon Sep 17 00:00:00 2001 From: Jeremy Cline Date: May 20 2024 18:19:19 +0000 Subject: [PATCH 1/2] Fix the EOFError in the download image test requests seems to be yielding a final b'' at the end of the test data. When this is passed to the decompressor it throws an EOFError. Only try to decompress the chunk if it's not empty. --- diff --git a/fedora_cloud_image_uploader/handler.py b/fedora_cloud_image_uploader/handler.py index 3de0959..864f71c 100644 --- a/fedora_cloud_image_uploader/handler.py +++ b/fedora_cloud_image_uploader/handler.py @@ -151,7 +151,7 @@ class Uploader: with open(image_dest, "wb") as fd: for chunk in req.iter_content(chunk_size=16 * 1024): checksum.update(chunk) - if decompressor: + if decompressor and chunk: chunk = decompressor.decompress(chunk) fd.write(chunk) except RequestException as e: From 59d79ab2078e19bd9049f206eb4e4ed8ad464d02 Mon Sep 17 00:00:00 2001 From: Jeremy Cline Date: May 20 2024 19:24:36 +0000 Subject: [PATCH 2/2] Add tox.ini and fix formatting Add a tox.ini to run the tests and formatting checks. Also fix outstanding black and isort issues. --- diff --git a/fedora_cloud_image_uploader/handler.py b/fedora_cloud_image_uploader/handler.py index 864f71c..aac16b9 100644 --- a/fedora_cloud_image_uploader/handler.py +++ b/fedora_cloud_image_uploader/handler.py @@ -8,9 +8,12 @@ import time from typing import NamedTuple import ansible_runner -from fedora_messaging import config, message as fm_message +from fedfind import exceptions as ff_exceptions +from fedfind import helpers as ff_helpers +from fedfind import release as ff_release +from fedora_messaging import config from fedora_messaging import exceptions as fm_exceptions -from fedfind import release as ff_release, exceptions as ff_exceptions, helpers as ff_helpers +from fedora_messaging import message as fm_message from requests import Session, adapters from requests.exceptions import RequestException from urllib3.util import Retry @@ -36,6 +39,7 @@ class ReleaseInfo(NamedTuple): Container for additional release info that fedfind does not provide (until fedfind 5.2.0). """ + ffrel: ff_release.Release relnum: int eol: str diff --git a/pyproject.toml b/pyproject.toml index bd7799a..7f5be43 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,8 +74,11 @@ dependencies = [ [project.optional-dependencies] dev = [ "black", + "isort", + "flake8", ] test = [ + "coverage", "freezegun", "pytest", "pytest-recording", @@ -90,3 +93,11 @@ path = "fedora_cloud_image_uploader/__init__.py" [tool.black] line-length = 100 + +[tool.isort] +profile = "black" + +[tool.coverage.run] +source = [ + "fedora_cloud_image_uploader/", +] diff --git a/tests/test_handler.py b/tests/test_handler.py index 9c76547..b5cf94a 100644 --- a/tests/test_handler.py +++ b/tests/test_handler.py @@ -4,14 +4,15 @@ import os import tempfile from unittest import mock -from fedora_messaging import message, config, exceptions -from fedora_cloud_image_uploader import Uploader, PLAYBOOKS -from fedora_cloud_image_uploader.handler import CantHandle, NotHandled import fedfind.release -from freezegun import freeze_time import pytest +from fedora_messaging import config, exceptions, message +from freezegun import freeze_time from requests.exceptions import RequestException +from fedora_cloud_image_uploader import PLAYBOOKS, Uploader +from fedora_cloud_image_uploader.handler import CantHandle, NotHandled + @mock.patch("fedora_cloud_image_uploader.handler.ansible_runner") @pytest.mark.vcr @@ -52,6 +53,7 @@ def test_gallery_name(mock_runner, fixtures_dir, compose): ] assert [expected_gallery_name, expected_gallery_name] == gallery_names + @pytest.mark.vcr @mock.patch("fedora_cloud_image_uploader.handler.ansible_runner") def test_old_unsupported_azure_compose(mock_runner, fixtures_dir): @@ -74,6 +76,7 @@ def test_old_unsupported_azure_compose(mock_runner, fixtures_dir): consumer(msg) assert mock_runner.interface.run.call_count == 0 + @pytest.mark.vcr @mock.patch("time.sleep") @mock.patch("fedora_cloud_image_uploader.handler.Session.get", side_effect=RequestException) @@ -87,6 +90,7 @@ def test_bodhi_fail(mock_get, mock_sleep, fixtures_dir, caplog): consumer(msg) assert caplog.records[-1].msg == "Failed to download release data from Bodhi: %s" + @pytest.mark.vcr @mock.patch("fedora_cloud_image_uploader.handler.Session.get") def test_release_info(mock_get): @@ -101,6 +105,7 @@ def test_release_info(mock_get): assert relinfo.relnum == 40 assert relinfo.ffrel == ffrel + @mock.patch("ansible_runner.interface.run", autospec=True) def test_ansible_fail(mock_run, caplog): """Test we error correctly on ansible playbook failure.""" @@ -114,6 +119,7 @@ def test_ansible_fail(mock_run, caplog): consumer.run_playbook(playbook, {}, workdir) assert caplog.records[-1].msg == "Playbook failed with return code 1" + def test_azure_filters(): """Test the cases where AzureHandler should decide not to handle.""" config.conf["consumer_config"]["azure"] = {} @@ -134,6 +140,7 @@ def test_azure_filters(): consumer.handle_azure(image, relinfo) assert str(excinfo.value) == "Images prior to F40 aren't supported" + @mock.patch("fedora_cloud_image_uploader.handler.ansible_runner") def test_non_handled_messages(mock_runner, fixtures_dir, caplog): """ @@ -149,7 +156,7 @@ def test_non_handled_messages(mock_runner, fixtures_dir, caplog): consumer(msg) assert mock_runner.interface.run.call_count == 0 msg.body["status"] = "FINISHED" - del(msg.body["compose_id"]) + del msg.body["compose_id"] consumer = Uploader() consumer(msg) assert mock_runner.interface.run.call_count == 0 @@ -163,6 +170,7 @@ def test_non_handled_messages(mock_runner, fixtures_dir, caplog): assert mock_runner.interface.run.call_count == 0 assert caplog.records[-1].msg == "Skipping compose %s as it contains no images" + @mock.patch("time.sleep") @mock.patch("fedora_cloud_image_uploader.handler.Uploader.get_relinfo") @mock.patch("fedfind.release.get_release") @@ -196,6 +204,7 @@ def test_consumer_handle_exceptions(mock_getrel, mock_relinfo, mock_sleep, fixtu # we should sleep before re-raising the Nack assert mock_sleep.call_count == 1 + @pytest.mark.vcr def test_download_image(): """Test download_image functionality.""" diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..58dae14 --- /dev/null +++ b/tox.ini @@ -0,0 +1,34 @@ +[tox] +envlist = format,flake8,py312 +isolated_build = True + +[testenv] +deps = + .[test] +sitepackages = False +skip_install = True +commands_pre = + pip install --upgrade pip +commands = + coverage erase + coverage run -m pytest -vv tests/ {posargs} + coverage report -m + coverage xml + coverage html + +[testenv:format] +deps = + black + isort +commands = + black --check . + isort --check . + +[testenv:flake8] +deps = + flake8 +commands = + flake8 . + +[flake8] +max-line-length = 100