)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"d53d632aca0dbb42639aff9195414038ff36e29b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9e424fe5_2f3c5c44","updated":"2026-08-04 11:47:47.000000000","message":"Please remove Depends-On https://review.opendev.org/c/openstack/tempest/+/948905 — it is unrelated to S3 multipart and is failing tempest-full / grenade on test_upload_image_with_size_*. Keep the tempestconf / Glance Depends-On as needed.","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"db8ea98a55d4138fe901ebd759283c493fd88fb9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"fa45b921_db0a0898","updated":"2026-07-15 14:29:06.000000000","message":"Test run in https://review.opendev.org/c/openstack/glance/+/997191","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"38d4fd5b35016b7a67466f28b86ff47e3a01998f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"2ff25b63_2e01d3b9","updated":"2026-08-26 07:55:16.000000000","message":"Test run in `glance-s3-multistore` job","commit_id":"48b95b62701446b907f35bf1d35d95f2b709d972"}],"releasenotes/notes/add-s3-storage-tests-and-config-a1b2c3d4e5f6g7h8.yaml":[{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"d53d632aca0dbb42639aff9195414038ff36e29b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"be04b751_da233a90","line":11,"range":{"start_line":3,"start_character":1,"end_line":11,"end_character":0},"updated":"2026-08-04 11:47:47.000000000","message":"Reno/docs fail with Unexpected indentation on this nested bullet list under |. Also the option is image-feature-enabled.s3_store, not s3_store_enabled.","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"}],"tempest/config.py":[{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"d53d632aca0dbb42639aff9195414038ff36e29b","unresolved":true,"context_lines":[{"line_number":728,"context_line":"    cfg.IntOpt(\u0027s3_store_large_object_chunk_size\u0027,"},{"line_number":729,"context_line":"               default\u003d10,"},{"line_number":730,"context_line":"               help\u003d\u0027Chunk size in MB for multipart upload\u0027),"},{"line_number":731,"context_line":"]"},{"line_number":732,"context_line":""},{"line_number":733,"context_line":"image_feature_group \u003d cfg.OptGroup(name\u003d\u0027image-feature-enabled\u0027,"},{"line_number":734,"context_line":"                                   title\u003d\u0027Enabled image service features\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"f8b45bc5_6e38708a","line":731,"range":{"start_line":731,"start_character":0,"end_line":731,"end_character":1},"updated":"2026-08-04 11:47:47.000000000","message":"s3_store_bucket also needs to be added?","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"345d14a17f8a6dab66632a9043898032879c6ea6","unresolved":false,"context_lines":[{"line_number":728,"context_line":"    cfg.IntOpt(\u0027s3_store_large_object_chunk_size\u0027,"},{"line_number":729,"context_line":"               default\u003d10,"},{"line_number":730,"context_line":"               help\u003d\u0027Chunk size in MB for multipart upload\u0027),"},{"line_number":731,"context_line":"]"},{"line_number":732,"context_line":""},{"line_number":733,"context_line":"image_feature_group \u003d cfg.OptGroup(name\u003d\u0027image-feature-enabled\u0027,"},{"line_number":734,"context_line":"                                   title\u003d\u0027Enabled image service features\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"68acb16f_9cdef3a2","line":731,"range":{"start_line":731,"start_character":0,"end_line":731,"end_character":1},"in_reply_to":"f8b45bc5_6e38708a","updated":"2026-08-05 09:24:17.000000000","message":"Currently don\u0027t need for multipart image upload tests","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"}],"tempest/scenario/manager.py":[{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"d53d632aca0dbb42639aff9195414038ff36e29b","unresolved":true,"context_lines":[{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import copy"},{"line_number":18,"context_line":"import io"},{"line_number":19,"context_line":"import os"},{"line_number":20,"context_line":"import re"},{"line_number":21,"context_line":"import shutil"}],"source_content_type":"text/x-python","patch_set":6,"id":"1c60ab45_3c2c3ca1","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":9},"updated":"2026-08-04 11:47:47.000000000","message":"Unused import","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"345d14a17f8a6dab66632a9043898032879c6ea6","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import copy"},{"line_number":18,"context_line":"import io"},{"line_number":19,"context_line":"import os"},{"line_number":20,"context_line":"import re"},{"line_number":21,"context_line":"import shutil"}],"source_content_type":"text/x-python","patch_set":6,"id":"956c8dc0_5a1724f3","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":9},"in_reply_to":"1c60ab45_3c2c3ca1","updated":"2026-08-05 09:24:17.000000000","message":"Done","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"},{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"d53d632aca0dbb42639aff9195414038ff36e29b","unresolved":true,"context_lines":[{"line_number":1918,"context_line":"        if not CONF.image_feature_enabled.s3_store:"},{"line_number":1919,"context_line":"            raise cls.skipException(\u0027S3 store is not enabled\u0027)"},{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"    def create_test_volume_image(self, image: dict) -\u003e None:"},{"line_number":1922,"context_line":"        \"\"\"Wrapper that create volume from image\"\"\""},{"line_number":1923,"context_line":"        volume \u003d self.create_volume_from_image(image_id\u003dimage[\u0027id\u0027])"},{"line_number":1924,"context_line":"        waiters.wait_for_volume_resource_status("}],"source_content_type":"text/x-python","patch_set":6,"id":"ff360341_e51a77b6","line":1921,"range":{"start_line":1921,"start_character":55,"end_line":1921,"end_character":59},"updated":"2026-08-04 11:47:47.000000000","message":"Return annotation says -\u003e None but this returns volume. Please fix","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"345d14a17f8a6dab66632a9043898032879c6ea6","unresolved":false,"context_lines":[{"line_number":1918,"context_line":"        if not CONF.image_feature_enabled.s3_store:"},{"line_number":1919,"context_line":"            raise cls.skipException(\u0027S3 store is not enabled\u0027)"},{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"    def create_test_volume_image(self, image: dict) -\u003e None:"},{"line_number":1922,"context_line":"        \"\"\"Wrapper that create volume from image\"\"\""},{"line_number":1923,"context_line":"        volume \u003d self.create_volume_from_image(image_id\u003dimage[\u0027id\u0027])"},{"line_number":1924,"context_line":"        waiters.wait_for_volume_resource_status("}],"source_content_type":"text/x-python","patch_set":6,"id":"52c56578_fa233f2e","line":1921,"range":{"start_line":1921,"start_character":55,"end_line":1921,"end_character":59},"in_reply_to":"ff360341_e51a77b6","updated":"2026-08-05 09:24:17.000000000","message":"Done","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"}],"tempest/scenario/test_glance_object_storage.py":[{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"d53d632aca0dbb42639aff9195414038ff36e29b","unresolved":true,"context_lines":[{"line_number":1,"context_line":"import logging"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"from tempest.api.image import base as image_base"},{"line_number":4,"context_line":"from tempest.common import waiters"},{"line_number":5,"context_line":"from tempest import config"},{"line_number":6,"context_line":"from tempest.lib import decorators"}],"source_content_type":"text/x-python","patch_set":6,"id":"b7ea5aa1_4e477217","line":3,"range":{"start_line":3,"start_character":38,"end_line":3,"end_character":48},"updated":"2026-08-04 11:47:47.000000000","message":"Unused import","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"345d14a17f8a6dab66632a9043898032879c6ea6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import logging"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"from tempest.api.image import base as image_base"},{"line_number":4,"context_line":"from tempest.common import waiters"},{"line_number":5,"context_line":"from tempest import config"},{"line_number":6,"context_line":"from tempest.lib import decorators"}],"source_content_type":"text/x-python","patch_set":6,"id":"7b9efd86_897e0188","line":3,"range":{"start_line":3,"start_character":38,"end_line":3,"end_character":48},"in_reply_to":"b7ea5aa1_4e477217","updated":"2026-08-05 09:24:17.000000000","message":"Done","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"},{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"d53d632aca0dbb42639aff9195414038ff36e29b","unresolved":true,"context_lines":[{"line_number":1,"context_line":"import logging"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"from tempest.api.image import base as image_base"},{"line_number":4,"context_line":"from tempest.common import waiters"},{"line_number":5,"context_line":"from tempest import config"},{"line_number":6,"context_line":"from tempest.lib import decorators"},{"line_number":7,"context_line":"from tempest.scenario import manager"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"CONF \u003d config.CONF"},{"line_number":11,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"class GlanceS3StorageTest(manager.GlanceS3StorageScenarioTest):"},{"line_number":15,"context_line":"    \"\"\"Scenario tests for the Glance S3 backend.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    @decorators.idempotent_id(\u0027bb0306cf-ceee-46ab-b0b4-50804bc7ae19\u0027)"},{"line_number":18,"context_line":"    def test_s3_multipart_volume_from_image(self):"},{"line_number":19,"context_line":"        \"\"\"Verify multipart upload with volumes from image."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"         This test creates a 100 MiB Glance image, uploads it and creates a"},{"line_number":22,"context_line":"         volume from the image."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"         The test verifies that the image object stored in S3:"},{"line_number":25,"context_line":"         * uses multipart upload (multipart ETag format) and"},{"line_number":26,"context_line":"         * has the expected object size."},{"line_number":27,"context_line":"        \"\"\""},{"line_number":28,"context_line":"        image \u003d self.create_test_image()"},{"line_number":29,"context_line":"        volume \u003d self.create_test_volume_image(image)"},{"line_number":30,"context_line":"        self.check_objects("},{"line_number":31,"context_line":"            volume[\u0027volume_image_metadata\u0027][\u0027image_id\u0027],"},{"line_number":32,"context_line":"            size\u003d104857600)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @decorators.idempotent_id(\u0027bb0206cf-ceee-46ab-b0b4-50804bc7ae18\u0027)"},{"line_number":35,"context_line":"    def test_s3_multipart_upload_volume_ins_snapshot(self):"},{"line_number":36,"context_line":"        \"\"\"Verify S3 upload behavior for images and instance snapshots."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        This test performs the following workflow:"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        * Create and upload a 100 MiB image to the Glance S3 backend."},{"line_number":41,"context_line":"        * Verify that the image is stored as a multipart S3 object."},{"line_number":42,"context_line":"        * Create a volume from the image and boot an instance from the volume."},{"line_number":43,"context_line":"        * Create a snapshot of the running instance."},{"line_number":44,"context_line":"        * Verify that the original image remains stored as a multipart object."},{"line_number":45,"context_line":"        * Verify that the instance snapshot is stored as a single-part object,"},{"line_number":46,"context_line":"          which is expected for zero-byte snapshot uploads."},{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":"        image \u003d self.create_test_image()"},{"line_number":49,"context_line":"        self.check_objects(image[\u0027id\u0027], size\u003d104857600)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        ins, _ \u003d self._create_ins_from_volume(image)"},{"line_number":52,"context_line":"        snap_image \u003d self.create_server_snapshot(server\u003dins)"},{"line_number":53,"context_line":"        waiters.wait_for_image_status(self.client, snap_image[\u0027id\u0027], \u0027active\u0027)"},{"line_number":54,"context_line":"        self.check_objects(image[\u0027id\u0027], size\u003d104857600)"},{"line_number":55,"context_line":"        self.check_objects(snap_image[\u0027id\u0027], fallback_singlepart\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3e147fd7_30683844","line":55,"range":{"start_line":1,"start_character":0,"end_line":55,"end_character":70},"updated":"2026-08-04 11:47:47.000000000","message":"Missing automodule entry in doc/source/tests/scenario/scenario.rst — that is why openstack-tox-docs fails.","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"345d14a17f8a6dab66632a9043898032879c6ea6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import logging"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"from tempest.api.image import base as image_base"},{"line_number":4,"context_line":"from tempest.common import waiters"},{"line_number":5,"context_line":"from tempest import config"},{"line_number":6,"context_line":"from tempest.lib import decorators"},{"line_number":7,"context_line":"from tempest.scenario import manager"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"CONF \u003d config.CONF"},{"line_number":11,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"class GlanceS3StorageTest(manager.GlanceS3StorageScenarioTest):"},{"line_number":15,"context_line":"    \"\"\"Scenario tests for the Glance S3 backend.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    @decorators.idempotent_id(\u0027bb0306cf-ceee-46ab-b0b4-50804bc7ae19\u0027)"},{"line_number":18,"context_line":"    def test_s3_multipart_volume_from_image(self):"},{"line_number":19,"context_line":"        \"\"\"Verify multipart upload with volumes from image."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"         This test creates a 100 MiB Glance image, uploads it and creates a"},{"line_number":22,"context_line":"         volume from the image."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"         The test verifies that the image object stored in S3:"},{"line_number":25,"context_line":"         * uses multipart upload (multipart ETag format) and"},{"line_number":26,"context_line":"         * has the expected object size."},{"line_number":27,"context_line":"        \"\"\""},{"line_number":28,"context_line":"        image \u003d self.create_test_image()"},{"line_number":29,"context_line":"        volume \u003d self.create_test_volume_image(image)"},{"line_number":30,"context_line":"        self.check_objects("},{"line_number":31,"context_line":"            volume[\u0027volume_image_metadata\u0027][\u0027image_id\u0027],"},{"line_number":32,"context_line":"            size\u003d104857600)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @decorators.idempotent_id(\u0027bb0206cf-ceee-46ab-b0b4-50804bc7ae18\u0027)"},{"line_number":35,"context_line":"    def test_s3_multipart_upload_volume_ins_snapshot(self):"},{"line_number":36,"context_line":"        \"\"\"Verify S3 upload behavior for images and instance snapshots."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        This test performs the following workflow:"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        * Create and upload a 100 MiB image to the Glance S3 backend."},{"line_number":41,"context_line":"        * Verify that the image is stored as a multipart S3 object."},{"line_number":42,"context_line":"        * Create a volume from the image and boot an instance from the volume."},{"line_number":43,"context_line":"        * Create a snapshot of the running instance."},{"line_number":44,"context_line":"        * Verify that the original image remains stored as a multipart object."},{"line_number":45,"context_line":"        * Verify that the instance snapshot is stored as a single-part object,"},{"line_number":46,"context_line":"          which is expected for zero-byte snapshot uploads."},{"line_number":47,"context_line":"        \"\"\""},{"line_number":48,"context_line":"        image \u003d self.create_test_image()"},{"line_number":49,"context_line":"        self.check_objects(image[\u0027id\u0027], size\u003d104857600)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        ins, _ \u003d self._create_ins_from_volume(image)"},{"line_number":52,"context_line":"        snap_image \u003d self.create_server_snapshot(server\u003dins)"},{"line_number":53,"context_line":"        waiters.wait_for_image_status(self.client, snap_image[\u0027id\u0027], \u0027active\u0027)"},{"line_number":54,"context_line":"        self.check_objects(image[\u0027id\u0027], size\u003d104857600)"},{"line_number":55,"context_line":"        self.check_objects(snap_image[\u0027id\u0027], fallback_singlepart\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ccb566db_dfefa71b","line":55,"range":{"start_line":1,"start_character":0,"end_line":55,"end_character":70},"in_reply_to":"3e147fd7_30683844","updated":"2026-08-05 09:24:17.000000000","message":"Done","commit_id":"63976dae22e12a96da184c167076a87bedc05de2"}]}
