)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d9ab4d49517a0c61940d67735238dc8a065e3317","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"988b3da2_6f3f36dc","updated":"2026-07-23 01:14:44.000000000","message":"check experimental","commit_id":"ba9111fb7b9097efef45c0d10ae3663be525cc1c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1f2239a0ec79f3e5614670eb6b122798ee207d35","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"26e6b131_e5d76efd","updated":"2026-08-28 17:43:23.000000000","message":"Thanks for the cleanup with the mixin! Maybe could\u0027ve done it as a follow-up, but now that it\u0027s done, may as well keep it.","commit_id":"eaf061d95310f692633b87f3486ab06eb913d752"}],"test/functional/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b88e1e10ec8ad6df920d2893d6879b81c2dc3df9","unresolved":true,"context_lines":[{"line_number":676,"context_line":"    proxy_srv \u003d prolis"},{"line_number":677,"context_line":"    prospa \u003d eventlet.spawn(eventlet.wsgi.server, prolis, app, nl,"},{"line_number":678,"context_line":"                            protocol\u003dSwiftHttpProtocol,"},{"line_number":679,"context_line":"                            capitalize_response_headers\u003dFalse)"},{"line_number":680,"context_line":"    acc1spa \u003d eventlet.spawn(eventlet.wsgi.server, acc1lis, acc1srv, nl,"},{"line_number":681,"context_line":"                             protocol\u003dSwiftHttpProtocol)"},{"line_number":682,"context_line":"    acc2spa \u003d eventlet.spawn(eventlet.wsgi.server, acc2lis, acc2srv, nl,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ec60243b_a20bc5a5","line":679,"updated":"2026-07-22 21:23:50.000000000","message":"Like we do for everybody in `common/wsgi.py`","commit_id":"866489a652c747ccb2602054670d161e8f00f504"}],"test/functional/s3api/__init__.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"36ef3783ed070a80fc9147d68fa406672829a6ec","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import os"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import test.functional as tf"},{"line_number":25,"context_line":"from test.functional.s3api.s3_test_client import ("},{"line_number":26,"context_line":"    Connection, get_boto3_conn, tear_down_s3)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d03eeb59_e3689c65","line":25,"updated":"2026-07-22 04:47:17.000000000","message":"pep8: F401 \u0027test.functional.s3api.s3_test_client.Connection\u0027 imported but unused","commit_id":"1e0a09461e633b36d81671497feb0290ccb92799"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b88e1e10ec8ad6df920d2893d6879b81c2dc3df9","unresolved":true,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @contextmanager"},{"line_number":43,"context_line":"    def quiet_boto_logging(self):"},{"line_number":44,"context_line":"        original_level \u003d logging.getLogger(\u0027boto\u0027).getEffectiveLevel()"},{"line_number":45,"context_line":"        try:"},{"line_number":46,"context_line":"            logging.getLogger(\u0027boto\u0027).setLevel(logging.INFO)"},{"line_number":47,"context_line":"            yield"}],"source_content_type":"text/x-python","patch_set":2,"id":"c25836db_52e5cff1","line":44,"updated":"2026-07-22 21:23:50.000000000","message":"This could all stand to get cleaned up (or nixed?)","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1f2239a0ec79f3e5614670eb6b122798ee207d35","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @contextmanager"},{"line_number":43,"context_line":"    def quiet_boto_logging(self):"},{"line_number":44,"context_line":"        original_level \u003d logging.getLogger(\u0027boto\u0027).getEffectiveLevel()"},{"line_number":45,"context_line":"        try:"},{"line_number":46,"context_line":"            logging.getLogger(\u0027boto\u0027).setLevel(logging.INFO)"},{"line_number":47,"context_line":"            yield"}],"source_content_type":"text/x-python","patch_set":2,"id":"66579372_bad5fbde","line":44,"in_reply_to":"c25836db_52e5cff1","updated":"2026-08-28 17:43:23.000000000","message":"Done","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b88e1e10ec8ad6df920d2893d6879b81c2dc3df9","unresolved":true,"context_lines":[{"line_number":82,"context_line":"        # TODO; requires consideration"},{"line_number":83,"context_line":"        # self.assertTrue(headers[\u0027server\u0027] is not None)"},{"line_number":84,"context_line":"        if etag is not None:"},{"line_number":85,"context_line":"            self.assertTrue(\u0027etag\u0027 in headers)  # sanity"},{"line_number":86,"context_line":"            self.assertEqual(etag, headers[\u0027etag\u0027].strip(\u0027\"\u0027))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"2bcef8eb_635f60cd","line":85,"range":{"start_line":85,"start_character":17,"end_line":85,"end_character":27},"updated":"2026-07-22 21:23:50.000000000","message":"Off-topic: man, these assertions could use some improvement.","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e6c4b7add2cd20e586da6e1b83099a94b003501","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        # TODO; requires consideration"},{"line_number":83,"context_line":"        # self.assertTrue(headers[\u0027server\u0027] is not None)"},{"line_number":84,"context_line":"        if etag is not None:"},{"line_number":85,"context_line":"            self.assertTrue(\u0027etag\u0027 in headers)  # sanity"},{"line_number":86,"context_line":"            self.assertEqual(etag, headers[\u0027etag\u0027].strip(\u0027\"\u0027))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"249f3a92_e7145f4c","line":85,"range":{"start_line":85,"start_character":17,"end_line":85,"end_character":27},"in_reply_to":"2bcef8eb_635f60cd","updated":"2026-08-11 17:57:59.000000000","message":"Done","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b88e1e10ec8ad6df920d2893d6879b81c2dc3df9","unresolved":true,"context_lines":[{"line_number":86,"context_line":"            self.assertEqual(etag, headers[\u0027etag\u0027].strip(\u0027\"\u0027))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def skip_boto2_sort_header_bug(m):"},{"line_number":90,"context_line":"    def wrapped(self, *args, **kwargs):"},{"line_number":91,"context_line":"        if os.environ.get(\u0027S3_USE_SIGV4\u0027) \u003d\u003d \"True\":"},{"line_number":92,"context_line":"            # boto doesn\u0027t sort headers for v4 sigs properly; see"}],"source_content_type":"text/x-python","patch_set":2,"id":"7b8b2365_5284a78e","line":89,"updated":"2026-07-22 21:23:50.000000000","message":"Should get dropped -- nothing uses it now.","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e6c4b7add2cd20e586da6e1b83099a94b003501","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            self.assertEqual(etag, headers[\u0027etag\u0027].strip(\u0027\"\u0027))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def skip_boto2_sort_header_bug(m):"},{"line_number":90,"context_line":"    def wrapped(self, *args, **kwargs):"},{"line_number":91,"context_line":"        if os.environ.get(\u0027S3_USE_SIGV4\u0027) \u003d\u003d \"True\":"},{"line_number":92,"context_line":"            # boto doesn\u0027t sort headers for v4 sigs properly; see"}],"source_content_type":"text/x-python","patch_set":2,"id":"256bf90b_45632443","line":89,"in_reply_to":"7b8b2365_5284a78e","updated":"2026-08-11 17:57:59.000000000","message":"Done","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2f135e5c94953e71d5f5b0b201631cd29e08929b","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            raise SkipTest(\u0027no s3api user configured\u0027)"},{"line_number":55,"context_line":"        if \u0027s3api\u0027 not in tf.cluster_info:"},{"line_number":56,"context_line":"            raise SkipTest(\u0027s3api middleware is not enabled\u0027)"},{"line_number":57,"context_line":"\u003c\u003c\u003c\u003c\u003c\u003c\u003c PATCH SET (f8845d985df58f28508d360475447987a439a3dc tests: Port boto2 tests to boto3)"},{"line_number":58,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":59,"context_line":"        if boto is None:"},{"line_number":60,"context_line":"            raise SkipTest(\u0027boto 2.x library is not installed\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9af2015d_564c21c4","line":57,"updated":"2026-08-25 22:47:21.000000000","message":"pep8: E999 SyntaxError: invalid syntax","commit_id":"2e6b10cf142a0d3f662961be0738f69c25a9c453"}],"test/functional/s3api/s3_test_client.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"36ef3783ed070a80fc9147d68fa406672829a6ec","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    logging.getLogger(\u0027botocore\u0027).setLevel(logging.INFO)"},{"line_number":39,"context_line":"    logging.getLogger(\u0027boto3\u0027).setLevel(logging.INFO)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def setUpModule():"},{"line_number":42,"context_line":"    tf.setup_package()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"6245fe7e_258f6f27","line":41,"updated":"2026-07-22 04:47:17.000000000","message":"pep8: E302 expected 2 blank lines, found 1","commit_id":"1e0a09461e633b36d81671497feb0290ccb92799"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"36ef3783ed070a80fc9147d68fa406672829a6ec","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def path_fixer(request, **kwargs):"},{"line_number":189,"context_line":"        parts \u003d urlparse(request.url)"},{"line_number":190,"context_line":"        if request.auth_path and request.auth_path.endswith(\u0027/\u0027) and not parts.path.endswith(\u0027/\u0027):"},{"line_number":191,"context_line":"            request.url \u003d urlunparse(parts._replace(path\u003dparts.path + \u0027/\u0027))"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    client.meta.events.register(\u0027before-sign.s3.*\u0027, path_fixer)"}],"source_content_type":"text/x-python","patch_set":1,"id":"2d6369e2_c32b3778","line":190,"updated":"2026-07-22 04:47:17.000000000","message":"pep8: E501 line too long (98 \u003e 79 characters)","commit_id":"1e0a09461e633b36d81671497feb0290ccb92799"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b88e1e10ec8ad6df920d2893d6879b81c2dc3df9","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        parts \u003d urlparse(request.url)"},{"line_number":70,"context_line":"        if request.auth_path and request.auth_path.endswith(\u0027/\u0027) and \\"},{"line_number":71,"context_line":"                not parts.path.endswith(\u0027/\u0027):"},{"line_number":72,"context_line":"            request.url \u003d urlunparse(parts._replace(path\u003dparts.path + \u0027/\u0027))"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    client.meta.events.register(\u0027before-sign.s3.*\u0027, path_fixer)"},{"line_number":75,"context_line":"    return client"}],"source_content_type":"text/x-python","patch_set":2,"id":"fe6f9f96_0387d2bb","line":72,"updated":"2026-07-22 21:23:50.000000000","message":"This seems to be an (unreported?) issue with v2 signing in boto3 that we\u0027ve worked around in multiple places before; fixing it once, here, seems better.","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1f2239a0ec79f3e5614670eb6b122798ee207d35","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                    except ClientError as e:"},{"line_number":94,"context_line":"                        err_code \u003d e.response.get(\u0027Error\u0027, {}).get(\u0027Code\u0027)"},{"line_number":95,"context_line":"                        # Multipart may be disabled on the cluster."},{"line_number":96,"context_line":"                        if err_code \u003d\u003d \u0027NotImplemented\u0027:"},{"line_number":97,"context_line":"                            resp \u003d {}"},{"line_number":98,"context_line":"                        elif e.response[\u0027ResponseMetadata\u0027]["},{"line_number":99,"context_line":"                                \u0027HTTPStatusCode\u0027] \u003d\u003d 404:"}],"source_content_type":"text/x-python","patch_set":9,"id":"6026206e_4b8b5c2d","line":96,"updated":"2026-08-28 17:43:23.000000000","message":"Bleh -- sometimes I hate how configurable we allow things to be. But yup, sure enough, we need the three-deep try blocks...\n\nArguably, even if MPUs are disabled, we *could* respond to the GET saying there are no uploads -- it\u0027d be kinda like how we [always respond 404 for GET `?object-lock`](https://github.com/openstack/swift/commit/0996433fe5fb8590eda1111e88ba74ab28d4508a) even though we\u0027ll 501 the PUT.\n\nEh, that\u0027s for another patch.","commit_id":"eaf061d95310f692633b87f3486ab06eb913d752"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1f2239a0ec79f3e5614670eb6b122798ee207d35","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                        if err_code \u003d\u003d \u0027NotImplemented\u0027:"},{"line_number":97,"context_line":"                            resp \u003d {}"},{"line_number":98,"context_line":"                        elif e.response[\u0027ResponseMetadata\u0027]["},{"line_number":99,"context_line":"                                \u0027HTTPStatusCode\u0027] \u003d\u003d 404:"},{"line_number":100,"context_line":"                            continue"},{"line_number":101,"context_line":"                        else:"},{"line_number":102,"context_line":"                            raise"}],"source_content_type":"text/x-python","patch_set":9,"id":"5ff26ef5_bdf9d2b4","line":99,"updated":"2026-08-28 17:43:23.000000000","message":"We could just raise and let the broader `# 404 means NoSuchBucket, NoSuchKey, or NoSuchUpload` handling deal with it.","commit_id":"eaf061d95310f692633b87f3486ab06eb913d752"}],"test/functional/s3api/test_bucket.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"97e57d70e45683dd7803c4c0d8d702a8052898db","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        # Depending on signing implementation, request method may get"},{"line_number":562,"context_line":"        # upper()ed during canonicalization. This seems more likely to happen"},{"line_number":563,"context_line":"        # with the Python implementations."},{"line_number":564,"context_line":"        if os.environ.get(\u0027S3_USE_SIGV4\u0027) \u003d\u003d \"True\":"},{"line_number":565,"context_line":"            # But v4 signatures can use a C implementation that won\u0027t do it"},{"line_number":566,"context_line":"            try:"},{"line_number":567,"context_line":"                import awscrt  # noqa: F401"}],"source_content_type":"text/x-python","patch_set":8,"id":"b73131ea_f1c07dc4","line":564,"updated":"2026-08-26 00:04:10.000000000","message":"pep8: F821 undefined name \u0027os\u0027","commit_id":"2814d16664c92a15705dfa66d43ee1db826de0fb"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"6d67f565495b4ff7887ce4ccf26e4a3c9819f097","unresolved":false,"context_lines":[{"line_number":561,"context_line":"        # Depending on signing implementation, request method may get"},{"line_number":562,"context_line":"        # upper()ed during canonicalization. This seems more likely to happen"},{"line_number":563,"context_line":"        # with the Python implementations."},{"line_number":564,"context_line":"        if os.environ.get(\u0027S3_USE_SIGV4\u0027) \u003d\u003d \"True\":"},{"line_number":565,"context_line":"            # But v4 signatures can use a C implementation that won\u0027t do it"},{"line_number":566,"context_line":"            try:"},{"line_number":567,"context_line":"                import awscrt  # noqa: F401"}],"source_content_type":"text/x-python","patch_set":9,"id":"7271226f_77ff76ad","line":564,"updated":"2026-08-26 01:26:38.000000000","message":"pep8: F821 undefined name \u0027os\u0027","commit_id":"eaf061d95310f692633b87f3486ab06eb913d752"}],"test/functional/s3api/test_multi_upload.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2f135e5c94953e71d5f5b0b201631cd29e08929b","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from swift.common.middleware.s3api.utils import MULTIUPLOAD_SUFFIX, mktime, \\"},{"line_number":32,"context_line":"    S3Timestamp"},{"line_number":33,"context_line":"from swift.common.swob import normalize_etag"},{"line_number":34,"context_line":"\u003e\u003e\u003e\u003e\u003e\u003e\u003e BASE      (a3ca4e2abb3af9d2e40df14c056e3c036088107a Merge \"object_versioning: test footer callbacks on overwrite)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"from test.functional.s3api import SigV4Mixin, S3ApiBaseBoto3, get_boto3_conn"},{"line_number":37,"context_line":"from test.functional.swift_test_client import Connection as SwiftConnection"}],"source_content_type":"text/x-python","patch_set":7,"id":"bd67ff7c_cc484107","line":34,"updated":"2026-08-25 22:47:21.000000000","message":"pep8: E999 SyntaxError: unterminated string literal (detected at line 34)","commit_id":"2e6b10cf142a0d3f662961be0738f69c25a9c453"}],"test/functional/s3api/test_object.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1f2239a0ec79f3e5614670eb6b122798ee207d35","unresolved":true,"context_lines":[{"line_number":90,"context_line":"        resp \u003d self.conn.create_bucket(Bucket\u003dself.bucket)"},{"line_number":91,"context_line":"        self.assertEqual(200, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test_put(self):"},{"line_number":94,"context_line":"        body \u003d b\u0027abcd\u0027 * 8192"},{"line_number":95,"context_line":"        resp \u003d self.conn.put_object(Bucket\u003dself.bucket, Key\u003d\u0027obj\u0027, Body\u003dbody)"},{"line_number":96,"context_line":"        self.assertEqual(200, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"5fd56906_3b5215e9","line":93,"updated":"2026-08-28 17:43:23.000000000","message":"Ditched because of the overlap with `test_object` now that we\u0027ve combined the classes, I\u0027m guessing?\n\nI should maybe check these tests some more, see if there\u0027s any other overlap...","commit_id":"f4261c5fadc06d06f05140b61146a412cf15be90"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2f135e5c94953e71d5f5b0b201631cd29e08929b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"from swift.common.middleware.s3api.etree import fromstring"},{"line_number":36,"context_line":"from swift.common.middleware.s3api.utils import S3Timestamp"},{"line_number":37,"context_line":"from swift.common.utils import quote"},{"line_number":38,"context_line":"\u003e\u003e\u003e\u003e\u003e\u003e\u003e BASE      (a3ca4e2abb3af9d2e40df14c056e3c036088107a Merge \"object_versioning: test footer callbacks on overwrite)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"from test.functional.s3api import SigV4Mixin, S3ApiBaseBoto3, get_boto3_conn"},{"line_number":41,"context_line":"from test.functional.s3api.utils import get_error_code, calculate_md5, \\"}],"source_content_type":"text/x-python","patch_set":7,"id":"a0f4f7b0_052b5620","line":38,"updated":"2026-08-25 22:47:21.000000000","message":"pep8: E999 SyntaxError: unterminated string literal (detected at line 38)","commit_id":"2e6b10cf142a0d3f662961be0738f69c25a9c453"}],"test/functional/s3api/test_presigned.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b88e1e10ec8ad6df920d2893d6879b81c2dc3df9","unresolved":true,"context_lines":[{"line_number":40,"context_line":"class TestS3ApiPresignedUrls(S3ApiBaseBoto3):"},{"line_number":41,"context_line":"    def setUp(self):"},{"line_number":42,"context_line":"        super(TestS3ApiPresignedUrls, self).setUp()"},{"line_number":43,"context_line":"        # Presigned URLs are signature-version specific, so build a client"},{"line_number":44,"context_line":"        # that signs the way the boto2-based tests used to: SigV2 by default,"},{"line_number":45,"context_line":"        # SigV4 for the SigV4 variant."},{"line_number":46,"context_line":"        if os.environ.get(\u0027S3_USE_SIGV4\u0027) \u003d\u003d \u0027True\u0027:"},{"line_number":47,"context_line":"            signature_version \u003d \u0027s3v4\u0027"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            signature_version \u003d \u0027s3\u0027"},{"line_number":50,"context_line":"        self.conn \u003d get_boto3_conn("},{"line_number":51,"context_line":"            tf.config[\u0027s3_access_key\u0027], tf.config[\u0027s3_secret_key\u0027],"},{"line_number":52,"context_line":"            signature_version\u003dsignature_version)"},{"line_number":53,"context_line":"        parsed \u003d urlparse(self.endpoint_url)"},{"line_number":54,"context_line":"        self.host \u003d parsed.hostname"},{"line_number":55,"context_line":"        self.port \u003d parsed.port"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"f3bb688d_12f64f0c","line":53,"range":{"start_line":43,"start_character":8,"end_line":53,"end_character":0},"updated":"2026-07-22 21:23:50.000000000","message":"Not necessary; `super().setUp()` builds a suitable client.","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e6c4b7add2cd20e586da6e1b83099a94b003501","unresolved":false,"context_lines":[{"line_number":40,"context_line":"class TestS3ApiPresignedUrls(S3ApiBaseBoto3):"},{"line_number":41,"context_line":"    def setUp(self):"},{"line_number":42,"context_line":"        super(TestS3ApiPresignedUrls, self).setUp()"},{"line_number":43,"context_line":"        # Presigned URLs are signature-version specific, so build a client"},{"line_number":44,"context_line":"        # that signs the way the boto2-based tests used to: SigV2 by default,"},{"line_number":45,"context_line":"        # SigV4 for the SigV4 variant."},{"line_number":46,"context_line":"        if os.environ.get(\u0027S3_USE_SIGV4\u0027) \u003d\u003d \u0027True\u0027:"},{"line_number":47,"context_line":"            signature_version \u003d \u0027s3v4\u0027"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            signature_version \u003d \u0027s3\u0027"},{"line_number":50,"context_line":"        self.conn \u003d get_boto3_conn("},{"line_number":51,"context_line":"            tf.config[\u0027s3_access_key\u0027], tf.config[\u0027s3_secret_key\u0027],"},{"line_number":52,"context_line":"            signature_version\u003dsignature_version)"},{"line_number":53,"context_line":"        parsed \u003d urlparse(self.endpoint_url)"},{"line_number":54,"context_line":"        self.host \u003d parsed.hostname"},{"line_number":55,"context_line":"        self.port \u003d parsed.port"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"21670e87_2e1b758a","line":53,"range":{"start_line":43,"start_character":8,"end_line":53,"end_character":0},"in_reply_to":"f3bb688d_12f64f0c","updated":"2026-08-11 17:57:59.000000000","message":"Done","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2774d62f3cd132bf073a7a926fbe751078386493","unresolved":false,"context_lines":[{"line_number":25,"context_line":"import test.functional as tf"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from test.functional.s3api import S3ApiBaseBoto3"},{"line_number":28,"context_line":"from test.functional.s3api.s3_test_client import get_boto3_conn"},{"line_number":29,"context_line":"from test.functional.s3api.utils import get_error_code, get_error_msg"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"6b7b2207_5a13a0ed","line":28,"updated":"2026-07-22 22:35:31.000000000","message":"pep8: F401 \u0027test.functional.s3api.s3_test_client.get_boto3_conn\u0027 imported but unused","commit_id":"4602e1a3bceffd9013f993e3c4b1ebb9f8528fff"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"97e57d70e45683dd7803c4c0d8d702a8052898db","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                         \u0027Got %d %s\u0027 % (resp.status_code, resp.content))"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def test_expiration_limits(self):"},{"line_number":122,"context_line":"        if os.environ.get(\u0027S3_USE_SIGV4\u0027):"},{"line_number":123,"context_line":"            self._test_expiration_limits_v4()"},{"line_number":124,"context_line":"        else:"},{"line_number":125,"context_line":"            self._test_expiration_limits_v2()"}],"source_content_type":"text/x-python","patch_set":8,"id":"cbc4fea3_1bc89ea4","line":122,"updated":"2026-08-26 00:04:10.000000000","message":"pep8: F821 undefined name \u0027os\u0027","commit_id":"2814d16664c92a15705dfa66d43ee1db826de0fb"}],"test/functional/s3api/test_versioning.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b88e1e10ec8ad6df920d2893d6879b81c2dc3df9","unresolved":true,"context_lines":[{"line_number":52,"context_line":"                Bucket\u003dself.bucket,"},{"line_number":53,"context_line":"                VersioningConfiguration\u003d{\u0027Status\u0027: \u0027Suspended\u0027})"},{"line_number":54,"context_line":"        except botocore.exceptions.ClientError:"},{"line_number":55,"context_line":"            pass"},{"line_number":56,"context_line":"        super(TestS3ApiVersioning, self).tearDown()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa31f578_491750a2","line":55,"range":{"start_line":55,"start_character":12,"end_line":55,"end_character":16},"updated":"2026-07-22 21:23:50.000000000","message":"We probably *should* care if that failed. We certainly *used to*.","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e6c4b7add2cd20e586da6e1b83099a94b003501","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                Bucket\u003dself.bucket,"},{"line_number":53,"context_line":"                VersioningConfiguration\u003d{\u0027Status\u0027: \u0027Suspended\u0027})"},{"line_number":54,"context_line":"        except botocore.exceptions.ClientError:"},{"line_number":55,"context_line":"            pass"},{"line_number":56,"context_line":"        super(TestS3ApiVersioning, self).tearDown()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"ec9e32b5_506023c4","line":55,"range":{"start_line":55,"start_character":12,"end_line":55,"end_character":16},"in_reply_to":"fa31f578_491750a2","updated":"2026-08-11 17:57:59.000000000","message":"Done","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b88e1e10ec8ad6df920d2893d6879b81c2dc3df9","unresolved":true,"context_lines":[{"line_number":152,"context_line":"        self.assertEqual(get_error_code(resp.content), \u0027MalformedXML\u0027)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        elem \u003d Element(\u0027VersioningConfiguration\u0027)"},{"line_number":155,"context_line":"        SubElement(elem, \u0027Status\u0027).text \u003d \u0027\u0027"},{"line_number":156,"context_line":"        xml \u003d tostring(elem)"},{"line_number":157,"context_line":"        resp \u003d requests.put(url, data\u003dxml)"},{"line_number":158,"context_line":"        self.assertEqual(resp.status_code, 400)"}],"source_content_type":"text/x-python","patch_set":2,"id":"2c5aced7_15491a1e","line":155,"updated":"2026-07-22 21:23:50.000000000","message":"Off-topic: We should probably also test with `\u003cStatus/\u003e`, not just `\u003cStatus\u003e\u003c/Status\u003e`","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e6c4b7add2cd20e586da6e1b83099a94b003501","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        self.assertEqual(get_error_code(resp.content), \u0027MalformedXML\u0027)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        elem \u003d Element(\u0027VersioningConfiguration\u0027)"},{"line_number":155,"context_line":"        SubElement(elem, \u0027Status\u0027).text \u003d \u0027\u0027"},{"line_number":156,"context_line":"        xml \u003d tostring(elem)"},{"line_number":157,"context_line":"        resp \u003d requests.put(url, data\u003dxml)"},{"line_number":158,"context_line":"        self.assertEqual(resp.status_code, 400)"}],"source_content_type":"text/x-python","patch_set":2,"id":"f74a6110_5f220d14","line":155,"in_reply_to":"2c5aced7_15491a1e","updated":"2026-08-11 17:57:59.000000000","message":"Done","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b88e1e10ec8ad6df920d2893d6879b81c2dc3df9","unresolved":true,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":163,"context_line":"    unittest.main()"}],"source_content_type":"text/x-python","patch_set":2,"id":"eef3ad60_5a9e7c8f","line":163,"updated":"2026-07-22 21:23:50.000000000","message":"Funny that Claude added this -- how do we feel about these?","commit_id":"866489a652c747ccb2602054670d161e8f00f504"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2774d62f3cd132bf073a7a926fbe751078386493","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import unittest"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import botocore"},{"line_number":19,"context_line":"import requests"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import test.functional as tf"}],"source_content_type":"text/x-python","patch_set":3,"id":"e45a77fa_cb296c6b","line":18,"updated":"2026-07-22 22:35:31.000000000","message":"pep8: F401 \u0027botocore\u0027 imported but unused","commit_id":"4602e1a3bceffd9013f993e3c4b1ebb9f8528fff"}]}
