)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"2041780dc25e845fd218bd5a9e61a701362fbf5c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8c8ec0b3_46e97b2f","updated":"2026-06-02 14:31:27.000000000","message":"Manual testing reference attached https://etherpad.opendev.org/p/s3-credential-free-manual-testing","commit_id":"e16f3fdf74496e7e2b0ccf7eec9fe209b749c3d6"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"3fa893f9932634f4d086645dbfdbc3c7432dea82","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5ff24c5b_fe856168","updated":"2026-06-03 05:16:09.000000000","message":"this one needs release note","commit_id":"e16f3fdf74496e7e2b0ccf7eec9fe209b749c3d6"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"46cdc27c21e08d3798c961ff80283614f8cb46f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"727fb37d_cb303693","in_reply_to":"5ff24c5b_fe856168","updated":"2026-06-04 13:09:56.000000000","message":"added releasenotes","commit_id":"e16f3fdf74496e7e2b0ccf7eec9fe209b749c3d6"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"bc1bbc8d922cc9629b381fc7d03dfdd2f0ce2d6d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"7fe62b4e_814fa3f0","updated":"2026-06-04 14:57:41.000000000","message":"The patch looks pretty good, though I\u0027ll probably need another look at the tests. I have some questions/nitpicking inside though!","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"96a9309e521aefe8370d6a831bafa6fe3e573185","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e8d1440b_7a2a82af","updated":"2026-06-24 06:05:31.000000000","message":"Looks good, thank you!!","commit_id":"122e4a0c69054f2b013713109af68b93d91f9608"}],"glance_store/_drivers/s3.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"6ed2a794174966c00e1323b11188dea437bf8b5a","unresolved":true,"context_lines":[{"line_number":514,"context_line":"            raise exceptions.BadStoreConfiguration(store_name\u003d\"s3\","},{"line_number":515,"context_line":"                                                   reason\u003dreason)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"        if self.backend_group:"},{"line_number":518,"context_line":"            self._set_url_prefix()"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"    def _set_url_prefix(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"52684e90_f5603777","side":"PARENT","line":517,"range":{"start_line":517,"start_character":1,"end_line":517,"end_character":30},"updated":"2026-05-13 07:12:27.000000000","message":"this should not be removed","commit_id":"032d273acc57f9010123f184cb112979f37391a5"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"fa284c9d146489a781c5506856b7c6e5d3f6ae75","unresolved":false,"context_lines":[{"line_number":514,"context_line":"            raise exceptions.BadStoreConfiguration(store_name\u003d\"s3\","},{"line_number":515,"context_line":"                                                   reason\u003dreason)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"        if self.backend_group:"},{"line_number":518,"context_line":"            self._set_url_prefix()"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"    def _set_url_prefix(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"2eaedbfd_f92b728e","side":"PARENT","line":517,"range":{"start_line":517,"start_character":1,"end_line":517,"end_character":30},"in_reply_to":"52684e90_f5603777","updated":"2026-06-02 09:57:25.000000000","message":"Acknowledged","commit_id":"032d273acc57f9010123f184cb112979f37391a5"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"6ed2a794174966c00e1323b11188dea437bf8b5a","unresolved":true,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    An S3 URI can look like any of the following:"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        s3://accesskey:secretkey@s3.amazonaws.com/bucket/key-id"},{"line_number":382,"context_line":"        s3+https://accesskey:secretkey@s3.amazonaws.com/bucket/key-id"},{"line_number":383,"context_line":"        s3://host/bucket/key-id (credential-free; credentials from"},{"line_number":384,"context_line":"        store config)"},{"line_number":385,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"b51d978d_1fea323a","line":382,"range":{"start_line":381,"start_character":0,"end_line":382,"end_character":69},"updated":"2026-05-13 07:12:27.000000000","message":"Now we need to remove it as it will never be like this from now on","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"fa284c9d146489a781c5506856b7c6e5d3f6ae75","unresolved":false,"context_lines":[{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    An S3 URI can look like any of the following:"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        s3://accesskey:secretkey@s3.amazonaws.com/bucket/key-id"},{"line_number":382,"context_line":"        s3+https://accesskey:secretkey@s3.amazonaws.com/bucket/key-id"},{"line_number":383,"context_line":"        s3://host/bucket/key-id (credential-free; credentials from"},{"line_number":384,"context_line":"        store config)"},{"line_number":385,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f283170_9aa705df","line":382,"range":{"start_line":381,"start_character":0,"end_line":382,"end_character":69},"in_reply_to":"b51d978d_1fea323a","updated":"2026-06-02 09:57:25.000000000","message":"Done","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"6ed2a794174966c00e1323b11188dea437bf8b5a","unresolved":true,"context_lines":[{"line_number":582,"context_line":"        url_format \u003d self._option_get(\u0027s3_store_bucket_url_format\u0027)"},{"line_number":583,"context_line":"        calling_format \u003d {\u0027addressing_style\u0027: url_format}"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        access_key \u003d getattr(loc, \u0027accesskey\u0027, None) or self.access_key"},{"line_number":586,"context_line":"        secret_key \u003d getattr(loc, \u0027secretkey\u0027, None) or self.secret_key"},{"line_number":587,"context_line":"        session \u003d boto_session.Session(aws_access_key_id\u003daccess_key,"},{"line_number":588,"context_line":"                                       aws_secret_access_key\u003dsecret_key)"},{"line_number":589,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fb0a3ec3_a6228dfb","line":586,"range":{"start_line":585,"start_character":0,"end_line":586,"end_character":71},"updated":"2026-05-13 07:12:27.000000000","message":"Now we should strictly use access and secret key from config only.","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"fa284c9d146489a781c5506856b7c6e5d3f6ae75","unresolved":false,"context_lines":[{"line_number":582,"context_line":"        url_format \u003d self._option_get(\u0027s3_store_bucket_url_format\u0027)"},{"line_number":583,"context_line":"        calling_format \u003d {\u0027addressing_style\u0027: url_format}"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        access_key \u003d getattr(loc, \u0027accesskey\u0027, None) or self.access_key"},{"line_number":586,"context_line":"        secret_key \u003d getattr(loc, \u0027secretkey\u0027, None) or self.secret_key"},{"line_number":587,"context_line":"        session \u003d boto_session.Session(aws_access_key_id\u003daccess_key,"},{"line_number":588,"context_line":"                                       aws_secret_access_key\u003dsecret_key)"},{"line_number":589,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"95e89971_95f01f90","line":586,"range":{"start_line":585,"start_character":0,"end_line":586,"end_character":71},"in_reply_to":"fb0a3ec3_a6228dfb","updated":"2026-06-02 09:57:25.000000000","message":"Done","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"6ed2a794174966c00e1323b11188dea437bf8b5a","unresolved":true,"context_lines":[{"line_number":840,"context_line":"        metadata \u003d {}"},{"line_number":841,"context_line":"        if self.backend_group:"},{"line_number":842,"context_line":"            metadata[\u0027store\u0027] \u003d self.backend_group"},{"line_number":843,"context_line":"        else:"},{"line_number":844,"context_line":"            stores \u003d _normalized_glance_stores(self.conf.glance_store.stores)"},{"line_number":845,"context_line":"            if stores:"},{"line_number":846,"context_line":"                metadata[\u0027store\u0027] \u003d stores[0]"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"        LOG.debug(\"Wrote %(size)d bytes to S3 key named %(key)s \""},{"line_number":849,"context_line":"                  \"with checksum %(checksum)s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"184391d5_b025d27d","line":846,"range":{"start_line":843,"start_character":0,"end_line":846,"end_character":45},"updated":"2026-05-13 07:12:27.000000000","message":"this is not needed","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"fa284c9d146489a781c5506856b7c6e5d3f6ae75","unresolved":false,"context_lines":[{"line_number":840,"context_line":"        metadata \u003d {}"},{"line_number":841,"context_line":"        if self.backend_group:"},{"line_number":842,"context_line":"            metadata[\u0027store\u0027] \u003d self.backend_group"},{"line_number":843,"context_line":"        else:"},{"line_number":844,"context_line":"            stores \u003d _normalized_glance_stores(self.conf.glance_store.stores)"},{"line_number":845,"context_line":"            if stores:"},{"line_number":846,"context_line":"                metadata[\u0027store\u0027] \u003d stores[0]"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"        LOG.debug(\"Wrote %(size)d bytes to S3 key named %(key)s \""},{"line_number":849,"context_line":"                  \"with checksum %(checksum)s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"930abc36_a4f4b8b6","line":846,"range":{"start_line":843,"start_character":0,"end_line":846,"end_character":45},"in_reply_to":"184391d5_b025d27d","updated":"2026-06-02 09:57:25.000000000","message":"Done","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"6ed2a794174966c00e1323b11188dea437bf8b5a","unresolved":true,"context_lines":[{"line_number":849,"context_line":"                  \"with checksum %(checksum)s\","},{"line_number":850,"context_line":"                  {\u0027size\u0027: total_bytes, \u0027key\u0027: key, \u0027checksum\u0027: checksum_hex})"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"        return (loc.get_uri(include_credentials\u003dFalse), total_bytes,"},{"line_number":853,"context_line":"                checksum_hex, hash_hex, metadata)"},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"    def _add_multipart(self, s3_client, image_file, image_size, bucket,"}],"source_content_type":"text/x-python","patch_set":2,"id":"b24fdca5_9587a5f7","line":852,"range":{"start_line":852,"start_character":28,"end_line":852,"end_character":47},"updated":"2026-05-13 07:12:27.000000000","message":"I think this is not needed as it never be True","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"fa284c9d146489a781c5506856b7c6e5d3f6ae75","unresolved":false,"context_lines":[{"line_number":849,"context_line":"                  \"with checksum %(checksum)s\","},{"line_number":850,"context_line":"                  {\u0027size\u0027: total_bytes, \u0027key\u0027: key, \u0027checksum\u0027: checksum_hex})"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"        return (loc.get_uri(include_credentials\u003dFalse), total_bytes,"},{"line_number":853,"context_line":"                checksum_hex, hash_hex, metadata)"},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"    def _add_multipart(self, s3_client, image_file, image_size, bucket,"}],"source_content_type":"text/x-python","patch_set":2,"id":"73103b18_a5a5eef8","line":852,"range":{"start_line":852,"start_character":28,"end_line":852,"end_character":47},"in_reply_to":"b24fdca5_9587a5f7","updated":"2026-06-02 09:57:25.000000000","message":"Done","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"6ed2a794174966c00e1323b11188dea437bf8b5a","unresolved":true,"context_lines":[{"line_number":967,"context_line":"            metadata \u003d {}"},{"line_number":968,"context_line":"            if self.backend_group:"},{"line_number":969,"context_line":"                metadata[\u0027store\u0027] \u003d self.backend_group"},{"line_number":970,"context_line":"            else:"},{"line_number":971,"context_line":"                stores \u003d _normalized_glance_stores("},{"line_number":972,"context_line":"                    self.conf.glance_store.stores)"},{"line_number":973,"context_line":"                if stores:"},{"line_number":974,"context_line":"                    metadata[\u0027store\u0027] \u003d stores[0]"},{"line_number":975,"context_line":"            # If no parts were uploaded, this was a zero-byte image. This is"},{"line_number":976,"context_line":"            # the case when a BFV server creates a snapshot resulting in a 0"},{"line_number":977,"context_line":"            # byte image file. Since we cannot complete a multipart upload"}],"source_content_type":"text/x-python","patch_set":2,"id":"598e1bbc_6c9c4893","line":974,"range":{"start_line":970,"start_character":0,"end_line":974,"end_character":49},"updated":"2026-05-13 07:12:27.000000000","message":"ditto","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"fa284c9d146489a781c5506856b7c6e5d3f6ae75","unresolved":false,"context_lines":[{"line_number":967,"context_line":"            metadata \u003d {}"},{"line_number":968,"context_line":"            if self.backend_group:"},{"line_number":969,"context_line":"                metadata[\u0027store\u0027] \u003d self.backend_group"},{"line_number":970,"context_line":"            else:"},{"line_number":971,"context_line":"                stores \u003d _normalized_glance_stores("},{"line_number":972,"context_line":"                    self.conf.glance_store.stores)"},{"line_number":973,"context_line":"                if stores:"},{"line_number":974,"context_line":"                    metadata[\u0027store\u0027] \u003d stores[0]"},{"line_number":975,"context_line":"            # If no parts were uploaded, this was a zero-byte image. This is"},{"line_number":976,"context_line":"            # the case when a BFV server creates a snapshot resulting in a 0"},{"line_number":977,"context_line":"            # byte image file. Since we cannot complete a multipart upload"}],"source_content_type":"text/x-python","patch_set":2,"id":"5611b0a5_f08b1d0a","line":974,"range":{"start_line":970,"start_character":0,"end_line":974,"end_character":49},"in_reply_to":"598e1bbc_6c9c4893","updated":"2026-06-02 09:57:25.000000000","message":"Done","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"6ed2a794174966c00e1323b11188dea437bf8b5a","unresolved":true,"context_lines":[{"line_number":1009,"context_line":"                         \"with checksum %(checksum)s\","},{"line_number":1010,"context_line":"                         {\u0027key\u0027: key, \u0027UploadId\u0027: upload_id,"},{"line_number":1011,"context_line":"                          \u0027total_size\u0027: total_size, \u0027checksum\u0027: checksum_hex})"},{"line_number":1012,"context_line":"            return (loc.get_uri(include_credentials\u003dFalse), total_size,"},{"line_number":1013,"context_line":"                    checksum_hex, hash_hex, metadata)"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"        # Abort"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ab0a026_4bdfa170","line":1012,"range":{"start_line":1012,"start_character":32,"end_line":1012,"end_character":57},"updated":"2026-05-13 07:12:27.000000000","message":"ditto","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"fa284c9d146489a781c5506856b7c6e5d3f6ae75","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"                         \"with checksum %(checksum)s\","},{"line_number":1010,"context_line":"                         {\u0027key\u0027: key, \u0027UploadId\u0027: upload_id,"},{"line_number":1011,"context_line":"                          \u0027total_size\u0027: total_size, \u0027checksum\u0027: checksum_hex})"},{"line_number":1012,"context_line":"            return (loc.get_uri(include_credentials\u003dFalse), total_size,"},{"line_number":1013,"context_line":"                    checksum_hex, hash_hex, metadata)"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"        # Abort"}],"source_content_type":"text/x-python","patch_set":2,"id":"8585e5a0_269c780e","line":1012,"range":{"start_line":1012,"start_character":32,"end_line":1012,"end_character":57},"in_reply_to":"3ab0a026_4bdfa170","updated":"2026-06-02 09:57:25.000000000","message":"Done","commit_id":"2e2e2f1468b36ca250a2bb5c721a7cd911b87a5f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"9c035a094abf86e174710e2aea34241bc5f761b7","unresolved":true,"context_lines":[{"line_number":582,"context_line":"            config \u003d boto_client.Config(s3\u003dcalling_format)"},{"line_number":583,"context_line":"        location \u003d get_s3_location(s3_host)"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        bucket_name \u003d loc.bucket"},{"line_number":586,"context_line":"        if (url_format \u003d\u003d \u0027virtual\u0027 and"},{"line_number":587,"context_line":"                not boto_utils.check_dns_name(bucket_name)):"},{"line_number":588,"context_line":"            raise boto_exceptions.InvalidDNSNameError(bucket_name\u003dbucket_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"33ba02a6_862693d4","line":585,"range":{"start_line":585,"start_character":8,"end_line":585,"end_character":32},"updated":"2026-06-03 05:22:21.000000000","message":"You can use self.bucket here and avoid passing loc to this method call as it is not used for any other purpose.","commit_id":"e16f3fdf74496e7e2b0ccf7eec9fe209b749c3d6"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"46cdc27c21e08d3798c961ff80283614f8cb46f7","unresolved":false,"context_lines":[{"line_number":582,"context_line":"            config \u003d boto_client.Config(s3\u003dcalling_format)"},{"line_number":583,"context_line":"        location \u003d get_s3_location(s3_host)"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        bucket_name \u003d loc.bucket"},{"line_number":586,"context_line":"        if (url_format \u003d\u003d \u0027virtual\u0027 and"},{"line_number":587,"context_line":"                not boto_utils.check_dns_name(bucket_name)):"},{"line_number":588,"context_line":"            raise boto_exceptions.InvalidDNSNameError(bucket_name\u003dbucket_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"51531227_68af43eb","line":585,"range":{"start_line":585,"start_character":8,"end_line":585,"end_character":32},"in_reply_to":"33ba02a6_862693d4","updated":"2026-06-04 13:09:56.000000000","message":"removed loc passing in create_s3_client","commit_id":"e16f3fdf74496e7e2b0ccf7eec9fe209b749c3d6"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"bc1bbc8d922cc9629b381fc7d03dfdd2f0ce2d6d","unresolved":true,"context_lines":[{"line_number":392,"context_line":"        \"\"\"Parse URLs."},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        Credentials are no longer parsed from the URI; they are"},{"line_number":395,"context_line":"        read from configuration options."},{"line_number":396,"context_line":"        \"\"\""},{"line_number":397,"context_line":"        # Make sure that URIs that contain multiple schemes, such as:"},{"line_number":398,"context_line":"        # s3://https://s3.amazonaws.com/bucket/key-id"}],"source_content_type":"text/x-python","patch_set":5,"id":"a136c818_67b34a20","line":395,"range":{"start_line":395,"start_character":32,"end_line":395,"end_character":39},"updated":"2026-06-04 14:57:41.000000000","message":"This is nice to explain this in the commit log and in the release notes, but a year from now, when I\u0027ll read this docstring, I\u0027ll need to know what this method does, not what it used to do and how it\u0027s evolved.\n\nJust describe what parse_uri does.","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"86796d0d3d3d78300a679603a806e74b43aa83b5","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        \"\"\"Parse URLs."},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        Credentials are no longer parsed from the URI; they are"},{"line_number":395,"context_line":"        read from configuration options."},{"line_number":396,"context_line":"        \"\"\""},{"line_number":397,"context_line":"        # Make sure that URIs that contain multiple schemes, such as:"},{"line_number":398,"context_line":"        # s3://https://s3.amazonaws.com/bucket/key-id"}],"source_content_type":"text/x-python","patch_set":5,"id":"e054394b_4b2a143d","line":395,"range":{"start_line":395,"start_character":32,"end_line":395,"end_character":39},"in_reply_to":"a136c818_67b34a20","updated":"2026-06-05 17:41:45.000000000","message":"Done","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"}],"glance_store/tests/unit/test_s3_store_base.py":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"9c035a094abf86e174710e2aea34241bc5f761b7","unresolved":true,"context_lines":[{"line_number":46,"context_line":"def format_s3_location(authurl, bucket, obj):"},{"line_number":47,"context_line":"    \"\"\"Helper method that returns a credential-free S3 store URI.\"\"\""},{"line_number":48,"context_line":"    scheme \u003d \u0027s3\u0027"},{"line_number":49,"context_line":"    host \u003d authurl"},{"line_number":50,"context_line":"    if host.startswith(\u0027https://\u0027):"},{"line_number":51,"context_line":"        scheme \u003d \u0027s3+https\u0027"},{"line_number":52,"context_line":"        authurl \u003d authurl[len(\u0027https://\u0027):]"}],"source_content_type":"text/x-python","patch_set":4,"id":"d4894189_75b47d07","line":49,"range":{"start_line":49,"start_character":5,"end_line":49,"end_character":18},"updated":"2026-06-03 05:22:21.000000000","message":"is this really necessary?","commit_id":"e16f3fdf74496e7e2b0ccf7eec9fe209b749c3d6"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"46cdc27c21e08d3798c961ff80283614f8cb46f7","unresolved":false,"context_lines":[{"line_number":46,"context_line":"def format_s3_location(authurl, bucket, obj):"},{"line_number":47,"context_line":"    \"\"\"Helper method that returns a credential-free S3 store URI.\"\"\""},{"line_number":48,"context_line":"    scheme \u003d \u0027s3\u0027"},{"line_number":49,"context_line":"    host \u003d authurl"},{"line_number":50,"context_line":"    if host.startswith(\u0027https://\u0027):"},{"line_number":51,"context_line":"        scheme \u003d \u0027s3+https\u0027"},{"line_number":52,"context_line":"        authurl \u003d authurl[len(\u0027https://\u0027):]"}],"source_content_type":"text/x-python","patch_set":4,"id":"86d4c70c_26a7cb71","line":49,"range":{"start_line":49,"start_character":5,"end_line":49,"end_character":18},"in_reply_to":"d4894189_75b47d07","updated":"2026-06-04 13:09:56.000000000","message":"yes missed it. Made changes","commit_id":"e16f3fdf74496e7e2b0ccf7eec9fe209b749c3d6"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"bc1bbc8d922cc9629b381fc7d03dfdd2f0ce2d6d","unresolved":true,"context_lines":[{"line_number":122,"context_line":"            backend_conf.s3_store_host, bucket, key)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        with stub.Stubber(fake_s3_client) as stubber:"},{"line_number":125,"context_line":"            stubber.add_response(method\u003d\u0027head_object\u0027,"},{"line_number":126,"context_line":"                                 service_response\u003d{},"},{"line_number":127,"context_line":"                                 expected_params\u003d{"},{"line_number":128,"context_line":"                                     \u0027Bucket\u0027: bucket, \u0027Key\u0027: key})"}],"source_content_type":"text/x-python","patch_set":5,"id":"03da9a21_b4f5e5fc","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":12},"updated":"2026-06-04 14:57:41.000000000","message":"Can we put all the context managers in a single with statement in this function? Let\u0027s listen to Linus and not add indentation levels we do not need :)","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"86796d0d3d3d78300a679603a806e74b43aa83b5","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            backend_conf.s3_store_host, bucket, key)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        with stub.Stubber(fake_s3_client) as stubber:"},{"line_number":125,"context_line":"            stubber.add_response(method\u003d\u0027head_object\u0027,"},{"line_number":126,"context_line":"                                 service_response\u003d{},"},{"line_number":127,"context_line":"                                 expected_params\u003d{"},{"line_number":128,"context_line":"                                     \u0027Bucket\u0027: bucket, \u0027Key\u0027: key})"}],"source_content_type":"text/x-python","patch_set":5,"id":"d03d6921_8e05cd5c","line":125,"range":{"start_line":125,"start_character":0,"end_line":125,"end_character":12},"in_reply_to":"03da9a21_b4f5e5fc","updated":"2026-06-05 17:41:45.000000000","message":"Acknowledged","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"bc1bbc8d922cc9629b381fc7d03dfdd2f0ce2d6d","unresolved":true,"context_lines":[{"line_number":759,"context_line":"                    endpoint_url\u003d\u0027https://s3-region1.com\u0027,"},{"line_number":760,"context_line":"                    region_name\u003d\u0027custom_region_name\u0027,"},{"line_number":761,"context_line":"                    service_name\u003d\u0027s3\u0027,"},{"line_number":762,"context_line":"                    use_ssl\u003dTrue,"},{"line_number":763,"context_line":"                    verify\u003d\u0027path/to/cert/bundle.pem\u0027,"},{"line_number":764,"context_line":"                )"},{"line_number":765,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"93e72a1f_7d1b3857","line":762,"range":{"start_line":762,"start_character":32,"end_line":762,"end_character":33},"updated":"2026-06-04 14:57:41.000000000","message":"Why does this patch impact the value of use_ssl here?","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"86796d0d3d3d78300a679603a806e74b43aa83b5","unresolved":false,"context_lines":[{"line_number":759,"context_line":"                    endpoint_url\u003d\u0027https://s3-region1.com\u0027,"},{"line_number":760,"context_line":"                    region_name\u003d\u0027custom_region_name\u0027,"},{"line_number":761,"context_line":"                    service_name\u003d\u0027s3\u0027,"},{"line_number":762,"context_line":"                    use_ssl\u003dTrue,"},{"line_number":763,"context_line":"                    verify\u003d\u0027path/to/cert/bundle.pem\u0027,"},{"line_number":764,"context_line":"                )"},{"line_number":765,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"cf17e692_36d61b96","line":762,"range":{"start_line":762,"start_character":32,"end_line":762,"end_character":33},"in_reply_to":"93e72a1f_7d1b3857","updated":"2026-06-05 17:41:45.000000000","message":"Before use_ssl was take from loc.scheme, but loc was a MagicMock \u0026 the scheme value was never set. So the check always return False.\n\nNow loc is not passed in create_s3_client(). it check from self.scheme, which is set from s3_store_host during configure_add().\n\nAlso multistore, config has https://s3-region1.com, self.scheme becomes s3+https, so use_ssl is set to True. \nMaybe I am wrong but this is what I understood from the code changes.","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"e7169084a1fe043a51360b8758270ac8bf640043","unresolved":false,"context_lines":[{"line_number":759,"context_line":"                    endpoint_url\u003d\u0027https://s3-region1.com\u0027,"},{"line_number":760,"context_line":"                    region_name\u003d\u0027custom_region_name\u0027,"},{"line_number":761,"context_line":"                    service_name\u003d\u0027s3\u0027,"},{"line_number":762,"context_line":"                    use_ssl\u003dTrue,"},{"line_number":763,"context_line":"                    verify\u003d\u0027path/to/cert/bundle.pem\u0027,"},{"line_number":764,"context_line":"                )"},{"line_number":765,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"892e80ab_6534f4e6","line":762,"range":{"start_line":762,"start_character":32,"end_line":762,"end_character":33},"in_reply_to":"cf17e692_36d61b96","updated":"2026-06-12 14:00:09.000000000","message":"\u003e loc was a MagicMock \u0026 the scheme value was never set. So the check always return False.\n\nOh, I see! Thanks for the explanation.","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"bc1bbc8d922cc9629b381fc7d03dfdd2f0ce2d6d","unresolved":true,"context_lines":[{"line_number":791,"context_line":"                    endpoint_url\u003d\u0027https://s3-region1.com\u0027,"},{"line_number":792,"context_line":"                    region_name\u003d\u0027custom_region_name\u0027,"},{"line_number":793,"context_line":"                    service_name\u003d\u0027s3\u0027,"},{"line_number":794,"context_line":"                    use_ssl\u003dTrue,"},{"line_number":795,"context_line":"                    verify\u003d\u0027path/to/cert/bundle.pem\u0027,"},{"line_number":796,"context_line":"                )"},{"line_number":797,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"537d48c5_edc43005","line":794,"range":{"start_line":794,"start_character":28,"end_line":794,"end_character":32},"updated":"2026-06-04 14:57:41.000000000","message":"Ditto","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"86796d0d3d3d78300a679603a806e74b43aa83b5","unresolved":false,"context_lines":[{"line_number":791,"context_line":"                    endpoint_url\u003d\u0027https://s3-region1.com\u0027,"},{"line_number":792,"context_line":"                    region_name\u003d\u0027custom_region_name\u0027,"},{"line_number":793,"context_line":"                    service_name\u003d\u0027s3\u0027,"},{"line_number":794,"context_line":"                    use_ssl\u003dTrue,"},{"line_number":795,"context_line":"                    verify\u003d\u0027path/to/cert/bundle.pem\u0027,"},{"line_number":796,"context_line":"                )"},{"line_number":797,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fc43ad88_8cfa4a00","line":794,"range":{"start_line":794,"start_character":28,"end_line":794,"end_character":32},"in_reply_to":"537d48c5_edc43005","updated":"2026-06-05 17:41:45.000000000","message":"same explanation as the previous comment.","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"}],"releasenotes/notes/s3-location-without-credentials-7d276443d4de3cc8.yaml":[{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"bc1bbc8d922cc9629b381fc7d03dfdd2f0ce2d6d","unresolved":true,"context_lines":[{"line_number":7,"context_line":"    ``s3_store_secret_key``) instead of being embedded in the URI."},{"line_number":8,"context_line":"    Existing images with legacy credential-bearing S3 URIs are migrated"},{"line_number":9,"context_line":"    automatically on first access. No bulk migration or downtime is"},{"line_number":10,"context_line":"    required."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"d4abcc05_595de172","line":10,"range":{"start_line":10,"start_character":4,"end_line":10,"end_character":12},"updated":"2026-06-04 14:57:41.000000000","message":"I think we might want to mention admins *must* update Glance as well so that the lazy migration can happen.","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"},{"author":{"_account_id":38762,"name":"Sahil Kumbhar","display_name":"sakumbha","email":"sakumbha@redhat.com","username":"sakumbha"},"change_message_id":"86796d0d3d3d78300a679603a806e74b43aa83b5","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    ``s3_store_secret_key``) instead of being embedded in the URI."},{"line_number":8,"context_line":"    Existing images with legacy credential-bearing S3 URIs are migrated"},{"line_number":9,"context_line":"    automatically on first access. No bulk migration or downtime is"},{"line_number":10,"context_line":"    required."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"5f4e017a_aaf1c8d0","line":10,"range":{"start_line":10,"start_character":4,"end_line":10,"end_character":12},"in_reply_to":"d4abcc05_595de172","updated":"2026-06-05 17:41:45.000000000","message":"Done","commit_id":"deadda22d21026fe58a201cbe731cfd1e1cce1f4"}]}
