)]}'
{"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fbd59ad3fe2a6440e5f9a43c146cdf8749a1bbe7","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"from swift.common.constraints import check_utf8"},{"line_number":40,"context_line":"from swift.proxy.controllers.base import get_container_info, \\"},{"line_number":41,"context_line":"    headers_to_container_info"},{"line_number":42,"context_line":"from swift.common.request_helpers import check_path_header"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"from swift.common.middleware.s3api.controllers import ServiceController, \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"bf51134e_91993921","side":"PARENT","line":41,"range":{"start_line":41,"start_character":4,"end_line":41,"end_character":29},"updated":"2020-06-15 22:21:28.000000000","message":"Yeah, this was such a code-smell.","commit_id":"0bed59e3faae94b96f98bbbc61b09abe54453267"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fbd59ad3fe2a6440e5f9a43c146cdf8749a1bbe7","unresolved":false,"context_lines":[{"line_number":1436,"context_line":"        :raises: InternalError when the request failed without 404"},{"line_number":1437,"context_line":"        \"\"\""},{"line_number":1438,"context_line":"        if not self.is_authenticated:"},{"line_number":1439,"context_line":"            sw_req \u003d self.to_swift_req(\u0027TEST\u0027, None, None, body\u003d\u0027\u0027)"},{"line_number":1440,"context_line":"            # don\u0027t show log message of this request"},{"line_number":1441,"context_line":"            sw_req.environ[\u0027swift.proxy_access_log_made\u0027] \u003d True"},{"line_number":1442,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bf51134e_f1b7d585","line":1439,"updated":"2020-06-15 22:21:28.000000000","message":"I was a little nervous about ACLs on this -- like, what about users who have access to read this container but not the account? -- but proxy-server controllers are responsible for calling the authorize callback and we get the 405 right before then.","commit_id":"9f83b9c9d365d9ce6f7a6ce98a66d217c49464f7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fbd59ad3fe2a6440e5f9a43c146cdf8749a1bbe7","unresolved":false,"context_lines":[{"line_number":1440,"context_line":"            # don\u0027t show log message of this request"},{"line_number":1441,"context_line":"            sw_req.environ[\u0027swift.proxy_access_log_made\u0027] \u003d True"},{"line_number":1442,"context_line":""},{"line_number":1443,"context_line":"            sw_resp \u003d sw_req.get_response(app)"},{"line_number":1444,"context_line":""},{"line_number":1445,"context_line":"            if not sw_req.remote_user:"},{"line_number":1446,"context_line":"                raise SignatureDoesNotMatch("}],"source_content_type":"text/x-python","patch_set":1,"id":"bf51134e_54b5cf30","line":1443,"updated":"2020-06-15 22:21:28.000000000","message":"Might want to add a\n\n # consume the response body\n sw_resp.body\n\nto make it so that if someone *does* want to log the TEST request, they get an appropriate status instead of a 499.\n\nOTOH, pretty sure s3_acl doesn\u0027t do this, so... *shrug*","commit_id":"9f83b9c9d365d9ce6f7a6ce98a66d217c49464f7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"460bc04b8ba4ff4023b5a3e8fe6c2f1ce773c8ef","unresolved":false,"context_lines":[{"line_number":1454,"context_line":"            headers \u003d resp.sw_headers.copy()"},{"line_number":1455,"context_line":"            headers.update(resp.sysmeta_headers)"},{"line_number":1456,"context_line":"            return headers_to_container_info("},{"line_number":1457,"context_line":"                headers, resp.status_int)  # pylint: disable-msg\u003dE1101"},{"line_number":1458,"context_line":""},{"line_number":1459,"context_line":"    def gen_multipart_manifest_delete_query(self, app, obj\u003dNone, version\u003dNone):"},{"line_number":1460,"context_line":"        if not self.allow_multipart_uploads:"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_e8473176","side":"PARENT","line":1457,"updated":"2020-06-25 16:10:04.000000000","message":"tests seem to show that a LOT more requests than I realized fall into this block\n\nI *think* using the real get_container_info is gunna work quite a bit better","commit_id":"0bed59e3faae94b96f98bbbc61b09abe54453267"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e085fde205739e8d2e8149d82fd9b275927e6b7a","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        Note that it currently supports only keystone and tempauth."},{"line_number":1505,"context_line":"        (no support for the third party authentication middleware)"},{"line_number":1506,"context_line":"        \"\"\""},{"line_number":1507,"context_line":"        sw_req \u003d self.to_swift_req(\u0027TEST\u0027, None, None, body\u003d\u0027\u0027)"},{"line_number":1508,"context_line":"        # don\u0027t show log message of this request"},{"line_number":1509,"context_line":"        sw_req.environ[\u0027swift.proxy_access_log_made\u0027] \u003d True"},{"line_number":1510,"context_line":""},{"line_number":1511,"context_line":"        sw_resp \u003d sw_req.get_response(app)"},{"line_number":1512,"context_line":""},{"line_number":1513,"context_line":"        if not sw_req.remote_user:"},{"line_number":1514,"context_line":"            raise SignatureDoesNotMatch("},{"line_number":1515,"context_line":"                **self.signature_does_not_match_kwargs())"},{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"        _, self.account, _ \u003d split_path(sw_resp.environ[\u0027PATH_INFO\u0027],"},{"line_number":1518,"context_line":"                                        2, 3, True)"},{"line_number":1519,"context_line":""},{"line_number":1520,"context_line":"        if \u0027HTTP_X_USER_NAME\u0027 in sw_resp.environ:"},{"line_number":1521,"context_line":"            # keystone"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_f0507661","line":1518,"range":{"start_line":1507,"start_character":8,"end_line":1518,"end_character":51},"updated":"2020-07-01 16:36:54.000000000","message":"Right, so we crib all this, skip the rest (since it\u0027s specific to s3_acl).","commit_id":"2e001431fd0907c97d44b81dd1f3d2d14ae1208b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e085fde205739e8d2e8149d82fd9b275927e6b7a","unresolved":false,"context_lines":[{"line_number":1527,"context_line":"            # tempauth"},{"line_number":1528,"context_line":"            self.user_id \u003d self.access_key"},{"line_number":1529,"context_line":""},{"line_number":1530,"context_line":"        sw_req.environ.get(\u0027swift.authorize\u0027, lambda req: None)(sw_req)"},{"line_number":1531,"context_line":"        self.environ[\u0027swift_owner\u0027] \u003d sw_req.environ.get(\u0027swift_owner\u0027, False)"},{"line_number":1532,"context_line":""},{"line_number":1533,"context_line":"        # Need to skip S3 authorization on subsequent requests to prevent"},{"line_number":1534,"context_line":"        # overwriting the account in PATH_INFO"},{"line_number":1535,"context_line":"        del self.environ[\u0027s3api.auth_details\u0027]"},{"line_number":1536,"context_line":""},{"line_number":1537,"context_line":"    def to_swift_req(self, method, container, obj, query\u003dNone,"},{"line_number":1538,"context_line":"                     body\u003dNone, headers\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_362adb8f","line":1535,"range":{"start_line":1530,"start_character":8,"end_line":1535,"end_character":46},"updated":"2020-07-01 16:36:54.000000000","message":"I had this momentary concern that we\u0027d be checking signatures more often since we didn\u0027t crib this part, too -- but we would\u0027ve done that for the HEAD, too. At least now we avoid going to disk when we can.","commit_id":"2e001431fd0907c97d44b81dd1f3d2d14ae1208b"}],"test/unit/common/middleware/s3api/__init__.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"460bc04b8ba4ff4023b5a3e8fe6c2f1ce773c8ef","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                # the default auth system"},{"line_number":61,"context_line":"                return swob.HTTPForbidden(request\u003dreq)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"            env[\u0027swift.authorize\u0027] \u003d authorize_cb"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        return self.swift(env, start_response)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_488bbdc1","line":63,"updated":"2020-06-25 16:10:04.000000000","message":"I lifted this from the ACL helper that also makes TEST somewhat magic, now our base FakeApp does it - hopefully that\u0027s reasonable?","commit_id":"8698dcf0bf1e18fe4057b2f6f35ea4fd0973253b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e085fde205739e8d2e8149d82fd9b275927e6b7a","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                # Assume swift owner, if not yet set"},{"line_number":57,"context_line":"                req.environ.setdefault(\u0027REMOTE_USER\u0027, \u0027authorized\u0027)"},{"line_number":58,"context_line":"                req.environ.setdefault(\u0027swift_owner\u0027, True)"},{"line_number":59,"context_line":"                # But then default to blocking authz, to ensure we\u0027ve replaced"},{"line_number":60,"context_line":"                # the default auth system"},{"line_number":61,"context_line":"                return swob.HTTPForbidden(request\u003dreq)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"            env[\u0027swift.authorize\u0027] \u003d authorize_cb"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf51134e_f608632e","line":60,"range":{"start_line":59,"start_character":18,"end_line":60,"end_character":41},"updated":"2020-07-01 16:36:54.000000000","message":"IDK that this makes sense outside of an s3_acl context -- but our FakeApp won\u0027t try to call authorize anyway, so w/e.","commit_id":"2e001431fd0907c97d44b81dd1f3d2d14ae1208b"}],"test/unit/common/middleware/s3api/test_multi_upload.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"460bc04b8ba4ff4023b5a3e8fe6c2f1ce773c8ef","unresolved":false,"context_lines":[{"line_number":582,"context_line":"            ], self.swift.calls)"},{"line_number":583,"context_line":"        else:"},{"line_number":584,"context_line":"            self.assertEqual(["},{"line_number":585,"context_line":"                (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket\u0027),"},{"line_number":586,"context_line":"                (\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket+segments\u0027),"},{"line_number":587,"context_line":"                (\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket+segments/object/X\u0027),"},{"line_number":588,"context_line":"            ], self.swift.calls)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_88fcb53e","side":"PARENT","line":585,"updated":"2020-06-25 16:10:04.000000000","message":"mandatory HEAD removed!","commit_id":"0bed59e3faae94b96f98bbbc61b09abe54453267"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"460bc04b8ba4ff4023b5a3e8fe6c2f1ce773c8ef","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":138,"context_line":"        status, headers, body \u003d self.call_s3api(req)"},{"line_number":139,"context_line":"        self.assertEqual(self._get_error_code(body), \u0027InvalidRequest\u0027)"},{"line_number":140,"context_line":"        self.assertEqual([], self.swift.calls)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def test_bucket_upload_part_success(self):"},{"line_number":143,"context_line":"        req \u003d Request.blank(\u0027/bucket/object?partNumber\u003d1\u0026uploadId\u003dX\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_e8ebb174","line":140,"updated":"2020-06-25 16:10:04.000000000","message":"this is sort of an odd test - I guess, the idea is no matter the qs a PUT to a bucket is never a part upload","commit_id":"8698dcf0bf1e18fe4057b2f6f35ea4fd0973253b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"d40710db1b7fa8ac77c171e7ff8cc43f87ef3f60","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                            method\u003d\u0027PUT\u0027,"},{"line_number":145,"context_line":"                            headers\u003d{\u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":146,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":147,"context_line":"        with patch(\u0027swift.common.middleware.s3api.s3request.get_container_info\u0027,"},{"line_number":148,"context_line":"                   lambda env, app, swift_source: {\u0027status\u0027: 204}):"},{"line_number":149,"context_line":"            status, headers, body \u003d self.call_s3api(req)"},{"line_number":150,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_cc335aaa","line":147,"updated":"2020-06-25 22:59:24.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"8698dcf0bf1e18fe4057b2f6f35ea4fd0973253b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"460bc04b8ba4ff4023b5a3e8fe6c2f1ce773c8ef","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":147,"context_line":"        with patch(\u0027swift.common.middleware.s3api.s3request.get_container_info\u0027,"},{"line_number":148,"context_line":"                   lambda env, app, swift_source: {\u0027status\u0027: 204}):"},{"line_number":149,"context_line":"            status, headers, body \u003d self.call_s3api(req)"},{"line_number":150,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":151,"context_line":"        self.assertEqual(["},{"line_number":152,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket+segments/object/X\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_68de81da","line":149,"updated":"2020-06-25 16:10:04.000000000","message":"I think the patched get_container_info most clearly displays the effect of this change to eliminate a mandatory HEAD request for part uploads","commit_id":"8698dcf0bf1e18fe4057b2f6f35ea4fd0973253b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"460bc04b8ba4ff4023b5a3e8fe6c2f1ce773c8ef","unresolved":false,"context_lines":[{"line_number":841,"context_line":""},{"line_number":842,"context_line":"        self.assertEqual(self.swift.calls, ["},{"line_number":843,"context_line":"            # Bucket exists"},{"line_number":844,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test\u0027),"},{"line_number":845,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket\u0027),"},{"line_number":846,"context_line":"            # Segment container exists"},{"line_number":847,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket+segments/object/X\u0027),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_c897cdeb","line":844,"updated":"2020-06-25 16:10:04.000000000","message":"real get_container_info has to get account (n.b. this is easy post TEST/auth","commit_id":"8698dcf0bf1e18fe4057b2f6f35ea4fd0973253b"}],"test/unit/common/middleware/s3api/test_obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"460bc04b8ba4ff4023b5a3e8fe6c2f1ce773c8ef","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"            }"},{"line_number":1136,"context_line":"        }"},{"line_number":1137,"context_line":"        with patch(\u0027swift.common.middleware.s3api.s3request.\u0027"},{"line_number":1138,"context_line":"                   \u0027get_container_info\u0027, return_value\u003dfake_info):"},{"line_number":1139,"context_line":"            status, headers, body \u003d self.call_s3api(req)"},{"line_number":1140,"context_line":"        self.assertEqual(status.split()[0], \u0027204\u0027)"},{"line_number":1141,"context_line":"        self.assertEqual(["}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_4879fdc5","line":1138,"updated":"2020-06-25 16:10:04.000000000","message":"going with the patch\u0027d get_container_info seemed more obvious because the real get_container_info would also need a HEAD on the version\u0027s container","commit_id":"8698dcf0bf1e18fe4057b2f6f35ea4fd0973253b"}],"test/unit/common/middleware/s3api/test_s3api.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"460bc04b8ba4ff4023b5a3e8fe6c2f1ce773c8ef","unresolved":false,"context_lines":[{"line_number":502,"context_line":"            self.assertIn(\u0027swift.backend_path\u0027, req.environ)"},{"line_number":503,"context_line":"            self.assertEqual("},{"line_number":504,"context_line":"                \u0027/v1/AUTH_test/bucket+segments/object/123456789abcdef\u0027,"},{"line_number":505,"context_line":"                req.environ[\u0027swift.backend_path\u0027])"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        _, _, headers \u003d self.swift.calls_with_headers[-1]"},{"line_number":508,"context_line":"        self.assertEqual(req.environ[\u0027s3api.auth_details\u0027], {"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_2822c9b9","line":505,"updated":"2020-06-25 16:10:04.000000000","message":"I\u0027m really not sure what\u0027s going on with this - it looks like a weird unexpected side effect of not doing the HEAD?  I hope this wasn\u0027t trying to described a *desired* behavior!?  I think there\u0027s an outstanding change to make backend_path not get \"stuck\" to the first request...","commit_id":"8698dcf0bf1e18fe4057b2f6f35ea4fd0973253b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c432b7753559605f4faa19f8fc2ad4dd7cfcaa0c","unresolved":false,"context_lines":[{"line_number":502,"context_line":"            self.assertIn(\u0027swift.backend_path\u0027, req.environ)"},{"line_number":503,"context_line":"            self.assertEqual("},{"line_number":504,"context_line":"                \u0027/v1/AUTH_test/bucket+segments/object/123456789abcdef\u0027,"},{"line_number":505,"context_line":"                req.environ[\u0027swift.backend_path\u0027])"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        _, _, headers \u003d self.swift.calls_with_headers[-1]"},{"line_number":508,"context_line":"        self.assertEqual(req.environ[\u0027s3api.auth_details\u0027], {"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_76b77e3b","line":505,"in_reply_to":"bf51134e_2822c9b9","updated":"2020-06-25 17:30:20.000000000","message":"So it used to be that we would\n\n HEAD /v1/AUTH_test/bucket\n HEAD /v1/AUTH_test/bucket+segments/object/123456789abcdef\n PUT /v1/AUTH_test/bucket+segments/object/123456789abcdef/1\n\nNow that we\u0027ve taken out the container HEAD, it drops through to the upload-marker HEAD, but that doesn\u0027t quite seem right, either.\n\nIn https://review.opendev.org/#/c/735221/1/test/unit/common/middleware/s3api/test_s3api.py I had to update this to set it as the segment, which makes more sense to me. Still wouldn\u0027t mind getting OVH\u0027s opinion on it, since https://review.opendev.org/#/c/718086/ makes me think this was somewhat intentional; there was some comment about\n\n\u003e Store PATH_INFO only the first time to ignore multipart requests.","commit_id":"8698dcf0bf1e18fe4057b2f6f35ea4fd0973253b"}],"test/unit/common/middleware/s3api/test_s3request.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"460bc04b8ba4ff4023b5a3e8fe6c2f1ce773c8ef","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        self.assertTrue(\u0027status\u0027 in info)  # sanity"},{"line_number":327,"context_line":"        self.assertEqual(204, info[\u0027status\u0027])  # sanity"},{"line_number":328,"context_line":"        self.assertEqual(\u0027foo\u0027, info[\u0027read_acl\u0027])  # sanity"},{"line_number":329,"context_line":"        self.assertEqual(5, info[\u0027object_count\u0027])  # sanity"},{"line_number":330,"context_line":"        self.assertEqual("},{"line_number":331,"context_line":"            \u0027bucket2\u0027, info[\u0027sysmeta\u0027][\u0027versions-location\u0027])  # sanity"},{"line_number":332,"context_line":"        self.assertEqual(s3api_acl, info[\u0027sysmeta\u0027][\u0027s3api-acl\u0027])  # sanity"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_08138567","line":329,"updated":"2020-06-25 16:10:04.000000000","message":"I actually do not know who\u0027s casting this to an int?  the way the test was written it looked like it was getting cast to a string - which is ever weirder!?","commit_id":"8698dcf0bf1e18fe4057b2f6f35ea4fd0973253b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c432b7753559605f4faa19f8fc2ad4dd7cfcaa0c","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        self.assertTrue(\u0027status\u0027 in info)  # sanity"},{"line_number":327,"context_line":"        self.assertEqual(204, info[\u0027status\u0027])  # sanity"},{"line_number":328,"context_line":"        self.assertEqual(\u0027foo\u0027, info[\u0027read_acl\u0027])  # sanity"},{"line_number":329,"context_line":"        self.assertEqual(5, info[\u0027object_count\u0027])  # sanity"},{"line_number":330,"context_line":"        self.assertEqual("},{"line_number":331,"context_line":"            \u0027bucket2\u0027, info[\u0027sysmeta\u0027][\u0027versions-location\u0027])  # sanity"},{"line_number":332,"context_line":"        self.assertEqual(s3api_acl, info[\u0027sysmeta\u0027][\u0027s3api-acl\u0027])  # sanity"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_f6f1ce02","line":329,"in_reply_to":"bf51134e_08138567","updated":"2020-06-25 17:30:20.000000000","message":"I guess it was indirectly testing that we called headers_to_container_info, which just leaves the values it pulls out as strings? Agreed that having it as an int makes much more sense.","commit_id":"8698dcf0bf1e18fe4057b2f6f35ea4fd0973253b"}]}
