)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9883349cff09e106ec42bc6f4906c0d9658c916b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"48308fbd_0314d868","updated":"2022-11-30 18:20:49.000000000","message":"That test looks a little funny -- I\u0027ll try to get myself set up to try it against real S3 today.","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3235ffcf0ae8c362478f1b2cfa33247d0e10f74","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d3ab787d_a1a591c8","updated":"2022-12-01 23:58:03.000000000","message":"See what you think of the changes, Ash. I verified that the test passes against both my VSAIO and AWS now, and that the request being sent included the self-closing tag that would pop the error before.","commit_id":"4cba97d7b66d3267a3e899ce332989c897ae15a8"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9883349cff09e106ec42bc6f4906c0d9658c916b","unresolved":true,"context_lines":[{"line_number":709,"context_line":""},{"line_number":710,"context_line":"                etag \u003d normalize_etag(part_elem.find(\u0027./ETag\u0027).text)"},{"line_number":711,"context_line":"                if etag is None:"},{"line_number":712,"context_line":"                    raise MalformedPOSTRequest(upload_id,"},{"line_number":713,"context_line":"                                               part_number)"},{"line_number":714,"context_line":"                if len(etag) !\u003d 32 or any(c not in \u00270123456789abcdef\u0027"},{"line_number":715,"context_line":"                                          for c in etag):"}],"source_content_type":"text/x-python","patch_set":3,"id":"4b454dba_21bd8fd9","line":712,"range":{"start_line":712,"start_character":26,"end_line":712,"end_character":46},"updated":"2022-11-30 18:20:49.000000000","message":"I kinda expected it to be MalformedXML or InvalidPart -- but this is what AWS does, eh?","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d5e9c186d1aa673269fdbb9242ae38c2c6197e81","unresolved":true,"context_lines":[{"line_number":709,"context_line":""},{"line_number":710,"context_line":"                etag \u003d normalize_etag(part_elem.find(\u0027./ETag\u0027).text)"},{"line_number":711,"context_line":"                if etag is None:"},{"line_number":712,"context_line":"                    raise MalformedPOSTRequest(upload_id,"},{"line_number":713,"context_line":"                                               part_number)"},{"line_number":714,"context_line":"                if len(etag) !\u003d 32 or any(c not in \u00270123456789abcdef\u0027"},{"line_number":715,"context_line":"                                          for c in etag):"}],"source_content_type":"text/x-python","patch_set":3,"id":"76a89115_3a23d9db","line":712,"range":{"start_line":712,"start_character":47,"end_line":712,"end_character":56},"updated":"2022-12-01 23:55:56.000000000","message":"This sends the upload_id in a \u003cMessage\u003e tag back to the client -- that doesn\u0027t seem terribly informative...","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d5e9c186d1aa673269fdbb9242ae38c2c6197e81","unresolved":false,"context_lines":[{"line_number":709,"context_line":""},{"line_number":710,"context_line":"                etag \u003d normalize_etag(part_elem.find(\u0027./ETag\u0027).text)"},{"line_number":711,"context_line":"                if etag is None:"},{"line_number":712,"context_line":"                    raise MalformedPOSTRequest(upload_id,"},{"line_number":713,"context_line":"                                               part_number)"},{"line_number":714,"context_line":"                if len(etag) !\u003d 32 or any(c not in \u00270123456789abcdef\u0027"},{"line_number":715,"context_line":"                                          for c in etag):"}],"source_content_type":"text/x-python","patch_set":3,"id":"420af4cf_84b2d21c","line":712,"range":{"start_line":712,"start_character":26,"end_line":712,"end_character":46},"in_reply_to":"4b454dba_21bd8fd9","updated":"2022-12-01 23:55:56.000000000","message":"No -- AWS sends back InvalidPart.","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3235ffcf0ae8c362478f1b2cfa33247d0e10f74","unresolved":false,"context_lines":[{"line_number":709,"context_line":""},{"line_number":710,"context_line":"                etag \u003d normalize_etag(part_elem.find(\u0027./ETag\u0027).text)"},{"line_number":711,"context_line":"                if etag is None:"},{"line_number":712,"context_line":"                    raise MalformedPOSTRequest(upload_id,"},{"line_number":713,"context_line":"                                               part_number)"},{"line_number":714,"context_line":"                if len(etag) !\u003d 32 or any(c not in \u00270123456789abcdef\u0027"},{"line_number":715,"context_line":"                                          for c in etag):"}],"source_content_type":"text/x-python","patch_set":3,"id":"74eafd08_c76efa0c","line":712,"range":{"start_line":712,"start_character":47,"end_line":712,"end_character":56},"in_reply_to":"76a89115_3a23d9db","updated":"2022-12-01 23:58:03.000000000","message":"Done","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"}],"test/s3api/test_mpu.py":[{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"c874b44f1985ed5edaf0b7c8417d364be6c457d2","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from test.s3api import BaseS3TestCase"},{"line_number":17,"context_line":"from botocore.exceptions import ClientError"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"class TestMultiPartUploads(BaseS3TestCase):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    maxDiff \u003d None"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"b9b29f04_8798cc75","line":19,"in_reply_to":"12522e78_efd2babf","updated":"2022-12-05 17:34:24.000000000","message":"\u003e pep8: E302 expected 2 blank lines, found 1\n\nPlease fix.","commit_id":"30c80f4718c1bfdbec8473e0d99c0200f25addff"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9883349cff09e106ec42bc6f4906c0d9658c916b","unresolved":true,"context_lines":[{"line_number":118,"context_line":"            parts.append({"},{"line_number":119,"context_line":"                \u0027PartNumber\u0027: i,"},{"line_number":120,"context_line":"            })"},{"line_number":121,"context_line":"            try:"},{"line_number":122,"context_line":"                self.client.complete_multipart_upload("},{"line_number":123,"context_line":"                    Bucket\u003dself.bucket_name, Key\u003dkey_name,"},{"line_number":124,"context_line":"                    MultipartUpload\u003d{"}],"source_content_type":"text/x-python","patch_set":3,"id":"6610e751_86ba0ee7","line":121,"updated":"2022-11-30 18:20:49.000000000","message":"Did we mean for this to be in the for-loop?","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3235ffcf0ae8c362478f1b2cfa33247d0e10f74","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            parts.append({"},{"line_number":119,"context_line":"                \u0027PartNumber\u0027: i,"},{"line_number":120,"context_line":"            })"},{"line_number":121,"context_line":"            try:"},{"line_number":122,"context_line":"                self.client.complete_multipart_upload("},{"line_number":123,"context_line":"                    Bucket\u003dself.bucket_name, Key\u003dkey_name,"},{"line_number":124,"context_line":"                    MultipartUpload\u003d{"}],"source_content_type":"text/x-python","patch_set":3,"id":"f9adb008_f7896b41","line":121,"in_reply_to":"6610e751_86ba0ee7","updated":"2022-12-01 23:58:03.000000000","message":"Done","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d5e9c186d1aa673269fdbb9242ae38c2c6197e81","unresolved":true,"context_lines":[{"line_number":130,"context_line":"                complete_mpu_resp \u003d e.response"},{"line_number":131,"context_line":"                self.assertEqual(400, complete_mpu_resp["},{"line_number":132,"context_line":"                    \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":133,"context_line":"                self.assertEqual(\u0027MalformedXML\u0027, complete_mpu_resp["},{"line_number":134,"context_line":"                    \u0027Error\u0027][\u0027Code\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"d115ed25_e21abddd","line":133,"range":{"start_line":133,"start_character":34,"end_line":133,"end_character":46},"updated":"2022-12-01 23:55:56.000000000","message":"Wait a tick -- I thought we wanted MalformedPOSTRequest?\n\nPretty sure we\u0027re getting this because the request doesn\u0027t have ETag elements *at all*, which violates our schema at https://github.com/openstack/swift/blob/master/swift/common/middleware/s3api/schema/complete_multipart_upload.rng#L11, so it pops in fromstring() at https://github.com/openstack/swift/blob/2.30.0/swift/common/middleware/s3api/etree.py#L80-L83\n\nThat also explains why the test still passes if I back out the change.\n\nFortunately, looks like we just need to include\n\n \u0027ETag\u0027: \u0027\u0027,\n\nwhen building our Part dicts, then boto will go ahead and send across \u003cETag /\u003e tags.","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3235ffcf0ae8c362478f1b2cfa33247d0e10f74","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                complete_mpu_resp \u003d e.response"},{"line_number":131,"context_line":"                self.assertEqual(400, complete_mpu_resp["},{"line_number":132,"context_line":"                    \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":133,"context_line":"                self.assertEqual(\u0027MalformedXML\u0027, complete_mpu_resp["},{"line_number":134,"context_line":"                    \u0027Error\u0027][\u0027Code\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"616eee7a_a6f4cffd","line":133,"range":{"start_line":133,"start_character":34,"end_line":133,"end_character":46},"in_reply_to":"d115ed25_e21abddd","updated":"2022-12-01 23:58:03.000000000","message":"Done","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9883349cff09e106ec42bc6f4906c0d9658c916b","unresolved":true,"context_lines":[{"line_number":131,"context_line":"                self.assertEqual(400, complete_mpu_resp["},{"line_number":132,"context_line":"                    \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":133,"context_line":"                self.assertEqual(\u0027MalformedXML\u0027, complete_mpu_resp["},{"line_number":134,"context_line":"                    \u0027Error\u0027][\u0027Code\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"6c64ee86_f378dc9b","line":134,"updated":"2022-11-30 18:20:49.000000000","message":"I wonder what else we could assert about what comes out of the Error dict...","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3235ffcf0ae8c362478f1b2cfa33247d0e10f74","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                self.assertEqual(400, complete_mpu_resp["},{"line_number":132,"context_line":"                    \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":133,"context_line":"                self.assertEqual(\u0027MalformedXML\u0027, complete_mpu_resp["},{"line_number":134,"context_line":"                    \u0027Error\u0027][\u0027Code\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"2503815a_c3b2f80c","line":134,"in_reply_to":"6c64ee86_f378dc9b","updated":"2022-12-01 23:58:03.000000000","message":"Done","commit_id":"5b769104eba36f7c28cd83d9d0e184e4c6337748"}]}
