)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"670d8bdd3ffbcb020a9e26a51c62694664132508","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"f5c1c777_6484fa41","updated":"2023-08-21 16:24:04.000000000","message":"I would like to abandon in favor of https://review.opendev.org/c/openstack/swift/+/891009 once this is squashed into that","commit_id":"cdb3126b2e2a222b7bd17d499debbd8398a25cb7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9c514fa57607ec5f5bab9798047c11efdb9225b1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"923119ca_29c2bf5c","updated":"2023-08-01 13:07:13.000000000","message":"as expected, this isn\u0027t working with s3api yet","commit_id":"cdb3126b2e2a222b7bd17d499debbd8398a25cb7"}],"test/s3api/test_mpu.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9c514fa57607ec5f5bab9798047c11efdb9225b1","unresolved":true,"context_lines":[{"line_number":84,"context_line":"                \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":85,"context_line":"            parts.append({"},{"line_number":86,"context_line":"                \u0027ETag\u0027: part_resp[\u0027ETag\u0027],"},{"line_number":87,"context_line":"                \u0027PartNumber\u0027: i,"},{"line_number":88,"context_line":"            })"},{"line_number":89,"context_line":"        # this helper doesn\u0027t bother calling list-parts, it\u0027s not required and"},{"line_number":90,"context_line":"        # we know what we uploaded"}],"source_content_type":"text/x-python","patch_set":1,"id":"a2d55365_b7ee97bf","line":87,"updated":"2023-08-01 13:07:13.000000000","message":"in an earlier version of this patch (testing with real s3) my uploads tried to send PartNumber\u003d0 during upload and instead of nice 4xx response with InvalidArgument I got a strange SSL error - I don\u0027t understand how to validate what the s3 error should look like on PUT.  I haven\u0027t tested how s3api behaves on PUT with PartNumber\u003d0","commit_id":"cdb3126b2e2a222b7bd17d499debbd8398a25cb7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"0b0747107e5502c0979bdf1d026c9a1c662d640a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":85,"context_line":"            parts.append({"},{"line_number":86,"context_line":"                \u0027ETag\u0027: part_resp[\u0027ETag\u0027],"},{"line_number":87,"context_line":"                \u0027PartNumber\u0027: i,"},{"line_number":88,"context_line":"            })"},{"line_number":89,"context_line":"        # this helper doesn\u0027t bother calling list-parts, it\u0027s not required and"},{"line_number":90,"context_line":"        # we know what we uploaded"}],"source_content_type":"text/x-python","patch_set":1,"id":"d31a0b41_da2067bb","line":87,"in_reply_to":"a2d55365_b7ee97bf","updated":"2023-09-21 17:57:21.000000000","message":"Ack","commit_id":"cdb3126b2e2a222b7bd17d499debbd8398a25cb7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9c514fa57607ec5f5bab9798047c11efdb9225b1","unresolved":true,"context_lines":[{"line_number":115,"context_line":"            self.client.get_object(Bucket\u003dself.bucket_name,"},{"line_number":116,"context_line":"                                   Key\u003dkey_name, PartNumber\u003d0)"},{"line_number":117,"context_line":"        err_resp \u003d caught.exception.response"},{"line_number":118,"context_line":"        self.assertEqual(400, err_resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":119,"context_line":"        self.assertEqual(\u0027InvalidArgument\u0027, err_resp[\u0027Error\u0027][\u0027Code\u0027])"},{"line_number":120,"context_line":"        err_msg \u003d \u0027Part number must be an integer between \u0027 \\"},{"line_number":121,"context_line":"            \u00271 and 10000, inclusive\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"b01c80e3_2c06cf0a","line":118,"updated":"2023-08-01 13:07:13.000000000","message":"since s3api doesn\u0027t support PartNumber on GET this was the first failure:\n\n            with self.assertRaises(ClientError) as caught:\n                self.client.get_object(Bucket\u003dself.bucket_name,\n                                       Key\u003dkey_name, PartNumber\u003d0)\n            err_resp \u003d caught.exception.response\n    \u003e       self.assertEqual(400, err_resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])\n    E       AssertionError: 400 !\u003d 405","commit_id":"cdb3126b2e2a222b7bd17d499debbd8398a25cb7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"171e23a637b2005fdb6428de15164f4641516f58","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self.client.get_object(Bucket\u003dself.bucket_name,"},{"line_number":116,"context_line":"                                   Key\u003dkey_name, PartNumber\u003d0)"},{"line_number":117,"context_line":"        err_resp \u003d caught.exception.response"},{"line_number":118,"context_line":"        self.assertEqual(400, err_resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":119,"context_line":"        self.assertEqual(\u0027InvalidArgument\u0027, err_resp[\u0027Error\u0027][\u0027Code\u0027])"},{"line_number":120,"context_line":"        err_msg \u003d \u0027Part number must be an integer between \u0027 \\"},{"line_number":121,"context_line":"            \u00271 and 10000, inclusive\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"0180d16a_30110672","line":118,"in_reply_to":"b01c80e3_2c06cf0a","updated":"2023-09-21 18:17:08.000000000","message":"Ack","commit_id":"cdb3126b2e2a222b7bd17d499debbd8398a25cb7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9c514fa57607ec5f5bab9798047c11efdb9225b1","unresolved":true,"context_lines":[{"line_number":126,"context_line":"        # all other partNumber args are valid"},{"line_number":127,"context_line":"        for i in range(num_parts):"},{"line_number":128,"context_line":"            # partNumber argument is 1 indexed"},{"line_number":129,"context_line":"            resp \u003d self.client.get_object(Bucket\u003dself.bucket_name, Key\u003dkey_name,"},{"line_number":130,"context_line":"                                          PartNumber\u003di + 1)"},{"line_number":131,"context_line":"            self.assertEqual(206, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":132,"context_line":"            self.assertEqual(part_size, resp[\u0027ContentLength\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"f46a897b_fb692b60","line":129,"updated":"2023-08-01 13:07:13.000000000","message":"it would also be appropriate to check head_object on each PartNumber","commit_id":"cdb3126b2e2a222b7bd17d499debbd8398a25cb7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"171e23a637b2005fdb6428de15164f4641516f58","unresolved":true,"context_lines":[{"line_number":126,"context_line":"        # all other partNumber args are valid"},{"line_number":127,"context_line":"        for i in range(num_parts):"},{"line_number":128,"context_line":"            # partNumber argument is 1 indexed"},{"line_number":129,"context_line":"            resp \u003d self.client.get_object(Bucket\u003dself.bucket_name, Key\u003dkey_name,"},{"line_number":130,"context_line":"                                          PartNumber\u003di + 1)"},{"line_number":131,"context_line":"            self.assertEqual(206, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":132,"context_line":"            self.assertEqual(part_size, resp[\u0027ContentLength\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"6be8d5b4_16a8610a","line":129,"in_reply_to":"f46a897b_fb692b60","updated":"2023-09-21 18:17:08.000000000","message":"Ack","commit_id":"cdb3126b2e2a222b7bd17d499debbd8398a25cb7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9c514fa57607ec5f5bab9798047c11efdb9225b1","unresolved":true,"context_lines":[{"line_number":130,"context_line":"                                          PartNumber\u003di + 1)"},{"line_number":131,"context_line":"            self.assertEqual(206, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":132,"context_line":"            self.assertEqual(part_size, resp[\u0027ContentLength\u0027])"},{"line_number":133,"context_line":"            # but our part_bodies are zero indexed"},{"line_number":134,"context_line":"            resp_body \u003d b\u0027\u0027.join(resp[\u0027Body\u0027]).decode()"},{"line_number":135,"context_line":"            self.assertEqual(resp_body, part_bodies[i])"},{"line_number":136,"context_line":"            start \u003d part_size * i"}],"source_content_type":"text/x-python","patch_set":1,"id":"1daf4099_1fe519f2","line":133,"updated":"2023-08-01 13:07:13.000000000","message":"i tried switching the part_bodes to being 1 indexed, but it wasn\u0027t worth it because the python list that holds part_bodies will always be zero-indexed\n\nso part_bodies[0] \u003d b\u00270...0\u0027 and is referenced as PartNumber\u003d1","commit_id":"cdb3126b2e2a222b7bd17d499debbd8398a25cb7"}]}
