)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":22629,"name":"Michal Nasiadka","email":"mnasiadka@gmail.com","username":"mnasiadka"},"change_message_id":"e77e2910f37cc94aada93fca8654f7cc09c2cbbd","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e87c7c52_51c2b95b","updated":"2026-10-19 11:29:51.000000000","message":"So, to get this right (and you haven\u0027t raised a bug to give us greater detail, so I might be understanding this wrong) - removing setting utime on the outer dest_archive file metadata, but not touching set_time() in kolla/image/kolla_worker.py and not touching normalize_tarinfo - is only part of the puzzle here?\n\nThat code path has been created in pre-BuildKit times, so are you sure it affects BuildKit, non-BuildKit and podman/buildah in the same way?\n\nIn addition to that, I don\u0027t see any reproduction information (no launchpad bug, no nothing) and no regression tests, not even a release note warning users about changed behaviour.","commit_id":"6faca216f292adea8aad557051f1d70a70592fc0"},{"author":{"_account_id":39457,"name":"Murray Groves","display_name":"Murray Groves","email":"murray@stackhpc.com","username":"MurrayGroves"},"change_message_id":"fbc0bf9f3c504f50b5232bbb00b37ceacd05f535","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f7a9c5ee_5949aaea","in_reply_to":"e87c7c52_51c2b95b","updated":"2026-10-21 12:53:40.000000000","message":"Added bug with reproduction steps: https://launchpad.net/bugs/2171614\n\nOnly removing the line which sets utime on the outer archive is necessary, since it causes Docker to re-check the hash for the archive and notice it has changed.\n\nI added a regression test which tests BuildKit, non-BuildKit and podman. It tests source, plugins, and additions. This test showed it only affected BuildKit.\n\nAdded a release note, not sure if it has the correct level of detail.","commit_id":"6faca216f292adea8aad557051f1d70a70592fc0"}],"kolla/tests/test_build.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"974e8c3087e7aa9aafa6b213d2874620c953ecaf","unresolved":false,"context_lines":[{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    @mock.patch.dict(os.environ, clear\u003dTrue)"},{"line_number":435,"context_line":"    def test_cache_invalidation_minor_changes(self):"},{"line_number":436,"context_line":"        \"\"\"Test that small changes to source correctly invalidate build cache.\"\"\""},{"line_number":437,"context_line":"        src_dir \u003d self.useFixture(fixtures.TempDir()).path"},{"line_number":438,"context_line":"        plugins_dir \u003d self.useFixture(fixtures.TempDir()).path"},{"line_number":439,"context_line":"        additions_dir \u003d self.useFixture(fixtures.TempDir()).path"}],"source_content_type":"text/x-python","patch_set":3,"id":"f2a0c3bb_55c99d6e","line":436,"updated":"2026-10-21 13:38:05.000000000","message":"pep8: E501 line too long (81 \u003e 79 characters)","commit_id":"798d3605af3ca237f2803885e64464b4b0f4e5e5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"974e8c3087e7aa9aafa6b213d2874620c953ecaf","unresolved":false,"context_lines":[{"line_number":448,"context_line":"                ADD additions-archive /"},{"line_number":449,"context_line":"                \"\"\")"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        def build_image_and_get_file(text: bytes, buildkit: bool, podman: bool) -\u003e tuple[bytes, bytes, bytes]:"},{"line_number":452,"context_line":"            file_path \u003d os.path.join(src_dir, \"test.txt\")"},{"line_number":453,"context_line":"            with open(file_path, \"wb\") as f:"},{"line_number":454,"context_line":"                f.write(text)"}],"source_content_type":"text/x-python","patch_set":3,"id":"20801421_87303255","line":451,"updated":"2026-10-21 13:38:05.000000000","message":"pep8: E501 line too long (110 \u003e 79 characters)","commit_id":"798d3605af3ca237f2803885e64464b4b0f4e5e5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"974e8c3087e7aa9aafa6b213d2874620c953ecaf","unresolved":false,"context_lines":[{"line_number":518,"context_line":"        text_b \u003d text_a.replace(b\"a\", b\"b\")"},{"line_number":519,"context_line":"        self.assertequal(len(text_a), len(text_b))"},{"line_number":520,"context_line":""},{"line_number":521,"context_line":"        file_a, plugin_a, addition_a \u003d build_image_and_get_file(text_a, buildkit\u003dFalse, podman\u003dTrue)"},{"line_number":522,"context_line":"        self.assertEqual(text_a, file_a)"},{"line_number":523,"context_line":"        self.assertEqual(text_a, plugin_a)"},{"line_number":524,"context_line":"        self.assertEqual(text_a, addition_a)"}],"source_content_type":"text/x-python","patch_set":3,"id":"0123847d_ac02975e","line":521,"updated":"2026-10-21 13:38:05.000000000","message":"pep8: E501 line too long (100 \u003e 79 characters)","commit_id":"798d3605af3ca237f2803885e64464b4b0f4e5e5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"974e8c3087e7aa9aafa6b213d2874620c953ecaf","unresolved":false,"context_lines":[{"line_number":522,"context_line":"        self.assertEqual(text_a, file_a)"},{"line_number":523,"context_line":"        self.assertEqual(text_a, plugin_a)"},{"line_number":524,"context_line":"        self.assertEqual(text_a, addition_a)"},{"line_number":525,"context_line":"        file_b, plugin_b, addition_b \u003d build_image_and_get_file(text_b, buildkit\u003dFalse, podman\u003dTrue)"},{"line_number":526,"context_line":"        self.assertEqual(text_b, file_b)"},{"line_number":527,"context_line":"        self.assertEqual(text_b, plugin_b)"},{"line_number":528,"context_line":"        self.assertEqual(text_b, addition_b)"}],"source_content_type":"text/x-python","patch_set":3,"id":"25645ab6_56ffb9ee","line":525,"updated":"2026-10-21 13:38:05.000000000","message":"pep8: E501 line too long (100 \u003e 79 characters)","commit_id":"798d3605af3ca237f2803885e64464b4b0f4e5e5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"974e8c3087e7aa9aafa6b213d2874620c953ecaf","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        self.assertEqual(text_b, plugin_b)"},{"line_number":528,"context_line":"        self.assertEqual(text_b, addition_b)"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"        file_a, plugin_a, addition_a \u003d build_image_and_get_file(text_a, buildkit\u003dFalse, podman\u003dFalse)"},{"line_number":531,"context_line":"        self.assertEqual(text_a, file_a)"},{"line_number":532,"context_line":"        self.assertEqual(text_a, plugin_a)"},{"line_number":533,"context_line":"        self.assertEqual(text_a, addition_a)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ed9a0fef_b9fe2e40","line":530,"updated":"2026-10-21 13:38:05.000000000","message":"pep8: E501 line too long (101 \u003e 79 characters)","commit_id":"798d3605af3ca237f2803885e64464b4b0f4e5e5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"974e8c3087e7aa9aafa6b213d2874620c953ecaf","unresolved":false,"context_lines":[{"line_number":531,"context_line":"        self.assertEqual(text_a, file_a)"},{"line_number":532,"context_line":"        self.assertEqual(text_a, plugin_a)"},{"line_number":533,"context_line":"        self.assertEqual(text_a, addition_a)"},{"line_number":534,"context_line":"        file_b, plugin_b, addition_b \u003d build_image_and_get_file(text_b, buildkit\u003dFalse, podman\u003dFalse)"},{"line_number":535,"context_line":"        self.assertEqual(text_b, file_b)"},{"line_number":536,"context_line":"        self.assertEqual(text_b, plugin_b)"},{"line_number":537,"context_line":"        self.assertEqual(text_b, addition_b)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3dc8e8b0_e403d761","line":534,"updated":"2026-10-21 13:38:05.000000000","message":"pep8: E501 line too long (101 \u003e 79 characters)","commit_id":"798d3605af3ca237f2803885e64464b4b0f4e5e5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"974e8c3087e7aa9aafa6b213d2874620c953ecaf","unresolved":false,"context_lines":[{"line_number":536,"context_line":"        self.assertEqual(text_b, plugin_b)"},{"line_number":537,"context_line":"        self.assertEqual(text_b, addition_b)"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"        file_a, plugin_a, addition_a \u003d build_image_and_get_file(text_a, buildkit\u003dTrue, podman\u003dFalse)"},{"line_number":540,"context_line":"        self.assertEqual(text_a, file_a)"},{"line_number":541,"context_line":"        self.assertEqual(text_a, plugin_a)"},{"line_number":542,"context_line":"        self.assertEqual(text_a, addition_a)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1419f24d_a9172527","line":539,"updated":"2026-10-21 13:38:05.000000000","message":"pep8: E501 line too long (100 \u003e 79 characters)","commit_id":"798d3605af3ca237f2803885e64464b4b0f4e5e5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"974e8c3087e7aa9aafa6b213d2874620c953ecaf","unresolved":false,"context_lines":[{"line_number":540,"context_line":"        self.assertEqual(text_a, file_a)"},{"line_number":541,"context_line":"        self.assertEqual(text_a, plugin_a)"},{"line_number":542,"context_line":"        self.assertEqual(text_a, addition_a)"},{"line_number":543,"context_line":"        file_b, plugin_b, addition_b \u003d build_image_and_get_file(text_b, buildkit\u003dTrue, podman\u003dFalse)"},{"line_number":544,"context_line":"        self.assertEqual(text_b, file_b)"},{"line_number":545,"context_line":"        self.assertEqual(text_b, plugin_b)"},{"line_number":546,"context_line":"        self.assertEqual(text_b, addition_b)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3af10947_49ae94de","line":543,"updated":"2026-10-21 13:38:05.000000000","message":"pep8: E501 line too long (100 \u003e 79 characters)","commit_id":"798d3605af3ca237f2803885e64464b4b0f4e5e5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"974e8c3087e7aa9aafa6b213d2874620c953ecaf","unresolved":false,"context_lines":[{"line_number":546,"context_line":"        self.assertEqual(text_b, addition_b)"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"    @mock.patch.dict(os.environ, clear\u003dTrue)"},{"line_number":550,"context_line":"    @mock.patch(engine_client)"},{"line_number":551,"context_line":"    def test_malicious_tar(self, mock_client):"},{"line_number":552,"context_line":"        tmpdir \u003d tempfile.mkdtemp()"}],"source_content_type":"text/x-python","patch_set":3,"id":"65b5c9fa_5fa68549","line":549,"updated":"2026-10-21 13:38:05.000000000","message":"pep8: E303 too many blank lines (2)","commit_id":"798d3605af3ca237f2803885e64464b4b0f4e5e5"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c21e52d9fb8b9ab6da883111a454ec09635ba80a","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":"import tarfile"},{"line_number":18,"context_line":"import tempfile"},{"line_number":19,"context_line":"from copy import deepcopy"},{"line_number":20,"context_line":"from unittest import mock"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"import fixtures"}],"source_content_type":"text/x-python","patch_set":4,"id":"112d205f_f26a11ee","line":19,"updated":"2026-10-21 14:59:51.000000000","message":"pep8: H306: imports not in alphabetical order (tempfile, copy.deepcopy)","commit_id":"495c6b304abeaf01a67fc4f32593be5bb5111eac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c21e52d9fb8b9ab6da883111a454ec09635ba80a","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from kolla.cmd import build as build_cmd"},{"line_number":27,"context_line":"from kolla.common import utils as common_utils"},{"line_number":28,"context_line":"from kolla.image import build, tasks, utils"},{"line_number":29,"context_line":"from kolla.image.kolla_worker import Image"},{"line_number":30,"context_line":"from kolla.tests import base"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"804a4387_0060138f","line":28,"updated":"2026-10-21 14:59:51.000000000","message":"pep8: H301: one import per line","commit_id":"495c6b304abeaf01a67fc4f32593be5bb5111eac"}]}
