)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"8e57d44e1963a2fa9daffae6b191cbad5980a517","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0da17140_df5d1aee","updated":"2025-05-12 08:31:25.000000000","message":"recheck unrelated failure","commit_id":"91689a04449d44d6ed278e4a3a523583429c5080"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b77b307c80b0eafb4ec97cb17d89dd86789359e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"88f1ea55_d36d6197","updated":"2025-06-26 15:32:43.000000000","message":"I haven\u0027t reviewed tests yet, but committing some comments on the code to start","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"72c8954c7877e9b96fec10d0183c8cb155f97366","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"bab21567_fdf3289e","updated":"2025-06-27 08:43:19.000000000","message":"Thank you Dan for the review!!\nMade changes as per suggestion!","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"4455b6ed7243f3b8168b60be2a2d63eb03ba88f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"8f0e403a_18ed9b4c","updated":"2025-05-16 14:02:18.000000000","message":"recheck cinder timeout","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1b093fd756cb6085ae604b691b5058bc4261ab92","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0a60b559_8505b789","updated":"2025-06-30 14:42:04.000000000","message":"I just addressed some trivial feedback","commit_id":"01f36b659b529febbc4c3570eabcf2633ea075f1"}],"glance_store/_drivers/s3.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b77b307c80b0eafb4ec97cb17d89dd86789359e5","unresolved":true,"context_lines":[{"line_number":664,"context_line":"        raise exceptions.Duplicate(image\u003dkey)"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    def _add_singlepart(self, s3_client, image_file, bucket, key, loc,"},{"line_number":667,"context_line":"                        hashing_algo, verifier, expected_image_size\u003d0):"},{"line_number":668,"context_line":"        \"\"\"Stores an image file with a single part upload to S3 backend."},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"        :param s3_client: An object with credentials to connect to S3"}],"source_content_type":"text/x-python","patch_set":6,"id":"30226ab1_a761de4d","line":667,"range":{"start_line":667,"start_character":48,"end_line":667,"end_character":69},"updated":"2025-06-26 15:32:43.000000000","message":"Why does this need to be optional/defaulted? It doesn\u0027t look to me like this is used anywhere other than L644.\n\nAlso, can\u0027t we use `image_size` for parity with `_add_multipart()`? I understand it would require renaming the `image_size` variable below, but it seems better to make them the same.","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"e1231062c40795ae8521304852eab65d08434afa","unresolved":false,"context_lines":[{"line_number":664,"context_line":"        raise exceptions.Duplicate(image\u003dkey)"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    def _add_singlepart(self, s3_client, image_file, bucket, key, loc,"},{"line_number":667,"context_line":"                        hashing_algo, verifier, expected_image_size\u003d0):"},{"line_number":668,"context_line":"        \"\"\"Stores an image file with a single part upload to S3 backend."},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"        :param s3_client: An object with credentials to connect to S3"}],"source_content_type":"text/x-python","patch_set":6,"id":"84035507_c48a20d9","line":667,"range":{"start_line":667,"start_character":48,"end_line":667,"end_character":69},"in_reply_to":"30226ab1_a761de4d","updated":"2025-06-26 17:22:36.000000000","message":"Acknowledged","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b77b307c80b0eafb4ec97cb17d89dd86789359e5","unresolved":true,"context_lines":[{"line_number":687,"context_line":"        image_size \u003d 0"},{"line_number":688,"context_line":"        for chunk in utils.chunkreadable(image_file, self.WRITE_CHUNKSIZE):"},{"line_number":689,"context_line":"            image_size +\u003d len(chunk)"},{"line_number":690,"context_line":"            if expected_image_size !\u003d 0 and image_size \u003e expected_image_size:"},{"line_number":691,"context_line":"                # Size exceeded, abort upload"},{"line_number":692,"context_line":"                raise glance_store.Invalid("},{"line_number":693,"context_line":"                    _(\"Size exceeds expected: expected %(expected)d bytes, \""}],"source_content_type":"text/x-python","patch_set":6,"id":"21da9a9d_7f9efafa","line":690,"updated":"2025-06-26 15:32:43.000000000","message":"Is the check for `!\u003d 0` just because of the defaulting above or would we ever expect this to be passed in as zero? If not, then it would be better to keep this simpler.","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"e1231062c40795ae8521304852eab65d08434afa","unresolved":true,"context_lines":[{"line_number":687,"context_line":"        image_size \u003d 0"},{"line_number":688,"context_line":"        for chunk in utils.chunkreadable(image_file, self.WRITE_CHUNKSIZE):"},{"line_number":689,"context_line":"            image_size +\u003d len(chunk)"},{"line_number":690,"context_line":"            if expected_image_size !\u003d 0 and image_size \u003e expected_image_size:"},{"line_number":691,"context_line":"                # Size exceeded, abort upload"},{"line_number":692,"context_line":"                raise glance_store.Invalid("},{"line_number":693,"context_line":"                    _(\"Size exceeds expected: expected %(expected)d bytes, \""}],"source_content_type":"text/x-python","patch_set":6,"id":"dfe17ef7_d03ea6bc","line":690,"in_reply_to":"21da9a9d_7f9efafa","updated":"2025-06-26 17:22:36.000000000","message":"Yes, this is 0 at this moment as we pass it from glance.","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"72c8954c7877e9b96fec10d0183c8cb155f97366","unresolved":false,"context_lines":[{"line_number":687,"context_line":"        image_size \u003d 0"},{"line_number":688,"context_line":"        for chunk in utils.chunkreadable(image_file, self.WRITE_CHUNKSIZE):"},{"line_number":689,"context_line":"            image_size +\u003d len(chunk)"},{"line_number":690,"context_line":"            if expected_image_size !\u003d 0 and image_size \u003e expected_image_size:"},{"line_number":691,"context_line":"                # Size exceeded, abort upload"},{"line_number":692,"context_line":"                raise glance_store.Invalid("},{"line_number":693,"context_line":"                    _(\"Size exceeds expected: expected %(expected)d bytes, \""}],"source_content_type":"text/x-python","patch_set":6,"id":"446720b2_8dc82ad6","line":690,"in_reply_to":"dfe17ef7_d03ea6bc","updated":"2025-06-27 08:43:19.000000000","message":"Done","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b77b307c80b0eafb4ec97cb17d89dd86789359e5","unresolved":true,"context_lines":[{"line_number":700,"context_line":"                verifier.update(chunk)"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"        # Final size check after reading all chunks"},{"line_number":703,"context_line":"        if expected_image_size !\u003d 0 and image_size !\u003d expected_image_size:"},{"line_number":704,"context_line":"            raise glance_store.Invalid("},{"line_number":705,"context_line":"                _(\"Size mismatch: expected %(expected)d bytes, \""},{"line_number":706,"context_line":"                  \"got %(actual)d bytes\") %"}],"source_content_type":"text/x-python","patch_set":6,"id":"96b5d796_6069ce24","line":703,"updated":"2025-06-26 15:32:43.000000000","message":"Same here, it\u0027d be better if we don\u0027t have to consider the zero case.","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"72c8954c7877e9b96fec10d0183c8cb155f97366","unresolved":false,"context_lines":[{"line_number":700,"context_line":"                verifier.update(chunk)"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"        # Final size check after reading all chunks"},{"line_number":703,"context_line":"        if expected_image_size !\u003d 0 and image_size !\u003d expected_image_size:"},{"line_number":704,"context_line":"            raise glance_store.Invalid("},{"line_number":705,"context_line":"                _(\"Size mismatch: expected %(expected)d bytes, \""},{"line_number":706,"context_line":"                  \"got %(actual)d bytes\") %"}],"source_content_type":"text/x-python","patch_set":6,"id":"bddc7d4d_e1e95201","line":703,"in_reply_to":"95560074_690dc06f","updated":"2025-06-27 08:43:19.000000000","message":"Done","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"e1231062c40795ae8521304852eab65d08434afa","unresolved":true,"context_lines":[{"line_number":700,"context_line":"                verifier.update(chunk)"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":"        # Final size check after reading all chunks"},{"line_number":703,"context_line":"        if expected_image_size !\u003d 0 and image_size !\u003d expected_image_size:"},{"line_number":704,"context_line":"            raise glance_store.Invalid("},{"line_number":705,"context_line":"                _(\"Size mismatch: expected %(expected)d bytes, \""},{"line_number":706,"context_line":"                  \"got %(actual)d bytes\") %"}],"source_content_type":"text/x-python","patch_set":6,"id":"95560074_690dc06f","line":703,"in_reply_to":"96b5d796_6069ce24","updated":"2025-06-26 17:22:36.000000000","message":"same","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b77b307c80b0eafb4ec97cb17d89dd86789359e5","unresolved":true,"context_lines":[{"line_number":705,"context_line":"                _(\"Size mismatch: expected %(expected)d bytes, \""},{"line_number":706,"context_line":"                  \"got %(actual)d bytes\") %"},{"line_number":707,"context_line":"                {\u0027expected\u0027: expected_image_size, \u0027actual\u0027: image_size}"},{"line_number":708,"context_line":"            )"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        s3_client.put_object(Body\u003dimage_data,"},{"line_number":711,"context_line":"                             Bucket\u003dbucket,"}],"source_content_type":"text/x-python","patch_set":6,"id":"c757d358_e97a03ca","line":708,"updated":"2025-06-26 15:32:43.000000000","message":"Wasted extra line :(","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"e1231062c40795ae8521304852eab65d08434afa","unresolved":false,"context_lines":[{"line_number":705,"context_line":"                _(\"Size mismatch: expected %(expected)d bytes, \""},{"line_number":706,"context_line":"                  \"got %(actual)d bytes\") %"},{"line_number":707,"context_line":"                {\u0027expected\u0027: expected_image_size, \u0027actual\u0027: image_size}"},{"line_number":708,"context_line":"            )"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        s3_client.put_object(Body\u003dimage_data,"},{"line_number":711,"context_line":"                             Bucket\u003dbucket,"}],"source_content_type":"text/x-python","patch_set":6,"id":"f927bb11_042b82f3","line":708,"in_reply_to":"c757d358_e97a03ca","updated":"2025-06-26 17:22:36.000000000","message":"Ack, will always keep in mind","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b77b307c80b0eafb4ec97cb17d89dd86789359e5","unresolved":true,"context_lines":[{"line_number":760,"context_line":"                                   chunk_size)"},{"line_number":761,"context_line":"            it \u003d utils.chunkreadable(image_file, self.WRITE_CHUNKSIZE)"},{"line_number":762,"context_line":"            buffered_chunk \u003d b\u0027\u0027"},{"line_number":763,"context_line":"            total_bytes \u003d 0"},{"line_number":764,"context_line":"            while True:"},{"line_number":765,"context_line":"                try:"},{"line_number":766,"context_line":"                    buffered_clen \u003d len(buffered_chunk)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dd82dab8_9d467b59","line":763,"updated":"2025-06-26 15:32:43.000000000","message":"This is a better name for what the above calls `image_size`, IMHO.","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"e1231062c40795ae8521304852eab65d08434afa","unresolved":false,"context_lines":[{"line_number":760,"context_line":"                                   chunk_size)"},{"line_number":761,"context_line":"            it \u003d utils.chunkreadable(image_file, self.WRITE_CHUNKSIZE)"},{"line_number":762,"context_line":"            buffered_chunk \u003d b\u0027\u0027"},{"line_number":763,"context_line":"            total_bytes \u003d 0"},{"line_number":764,"context_line":"            while True:"},{"line_number":765,"context_line":"                try:"},{"line_number":766,"context_line":"                    buffered_clen \u003d len(buffered_chunk)"}],"source_content_type":"text/x-python","patch_set":6,"id":"e66cd2c1_259934ab","line":763,"in_reply_to":"dd82dab8_9d467b59","updated":"2025-06-26 17:22:36.000000000","message":"Acknowledged","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b77b307c80b0eafb4ec97cb17d89dd86789359e5","unresolved":true,"context_lines":[{"line_number":835,"context_line":"                _(\"Size mismatch after upload: expected %(expected)d \""},{"line_number":836,"context_line":"                  \"bytes, got %(actual)d bytes\") %"},{"line_number":837,"context_line":"                {\u0027expected\u0027: image_size, \u0027actual\u0027: total_bytes})"},{"line_number":838,"context_line":""},{"line_number":839,"context_line":"        # Check success status"},{"line_number":840,"context_line":"        success \u003d all(p.success for p in plist)"},{"line_number":841,"context_line":"        total_size \u003d sum(p.size for p in plist)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fdd602d8_b23f6eb9","line":838,"updated":"2025-06-26 15:32:43.000000000","message":"I think we could put this and the above in a `finally:` block and avoid needing to duplicate it, right?","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"e1231062c40795ae8521304852eab65d08434afa","unresolved":false,"context_lines":[{"line_number":835,"context_line":"                _(\"Size mismatch after upload: expected %(expected)d \""},{"line_number":836,"context_line":"                  \"bytes, got %(actual)d bytes\") %"},{"line_number":837,"context_line":"                {\u0027expected\u0027: image_size, \u0027actual\u0027: total_bytes})"},{"line_number":838,"context_line":""},{"line_number":839,"context_line":"        # Check success status"},{"line_number":840,"context_line":"        success \u003d all(p.success for p in plist)"},{"line_number":841,"context_line":"        total_size \u003d sum(p.size for p in plist)"}],"source_content_type":"text/x-python","patch_set":6,"id":"897495e7_21999e76","line":838,"in_reply_to":"fdd602d8_b23f6eb9","updated":"2025-06-26 17:22:36.000000000","message":"Acknowledged","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"}],"glance_store/tests/unit/test_multistore_s3.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d413d90fe5647e686345a74761e82766910fbd40","unresolved":true,"context_lines":[{"line_number":329,"context_line":"            mock_client.return_value \u003d fake_s3_client"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"            # Expect an exception due to size mismatch"},{"line_number":332,"context_line":"            self.assertRaises(exceptions.Invalid, self.store.add,"},{"line_number":333,"context_line":"                              expected_image_id, image_s3, expected_s3_size,"},{"line_number":334,"context_line":"                              self.hash_algo)"},{"line_number":335,"context_line":"            # Verify that the stream\u0027s position reflects the number of bytes"}],"source_content_type":"text/x-python","patch_set":6,"id":"23dce1f3_c30ec9a2","line":332,"updated":"2025-06-26 16:07:36.000000000","message":"I think you should make sure this is raised for the reason you expect.","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"e1231062c40795ae8521304852eab65d08434afa","unresolved":false,"context_lines":[{"line_number":329,"context_line":"            mock_client.return_value \u003d fake_s3_client"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"            # Expect an exception due to size mismatch"},{"line_number":332,"context_line":"            self.assertRaises(exceptions.Invalid, self.store.add,"},{"line_number":333,"context_line":"                              expected_image_id, image_s3, expected_s3_size,"},{"line_number":334,"context_line":"                              self.hash_algo)"},{"line_number":335,"context_line":"            # Verify that the stream\u0027s position reflects the number of bytes"}],"source_content_type":"text/x-python","patch_set":6,"id":"541203ec_732184f3","line":332,"in_reply_to":"23dce1f3_c30ec9a2","updated":"2025-06-26 17:22:36.000000000","message":"Acknowledged","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d413d90fe5647e686345a74761e82766910fbd40","unresolved":true,"context_lines":[{"line_number":378,"context_line":"            mock_client.return_value \u003d fake_s3_client"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"            # Expect an exception due to size mismatch"},{"line_number":381,"context_line":"            self.assertRaises(exceptions.Invalid, self.store.add,"},{"line_number":382,"context_line":"                              expected_image_id, image_s3, expected_s3_size,"},{"line_number":383,"context_line":"                              self.hash_algo)"},{"line_number":384,"context_line":"            # The input buffer should be fully read"}],"source_content_type":"text/x-python","patch_set":6,"id":"3215780a_52903e36","line":381,"updated":"2025-06-26 16:07:36.000000000","message":"Same here","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"e1231062c40795ae8521304852eab65d08434afa","unresolved":false,"context_lines":[{"line_number":378,"context_line":"            mock_client.return_value \u003d fake_s3_client"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"            # Expect an exception due to size mismatch"},{"line_number":381,"context_line":"            self.assertRaises(exceptions.Invalid, self.store.add,"},{"line_number":382,"context_line":"                              expected_image_id, image_s3, expected_s3_size,"},{"line_number":383,"context_line":"                              self.hash_algo)"},{"line_number":384,"context_line":"            # The input buffer should be fully read"}],"source_content_type":"text/x-python","patch_set":6,"id":"39fe2f02_d3b6ae48","line":381,"in_reply_to":"3215780a_52903e36","updated":"2025-06-26 17:22:36.000000000","message":"Acknowledged","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d413d90fe5647e686345a74761e82766910fbd40","unresolved":true,"context_lines":[{"line_number":732,"context_line":"                Bucket\u003dS3_CONF[\u0027s3_store_bucket\u0027],"},{"line_number":733,"context_line":"                Key\u003dexpected_image_id,"},{"line_number":734,"context_line":"                UploadId\u003d\u0027UploadId\u0027"},{"line_number":735,"context_line":"            )"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    @mock.patch.object(boto3.session.Session, \"client\")"},{"line_number":738,"context_line":"    def test_add_already_existing(self, mock_client):"}],"source_content_type":"text/x-python","patch_set":6,"id":"b2a5995b_5c063678","line":735,"updated":"2025-06-26 16:07:36.000000000","message":"Are these multi/single tests not basically identical? Can\u0027t we re-use a bunch of the meat, perhaps with a few different parameters? They\u0027re so similar it\u0027s hard to tell what the difference is, aside from the name.","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"72c8954c7877e9b96fec10d0183c8cb155f97366","unresolved":false,"context_lines":[{"line_number":732,"context_line":"                Bucket\u003dS3_CONF[\u0027s3_store_bucket\u0027],"},{"line_number":733,"context_line":"                Key\u003dexpected_image_id,"},{"line_number":734,"context_line":"                UploadId\u003d\u0027UploadId\u0027"},{"line_number":735,"context_line":"            )"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    @mock.patch.object(boto3.session.Session, \"client\")"},{"line_number":738,"context_line":"    def test_add_already_existing(self, mock_client):"}],"source_content_type":"text/x-python","patch_set":6,"id":"8a1798a5_06d834a2","line":735,"in_reply_to":"6db22c91_988794db","updated":"2025-06-27 08:43:19.000000000","message":"There is a significant amount of duplication throughout the file. I will work on addressing this by creating a separate patch to remove the redundant code.","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"e1231062c40795ae8521304852eab65d08434afa","unresolved":false,"context_lines":[{"line_number":732,"context_line":"                Bucket\u003dS3_CONF[\u0027s3_store_bucket\u0027],"},{"line_number":733,"context_line":"                Key\u003dexpected_image_id,"},{"line_number":734,"context_line":"                UploadId\u003d\u0027UploadId\u0027"},{"line_number":735,"context_line":"            )"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    @mock.patch.object(boto3.session.Session, \"client\")"},{"line_number":738,"context_line":"    def test_add_already_existing(self, mock_client):"}],"source_content_type":"text/x-python","patch_set":6,"id":"6db22c91_988794db","line":735,"in_reply_to":"b2a5995b_5c063678","updated":"2025-06-26 17:22:36.000000000","message":"Acknowledged","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"28873aa69331544aa81fac46069da6355ee516b5","unresolved":true,"context_lines":[{"line_number":335,"context_line":"            except exceptions.Invalid as e:"},{"line_number":336,"context_line":"                # Ensure the exception message contains the expected size"},{"line_number":337,"context_line":"                self.assertIn(\"Size exceeds: expected\", str(e))"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"            # Verify that the stream\u0027s position reflects the number of bytes"},{"line_number":340,"context_line":"            # read, which should be exactly at expected_file_size plus the"},{"line_number":341,"context_line":"            # last buffer size read."}],"source_content_type":"text/x-python","patch_set":7,"id":"0e3228c8_0818b9df","line":338,"updated":"2025-06-30 14:09:55.000000000","message":"...This should be `assertRaisesRegex()` ...","commit_id":"4e32a3c0d5f6a07f0a46f0882c8d81723e282e9b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1b093fd756cb6085ae604b691b5058bc4261ab92","unresolved":false,"context_lines":[{"line_number":335,"context_line":"            except exceptions.Invalid as e:"},{"line_number":336,"context_line":"                # Ensure the exception message contains the expected size"},{"line_number":337,"context_line":"                self.assertIn(\"Size exceeds: expected\", str(e))"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"            # Verify that the stream\u0027s position reflects the number of bytes"},{"line_number":340,"context_line":"            # read, which should be exactly at expected_file_size plus the"},{"line_number":341,"context_line":"            # last buffer size read."}],"source_content_type":"text/x-python","patch_set":7,"id":"72a829f7_836a77b5","line":338,"in_reply_to":"0e3228c8_0818b9df","updated":"2025-06-30 14:42:04.000000000","message":"Done","commit_id":"4e32a3c0d5f6a07f0a46f0882c8d81723e282e9b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"28873aa69331544aa81fac46069da6355ee516b5","unresolved":true,"context_lines":[{"line_number":399,"context_line":"                self.store.add(expected_image_id, image_s3, expected_s3_size,"},{"line_number":400,"context_line":"                               self.hash_algo)"},{"line_number":401,"context_line":"            except exceptions.Invalid as e:"},{"line_number":402,"context_line":"                self.assertIn(\"Size mismatch: expected\", str(e))"},{"line_number":403,"context_line":"            self.assertRaises(exceptions.Invalid, self.store.add,"},{"line_number":404,"context_line":"                              expected_image_id, image_s3, expected_s3_size,"},{"line_number":405,"context_line":"                              self.hash_algo)"}],"source_content_type":"text/x-python","patch_set":7,"id":"215a7566_fd3ee450","line":402,"updated":"2025-06-30 14:09:55.000000000","message":"Same here","commit_id":"4e32a3c0d5f6a07f0a46f0882c8d81723e282e9b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1b093fd756cb6085ae604b691b5058bc4261ab92","unresolved":false,"context_lines":[{"line_number":399,"context_line":"                self.store.add(expected_image_id, image_s3, expected_s3_size,"},{"line_number":400,"context_line":"                               self.hash_algo)"},{"line_number":401,"context_line":"            except exceptions.Invalid as e:"},{"line_number":402,"context_line":"                self.assertIn(\"Size mismatch: expected\", str(e))"},{"line_number":403,"context_line":"            self.assertRaises(exceptions.Invalid, self.store.add,"},{"line_number":404,"context_line":"                              expected_image_id, image_s3, expected_s3_size,"},{"line_number":405,"context_line":"                              self.hash_algo)"}],"source_content_type":"text/x-python","patch_set":7,"id":"d7061019_f149be47","line":402,"in_reply_to":"215a7566_fd3ee450","updated":"2025-06-30 14:42:04.000000000","message":"Done","commit_id":"4e32a3c0d5f6a07f0a46f0882c8d81723e282e9b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1b093fd756cb6085ae604b691b5058bc4261ab92","unresolved":false,"context_lines":[{"line_number":402,"context_line":"                self.assertIn(\"Size mismatch: expected\", str(e))"},{"line_number":403,"context_line":"            self.assertRaises(exceptions.Invalid, self.store.add,"},{"line_number":404,"context_line":"                              expected_image_id, image_s3, expected_s3_size,"},{"line_number":405,"context_line":"                              self.hash_algo)"},{"line_number":406,"context_line":"            # The input buffer should be fully read"},{"line_number":407,"context_line":"            # depending on implementation"},{"line_number":408,"context_line":"            total_input_size \u003d len(actual_s3_contents)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ef73027b_3a798830","line":405,"updated":"2025-06-30 14:42:04.000000000","message":"I think this was supposed to be removed, since it just re-runs the above.","commit_id":"4e32a3c0d5f6a07f0a46f0882c8d81723e282e9b"}],"glance_store/tests/unit/test_s3_store.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d413d90fe5647e686345a74761e82766910fbd40","unresolved":true,"context_lines":[{"line_number":638,"context_line":"                Key\u003dexpected_image_id,"},{"line_number":639,"context_line":"                UploadId\u003d\u0027UploadId\u0027"},{"line_number":640,"context_line":"            )"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"    @mock.patch.object(boto3.session.Session, \"client\")"},{"line_number":643,"context_line":"    def test_add_already_existing(self, mock_client):"},{"line_number":644,"context_line":"        \"\"\"Tests that adding an image with an existing identifier"}],"source_content_type":"text/x-python","patch_set":6,"id":"f4b3d7e1_eb21d432","line":641,"updated":"2025-06-26 16:07:36.000000000","message":"All the same things here, both that all the tests in both of these files seem basically the same and should be re-usable, and please check the reason for the Invalid in each case.","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"72c8954c7877e9b96fec10d0183c8cb155f97366","unresolved":false,"context_lines":[{"line_number":638,"context_line":"                Key\u003dexpected_image_id,"},{"line_number":639,"context_line":"                UploadId\u003d\u0027UploadId\u0027"},{"line_number":640,"context_line":"            )"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"    @mock.patch.object(boto3.session.Session, \"client\")"},{"line_number":643,"context_line":"    def test_add_already_existing(self, mock_client):"},{"line_number":644,"context_line":"        \"\"\"Tests that adding an image with an existing identifier"}],"source_content_type":"text/x-python","patch_set":6,"id":"c500b726_7e07a86d","line":641,"in_reply_to":"869b8a86_50b91a54","updated":"2025-06-27 08:43:19.000000000","message":"There is a significant amount of duplication throughout the file. I will work on addressing this by creating a separate patch to remove the redundant code.","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"e1231062c40795ae8521304852eab65d08434afa","unresolved":false,"context_lines":[{"line_number":638,"context_line":"                Key\u003dexpected_image_id,"},{"line_number":639,"context_line":"                UploadId\u003d\u0027UploadId\u0027"},{"line_number":640,"context_line":"            )"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"    @mock.patch.object(boto3.session.Session, \"client\")"},{"line_number":643,"context_line":"    def test_add_already_existing(self, mock_client):"},{"line_number":644,"context_line":"        \"\"\"Tests that adding an image with an existing identifier"}],"source_content_type":"text/x-python","patch_set":6,"id":"869b8a86_50b91a54","line":641,"in_reply_to":"f4b3d7e1_eb21d432","updated":"2025-06-26 17:22:36.000000000","message":"Acknowledged","commit_id":"94adbddf3044c3c61d2521339ff39e3126e4944f"}]}
