)]}'
{"/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"}],"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":"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":"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"}],"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"}],"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":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"}],"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":"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":"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"}]}
