)]}'
{"glance/api/v2/images.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b33d4353f99d3e4a9cd97eaae4ca5dfefbefabff","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        for key in [\u0027id\u0027, \u0027name\u0027]:"},{"line_number":118,"context_line":"            _image[key] \u003d image[key]"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        _image[\u0027tags\u0027] \u003d [tag[\u0027value\u0027] for tag in image[\u0027tags\u0027]]"},{"line_number":121,"context_line":"        _image[\u0027visibility\u0027] \u003d \u0027public\u0027 if image[\u0027is_public\u0027] else \u0027private\u0027"},{"line_number":122,"context_line":"        _image[\u0027links\u0027] \u003d self._get_image_links(image)"},{"line_number":123,"context_line":"        return _image"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAHX%2F%2F6Ns%3D","line":120,"updated":"2012-05-18 16:16:59.000000000","message":"Seems odd here... Shouldn\u0027t tags just be a set of strings, not a set of strings in dicts with the key \u0027value\u0027? I would do this normalization in the DB API layer, instead of leaking it up into the controller...","commit_id":"cb4f5acc86cd7fd3b65064343623ca1b13f77200"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"2a2a582c028ee4d39a70dc880d6eb67f7684937e","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        for key in [\u0027id\u0027, \u0027name\u0027]:"},{"line_number":118,"context_line":"            _image[key] \u003d image[key]"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        _image[\u0027tags\u0027] \u003d [tag[\u0027value\u0027] for tag in image[\u0027tags\u0027]]"},{"line_number":121,"context_line":"        _image[\u0027visibility\u0027] \u003d \u0027public\u0027 if image[\u0027is_public\u0027] else \u0027private\u0027"},{"line_number":122,"context_line":"        _image[\u0027links\u0027] \u003d self._get_image_links(image)"},{"line_number":123,"context_line":"        return _image"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAHX%2F%2F51Y%3D","line":120,"in_reply_to":"AAAAHX%2F%2F6Ns%3D","updated":"2012-05-21 03:21:32.000000000","message":"So I actually did that in some initial refactoring but reverted it due to the joined load on the image entities. The cleanest way to do this is to remove the joinedload from the Image entity and manually request the tags from the v2 controller. It\u0027s either that or start returning dicts from image_get and image_get_all methods, which opens up a bigger can of worms... Take a look and tell me what you think.","commit_id":"cb4f5acc86cd7fd3b65064343623ca1b13f77200"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5b498ff9ef0a324c2ca20bb80ea162001b9fb03b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        image[\u0027status\u0027] \u003d \u0027queued\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        image \u003d dict(self.db_api.image_create(req.context, image))"},{"line_number":45,"context_line":"        self._append_tags(req.context, image)"},{"line_number":46,"context_line":"        return image"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def index(self, req):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAHX%2F%2F5kA%3D","line":45,"updated":"2012-05-21 16:54:43.000000000","message":"Would using the eager-loading of the tags collection of the image model be more efficient than a separate call to _append_tags() here and below?","commit_id":"95fbb0fc140715f0ea9e2a9d507a8b011b55ae5f"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"13a8c75c11209f83666fde1031ca1716af950356","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        image[\u0027status\u0027] \u003d \u0027queued\u0027"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        image \u003d dict(self.db_api.image_create(req.context, image))"},{"line_number":45,"context_line":"        self._append_tags(req.context, image)"},{"line_number":46,"context_line":"        return image"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def index(self, req):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAHX%2F%2F5iY%3D","line":45,"in_reply_to":"AAAAHX%2F%2F5kA%3D","updated":"2012-05-21 17:38:17.000000000","message":"Yes, but I have to remove the join so I can process the list of tags the same was as we do in image_tag_get_all.","commit_id":"95fbb0fc140715f0ea9e2a9d507a8b011b55ae5f"}],"glance/registry/db/api.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5b498ff9ef0a324c2ca20bb80ea162001b9fb03b","unresolved":false,"context_lines":[{"line_number":582,"context_line":"            raise exception.Duplicate(\"Image ID %s already exists!\""},{"line_number":583,"context_line":"                                      % values[\u0027id\u0027])"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        _set_properties_for_image(context, image_ref, properties, purge_props,"},{"line_number":586,"context_line":"                                  session)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"        _image_tag_set_all(context, image_ref.id, tags, session)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAHX%2F%2F5jY%3D","line":585,"updated":"2012-05-21 16:54:43.000000000","message":"Might want to make these function names more consistent in a future patch... should be:\n\n _image_property_set_all()\n\nif you are consistent with the _image_tag_set_all() below?","commit_id":"95fbb0fc140715f0ea9e2a9d507a8b011b55ae5f"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"13a8c75c11209f83666fde1031ca1716af950356","unresolved":false,"context_lines":[{"line_number":582,"context_line":"            raise exception.Duplicate(\"Image ID %s already exists!\""},{"line_number":583,"context_line":"                                      % values[\u0027id\u0027])"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        _set_properties_for_image(context, image_ref, properties, purge_props,"},{"line_number":586,"context_line":"                                  session)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"        _image_tag_set_all(context, image_ref.id, tags, session)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAHX%2F%2F5iU%3D","line":585,"in_reply_to":"AAAAHX%2F%2F5jY%3D","updated":"2012-05-21 17:38:17.000000000","message":"Ok. Look for future patches to clean up all the db code.","commit_id":"95fbb0fc140715f0ea9e2a9d507a8b011b55ae5f"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"6d94c7eed13ac7c5f596c41a63ea0cc0dd16c21a","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    try:"},{"line_number":252,"context_line":"        query \u003d session.query(models.Image).\\"},{"line_number":253,"context_line":"                        options(joinedload(models.Image.properties)).\\"},{"line_number":254,"context_line":"                        options(joinedload(models.Image.members)).\\"},{"line_number":255,"context_line":"                        filter_by(id\u003dimage_id)"},{"line_number":256,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F3XU%3D","line":253,"updated":"2012-05-25 21:34:48.000000000","message":"Its a little weird that we allow updates with tags, but we don\u0027t join on tags during the get.\n\nI think parity is most important, but I lean more towards supporting tags in both since that will make transactions easier if we end up needing those.","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"f2cbe9e3a1042c52f3c6da99fbacc731cc747aa1","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    try:"},{"line_number":252,"context_line":"        query \u003d session.query(models.Image).\\"},{"line_number":253,"context_line":"                        options(joinedload(models.Image.properties)).\\"},{"line_number":254,"context_line":"                        options(joinedload(models.Image.members)).\\"},{"line_number":255,"context_line":"                        filter_by(id\u003dimage_id)"},{"line_number":256,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F2cU%3D","line":253,"in_reply_to":"AAAAHX%2F%2F3XU%3D","updated":"2012-05-29 21:41:25.000000000","message":"I\u0027m against joining on tags as we need to parse them before we output them from this layer, which means we also need to return a dictionary in place of the Image model. That isn\u0027t reasonable to do at this time, so I\u0027ll just drop support for setting tags in the image update call.","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"3d133afa7981d5ade86c29e983c6af32172aa465","unresolved":false,"context_lines":[{"line_number":791,"context_line":"    for tag in tags_to_create:"},{"line_number":792,"context_line":"        image_tag_create(context, image_id, tag, session)"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    tags_to_delete \u003d existing_tags - tags"},{"line_number":795,"context_line":"    for tag in tags_to_delete:"},{"line_number":796,"context_line":"        image_tag_delete(context, image_id, tag, session)"},{"line_number":797,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F3CQ%3D","line":794,"updated":"2012-05-28 15:28:39.000000000","message":"I\u0027m a bit confused by the set difference here.\n\n  tags_to_delete \u003d existing_tags - tags\n\nseems to imply that each element in tags_to_delete is not in existing_tags. But why delete the tag if its not in the set currently applying to the image?","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"adc3b6291fa42fbfc500071bbe1646b15b66f684","unresolved":false,"context_lines":[{"line_number":791,"context_line":"    for tag in tags_to_create:"},{"line_number":792,"context_line":"        image_tag_create(context, image_id, tag, session)"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    tags_to_delete \u003d existing_tags - tags"},{"line_number":795,"context_line":"    for tag in tags_to_delete:"},{"line_number":796,"context_line":"        image_tag_delete(context, image_id, tag, session)"},{"line_number":797,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHn%2F%2F%2F4M%3D","line":794,"in_reply_to":"AAAAHX%2F%2F2b0%3D","updated":"2012-05-30 09:20:56.000000000","message":"A-ha, I see, all the existing tags have to be repeated in the update call, otherwise a missing tag is by implication deleted, right?","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"f2cbe9e3a1042c52f3c6da99fbacc731cc747aa1","unresolved":false,"context_lines":[{"line_number":791,"context_line":"    for tag in tags_to_create:"},{"line_number":792,"context_line":"        image_tag_create(context, image_id, tag, session)"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    tags_to_delete \u003d existing_tags - tags"},{"line_number":795,"context_line":"    for tag in tags_to_delete:"},{"line_number":796,"context_line":"        image_tag_delete(context, image_id, tag, session)"},{"line_number":797,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F2b0%3D","line":794,"in_reply_to":"AAAAHX%2F%2F3CQ%3D","updated":"2012-05-29 21:41:25.000000000","message":"This tidbit finds all the tags that are stored in the database that the user didn\u0027t reference in their request. This method is a set operation, not an add operation, so we need to do away with any lingering tags related to the image. I\u0027m not sure how a tag would even show up in tags_to_delete if it weren\u0027t in existing_tags, given the nature of the specific operation at hand.","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"3d133afa7981d5ade86c29e983c6af32172aa465","unresolved":false,"context_lines":[{"line_number":798,"context_line":""},{"line_number":799,"context_line":"def image_tag_create(context, image_id, value, session\u003dNone):"},{"line_number":800,"context_line":"    \"\"\"Create an image tag.\"\"\""},{"line_number":801,"context_line":"    session \u003d session or get_session()"},{"line_number":802,"context_line":"    tag_ref \u003d models.ImageTag(image_id\u003dimage_id, value\u003dvalue)"},{"line_number":803,"context_line":"    tag_ref.save(session\u003dsession)"},{"line_number":804,"context_line":"    return tag_ref[\u0027value\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F3CM%3D","line":801,"updated":"2012-05-28 15:28:39.000000000","message":"Neater as:\n\n\n  -    def image_tag_create(context, image_id, value, session\u003dNone):\n  -        session \u003d session or get_session()\n  +    def image_tag_create(context, image_id, value, session\u003dget_session()):","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"adc3b6291fa42fbfc500071bbe1646b15b66f684","unresolved":false,"context_lines":[{"line_number":798,"context_line":""},{"line_number":799,"context_line":"def image_tag_create(context, image_id, value, session\u003dNone):"},{"line_number":800,"context_line":"    \"\"\"Create an image tag.\"\"\""},{"line_number":801,"context_line":"    session \u003d session or get_session()"},{"line_number":802,"context_line":"    tag_ref \u003d models.ImageTag(image_id\u003dimage_id, value\u003dvalue)"},{"line_number":803,"context_line":"    tag_ref.save(session\u003dsession)"},{"line_number":804,"context_line":"    return tag_ref[\u0027value\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHn%2F%2F%2F4Q%3D","line":801,"in_reply_to":"AAAAHX%2F%2F2bo%3D","updated":"2012-05-30 09:20:56.000000000","message":"Yep, good point, my bad.","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"f2cbe9e3a1042c52f3c6da99fbacc731cc747aa1","unresolved":false,"context_lines":[{"line_number":798,"context_line":""},{"line_number":799,"context_line":"def image_tag_create(context, image_id, value, session\u003dNone):"},{"line_number":800,"context_line":"    \"\"\"Create an image tag.\"\"\""},{"line_number":801,"context_line":"    session \u003d session or get_session()"},{"line_number":802,"context_line":"    tag_ref \u003d models.ImageTag(image_id\u003dimage_id, value\u003dvalue)"},{"line_number":803,"context_line":"    tag_ref.save(session\u003dsession)"},{"line_number":804,"context_line":"    return tag_ref[\u0027value\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F2bo%3D","line":801,"in_reply_to":"AAAAHX%2F%2F3CM%3D","updated":"2012-05-29 21:41:25.000000000","message":"You would think so, but if you define a keyword param like that, the default value is generated at load time, not at run time.","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"3d133afa7981d5ade86c29e983c6af32172aa465","unresolved":false,"context_lines":[{"line_number":806,"context_line":""},{"line_number":807,"context_line":"def image_tag_delete(context, image_id, value, session\u003dNone):"},{"line_number":808,"context_line":"    \"\"\"Delete an image tag.\"\"\""},{"line_number":809,"context_line":"    session \u003d session or get_session()"},{"line_number":810,"context_line":"    query \u003d session.query(models.ImageTag).\\"},{"line_number":811,"context_line":"                    filter_by(image_id\u003dimage_id).\\"},{"line_number":812,"context_line":"                    filter_by(value\u003dvalue).\\"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F3CI%3D","line":809,"updated":"2012-05-28 15:28:39.000000000","message":"Similarly.","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"3d133afa7981d5ade86c29e983c6af32172aa465","unresolved":false,"context_lines":[{"line_number":821,"context_line":""},{"line_number":822,"context_line":"def image_tag_get_all(context, image_id, session\u003dNone):"},{"line_number":823,"context_line":"    \"\"\"Get a list of tags for a specific image.\"\"\""},{"line_number":824,"context_line":"    session \u003d session or get_session()"},{"line_number":825,"context_line":"    tags \u003d session.query(models.ImageTag).\\"},{"line_number":826,"context_line":"                   filter_by(image_id\u003dimage_id).\\"},{"line_number":827,"context_line":"                   filter_by(deleted\u003dFalse).\\"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F3CE%3D","line":824,"updated":"2012-05-28 15:28:39.000000000","message":"Similarly.","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"}],"glance/schema.py":[{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"3d133afa7981d5ade86c29e983c6af32172aa465","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            \u0027description\u0027: \u0027List of strings related to the image\u0027,"},{"line_number":48,"context_line":"            \u0027items\u0027: {"},{"line_number":49,"context_line":"                \u0027type\u0027: \u0027string\u0027,"},{"line_number":50,"context_line":"                \u0027maxLength\u0027: 255,"},{"line_number":51,"context_line":"            },"},{"line_number":52,"context_line":"        },"},{"line_number":53,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F3CA%3D","line":50,"updated":"2012-05-28 15:28:39.000000000","message":"Should we limit the number of tags that can be applied to an image?\n\n(in addition to limiting the length of each tag)","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":2284,"name":"Eoghan Glynn","email":"eglynn@redhat.com","username":"eglynn"},"change_message_id":"adc3b6291fa42fbfc500071bbe1646b15b66f684","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            \u0027description\u0027: \u0027List of strings related to the image\u0027,"},{"line_number":48,"context_line":"            \u0027items\u0027: {"},{"line_number":49,"context_line":"                \u0027type\u0027: \u0027string\u0027,"},{"line_number":50,"context_line":"                \u0027maxLength\u0027: 255,"},{"line_number":51,"context_line":"            },"},{"line_number":52,"context_line":"        },"},{"line_number":53,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHn%2F%2F%2F4I%3D","line":50,"in_reply_to":"AAAAHX%2F%2F2ao%3D","updated":"2012-05-30 09:20:56.000000000","message":"Not a biggie, we could for example limit the number of tags with some sanity threshold like 1024 in a later patch.","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"f2cbe9e3a1042c52f3c6da99fbacc731cc747aa1","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            \u0027description\u0027: \u0027List of strings related to the image\u0027,"},{"line_number":48,"context_line":"            \u0027items\u0027: {"},{"line_number":49,"context_line":"                \u0027type\u0027: \u0027string\u0027,"},{"line_number":50,"context_line":"                \u0027maxLength\u0027: 255,"},{"line_number":51,"context_line":"            },"},{"line_number":52,"context_line":"        },"},{"line_number":53,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F2ao%3D","line":50,"in_reply_to":"AAAAHX%2F%2F3CA%3D","updated":"2012-05-29 21:41:25.000000000","message":"I really don\u0027t want to, but I guess we could. What would you want to set it at?","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":616,"name":"Mark Washenberger","email":"mark.washenberger@markwash.net","username":"markwash"},"change_message_id":"6d94c7eed13ac7c5f596c41a63ea0cc0dd16c21a","unresolved":false,"context_lines":[{"line_number":60,"context_line":"          \u0027type\u0027: \u0027boolean\u0027,"},{"line_number":61,"context_line":"          \u0027description\u0027: \u0027Ability of tenant to share with others\u0027,"},{"line_number":62,"context_line":"          \u0027default\u0027: False,"},{"line_number":63,"context_line":"        },"},{"line_number":64,"context_line":"    },"},{"line_number":65,"context_line":"}"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F3W4%3D","line":63,"updated":"2012-05-25 21:34:48.000000000","message":"Should we add an explicit tags schema as well?","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"f2cbe9e3a1042c52f3c6da99fbacc731cc747aa1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"          \u0027type\u0027: \u0027boolean\u0027,"},{"line_number":61,"context_line":"          \u0027description\u0027: \u0027Ability of tenant to share with others\u0027,"},{"line_number":62,"context_line":"          \u0027default\u0027: False,"},{"line_number":63,"context_line":"        },"},{"line_number":64,"context_line":"    },"},{"line_number":65,"context_line":"}"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAHX%2F%2F2ak%3D","line":63,"in_reply_to":"AAAAHX%2F%2F3W4%3D","updated":"2012-05-29 21:41:25.000000000","message":"Yeah, I\u0027m going to have another patch that expands what schemas we offer: images container, access record container, etc.","commit_id":"a692d4883a5810443d5c39adef5e2f43852945c5"}],"glance/tests/functional/v2/test_images.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b33d4353f99d3e4a9cd97eaae4ca5dfefbefabff","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        self.assertEqual(200, response.status_code)"},{"line_number":453,"context_line":"        tags \u003d json.loads(response.text)[\u0027image\u0027][\u0027tags\u0027]"},{"line_number":454,"context_line":"        self.assertEqual([\u0027sniff\u0027, \u0027someone@example.com\u0027], tags)"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        # The tag should be deletable"},{"line_number":457,"context_line":"        path \u003d self._url(\u0027/images/%s/tags/someone%%40example.com\u0027 % image_id)"},{"line_number":458,"context_line":"        response \u003d requests.delete(path, headers\u003dself._headers())"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAHX%2F%2F6NU%3D","line":455,"updated":"2012-05-18 16:16:59.000000000","message":"Do we have a test for PUT /images/\u003cIMAGE_ID\u003e/tags? I see PUT /images/\u003cIMAGE_ID\u003e/tags/\u003cTAG\u003e, but not the update all operation...","commit_id":"cb4f5acc86cd7fd3b65064343623ca1b13f77200"},{"author":{"_account_id":1132,"name":"Brian Waldon","email":"brian@waldon.cc","username":"bcwaldon"},"change_message_id":"2a2a582c028ee4d39a70dc880d6eb67f7684937e","unresolved":false,"context_lines":[{"line_number":452,"context_line":"        self.assertEqual(200, response.status_code)"},{"line_number":453,"context_line":"        tags \u003d json.loads(response.text)[\u0027image\u0027][\u0027tags\u0027]"},{"line_number":454,"context_line":"        self.assertEqual([\u0027sniff\u0027, \u0027someone@example.com\u0027], tags)"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"        # The tag should be deletable"},{"line_number":457,"context_line":"        path \u003d self._url(\u0027/images/%s/tags/someone%%40example.com\u0027 % image_id)"},{"line_number":458,"context_line":"        response \u003d requests.delete(path, headers\u003dself._headers())"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAHX%2F%2F51c%3D","line":455,"in_reply_to":"AAAAHX%2F%2F6NU%3D","updated":"2012-05-21 03:21:32.000000000","message":"I\u0027ve elected to leave that call out of the spec for now. I want to get something functional then revisit what calls we actually *need* for tags. I want to keep duplication to a minimum while preserving atomicity. For example, I would prefer users to PUT and DELETE individual tags instead of acting on the containers to prevent collisions/conflicts with simultaneous calls.","commit_id":"cb4f5acc86cd7fd3b65064343623ca1b13f77200"}]}
