)]}'
{"glance_store/_drivers/swift/store.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"405b04ad37c65521d750439007bdc5b1871b9503","unresolved":false,"context_lines":[{"line_number":1030,"context_line":"                    if image_size \u003d\u003d 0:"},{"line_number":1031,"context_line":"                        image_size \u003d combined_chunks_size"},{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"                    # Now we write the object manifest and return the"},{"line_number":1034,"context_line":"                    # manifest\u0027s etag..."},{"line_number":1035,"context_line":"                    manifest \u003d \"%s/%s-\" % (location.container, location.obj)"},{"line_number":1036,"context_line":"                    headers \u003d {\u0027X-Object-Manifest\u0027: manifest}"},{"line_number":1037,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fce034c_7f02a90b","line":1034,"range":{"start_line":1033,"start_character":54,"end_line":1034,"end_character":40},"updated":"2019-04-16 00:28:37.000000000","message":"Sorry I missed this last time.  You should update this comment and explain why we aren\u0027t including an ETag header for the manifest.","commit_id":"74e5be0fce7fae9c5afe2a42a7487ab4f0070d76"}],"glance_store/tests/unit/test_swift_store.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"52e3fef508809eda3067931b71018d35e8b20db6","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                if kwargs.get(\u0027headers\u0027):"},{"line_number":121,"context_line":"                    manifest \u003d kwargs.get(\u0027headers\u0027).get(\u0027X-Object-Manifest\u0027)"},{"line_number":122,"context_line":"                    fixture_headers[fixture_key] \u003d {"},{"line_number":123,"context_line":"                        \u0027manifest\u0027: True,"},{"line_number":124,"context_line":"                        \u0027x-object-manifest\u0027: manifest"},{"line_number":125,"context_line":"                    }"},{"line_number":126,"context_line":"                    if \u0027ETag\u0027 in kwargs.get(\u0027headers\u0027).keys():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_8aae63e5","line":123,"updated":"2019-04-12 14:12:03.000000000","message":"I think it may be more clear to set the etag here (like in the old code) to make it obvious that we should get a null bytes md5sum since the manifest has a zero-byte payload.  (See my comment below for how I\u0027d prefer you to set the value.)","commit_id":"9381140b97dbbe50d3d334d846ac9dd717389dc8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"32789865906a0b52666182d92c7cf82e35cf9ea5","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                if kwargs.get(\u0027headers\u0027):"},{"line_number":121,"context_line":"                    manifest \u003d kwargs.get(\u0027headers\u0027).get(\u0027X-Object-Manifest\u0027)"},{"line_number":122,"context_line":"                    fixture_headers[fixture_key] \u003d {"},{"line_number":123,"context_line":"                        \u0027manifest\u0027: True,"},{"line_number":124,"context_line":"                        \u0027x-object-manifest\u0027: manifest"},{"line_number":125,"context_line":"                    }"},{"line_number":126,"context_line":"                    if \u0027ETag\u0027 in kwargs.get(\u0027headers\u0027).keys():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_6d1eae0d","line":123,"in_reply_to":"3fce034c_2a0baf8e","updated":"2019-04-12 17:08:04.000000000","message":"The fixture_headers are used by fake_get_object, so if we don\u0027t put an etag here I don\u0027t think it will show up with the response.  You\u0027re right that there\u0027s a weird mix of headers being stored in the fixture; the \u0027manifest\u0027 boolean is used by fake_get_object to recognize that it needs to stream segments in its response (see line 181).  I don\u0027t see that the x-object-manifest value is currently used by fake_get_object, instead it looks like it\u0027s relying on the naming convention glance uses for swift segments and the manifest (which is probably bad -- since swift is going to use the DLO pattern glance gives it, we should probably be using that pattern ourselves in the mock -- though hopefully there\u0027s a test somewhere that checks to make sure we write the container/prefix correctly).  It doesn\u0027t look like we do any kind of screening on the get response to make sure the only headers returned are realistic; I think we just dump them all along with the body at line 199.  Anyway, if we want fake_get_object to have an etag in a fake DLO response, it looks like we do need to include it here.","commit_id":"9381140b97dbbe50d3d334d846ac9dd717389dc8"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ed9734d0ca0fe2f6214f04a1455d69caf2235827","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                if kwargs.get(\u0027headers\u0027):"},{"line_number":121,"context_line":"                    manifest \u003d kwargs.get(\u0027headers\u0027).get(\u0027X-Object-Manifest\u0027)"},{"line_number":122,"context_line":"                    fixture_headers[fixture_key] \u003d {"},{"line_number":123,"context_line":"                        \u0027manifest\u0027: True,"},{"line_number":124,"context_line":"                        \u0027x-object-manifest\u0027: manifest"},{"line_number":125,"context_line":"                    }"},{"line_number":126,"context_line":"                    if \u0027ETag\u0027 in kwargs.get(\u0027headers\u0027).keys():"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_2a0baf8e","line":123,"in_reply_to":"3fce034c_8aae63e5","updated":"2019-04-12 14:21:13.000000000","message":"Should fixture_headers[fixture_key] always include etag?, that\u0027s not clear to me. Should fixture_headers[fixture_key] contain the request or call headers?, if it\u0027s request headers etag should only be included if it\u0027s in the put, am i wrong?","commit_id":"9381140b97dbbe50d3d334d846ac9dd717389dc8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"52e3fef508809eda3067931b71018d35e8b20db6","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                        fixture_headers[fixture_key][\u0027etag\u0027] \u003d etag"},{"line_number":129,"context_line":"                    else:"},{"line_number":130,"context_line":"                        # Response for put calls always return an etag"},{"line_number":131,"context_line":"                        etag \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":132,"context_line":"                    fixture_objects[fixture_key] \u003d None"},{"line_number":133,"context_line":"                    return etag"},{"line_number":134,"context_line":"                if hasattr(contents, \u0027read\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_dfee6b87","line":131,"range":{"start_line":131,"start_character":31,"end_line":131,"end_character":65},"updated":"2019-04-12 14:12:03.000000000","message":"I\u0027d suggest replacing this with\n\n    hashlib.md5(b\u0027\u0027).hexdigest()\n\nso it\u0027s obvious what\u0027s being returned here.  (Or if you decide to define the string as something like NULL_BYTES_MD5SUM, please also make the change at line 1950.)","commit_id":"9381140b97dbbe50d3d334d846ac9dd717389dc8"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ed9734d0ca0fe2f6214f04a1455d69caf2235827","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                        fixture_headers[fixture_key][\u0027etag\u0027] \u003d etag"},{"line_number":129,"context_line":"                    else:"},{"line_number":130,"context_line":"                        # Response for put calls always return an etag"},{"line_number":131,"context_line":"                        etag \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":132,"context_line":"                    fixture_objects[fixture_key] \u003d None"},{"line_number":133,"context_line":"                    return etag"},{"line_number":134,"context_line":"                if hasattr(contents, \u0027read\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_ca98eb6b","line":131,"range":{"start_line":131,"start_character":31,"end_line":131,"end_character":65},"in_reply_to":"3fce034c_dfee6b87","updated":"2019-04-12 14:21:13.000000000","message":"Yes, sounds good to me.","commit_id":"9381140b97dbbe50d3d334d846ac9dd717389dc8"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a87ecc54e2e32def282c9b2f807bc99f570198ac","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            if fixture_key not in fixture_headers:"},{"line_number":120,"context_line":"                if kwargs.get(\u0027headers\u0027):"},{"line_number":121,"context_line":"                    manifest \u003d kwargs.get(\u0027headers\u0027).get(\u0027X-Object-Manifest\u0027)"},{"line_number":122,"context_line":"                    if \u0027ETag\u0027 in kwargs.get(\u0027headers\u0027).keys():"},{"line_number":123,"context_line":"                        etag \u003d kwargs.get(\u0027headers\u0027).get(\u0027ETag\u0027)"},{"line_number":124,"context_line":"                    else:"},{"line_number":125,"context_line":"                        # Response for put calls always return an etag"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fce034c_8e2069b2","line":122,"updated":"2019-04-17 09:46:47.000000000","message":"nit:\n\n  etag \u003d kwargs[\u0027headers\u0027].get(\u0027ETag\u0027, hashlib.md5(b\u0027\u0027).hexdigest())","commit_id":"0641e29dff782f177a3c26b5d62494ef5c6f8902"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"859b3eebfb05f3f274cf8347011b627bdc09737e","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            if fixture_key not in fixture_headers:"},{"line_number":120,"context_line":"                if kwargs.get(\u0027headers\u0027):"},{"line_number":121,"context_line":"                    manifest \u003d kwargs.get(\u0027headers\u0027).get(\u0027X-Object-Manifest\u0027)"},{"line_number":122,"context_line":"                    etag \u003d kwargs.get(\u0027headers\u0027) \\"},{"line_number":123,"context_line":"                                 .get(\u0027ETag\u0027, hashlib.md5(b\u0027\u0027).hexdigest())"},{"line_number":124,"context_line":"                    fixture_headers[fixture_key] \u003d {"},{"line_number":125,"context_line":"                        \u0027manifest\u0027: True,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fce034c_1403260f","line":122,"updated":"2019-04-17 10:45:01.000000000","message":"nit: No need to use `get`, since you already know the key exists (checked in L120), so we can just do `kwargs[\u0027headers\u0027]`","commit_id":"ed356fc6b46e133899e1bf1c54df239536ea78b9"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"fa17e82a287478e4711cfa01bfd45c19fd0cf92a","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            if fixture_key not in fixture_headers:"},{"line_number":120,"context_line":"                if kwargs.get(\u0027headers\u0027):"},{"line_number":121,"context_line":"                    manifest \u003d kwargs.get(\u0027headers\u0027).get(\u0027X-Object-Manifest\u0027)"},{"line_number":122,"context_line":"                    etag \u003d kwargs.get(\u0027headers\u0027) \\"},{"line_number":123,"context_line":"                                 .get(\u0027ETag\u0027, hashlib.md5(b\u0027\u0027).hexdigest())"},{"line_number":124,"context_line":"                    fixture_headers[fixture_key] \u003d {"},{"line_number":125,"context_line":"                        \u0027manifest\u0027: True,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fce034c_8fc70346","line":122,"in_reply_to":"3fce034c_1403260f","updated":"2019-04-17 12:23:41.000000000","message":"nit: if you decide to address Gorka\u0027s nit, please also get rid of the \\ continuation:\n\n  etag \u003d kwargs[\u0027headers\u0027].get(\n      \u0027ETag\u0027, hashlib.md5(b\u0027\u0027).hexdigest())","commit_id":"ed356fc6b46e133899e1bf1c54df239536ea78b9"}],"glance_store/tests/unit/test_swift_store_multibackend.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"52e3fef508809eda3067931b71018d35e8b20db6","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                        fixture_headers[fixture_key][\u0027etag\u0027] \u003d etag"},{"line_number":120,"context_line":"                    else:"},{"line_number":121,"context_line":"                        # Response for put calls always return an etag"},{"line_number":122,"context_line":"                        etag \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":123,"context_line":"                    fixture_objects[fixture_key] \u003d None"},{"line_number":124,"context_line":"                    return etag"},{"line_number":125,"context_line":"                if hasattr(contents, \u0027read\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_5f8fdbcb","line":122,"updated":"2019-04-12 14:12:03.000000000","message":"see comment on the other test file","commit_id":"9381140b97dbbe50d3d334d846ac9dd717389dc8"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"859b3eebfb05f3f274cf8347011b627bdc09737e","unresolved":false,"context_lines":[{"line_number":110,"context_line":"            if fixture_key not in fixture_headers:"},{"line_number":111,"context_line":"                if kwargs.get(\u0027headers\u0027):"},{"line_number":112,"context_line":"                    manifest \u003d kwargs.get(\u0027headers\u0027).get(\u0027X-Object-Manifest\u0027)"},{"line_number":113,"context_line":"                    etag \u003d kwargs.get(\u0027headers\u0027) \\"},{"line_number":114,"context_line":"                                 .get(\u0027ETag\u0027, hashlib.md5(b\u0027\u0027).hexdigest())"},{"line_number":115,"context_line":"                    fixture_headers[fixture_key] \u003d {"},{"line_number":116,"context_line":"                        \u0027manifest\u0027: True,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fce034c_b409f22c","line":113,"updated":"2019-04-17 10:45:01.000000000","message":"ditto","commit_id":"ed356fc6b46e133899e1bf1c54df239536ea78b9"}]}
