)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"04b6560ffe21de71ee1ca8e7e71f4ff273bda8cf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"28ab5932_0954f5fc","updated":"2024-12-03 17:12:46.000000000","message":"Oh yeah, forgot to mention: confirmed that all of `test_mpu.py` passes against AWS.","commit_id":"eac4ffd7a9ce571a865e70b5b79f24921757507b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"1254a659b9ba26deadfae3697291ab53b4c30bb8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"0a38fb11_d32a25c4","updated":"2024-12-03 19:22:42.000000000","message":"Thanks for taking a look Tim","commit_id":"eac4ffd7a9ce571a865e70b5b79f24921757507b"}],"test/s3api/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c076c9c0befb8e161ae2997b5654196bea5bc013","unresolved":true,"context_lines":[{"line_number":83,"context_line":"        return default"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"def date_to_datetime(resp):"},{"line_number":87,"context_line":"    date_str \u003d resp[\u0027ResponseMetadata\u0027][\u0027HTTPHeaders\u0027][\u0027date\u0027]"},{"line_number":88,"context_line":"    return datetime.strptime(date_str, \u0027%a, %d %b %Y %H:%M:%S %Z\u0027)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"47f8a757_ddc85a21","line":86,"updated":"2024-12-02 23:33:38.000000000","message":"I don\u0027t think this is used anywhere yet.","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"76f8da328e676fabb8024503cdbc2eb0b449e823","unresolved":true,"context_lines":[{"line_number":83,"context_line":"        return default"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"def date_to_datetime(resp):"},{"line_number":87,"context_line":"    date_str \u003d resp[\u0027ResponseMetadata\u0027][\u0027HTTPHeaders\u0027][\u0027date\u0027]"},{"line_number":88,"context_line":"    return datetime.strptime(date_str, \u0027%a, %d %b %Y %H:%M:%S %Z\u0027)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"6ab26072_3e91cff5","line":86,"in_reply_to":"47f8a757_ddc85a21","updated":"2024-12-03 12:50:57.000000000","message":"ah, thanks - the feature/mpu version of this patch has more tests and this gets used there https://review.opendev.org/c/openstack/swift/+/931187/2/test/s3api/test_mpu.py#329\n\nAside: I do wish we had one place where various date format conversions were encapsulated.","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"}],"test/s3api/test_mpu.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c076c9c0befb8e161ae2997b5654196bea5bc013","unresolved":true,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def status_from_error(error):"},{"line_number":29,"context_line":"    return error.response[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class BaseMultiPartUploadTestCase(BaseS3TestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"04b0d3df_b034d522","line":29,"updated":"2024-12-02 23:33:38.000000000","message":"Might want these up in `test/s3api/__init__.py`","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"76f8da328e676fabb8024503cdbc2eb0b449e823","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def status_from_error(error):"},{"line_number":29,"context_line":"    return error.response[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027]"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class BaseMultiPartUploadTestCase(BaseS3TestCase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"209c06e7_393acf8e","line":29,"in_reply_to":"04b0d3df_b034d522","updated":"2024-12-03 12:50:57.000000000","message":"good call","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c076c9c0befb8e161ae2997b5654196bea5bc013","unresolved":true,"context_lines":[{"line_number":202,"context_line":"        self.assertEqual(200, list_mpu_resp["},{"line_number":203,"context_line":"            \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":204,"context_line":"        mpus \u003d list_mpu_resp.get(\u0027Uploads\u0027, [])"},{"line_number":205,"context_line":"        return [mpu[\u0027UploadId\u0027] for mpu in mpus]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def list_parts(self, key_name, upload_id):"},{"line_number":208,"context_line":"        list_parts_resp \u003d self.client.list_parts("}],"source_content_type":"text/x-python","patch_set":1,"id":"3732ada4_b7ea3df4","line":205,"updated":"2024-12-02 23:33:38.000000000","message":"I feel like we probably want to include `Key` as well...","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"76f8da328e676fabb8024503cdbc2eb0b449e823","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        self.assertEqual(200, list_mpu_resp["},{"line_number":203,"context_line":"            \u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":204,"context_line":"        mpus \u003d list_mpu_resp.get(\u0027Uploads\u0027, [])"},{"line_number":205,"context_line":"        return [mpu[\u0027UploadId\u0027] for mpu in mpus]"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def list_parts(self, key_name, upload_id):"},{"line_number":208,"context_line":"        list_parts_resp \u003d self.client.list_parts("}],"source_content_type":"text/x-python","patch_set":1,"id":"9197bd44_9533347d","line":205,"in_reply_to":"3732ada4_b7ea3df4","updated":"2024-12-03 12:50:57.000000000","message":"Done","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c076c9c0befb8e161ae2997b5654196bea5bc013","unresolved":true,"context_lines":[{"line_number":274,"context_line":"            self.client.head_object("},{"line_number":275,"context_line":"                Bucket\u003dself.bucket_name, Key\u003dkey_name,"},{"line_number":276,"context_line":"            )"},{"line_number":277,"context_line":"        self.assertEqual(\u0027404\u0027, cm.exception.response[\u0027Error\u0027][\u0027Code\u0027])"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def test_basic_upload(self):"},{"line_number":280,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"283903fe_78703541","line":277,"updated":"2024-12-02 23:33:38.000000000","message":"Not\n```\nself.assertEqual(404, status_from_error(cm.exception))\n```\n?\n\nI was initially rather surprised this passes -- I was expecting the state to be like\n```\ncm.exception.response[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027] \u003d\u003d 404\ncm.exception.response[\u0027Error\u0027][\u0027Code\u0027] \u003d\u003d \u0027NoSuckKey\u0027\n```\nBut then I realized we\u0027re doing a HEAD so there *can\u0027t* be a body, so boto3 is making up the code! Not sure that\u0027s what we want to be testing, though, since it\u0027s purely a client-side thing.","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"76f8da328e676fabb8024503cdbc2eb0b449e823","unresolved":false,"context_lines":[{"line_number":274,"context_line":"            self.client.head_object("},{"line_number":275,"context_line":"                Bucket\u003dself.bucket_name, Key\u003dkey_name,"},{"line_number":276,"context_line":"            )"},{"line_number":277,"context_line":"        self.assertEqual(\u0027404\u0027, cm.exception.response[\u0027Error\u0027][\u0027Code\u0027])"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def test_basic_upload(self):"},{"line_number":280,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"f8258a0b_07448eb6","line":277,"in_reply_to":"283903fe_78703541","updated":"2024-12-03 12:50:57.000000000","message":"Oh yeah I should use status_from_error now I wrote it!","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c076c9c0befb8e161ae2997b5654196bea5bc013","unresolved":true,"context_lines":[{"line_number":720,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"},{"line_number":721,"context_line":"        upload_id \u003d self.create_mpu(key_name)"},{"line_number":722,"context_line":"        with self.assertRaises(ClientError) as cm:"},{"line_number":723,"context_line":"            self.abort_mpu(key_name, upload_id + \u0027x\u0027)"},{"line_number":724,"context_line":"        self.assertEqual(404, status_from_error(cm.exception))"},{"line_number":725,"context_line":"        self.assertEqual(\u0027NoSuchUpload\u0027, code_from_error(cm.exception))"},{"line_number":726,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fdbcf8fa_646b6393","line":723,"range":{"start_line":723,"start_character":37,"end_line":723,"end_character":52},"updated":"2024-12-02 23:33:38.000000000","message":"Future work: I wonder if there\u0027s any other way we could munge the upload_id such that AWS returns something about an invalid parameter...","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"76f8da328e676fabb8024503cdbc2eb0b449e823","unresolved":false,"context_lines":[{"line_number":720,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"},{"line_number":721,"context_line":"        upload_id \u003d self.create_mpu(key_name)"},{"line_number":722,"context_line":"        with self.assertRaises(ClientError) as cm:"},{"line_number":723,"context_line":"            self.abort_mpu(key_name, upload_id + \u0027x\u0027)"},{"line_number":724,"context_line":"        self.assertEqual(404, status_from_error(cm.exception))"},{"line_number":725,"context_line":"        self.assertEqual(\u0027NoSuchUpload\u0027, code_from_error(cm.exception))"},{"line_number":726,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"738d2ed1_49be8b9a","line":723,"range":{"start_line":723,"start_character":37,"end_line":723,"end_character":52},"in_reply_to":"fdbcf8fa_646b6393","updated":"2024-12-03 12:50:57.000000000","message":"Acknowledged","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c076c9c0befb8e161ae2997b5654196bea5bc013","unresolved":true,"context_lines":[{"line_number":732,"context_line":"        with self.assertRaises(ClientError) as cm:"},{"line_number":733,"context_line":"            self.list_parts(key_name, upload_id)"},{"line_number":734,"context_line":"        self.assertEqual(404, status_from_error(cm.exception))"},{"line_number":735,"context_line":"        self.assertEqual(\u0027NoSuchUpload\u0027, code_from_error(cm.exception))"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    def test_create_upload_abort_upload(self):"},{"line_number":738,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"456042aa_4d0f3e17","line":735,"updated":"2024-12-02 23:33:38.000000000","message":"Isn\u0027t all this covered in the more-complete `test_create_list_mpus_abort_list_mpus` below?","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"76f8da328e676fabb8024503cdbc2eb0b449e823","unresolved":false,"context_lines":[{"line_number":732,"context_line":"        with self.assertRaises(ClientError) as cm:"},{"line_number":733,"context_line":"            self.list_parts(key_name, upload_id)"},{"line_number":734,"context_line":"        self.assertEqual(404, status_from_error(cm.exception))"},{"line_number":735,"context_line":"        self.assertEqual(\u0027NoSuchUpload\u0027, code_from_error(cm.exception))"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"    def test_create_upload_abort_upload(self):"},{"line_number":738,"context_line":"        key_name \u003d self.create_name(\u0027key\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9b5c3623_5a971bf1","line":735,"in_reply_to":"456042aa_4d0f3e17","updated":"2024-12-03 12:50:57.000000000","message":"that other test doesn\u0027t upload any parts. I\u0027ll remove the list_parts form the other test to better differentiate them","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c076c9c0befb8e161ae2997b5654196bea5bc013","unresolved":true,"context_lines":[{"line_number":753,"context_line":""},{"line_number":754,"context_line":"        response \u003d self.head_part(key_name, 1)"},{"line_number":755,"context_line":"        self.assertTrue(etag_from_resp(response).endswith(\u0027-2\"\u0027))"},{"line_number":756,"context_line":"        self.head_part(key_name, 2)"},{"line_number":757,"context_line":"        with self.assertRaises(ClientError) as cm:"},{"line_number":758,"context_line":"            self.head_part(key_name, 3)"},{"line_number":759,"context_line":"        self.assertEqual(416, status_from_error(cm.exception))"}],"source_content_type":"text/x-python","patch_set":1,"id":"98ca16cc_14843a58","line":756,"updated":"2024-12-02 23:33:38.000000000","message":"Maybe even do\n```\nresponse2 \u003d self.head_part(key_name, 2)\nself.assertEqual(etag_from_resp(response), etag_from_resp(response2))\n```","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"76f8da328e676fabb8024503cdbc2eb0b449e823","unresolved":false,"context_lines":[{"line_number":753,"context_line":""},{"line_number":754,"context_line":"        response \u003d self.head_part(key_name, 1)"},{"line_number":755,"context_line":"        self.assertTrue(etag_from_resp(response).endswith(\u0027-2\"\u0027))"},{"line_number":756,"context_line":"        self.head_part(key_name, 2)"},{"line_number":757,"context_line":"        with self.assertRaises(ClientError) as cm:"},{"line_number":758,"context_line":"            self.head_part(key_name, 3)"},{"line_number":759,"context_line":"        self.assertEqual(416, status_from_error(cm.exception))"}],"source_content_type":"text/x-python","patch_set":1,"id":"5cb09d7a_973316cf","line":756,"in_reply_to":"98ca16cc_14843a58","updated":"2024-12-03 12:50:57.000000000","message":"Done","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c076c9c0befb8e161ae2997b5654196bea5bc013","unresolved":true,"context_lines":[{"line_number":756,"context_line":"        self.head_part(key_name, 2)"},{"line_number":757,"context_line":"        with self.assertRaises(ClientError) as cm:"},{"line_number":758,"context_line":"            self.head_part(key_name, 3)"},{"line_number":759,"context_line":"        self.assertEqual(416, status_from_error(cm.exception))"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"    def test_create_upload_complete_subset_of_parts_list_with_gaps(self):"},{"line_number":762,"context_line":"        # only a subset of uploaded parts are referenced in complete"}],"source_content_type":"text/x-python","patch_set":1,"id":"1cb08b81_5317d1b1","line":759,"updated":"2024-12-02 23:33:38.000000000","message":"Maybe check `code_from_error(cm.exception)`?","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"76f8da328e676fabb8024503cdbc2eb0b449e823","unresolved":false,"context_lines":[{"line_number":756,"context_line":"        self.head_part(key_name, 2)"},{"line_number":757,"context_line":"        with self.assertRaises(ClientError) as cm:"},{"line_number":758,"context_line":"            self.head_part(key_name, 3)"},{"line_number":759,"context_line":"        self.assertEqual(416, status_from_error(cm.exception))"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"    def test_create_upload_complete_subset_of_parts_list_with_gaps(self):"},{"line_number":762,"context_line":"        # only a subset of uploaded parts are referenced in complete"}],"source_content_type":"text/x-python","patch_set":1,"id":"b2e72b8b_cc857f67","line":759,"in_reply_to":"1cb08b81_5317d1b1","updated":"2024-12-03 12:50:57.000000000","message":"Done, but more interesting by changing this to a GET","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c076c9c0befb8e161ae2997b5654196bea5bc013","unresolved":false,"context_lines":[{"line_number":782,"context_line":"        actual_parts \u003d self.list_parts(key_name, upload_id)"},{"line_number":783,"context_line":"        self.assertEqual([1, 1000], [p[\u0027PartNumber\u0027] for p in actual_parts])"},{"line_number":784,"context_line":"        self.complete_mpu(key_name, upload_id, parts)"},{"line_number":785,"context_line":"        # GET partNumbers are not same as uploaded part numbers!"},{"line_number":786,"context_line":"        self.head_part(key_name, 1)"},{"line_number":787,"context_line":"        response \u003d self.head_part(key_name, 1)"},{"line_number":788,"context_line":"        self.assertTrue(etag_from_resp(response).endswith(\u0027-2\"\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7eea32a3_8cb312ce","line":785,"updated":"2024-12-02 23:33:38.000000000","message":"I\u0027d been wondering about that!","commit_id":"df602d326dfe1ee656e638d055fe4516f0bdcd3f"}]}
