)]}'
{"test/functional/tests.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e88e251242f58e95e7b7c982b89344f6fe507d5","unresolved":false,"context_lines":[{"line_number":2880,"context_line":"            json.dumps([self.env.seg_info[\u0027seg_a\u0027]]),"},{"line_number":2881,"context_line":"            parms\u003d{\u0027multipart-manifest\u0027: \u0027put\u0027})"},{"line_number":2882,"context_line":"        # the container listing should have the etag of the actual manifest"},{"line_number":2883,"context_line":"        # object contents which we get using multipart-manifest\u003dget"},{"line_number":2884,"context_line":"        file_item.initialize(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":2885,"context_line":"        expected_etag \u003d file_item.etag"},{"line_number":2886,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_1d9f26b5","line":2883,"updated":"2016-05-19 22:38:30.000000000","message":"This doesn\u0027t seem like what we want. We don\u0027t have the same size or content-type as when we GET with multipart-manifest\u003dget; why should we have the same etag?\n\nI think we\u0027re codifying a bug here :(","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c69c002409a3fcd30efb15ce68c8cb52700cb31d","unresolved":false,"context_lines":[{"line_number":2880,"context_line":"            json.dumps([self.env.seg_info[\u0027seg_a\u0027]]),"},{"line_number":2881,"context_line":"            parms\u003d{\u0027multipart-manifest\u0027: \u0027put\u0027})"},{"line_number":2882,"context_line":"        # the container listing should have the etag of the actual manifest"},{"line_number":2883,"context_line":"        # object contents which we get using multipart-manifest\u003dget"},{"line_number":2884,"context_line":"        file_item.initialize(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":2885,"context_line":"        expected_etag \u003d file_item.etag"},{"line_number":2886,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_8046a978","line":2883,"in_reply_to":"bab6814e_1d9f26b5","updated":"2016-05-23 16:32:43.000000000","message":"I think I agree that the SLO handling of etags is strange but AFAIK has always been this way, rather than this being a recent regression. That\u0027s not saying it is correct.\n\nI can see how we could send the slo_etag to the container update using a backend override. We should avoid repeating the unfortunate hack in the object server for EC etags making it into container updates during POSTs, and there is a fix for that on feature/crypto (since encryption also needs to override the container etag).\n\nHowever, I don\u0027t want to fix that bug, if it is a bug, with this patch. The goal of this patch is to make copies of manifest at least be consistent with their source.\n\nAs for the test assertion - I could remove it? But often I find it helpful to have test assertions even when the asserted behaviour is dubious. How about i change the comment to acknowledge that the behaviour might be a bug? That way at least future us doesn\u0027t infer *intended* behaviour from the test assertion.","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e88e251242f58e95e7b7c982b89344f6fe507d5","unresolved":false,"context_lines":[{"line_number":3169,"context_line":"        copied.initialize()"},{"line_number":3170,"context_line":"        self.assertEqual(\u0027application/octet-stream\u0027, copied.content_type)"},{"line_number":3171,"context_line":"        copied.initialize(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":3172,"context_line":"        self.assertEqual(source.etag, copied.etag)"},{"line_number":3173,"context_line":""},{"line_number":3174,"context_line":"        # verify the listing metadata"},{"line_number":3175,"context_line":"        listing \u003d self.env.container.files(parms\u003d{\u0027format\u0027: \u0027json\u0027})"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_7dd2b2d3","line":3172,"updated":"2016-05-19 22:38:30.000000000","message":"How certain are we that this will always be true? Doesn\u0027t it depend on json.dumps stably ordering dict keys between the original PUT and the COPY?\n\nI feel like the non-multipart-manifest\u003dget case may be more interesting anyway...","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c69c002409a3fcd30efb15ce68c8cb52700cb31d","unresolved":false,"context_lines":[{"line_number":3169,"context_line":"        copied.initialize()"},{"line_number":3170,"context_line":"        self.assertEqual(\u0027application/octet-stream\u0027, copied.content_type)"},{"line_number":3171,"context_line":"        copied.initialize(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":3172,"context_line":"        self.assertEqual(source.etag, copied.etag)"},{"line_number":3173,"context_line":""},{"line_number":3174,"context_line":"        # verify the listing metadata"},{"line_number":3175,"context_line":"        listing \u003d self.env.container.files(parms\u003d{\u0027format\u0027: \u0027json\u0027})"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_d1307758","line":3172,"in_reply_to":"bab6814e_7dd2b2d3","updated":"2016-05-23 16:32:43.000000000","message":"Good point. I will change the test to assert that the deserialized contents are equal and that the etag is the hash of the respective contents.\n\nArguably it doesn\u0027t matter if the etags different so long as the contents are semantically equivalent. It might be nice if the etag of the copy was the same as the source, and that could be achieved by sorting keys in the json serialization, but it isn\u0027t what I set out to achieve in this patch.","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"}],"test/unit/common/middleware/test_slo.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e88e251242f58e95e7b7c982b89344f6fe507d5","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"        self.bc_etag \u003d md5hex(_bc_manifest_json)"},{"line_number":1113,"context_line":"        self.app.register("},{"line_number":1114,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc\u0027,"},{"line_number":1115,"context_line":"            # proxy oibj controller removes swift_bytes from content-type"},{"line_number":1116,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027text/plain\u0027,"},{"line_number":1117,"context_line":"                          \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":1118,"context_line":"                          \u0027X-Object-Meta-Plant\u0027: \u0027Ficus\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_1008ae2b","line":1115,"range":{"start_line":1115,"start_character":20,"end_line":1115,"end_character":24},"updated":"2016-05-19 22:38:30.000000000","message":"s/oibj/obj/","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c69c002409a3fcd30efb15ce68c8cb52700cb31d","unresolved":false,"context_lines":[{"line_number":1112,"context_line":"        self.bc_etag \u003d md5hex(_bc_manifest_json)"},{"line_number":1113,"context_line":"        self.app.register("},{"line_number":1114,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc\u0027,"},{"line_number":1115,"context_line":"            # proxy oibj controller removes swift_bytes from content-type"},{"line_number":1116,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027text/plain\u0027,"},{"line_number":1117,"context_line":"                          \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":1118,"context_line":"                          \u0027X-Object-Meta-Plant\u0027: \u0027Ficus\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_9148afb4","line":1115,"range":{"start_line":1115,"start_character":20,"end_line":1115,"end_character":24},"in_reply_to":"bab6814e_1008ae2b","updated":"2016-05-23 16:32:43.000000000","message":"Done","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e88e251242f58e95e7b7c982b89344f6fe507d5","unresolved":false,"context_lines":[{"line_number":1128,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027, \u0027range\u0027: \u0027100-200\u0027}])"},{"line_number":1129,"context_line":"        self.app.register("},{"line_number":1130,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc-r\u0027,"},{"line_number":1131,"context_line":"            # proxy oibj controller removes swift_bytes from content-type"},{"line_number":1132,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027text/plain\u0027,"},{"line_number":1133,"context_line":"                          \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":1134,"context_line":"                          \u0027X-Object-Meta-Plant\u0027: \u0027Ficus\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_6b0dcf36","line":1131,"range":{"start_line":1131,"start_character":20,"end_line":1131,"end_character":24},"updated":"2016-05-19 22:38:30.000000000","message":"and here","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c69c002409a3fcd30efb15ce68c8cb52700cb31d","unresolved":false,"context_lines":[{"line_number":1128,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027, \u0027range\u0027: \u0027100-200\u0027}])"},{"line_number":1129,"context_line":"        self.app.register("},{"line_number":1130,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc-r\u0027,"},{"line_number":1131,"context_line":"            # proxy oibj controller removes swift_bytes from content-type"},{"line_number":1132,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027text/plain\u0027,"},{"line_number":1133,"context_line":"                          \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":1134,"context_line":"                          \u0027X-Object-Meta-Plant\u0027: \u0027Ficus\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_d1ccf736","line":1131,"range":{"start_line":1131,"start_character":20,"end_line":1131,"end_character":24},"in_reply_to":"bab6814e_6b0dcf36","updated":"2016-05-23 16:32:43.000000000","message":"Done","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e88e251242f58e95e7b7c982b89344f6fe507d5","unresolved":false,"context_lines":[{"line_number":1262,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027}])"},{"line_number":1263,"context_line":"        self.app.register("},{"line_number":1264,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc\u0027,"},{"line_number":1265,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027application/json;swift_bytes\u003d25\u0027,"},{"line_number":1266,"context_line":"                          \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":1267,"context_line":"                          \u0027X-Object-Meta-Plant\u0027: \u0027Ficus\u0027,"},{"line_number":1268,"context_line":"                          \u0027Etag\u0027: md5hex(_bc_manifest_json)},"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_cbb03b46","line":1265,"range":{"start_line":1265,"start_character":43,"end_line":1265,"end_character":59},"updated":"2016-05-19 22:38:30.000000000","message":"Should we fix up these content-types, as well?","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c69c002409a3fcd30efb15ce68c8cb52700cb31d","unresolved":false,"context_lines":[{"line_number":1262,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027}])"},{"line_number":1263,"context_line":"        self.app.register("},{"line_number":1264,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc\u0027,"},{"line_number":1265,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027application/json;swift_bytes\u003d25\u0027,"},{"line_number":1266,"context_line":"                          \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":1267,"context_line":"                          \u0027X-Object-Meta-Plant\u0027: \u0027Ficus\u0027,"},{"line_number":1268,"context_line":"                          \u0027Etag\u0027: md5hex(_bc_manifest_json)},"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_afac678c","line":1265,"range":{"start_line":1265,"start_character":43,"end_line":1265,"end_character":59},"in_reply_to":"bab6814e_cbb03b46","updated":"2016-05-23 16:32:43.000000000","message":"I guess so.","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"}],"test/unit/container/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e88e251242f58e95e7b7c982b89344f6fe507d5","unresolved":false,"context_lines":[{"line_number":2317,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"},{"line_number":2318,"context_line":"        resp \u003d req.get_response(self.controller)"},{"line_number":2319,"context_line":"        result \u003d [x[\u0027content_type\u0027] for x in json.loads(resp.body)]"},{"line_number":2320,"context_line":"        self.assertEqual(result, [\u0027text/plain;charset\u003d\"utf-8\"\u0027])"},{"line_number":2321,"context_line":"        result \u003d [x[\u0027bytes\u0027] for x in json.loads(resp.body)]"},{"line_number":2322,"context_line":"        self.assertEqual(result, [12345678])"},{"line_number":2323,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_6b5e6f77","line":2320,"updated":"2016-05-19 22:38:30.000000000","message":"Interesting that we lose the space between the semicolon and param name. Not worrying, though.","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e88e251242f58e95e7b7c982b89344f6fe507d5","unresolved":false,"context_lines":[{"line_number":2319,"context_line":"        result \u003d [x[\u0027content_type\u0027] for x in json.loads(resp.body)]"},{"line_number":2320,"context_line":"        self.assertEqual(result, [\u0027text/plain;charset\u003d\"utf-8\"\u0027])"},{"line_number":2321,"context_line":"        result \u003d [x[\u0027bytes\u0027] for x in json.loads(resp.body)]"},{"line_number":2322,"context_line":"        self.assertEqual(result, [12345678])"},{"line_number":2323,"context_line":""},{"line_number":2324,"context_line":"    def test_GET_accept_not_valid(self):"},{"line_number":2325,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c\u0027, method\u003d\u0027PUT\u0027, headers\u003d{"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_eb453fb3","line":2322,"updated":"2016-05-19 22:38:30.000000000","message":"Where\u0027s our control? I\u0027m sure this exists somewhere, but where do we see that HTTP_X_SIZE gets turned into \u0027bytes\u0027 in a container listing?","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c69c002409a3fcd30efb15ce68c8cb52700cb31d","unresolved":false,"context_lines":[{"line_number":2319,"context_line":"        result \u003d [x[\u0027content_type\u0027] for x in json.loads(resp.body)]"},{"line_number":2320,"context_line":"        self.assertEqual(result, [\u0027text/plain;charset\u003d\"utf-8\"\u0027])"},{"line_number":2321,"context_line":"        result \u003d [x[\u0027bytes\u0027] for x in json.loads(resp.body)]"},{"line_number":2322,"context_line":"        self.assertEqual(result, [12345678])"},{"line_number":2323,"context_line":""},{"line_number":2324,"context_line":"    def test_GET_accept_not_valid(self):"},{"line_number":2325,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a/c\u0027, method\u003d\u0027PUT\u0027, headers\u003d{"}],"source_content_type":"text/x-python","patch_set":1,"id":"bab6814e_3a38b3d2","line":2322,"in_reply_to":"bab6814e_eb453fb3","updated":"2016-05-23 16:32:43.000000000","message":"test_object_update_with_multiple_timestamps() for example\n\nthere\u0027s a few places where X-Size\u003d0 and the listing is verified to have bytes\u003d0 but test_object_update_with_multiple_timestamps() actually sets non-zero sizes.","commit_id":"b76d2203ace27a8c9ec4cf6e58eb15b716669462"}]}
