)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"91c21480b2ad4de925db89e2f02785e57030d9ff","unresolved":false,"context_lines":[{"line_number":10,"context_line":"on Neutron resources. This patch adds the function for \"network\""},{"line_number":11,"context_line":"resource with tags."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"APIImpact"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements: blueprint add-tags-to-core-resources"},{"line_number":16,"context_line":"Related-Bug: #1489291"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"dae33548_9a4a0125","line":13,"updated":"2016-02-17 03:34:16.000000000","message":"add DocImpact and a release note?","commit_id":"36755897201dddf3559d12aa9bf6b883a9f25d66"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"18ed0527607a1a120aa5ba76cfce64603a9053ee","unresolved":false,"context_lines":[{"line_number":10,"context_line":"on Neutron resources. This patch adds the function for \"network\""},{"line_number":11,"context_line":"resource with tags."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"APIImpact"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements: blueprint add-tags-to-core-resources"},{"line_number":16,"context_line":"Related-Bug: #1489291"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"dae33548_006160d3","line":13,"in_reply_to":"dae33548_9a4a0125","updated":"2016-02-17 05:07:47.000000000","message":"Done","commit_id":"36755897201dddf3559d12aa9bf6b883a9f25d66"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"26d485750d055d8adb68f9dea295a7dedd44a472","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Introduce a generic mechanism to allow the user to set tags"},{"line_number":10,"context_line":"on Neutron resources. This patch adds the function for \"network\""},{"line_number":11,"context_line":"resource with tags."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"APIImpact"},{"line_number":14,"context_line":"DocImpact: allow users to set tags on neutron resources"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"dae33548_70199e79","line":12,"updated":"2016-02-19 02:05:56.000000000","message":"Nit: it is better to mention that the API framework is enhanced to allow to register subresource to existing resources.","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c6e1c935fd65b3dc3e45fa2209cdea42b9320c5b","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Introduce a generic mechanism to allow the user to set tags"},{"line_number":10,"context_line":"on Neutron resources. This patch adds the function for \"network\""},{"line_number":11,"context_line":"resource with tags."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"APIImpact"},{"line_number":14,"context_line":"DocImpact: allow users to set tags on neutron resources"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"bae84128_e6eb3aaf","line":12,"in_reply_to":"dae33548_70199e79","updated":"2016-02-19 09:26:43.000000000","message":"There was the mechanism using subresouce so I used it. I updated about collection_method.","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"/resources/action\" path."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":"DocImpact: allow users to set tags on neutron resources"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Implements: blueprint add-tags-to-core-resources"},{"line_number":21,"context_line":"Related-Bug: #1489291"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"bae84128_20889870","line":18,"updated":"2016-02-24 05:30:24.000000000","message":"You said networks above. Do you intend to tackle all other resources in the context of this patch?","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"/resources/action\" path."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":"DocImpact: allow users to set tags on neutron resources"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Implements: blueprint add-tags-to-core-resources"},{"line_number":21,"context_line":"Related-Bug: #1489291"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"bae84128_9257ddc9","line":18,"in_reply_to":"bae84128_20889870","updated":"2016-02-25 10:52:07.000000000","message":"I mean Network only in this patch so I will update.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":"DocImpact: allow users to set tags on neutron resources"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Implements: blueprint add-tags-to-core-resources"},{"line_number":21,"context_line":"Related-Bug: #1489291"},{"line_number":22,"context_line":"Change-Id: I4d9e80d2c46d07fc22de8015eac4bd3dacf4c03a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"bae84128_80a40408","line":20,"updated":"2016-02-24 05:30:24.000000000","message":"Should this be Partial-Implements?","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":"DocImpact: allow users to set tags on neutron resources"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Implements: blueprint add-tags-to-core-resources"},{"line_number":21,"context_line":"Related-Bug: #1489291"},{"line_number":22,"context_line":"Change-Id: I4d9e80d2c46d07fc22de8015eac4bd3dacf4c03a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"bae84128_b26e6194","line":20,"in_reply_to":"bae84128_80a40408","updated":"2016-02-25 10:52:07.000000000","message":"Done","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"}],"doc/source/devref/tag.rst":[{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"change_message_id":"ec057a493715565cda5fd27459d585ddbde5e0be","unresolved":false,"context_lines":[{"line_number":80,"context_line":"Add a single tag on a network ::"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    PUT /v2.0/networks/{network_id}/tags/{tag}"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    GET /v2.0/networks/{network_id}/tags/{tag}"}],"source_content_type":"text/x-rst","patch_set":19,"id":"9aed3d3a_e6d4c648","line":83,"updated":"2016-02-26 00:15:56.000000000","message":"There is lack of description:\n\nReplace tags on a network ::\n    PUT /v2.0/networks/{network_id}/tags","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":80,"context_line":"Add a single tag on a network ::"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    PUT /v2.0/networks/{network_id}/tags/{tag}"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    GET /v2.0/networks/{network_id}/tags/{tag}"}],"source_content_type":"text/x-rst","patch_set":19,"id":"9aed3d3a_9b7003a6","line":83,"in_reply_to":"9aed3d3a_e6d4c648","updated":"2016-03-01 02:25:54.000000000","message":"Done","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Remove all tags on a network ::"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    DELETE /v2.0/networks/{network_id}/tags"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Tag is regarded as a subresource of resource so API always includes id of"},{"line_number":97,"context_line":"resource related to tag."}],"source_content_type":"text/x-rst","patch_set":19,"id":"9aed3d3a_f73bd69a","line":94,"range":{"start_line":94,"start_character":17,"end_line":94,"end_character":25},"updated":"2016-02-25 22:39:55.000000000","message":"That\u0027s why you need to extend resource model in parent change?","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"97d51ffc9fd2ac0461df4365863573f38628d5c6","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Remove all tags on a network ::"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    DELETE /v2.0/networks/{network_id}/tags"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Tag is regarded as a subresource of resource so API always includes id of"},{"line_number":97,"context_line":"resource related to tag."}],"source_content_type":"text/x-rst","patch_set":19,"id":"9aed3d3a_a1dd6c16","line":94,"range":{"start_line":94,"start_character":17,"end_line":94,"end_character":25},"in_reply_to":"9aed3d3a_86721a7b","updated":"2016-02-26 14:11:52.000000000","message":"As commented above, PUT and DELETE for collections are the motivation of extending the API framework.","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Remove all tags on a network ::"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    DELETE /v2.0/networks/{network_id}/tags"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Tag is regarded as a subresource of resource so API always includes id of"},{"line_number":97,"context_line":"resource related to tag."}],"source_content_type":"text/x-rst","patch_set":19,"id":"9aed3d3a_1be2332f","line":94,"range":{"start_line":94,"start_character":17,"end_line":94,"end_character":25},"in_reply_to":"9aed3d3a_a1dd6c16","updated":"2016-03-01 02:25:54.000000000","message":"Done","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"change_message_id":"ec057a493715565cda5fd27459d585ddbde5e0be","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Remove all tags on a network ::"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    DELETE /v2.0/networks/{network_id}/tags"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"Tag is regarded as a subresource of resource so API always includes id of"},{"line_number":97,"context_line":"resource related to tag."}],"source_content_type":"text/x-rst","patch_set":19,"id":"9aed3d3a_86721a7b","line":94,"range":{"start_line":94,"start_character":17,"end_line":94,"end_character":25},"in_reply_to":"9aed3d3a_f73bd69a","updated":"2016-02-26 00:15:56.000000000","message":"I think so. (and PUT /v2.0/networks/{network_id}/tags too)","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a44ab3f2a2bc904cb6a77100897bcbb9c06fda87","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Add a single tag on a network ::"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    PUT /v2.0/networks/{network_id}/tags/{tag}"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Replace set of tags on a network ::"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-rst","patch_set":21,"id":"9aed3d3a_33447bb5","line":83,"updated":"2016-03-01 05:08:39.000000000","message":"I think it is worth documented what we discussed in the -dev list.\nhttp://lists.openstack.org/pipermail/openstack-dev/2016-February/thread.html#87638","commit_id":"aa4a128ad19078dde136d83dbad27c9d5756cc57"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a44ab3f2a2bc904cb6a77100897bcbb9c06fda87","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    DELETE /v2.0/networks/{network_id}/tags"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"PUT and DELETE for collections are the motivation of extending the API"},{"line_number":114,"context_line":"framework."}],"source_content_type":"text/x-rst","patch_set":21,"id":"9aed3d3a_733283a8","line":114,"range":{"start_line":113,"start_character":53,"end_line":114,"end_character":9},"updated":"2016-03-01 05:08:39.000000000","message":"If we keep this sentence, it is better to mention which change extends the API framework. I think the change-id or the review URL is good.","commit_id":"aa4a128ad19078dde136d83dbad27c9d5756cc57"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"dce15138d76a2a9df69c1359d4eda14ef4ae4de0","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    PUT /v2.0/networks/{network_id}/tags/{tag}"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Returns `201 Created`. If If the tag already exists, no error is raised, it"},{"line_number":86,"context_line":"just returns the `201 Created` because the `OpenStack Development Mailing List"},{"line_number":87,"context_line":"\u003chttp://lists.openstack.org/pipermail/openstack-dev/2016-February/087638.html\u003e`_"},{"line_number":88,"context_line":"discussion told us that PUT should be no issue updating an existing tag."}],"source_content_type":"text/x-rst","patch_set":22,"id":"9aed3d3a_75538317","line":85,"range":{"start_line":85,"start_character":23,"end_line":85,"end_character":28},"updated":"2016-03-01 07:51:21.000000000","message":"duplicated \u0027If\u0027","commit_id":"f1de43a53c8d6d6319c7a98a0186af4145855d81"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"3c67d4ad4262b18d94fe434187a87b2a7decf7fc","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    PUT /v2.0/networks/{network_id}/tags/{tag}"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Returns `201 Created`. If If the tag already exists, no error is raised, it"},{"line_number":86,"context_line":"just returns the `201 Created` because the `OpenStack Development Mailing List"},{"line_number":87,"context_line":"\u003chttp://lists.openstack.org/pipermail/openstack-dev/2016-February/087638.html\u003e`_"},{"line_number":88,"context_line":"discussion told us that PUT should be no issue updating an existing tag."}],"source_content_type":"text/x-rst","patch_set":22,"id":"9aed3d3a_95d60726","line":85,"range":{"start_line":85,"start_character":23,"end_line":85,"end_character":28},"in_reply_to":"9aed3d3a_75538317","updated":"2016-03-01 07:56:02.000000000","message":"oops ;)","commit_id":"f1de43a53c8d6d6319c7a98a0186af4145855d81"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"244fbb1ac16c6cba07ac0b308ffa76885151ebe9","unresolved":false,"context_lines":[{"line_number":21,"context_line":"      (Avoid deeper levels because they do not render well.)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Add Tags to Neutron Resources"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Tag service plugin allows users to set tags on their resources. Tagging"}],"source_content_type":"text/x-rst","patch_set":24,"id":"7af24918_a827cd62","line":24,"updated":"2016-03-02 17:37:38.000000000","message":"This is good. I suppose we can expand the content in due course.","commit_id":"ec1457dd7503626c917031ce4a16a366fe70c7bb"}],"neutron/api/extensions.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"26d485750d055d8adb68f9dea295a7dedd44a472","unresolved":false,"context_lines":[{"line_number":283,"context_line":"                                      path_prefix\u003dpath_prefix,"},{"line_number":284,"context_line":"                                      conditions\u003dconditions) as submap:"},{"line_number":285,"context_line":"                    submap.connect(path)"},{"line_number":286,"context_line":"                    submap.connect(\"%s.:(format)\" % path)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"            mapper.resource(resource.collection, resource.collection,"},{"line_number":289,"context_line":"                            controller\u003dresource.controller,"}],"source_content_type":"text/x-python","patch_set":13,"id":"dae33548_f05ace29","line":286,"updated":"2016-02-19 02:05:56.000000000","message":"If there is a corresponding UT class,, it is better to add a corresponding unit tests. I don\u0027t think it is a requirement as most tests cover the logic.","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c6e1c935fd65b3dc3e45fa2209cdea42b9320c5b","unresolved":false,"context_lines":[{"line_number":283,"context_line":"                                      path_prefix\u003dpath_prefix,"},{"line_number":284,"context_line":"                                      conditions\u003dconditions) as submap:"},{"line_number":285,"context_line":"                    submap.connect(path)"},{"line_number":286,"context_line":"                    submap.connect(\"%s.:(format)\" % path)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"            mapper.resource(resource.collection, resource.collection,"},{"line_number":289,"context_line":"                            controller\u003dresource.controller,"}],"source_content_type":"text/x-python","patch_set":13,"id":"bae84128_66d8ca1e","line":286,"in_reply_to":"dae33548_f05ace29","updated":"2016-02-19 09:26:43.000000000","message":"Done","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"}],"neutron/api/v2/resource.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    default_deserializers \u003d {\u0027application/json\u0027: wsgi.JSONDeserializer()}"},{"line_number":48,"context_line":"    default_serializers \u003d {\u0027application/json\u0027: wsgi.JSONDictSerializer()}"},{"line_number":49,"context_line":"    format_types \u003d {\u0027json\u0027: \u0027application/json\u0027}"},{"line_number":50,"context_line":"    action_status \u003d action_status or dict(create\u003d201, delete\u003d204)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    default_deserializers.update(deserializers or {})"},{"line_number":53,"context_line":"    default_serializers.update(serializers or {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_a06b081d","line":50,"updated":"2016-02-24 05:30:24.000000000","message":"I would personally extract all the changes to the API framework made up until this file and move them into a separate patch which explains one by one what they do. I\u0027d also make sure these are thoroughly tested (test_extensions.py additions you made should suffice).\n\nThat way, it\u0027s easier to get more trained eyes on the patch. Especially Salv\u0027s who is the goto guy in this sort of area.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    default_deserializers \u003d {\u0027application/json\u0027: wsgi.JSONDeserializer()}"},{"line_number":48,"context_line":"    default_serializers \u003d {\u0027application/json\u0027: wsgi.JSONDictSerializer()}"},{"line_number":49,"context_line":"    format_types \u003d {\u0027json\u0027: \u0027application/json\u0027}"},{"line_number":50,"context_line":"    action_status \u003d action_status or dict(create\u003d201, delete\u003d204)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    default_deserializers.update(deserializers or {})"},{"line_number":53,"context_line":"    default_serializers.update(serializers or {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_42ed9224","line":50,"in_reply_to":"bae84128_8e7a7522","updated":"2016-02-25 10:52:07.000000000","message":"make sense. Done","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e20343352d64c8f5fae72507ae5da894e44c848","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    default_deserializers \u003d {\u0027application/json\u0027: wsgi.JSONDeserializer()}"},{"line_number":48,"context_line":"    default_serializers \u003d {\u0027application/json\u0027: wsgi.JSONDictSerializer()}"},{"line_number":49,"context_line":"    format_types \u003d {\u0027json\u0027: \u0027application/json\u0027}"},{"line_number":50,"context_line":"    action_status \u003d action_status or dict(create\u003d201, delete\u003d204)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    default_deserializers.update(deserializers or {})"},{"line_number":53,"context_line":"    default_serializers.update(serializers or {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_8e7a7522","line":50,"in_reply_to":"bae84128_a06b081d","updated":"2016-02-24 06:18:14.000000000","message":"Agree.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"}],"neutron/db/migration/alembic_migrations/versions/mitaka/expand/2f9e956e7532_tag_support.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":31,"context_line":"def upgrade():"},{"line_number":32,"context_line":"    op.create_table("},{"line_number":33,"context_line":"        \u0027tags\u0027,"},{"line_number":34,"context_line":"        sa.Column(\u0027standard_attr_id\u0027, sa.BigInteger(),"},{"line_number":35,"context_line":"                  sa.ForeignKey(\u0027standardattributes.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":36,"context_line":"                  nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":37,"context_line":"        sa.Column(\u0027tag\u0027, sa.String(length\u003d60), nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_e317da42","line":34,"updated":"2016-02-24 05:30:24.000000000","message":"I am having second thoughts about this model: the conceptual relationship you\u0027re modeling here is N-M, meaning that the same resource can have many different tags, and that the same tag can be applied to the different resources. So entries like these are valid:\n\n network_1, foo_1\n network_2, foo_1\n network_2, foo_2\n\nFinally a tag is uniquely identified by its name. I think this is good. However, when I looked at the client side patch, and looking at the spec, it seems that the tag-create/delete api are not actually creating/deleting tags, but associations instead. In other words, it doesn\u0027t look like a tag is an entity on its own.\n\nI am okay with this model, but it means that if we intend to provide way to \u0027delete\u0027 an individual tag some more work needs to go in the business logic to make this happen. It also means that the existence of a tag cannot be in the absence of a resource, i.e. I can\u0027t simply create a tag and associate to resources in a second times.\n\nLet\u0027s make sure we document these either via devref or code comments and that we\u0027re all in agreement that this is acceptable way to go about it.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"def upgrade():"},{"line_number":32,"context_line":"    op.create_table("},{"line_number":33,"context_line":"        \u0027tags\u0027,"},{"line_number":34,"context_line":"        sa.Column(\u0027standard_attr_id\u0027, sa.BigInteger(),"},{"line_number":35,"context_line":"                  sa.ForeignKey(\u0027standardattributes.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":36,"context_line":"                  nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":37,"context_line":"        sa.Column(\u0027tag\u0027, sa.String(length\u003d60), nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_bf5ab74e","line":34,"in_reply_to":"bae84128_6940cb07","updated":"2016-02-25 10:52:07.000000000","message":"I can understand. It\u0027s difficult that we completely fit current tag model to existing model. Howevr, I believe that api-wg spec excepted current model and Nova as well. As Oda said, current model is simple enough to achieve the requirements for other projects(e.g. Kuryr).","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1dcf5269c71b24bea53e0bda76a56074a9e7ce60","unresolved":false,"context_lines":[{"line_number":31,"context_line":"def upgrade():"},{"line_number":32,"context_line":"    op.create_table("},{"line_number":33,"context_line":"        \u0027tags\u0027,"},{"line_number":34,"context_line":"        sa.Column(\u0027standard_attr_id\u0027, sa.BigInteger(),"},{"line_number":35,"context_line":"                  sa.ForeignKey(\u0027standardattributes.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":36,"context_line":"                  nullable\u003dFalse, primary_key\u003dTrue),"},{"line_number":37,"context_line":"        sa.Column(\u0027tag\u0027, sa.String(length\u003d60), nullable\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_6940cb07","line":34,"in_reply_to":"bae84128_e317da42","updated":"2016-02-24 06:50:38.000000000","message":"I agree that relationship between tag and resource is N-M in the concept.\n\nA question is whether we have a tag as a top resource. There are options:\n\n- to keep the current model.\n- to have \u0027tags\u0027 and \u0027tag-associations\u0027 tables. \u0027tags\u0027 table just keeps a tag name.\n\nThe latter approach makes simpler to delete some tag from all resources. We can create a tag without a resource.\n\nAnother question is whether a tag is common among all resource types or specific to one resource type (like network). I am not sure which is more common usage.\n\nIn my understanding, the tag mechanism is used two purpose: to add various information to a single resource, and to group resources by tag. For the first purpose, the current model is enough.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"}],"neutron/db/model_base.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"26d485750d055d8adb68f9dea295a7dedd44a472","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    # limit with our table names..."},{"line_number":109,"context_line":"    resource_type \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    tags \u003d orm.relationship(\u0027Tag\u0027, lazy\u003d\u0027joined\u0027, viewonly\u003dTrue)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"class HasStandardAttributes(object):"}],"source_content_type":"text/x-python","patch_set":13,"id":"dae33548_827a2fbb","line":111,"updated":"2016-02-19 02:05:56.000000000","message":"Why do you need to have this here?\nCannot we place it in a separate file like db/tag.py\n\nCan we move it to Tag table definition and use \u0027backref\u0027?","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c6e1c935fd65b3dc3e45fa2209cdea42b9320c5b","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    # limit with our table names..."},{"line_number":109,"context_line":"    resource_type \u003d sa.Column(sa.String(255), nullable\u003dFalse)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    tags \u003d orm.relationship(\u0027Tag\u0027, lazy\u003d\u0027joined\u0027, viewonly\u003dTrue)"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"class HasStandardAttributes(object):"}],"source_content_type":"text/x-python","patch_set":13,"id":"bae84128_a6081293","line":111,"in_reply_to":"dae33548_827a2fbb","updated":"2016-02-19 09:26:43.000000000","message":"Done","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"}],"neutron/db/tag_db.py":[{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"change_message_id":"d7551bd9b2452ca50de4b780ae0c46521e06076a","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    `not-tags` -- One or more strings that will be used to filter results"},{"line_number":57,"context_line":"            in a NOT AND expression: NOT (T1 AND T2)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    `tags-any` -- One or more strings that will be used to filter results in"},{"line_number":60,"context_line":"            a NOT OR expression: NOT (T1 OR T2)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    Note: tag values can be specified comma separated string."}],"source_content_type":"text/x-python","patch_set":5,"id":"5a5ae5dd_6e3e43ba","line":59,"updated":"2016-02-03 00:43:13.000000000","message":"not-tags-any","commit_id":"65eff1ccc82690f59a973ecaff2e91d7cb60aa24"}],"neutron/extensions/tag.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"26d485750d055d8adb68f9dea295a7dedd44a472","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    def get_resources(cls):"},{"line_number":154,"context_line":"        \"\"\"Returns Ext Resources.\"\"\""},{"line_number":155,"context_line":"        exts \u003d []"},{"line_number":156,"context_line":"        action_status \u003d dict(index\u003d200, show\u003d204, update\u003d201, update_all\u003d200,"},{"line_number":157,"context_line":"                             delete\u003d204, delete_all\u003d204)"},{"line_number":158,"context_line":"        controller \u003d api_resource.Resource(TagController(),"},{"line_number":159,"context_line":"                                           base.FAULT_MAP,"},{"line_number":160,"context_line":"                                           action_status\u003daction_status)"}],"source_content_type":"text/x-python","patch_set":13,"id":"dae33548_1543e46d","line":157,"range":{"start_line":156,"start_character":24,"end_line":157,"end_character":56},"updated":"2016-02-19 02:05:56.000000000","message":"nit: we usually use {\u0027index\u0027: 200, ....} style.","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c6e1c935fd65b3dc3e45fa2209cdea42b9320c5b","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    def get_resources(cls):"},{"line_number":154,"context_line":"        \"\"\"Returns Ext Resources.\"\"\""},{"line_number":155,"context_line":"        exts \u003d []"},{"line_number":156,"context_line":"        action_status \u003d dict(index\u003d200, show\u003d204, update\u003d201, update_all\u003d200,"},{"line_number":157,"context_line":"                             delete\u003d204, delete_all\u003d204)"},{"line_number":158,"context_line":"        controller \u003d api_resource.Resource(TagController(),"},{"line_number":159,"context_line":"                                           base.FAULT_MAP,"},{"line_number":160,"context_line":"                                           action_status\u003daction_status)"}],"source_content_type":"text/x-python","patch_set":13,"id":"bae84128_26f52283","line":157,"range":{"start_line":156,"start_character":24,"end_line":157,"end_character":56},"in_reply_to":"dae33548_1543e46d","updated":"2016-02-19 09:26:43.000000000","message":"Done","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"26d485750d055d8adb68f9dea295a7dedd44a472","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                              \"update_all\": \"PUT\"}"},{"line_number":163,"context_line":"        exts \u003d []"},{"line_number":164,"context_line":"        for collection_name, member_name in TAG_SUPPORTED_RESOURCES.items():"},{"line_number":165,"context_line":"            parent \u003d dict(member_name\u003dmember_name,"},{"line_number":166,"context_line":"                          collection_name\u003dcollection_name)"},{"line_number":167,"context_line":"            exts.append(extensions.ResourceExtension("},{"line_number":168,"context_line":"                TAGS, controller, parent,"},{"line_number":169,"context_line":"                collection_methods\u003dcollection_methods))"}],"source_content_type":"text/x-python","patch_set":13,"id":"dae33548_d52fbca5","line":166,"range":{"start_line":165,"start_character":21,"end_line":166,"end_character":58},"updated":"2016-02-19 02:05:56.000000000","message":"nit: {...} style is preferred.","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c6e1c935fd65b3dc3e45fa2209cdea42b9320c5b","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                              \"update_all\": \"PUT\"}"},{"line_number":163,"context_line":"        exts \u003d []"},{"line_number":164,"context_line":"        for collection_name, member_name in TAG_SUPPORTED_RESOURCES.items():"},{"line_number":165,"context_line":"            parent \u003d dict(member_name\u003dmember_name,"},{"line_number":166,"context_line":"                          collection_name\u003dcollection_name)"},{"line_number":167,"context_line":"            exts.append(extensions.ResourceExtension("},{"line_number":168,"context_line":"                TAGS, controller, parent,"},{"line_number":169,"context_line":"                collection_methods\u003dcollection_methods))"}],"source_content_type":"text/x-python","patch_set":13,"id":"bae84128_66ef2ab1","line":166,"range":{"start_line":165,"start_character":21,"end_line":166,"end_character":58},"in_reply_to":"dae33548_d52fbca5","updated":"2016-02-19 09:26:43.000000000","message":"Done","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"TAG_SUPPORTED_RESOURCES \u003d {"},{"line_number":39,"context_line":"    attributes.NETWORKS: attributes.NETWORK,"},{"line_number":40,"context_line":"    # other resources can be added"},{"line_number":41,"context_line":"}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"TAG_ATTRIBUTE_MAP \u003d {"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_e38a3a63","line":40,"updated":"2016-02-24 05:30:24.000000000","message":"why are you explicitly leaving them out? I\u0027d add all the ones that make use standardattr. Kevin and I are trying to resolve some quirks of this during the context of [1], so you may want to keep an eye on it.\n\n[1] https://review.openstack.org/#/c/269887/","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"TAG_SUPPORTED_RESOURCES \u003d {"},{"line_number":39,"context_line":"    attributes.NETWORKS: attributes.NETWORK,"},{"line_number":40,"context_line":"    # other resources can be added"},{"line_number":41,"context_line":"}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"TAG_ATTRIBUTE_MAP \u003d {"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_02170aee","line":40,"in_reply_to":"bae84128_e38a3a63","updated":"2016-02-25 10:52:07.000000000","message":"Indeed, it\u0027s easy. However, they\u0027re not defined in spec and I\u0027d like to give priority to put it on Mitaka safety. I will propose it on a separate patch.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class TagExists(exceptions.Conflict):"},{"line_number":57,"context_line":"    message \u003d _(\"Tag %(tag)s already exists.\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class TagLimitExceeded(exceptions.BadRequest):"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_e3e19a2b","line":57,"updated":"2016-02-24 05:30:24.000000000","message":"Actually this would be more accurate if it said \u0027exists on resource \"id\"\u0027, or am I barking up at the wrong tree?","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class TagExists(exceptions.Conflict):"},{"line_number":57,"context_line":"    message \u003d _(\"Tag %(tag)s already exists.\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class TagLimitExceeded(exceptions.BadRequest):"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_850de439","line":57,"in_reply_to":"bae84128_e3e19a2b","updated":"2016-02-25 10:52:07.000000000","message":"You\u0027re right.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e20343352d64c8f5fae72507ae5da894e44c848","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    message \u003d _(\"Tag %(tag)s already exists.\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class TagLimitExceeded(exceptions.BadRequest):"},{"line_number":61,"context_line":"    message \u003d _(\"Tag limit exceeded.\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_eef18196","line":60,"range":{"start_line":60,"start_character":23,"end_line":60,"end_character":44},"updated":"2016-02-24 06:18:14.000000000","message":"When a user exceeds a quota, 409 is returned.\nIt is a similar situation to over quota. 409 looks good.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    message \u003d _(\"Tag %(tag)s already exists.\")"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class TagLimitExceeded(exceptions.BadRequest):"},{"line_number":61,"context_line":"    message \u003d _(\"Tag limit exceeded.\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_42f2b270","line":60,"range":{"start_line":60,"start_character":23,"end_line":60,"end_character":44},"in_reply_to":"bae84128_eef18196","updated":"2016-02-25 10:52:07.000000000","message":"I got it.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class TagLimitExceeded(exceptions.BadRequest):"},{"line_number":61,"context_line":"    message \u003d _(\"Tag limit exceeded.\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def get_parent_resource_and_id(kwargs):"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_63cc6abb","line":61,"updated":"2016-02-24 05:30:24.000000000","message":"what\u0027s the limit?","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e20343352d64c8f5fae72507ae5da894e44c848","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class TagLimitExceeded(exceptions.BadRequest):"},{"line_number":61,"context_line":"    message \u003d _(\"Tag limit exceeded.\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def get_parent_resource_and_id(kwargs):"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_8ecf1555","line":61,"in_reply_to":"bae84128_63cc6abb","updated":"2016-02-24 06:18:14.000000000","message":"I think it should be \"The maximum number of tags per resource exceeded\".","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class TagLimitExceeded(exceptions.BadRequest):"},{"line_number":61,"context_line":"    message \u003d _(\"Tag limit exceeded.\")"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def get_parent_resource_and_id(kwargs):"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_e201463b","line":61,"in_reply_to":"bae84128_8ecf1555","updated":"2016-02-25 10:52:07.000000000","message":"I got it.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"tag_opts \u003d ["},{"line_number":89,"context_line":"    cfg.IntOpt(\u0027max_tags_per_resource\u0027, default\u003d5,"},{"line_number":90,"context_line":"               help\u003d_(\u0027Number of tags allowed per resource.\u0027))"},{"line_number":91,"context_line":"]"},{"line_number":92,"context_line":"cfg.CONF.register_opts(tag_opts, \"tag\")"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_6343ca13","line":89,"updated":"2016-02-24 05:30:24.000000000","message":"isn\u0027t that kinda small? I\u0027d have no limits and avoid the complication of this setting.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"tag_opts \u003d ["},{"line_number":89,"context_line":"    cfg.IntOpt(\u0027max_tags_per_resource\u0027, default\u003d5,"},{"line_number":90,"context_line":"               help\u003d_(\u0027Number of tags allowed per resource.\u0027))"},{"line_number":91,"context_line":"]"},{"line_number":92,"context_line":"cfg.CONF.register_opts(tag_opts, \"tag\")"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_42c0f2e0","line":89,"in_reply_to":"bae84128_6343ca13","updated":"2016-02-25 10:52:07.000000000","message":"You\u0027re right. I had to parepare unlimited default.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        return \"2016-01-01T00:00:00-00:00\""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @classmethod"},{"line_number":165,"context_line":"    def get_resources(cls):"},{"line_number":166,"context_line":"        \"\"\"Returns Ext Resources.\"\"\""},{"line_number":167,"context_line":"        exts \u003d []"},{"line_number":168,"context_line":"        action_status \u003d {\u0027index\u0027: 200, \u0027show\u0027: 204, \u0027update\u0027: 201,"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_e366bab9","line":165,"updated":"2016-02-24 05:30:24.000000000","message":"this needs a get_required_extensions as soon as we add support to other than networks.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        return \"2016-01-01T00:00:00-00:00\""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @classmethod"},{"line_number":165,"context_line":"    def get_resources(cls):"},{"line_number":166,"context_line":"        \"\"\"Returns Ext Resources.\"\"\""},{"line_number":167,"context_line":"        exts \u003d []"},{"line_number":168,"context_line":"        action_status \u003d {\u0027index\u0027: 200, \u0027show\u0027: 204, \u0027update\u0027: 201,"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_a26c5e09","line":165,"in_reply_to":"bae84128_e366bab9","updated":"2016-02-25 10:52:07.000000000","message":"Yes.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        pass"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    @abc.abstractmethod"},{"line_number":224,"context_line":"    def delete_tag(self, context, resource, resource_id, tag):"},{"line_number":225,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_83252e5d","line":224,"updated":"2016-02-24 05:30:24.000000000","message":"see my previous comment: should we consider enrich the semantic of this API (that as of now it\u0027s really a disassociation operation - i.e. deletes the association rather than the tag itself, which may still be applied to other resources)","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        pass"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    @abc.abstractmethod"},{"line_number":224,"context_line":"    def delete_tag(self, context, resource, resource_id, tag):"},{"line_number":225,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_82483a89","line":224,"in_reply_to":"bae84128_83252e5d","updated":"2016-02-25 10:52:07.000000000","message":"The method really deletes tag itself(the record) although I may misunderstand your point.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    message \u003d _(\"Tag %(tag)s could not be found.\")"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class TagExists(exceptions.Conflict):"},{"line_number":56,"context_line":"    message \u003d _(\"Tag %(tag)s already exists on the resource %(resource_id)s.\")"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_fa09fbde","line":55,"range":{"start_line":55,"start_character":27,"end_line":55,"end_character":35},"updated":"2016-02-25 22:39:55.000000000","message":"Why conflict? tag doesn\u0027t support POST only PUT so we should return 1XX if the tag already exists","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    message \u003d _(\"Tag %(tag)s could not be found.\")"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class TagExists(exceptions.Conflict):"},{"line_number":56,"context_line":"    message \u003d _(\"Tag %(tag)s already exists on the resource %(resource_id)s.\")"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_7b637f42","line":55,"range":{"start_line":55,"start_character":27,"end_line":55,"end_character":35},"in_reply_to":"9aed3d3a_a0e27d01","updated":"2016-03-01 02:25:54.000000000","message":"I removed this class because I followed the mail.","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"97d51ffc9fd2ac0461df4365863573f38628d5c6","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    message \u003d _(\"Tag %(tag)s could not be found.\")"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"class TagExists(exceptions.Conflict):"},{"line_number":56,"context_line":"    message \u003d _(\"Tag %(tag)s already exists on the resource %(resource_id)s.\")"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_a0e27d01","line":55,"range":{"start_line":55,"start_character":27,"end_line":55,"end_character":35},"in_reply_to":"9aed3d3a_fa09fbde","updated":"2016-02-26 14:11:52.000000000","message":"In the current implementation, this exception is raised when a requested tag already exists on a given resource.\nWe are following the guideline from API-WG, but this case is not defined. I just sent a mail to -dev list.","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    try:"},{"line_number":75,"context_line":"        tags \u003d body[\u0027tags\u0027]"},{"line_number":76,"context_line":"        msg \u003d attributes.validate_list_of_unique_strings(tags, MAX_TAG_LEN)"},{"line_number":77,"context_line":"    except KeyError:"},{"line_number":78,"context_line":"        msg \u003d _(\"Invalid tags body.\")"},{"line_number":79,"context_line":"    if msg:"},{"line_number":80,"context_line":"        raise exceptions.InvalidInput(error_message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_77f6a6d8","line":77,"range":{"start_line":77,"start_character":11,"end_line":77,"end_character":19},"updated":"2016-02-25 22:39:55.000000000","message":"KeyError can be raised only in line 75?\n\nLine 75 can also raise a TypeError?","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    try:"},{"line_number":75,"context_line":"        tags \u003d body[\u0027tags\u0027]"},{"line_number":76,"context_line":"        msg \u003d attributes.validate_list_of_unique_strings(tags, MAX_TAG_LEN)"},{"line_number":77,"context_line":"    except KeyError:"},{"line_number":78,"context_line":"        msg \u003d _(\"Invalid tags body.\")"},{"line_number":79,"context_line":"    if msg:"},{"line_number":80,"context_line":"        raise exceptions.InvalidInput(error_message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_b06c0609","line":77,"range":{"start_line":77,"start_character":11,"end_line":77,"end_character":19},"in_reply_to":"9aed3d3a_22695abf","updated":"2016-03-01 02:25:54.000000000","message":"Done","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"97d51ffc9fd2ac0461df4365863573f38628d5c6","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    try:"},{"line_number":75,"context_line":"        tags \u003d body[\u0027tags\u0027]"},{"line_number":76,"context_line":"        msg \u003d attributes.validate_list_of_unique_strings(tags, MAX_TAG_LEN)"},{"line_number":77,"context_line":"    except KeyError:"},{"line_number":78,"context_line":"        msg \u003d _(\"Invalid tags body.\")"},{"line_number":79,"context_line":"    if msg:"},{"line_number":80,"context_line":"        raise exceptions.InvalidInput(error_message\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_22695abf","line":77,"range":{"start_line":77,"start_character":11,"end_line":77,"end_character":19},"in_reply_to":"9aed3d3a_77f6a6d8","updated":"2016-02-26 14:11:52.000000000","message":"If KeyError comes only from L.75,except should be placed before L.76\n\n  if \u0027tags\u0027 not in body:\n      raise exceptions.InvalidInput(error_message\u003d\"Invalid tags body\")\n  msg \u003d attributes.validate_list_of_unique_strings(...)","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"}],"neutron/plugins/common/constants.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"91c21480b2ad4de925db89e2f02785e57030d9ff","unresolved":false,"context_lines":[{"line_number":24,"context_line":"L3_ROUTER_NAT \u003d \"L3_ROUTER_NAT\""},{"line_number":25,"context_line":"FLAVORS \u003d \"FLAVORS\""},{"line_number":26,"context_line":"QOS \u003d \"QOS\""},{"line_number":27,"context_line":"TAG \u003d \"TAG\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# Maps extension alias to service type that"},{"line_number":30,"context_line":"# can be implemented by the core plugin."}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_3ad2d55c","line":27,"updated":"2016-02-17 03:34:16.000000000","message":"changes to this file can be reverted.","commit_id":"36755897201dddf3559d12aa9bf6b883a9f25d66"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"18ed0527607a1a120aa5ba76cfce64603a9053ee","unresolved":false,"context_lines":[{"line_number":24,"context_line":"L3_ROUTER_NAT \u003d \"L3_ROUTER_NAT\""},{"line_number":25,"context_line":"FLAVORS \u003d \"FLAVORS\""},{"line_number":26,"context_line":"QOS \u003d \"QOS\""},{"line_number":27,"context_line":"TAG \u003d \"TAG\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"# Maps extension alias to service type that"},{"line_number":30,"context_line":"# can be implemented by the core plugin."}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_20a2a4fd","line":27,"in_reply_to":"dae33548_3ad2d55c","updated":"2016-02-17 05:07:47.000000000","message":"Done","commit_id":"36755897201dddf3559d12aa9bf6b883a9f25d66"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"91c21480b2ad4de925db89e2f02785e57030d9ff","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \u0027metering\u0027: METERING,"},{"line_number":38,"context_line":"    \u0027router\u0027: L3_ROUTER_NAT,"},{"line_number":39,"context_line":"    \u0027qos\u0027: QOS,"},{"line_number":40,"context_line":"    \u0027tag\u0027: TAG,"},{"line_number":41,"context_line":"}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Maps default service plugins entry points to their extension aliases"}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_dae2c92e","line":40,"updated":"2016-02-17 03:34:16.000000000","message":"this is not needed here.","commit_id":"36755897201dddf3559d12aa9bf6b883a9f25d66"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"18ed0527607a1a120aa5ba76cfce64603a9053ee","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \u0027metering\u0027: METERING,"},{"line_number":38,"context_line":"    \u0027router\u0027: L3_ROUTER_NAT,"},{"line_number":39,"context_line":"    \u0027qos\u0027: QOS,"},{"line_number":40,"context_line":"    \u0027tag\u0027: TAG,"},{"line_number":41,"context_line":"}"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Maps default service plugins entry points to their extension aliases"}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_80a3b0ff","line":40,"in_reply_to":"dae33548_dae2c92e","updated":"2016-02-17 05:07:47.000000000","message":"Done","commit_id":"36755897201dddf3559d12aa9bf6b883a9f25d66"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"91c21480b2ad4de925db89e2f02785e57030d9ff","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Maps default service plugins entry points to their extension aliases"},{"line_number":44,"context_line":"DEFAULT_SERVICE_PLUGINS \u003d {"},{"line_number":45,"context_line":"    \u0027auto_allocate\u0027: \u0027auto-allocated-topology\u0027,"},{"line_number":46,"context_line":"}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_dab92917","line":45,"updated":"2016-02-17 03:34:16.000000000","message":"you may want to add your service plugin here for automatic loading.","commit_id":"36755897201dddf3559d12aa9bf6b883a9f25d66"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"18ed0527607a1a120aa5ba76cfce64603a9053ee","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Maps default service plugins entry points to their extension aliases"},{"line_number":44,"context_line":"DEFAULT_SERVICE_PLUGINS \u003d {"},{"line_number":45,"context_line":"    \u0027auto_allocate\u0027: \u0027auto-allocated-topology\u0027,"},{"line_number":46,"context_line":"}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"# Service operation status constants"}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_a0951488","line":45,"in_reply_to":"dae33548_dab92917","updated":"2016-02-17 05:07:47.000000000","message":"Cool. I didn\u0027t know this function. Done.","commit_id":"36755897201dddf3559d12aa9bf6b883a9f25d66"}],"neutron/services/tag/tag_plugin.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"26d485750d055d8adb68f9dea295a7dedd44a472","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from oslo_log import helpers as log_helpers"},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from sqlalchemy.orm import exc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutron.api.v2 import attributes"}],"source_content_type":"text/x-python","patch_set":13,"id":"dae33548_8476a804","line":17,"updated":"2016-02-19 02:05:56.000000000","message":"This blank line looks unnecessary","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c6e1c935fd65b3dc3e45fa2209cdea42b9320c5b","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from oslo_log import helpers as log_helpers"},{"line_number":16,"context_line":"from oslo_log import log as logging"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from sqlalchemy.orm import exc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutron.api.v2 import attributes"}],"source_content_type":"text/x-python","patch_set":13,"id":"bae84128_e6397a43","line":17,"in_reply_to":"dae33548_8476a804","updated":"2016-02-19 09:26:43.000000000","message":"Done","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def update_tags(self, context, resource, resource_id, body):"},{"line_number":76,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":77,"context_line":"        new_tags \u003d set(body[\u0027tags\u0027])"},{"line_number":78,"context_line":"        if len(new_tags) \u003e cfg.CONF.tag.max_tags_per_resource:"},{"line_number":79,"context_line":"            raise tag_ext.TagLimitExceeded()"},{"line_number":80,"context_line":"        old_tags \u003d {tag_db.tag for tag_db in res.standard_attr.tags}"},{"line_number":81,"context_line":"        tags_added \u003d new_tags - old_tags"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_23d9c257","line":78,"updated":"2016-02-24 05:30:24.000000000","message":"I\u0027d get rid of this failure mode. I see no good reason to artificially limit the number of tags and it\u0027s not like we\u0027re gonna have a gazillion tags on a resource either :)","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    def update_tags(self, context, resource, resource_id, body):"},{"line_number":76,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":77,"context_line":"        new_tags \u003d set(body[\u0027tags\u0027])"},{"line_number":78,"context_line":"        if len(new_tags) \u003e cfg.CONF.tag.max_tags_per_resource:"},{"line_number":79,"context_line":"            raise tag_ext.TagLimitExceeded()"},{"line_number":80,"context_line":"        old_tags \u003d {tag_db.tag for tag_db in res.standard_attr.tags}"},{"line_number":81,"context_line":"        tags_added \u003d new_tags - old_tags"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_42cbd21e","line":78,"in_reply_to":"bae84128_23d9c257","updated":"2016-02-25 10:52:07.000000000","message":"It just follows api-wg and neutron tag spec. I will give it on a separate patch and let\u0027s discuss on the patch.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                                              resource_id\u003dresource_id)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _get_resource_tag(self, context, resource, resource_id, tag):"},{"line_number":54,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":55,"context_line":"        query \u003d context.session.query(tag_model.Tag)"},{"line_number":56,"context_line":"        query \u003d query.filter_by(tag\u003dtag,"},{"line_number":57,"context_line":"                                standard_attr_id\u003dres.standard_attr_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_5acaa7a2","line":54,"updated":"2016-02-25 22:39:55.000000000","message":"why not joining tables Tag and resource to avoid extra db queries","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                                              resource_id\u003dresource_id)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _get_resource_tag(self, context, resource, resource_id, tag):"},{"line_number":54,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":55,"context_line":"        query \u003d context.session.query(tag_model.Tag)"},{"line_number":56,"context_line":"        query \u003d query.filter_by(tag\u003dtag,"},{"line_number":57,"context_line":"                                standard_attr_id\u003dres.standard_attr_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_3b93b7fb","line":54,"in_reply_to":"9aed3d3a_5acaa7a2","updated":"2016-03-01 02:25:54.000000000","message":"I removed this class.","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        query \u003d query.filter_by(tag\u003dtag,"},{"line_number":57,"context_line":"                                standard_attr_id\u003dres.standard_attr_id)"},{"line_number":58,"context_line":"        try:"},{"line_number":59,"context_line":"            return query.one()"},{"line_number":60,"context_line":"        except exc.NoResultFound:"},{"line_number":61,"context_line":"            raise tag_ext.TagNotFound(tag\u003dtag)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_f77d96e8","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":30},"updated":"2016-02-25 22:39:55.000000000","message":"query.first() is more efficient as it looks for the first element where query.one() looks for multiple elements to check there is one and only one element","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        query \u003d query.filter_by(tag\u003dtag,"},{"line_number":57,"context_line":"                                standard_attr_id\u003dres.standard_attr_id)"},{"line_number":58,"context_line":"        try:"},{"line_number":59,"context_line":"            return query.one()"},{"line_number":60,"context_line":"        except exc.NoResultFound:"},{"line_number":61,"context_line":"            raise tag_ext.TagNotFound(tag\u003dtag)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_7bbfff60","line":59,"range":{"start_line":59,"start_character":0,"end_line":59,"end_character":30},"in_reply_to":"9aed3d3a_f77d96e8","updated":"2016-03-01 02:25:54.000000000","message":"ditto.","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self._get_resource_tag(context, resource, resource_id, tag)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @log_helpers.log_method_call"},{"line_number":74,"context_line":"    def update_tags(self, context, resource, resource_id, body):"},{"line_number":75,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":76,"context_line":"        new_tags \u003d set(body[\u0027tags\u0027])"},{"line_number":77,"context_line":"        old_tags \u003d {tag_db.tag for tag_db in res.standard_attr.tags}"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_5ae747e4","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":19},"updated":"2016-02-25 22:39:55.000000000","message":"This method is not thread-safe?","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"b1e71c6af69fe7446cdc2f77b65b55f4c086b8e4","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self._get_resource_tag(context, resource, resource_id, tag)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @log_helpers.log_method_call"},{"line_number":74,"context_line":"    def update_tags(self, context, resource, resource_id, body):"},{"line_number":75,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":76,"context_line":"        new_tags \u003d set(body[\u0027tags\u0027])"},{"line_number":77,"context_line":"        old_tags \u003d {tag_db.tag for tag_db in res.standard_attr.tags}"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_e449f0b8","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":19},"in_reply_to":"9aed3d3a_5ae747e4","updated":"2016-02-29 06:51:42.000000000","message":"Good catch. I\u0027m fixing here but it\u0027s difficult work for me. I also noticed we have the same issues in host_routes of subnet/router ;)","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self._get_resource_tag(context, resource, resource_id, tag)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @log_helpers.log_method_call"},{"line_number":74,"context_line":"    def update_tags(self, context, resource, resource_id, body):"},{"line_number":75,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":76,"context_line":"        new_tags \u003d set(body[\u0027tags\u0027])"},{"line_number":77,"context_line":"        old_tags \u003d {tag_db.tag for tag_db in res.standard_attr.tags}"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_1b4993b7","line":74,"range":{"start_line":74,"start_character":8,"end_line":74,"end_character":19},"in_reply_to":"9aed3d3a_e449f0b8","updated":"2016-03-01 02:25:54.000000000","message":"Done","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        return body"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @log_helpers.log_method_call"},{"line_number":91,"context_line":"    def update_tag(self, context, resource, resource_id, tag):"},{"line_number":92,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":93,"context_line":"        tags \u003d [tag_db.tag for tag_db in res.standard_attr.tags]"},{"line_number":94,"context_line":"        if tag in tags:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_1a881f22","line":91,"updated":"2016-02-25 22:39:55.000000000","message":"It\u0027s not thread-safe: the method crashs if the tag is concurrently created. It\u0027s better to ask for forgiveness than permission:\n\n def update_tag(...):\n  res \u003d ...\n  try:\n    with context.session.begin(...):\n      context.session.add(...)\n  except DBDuplicateEntry:\n    raise TagExist\n\nThis method avoids a db query and check that the db will do","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        return body"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @log_helpers.log_method_call"},{"line_number":91,"context_line":"    def update_tag(self, context, resource, resource_id, tag):"},{"line_number":92,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":93,"context_line":"        tags \u003d [tag_db.tag for tag_db in res.standard_attr.tags]"},{"line_number":94,"context_line":"        if tag in tags:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_9bd3e3d4","line":91,"in_reply_to":"9aed3d3a_000d293e","updated":"2016-03-01 02:25:54.000000000","message":"Done","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"97d51ffc9fd2ac0461df4365863573f38628d5c6","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        return body"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @log_helpers.log_method_call"},{"line_number":91,"context_line":"    def update_tag(self, context, resource, resource_id, tag):"},{"line_number":92,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":93,"context_line":"        tags \u003d [tag_db.tag for tag_db in res.standard_attr.tags]"},{"line_number":94,"context_line":"        if tag in tags:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_000d293e","line":91,"in_reply_to":"9aed3d3a_1a881f22","updated":"2016-02-26 14:11:52.000000000","message":"Good point.","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    @log_helpers.log_method_call"},{"line_number":91,"context_line":"    def update_tag(self, context, resource, resource_id, tag):"},{"line_number":92,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":93,"context_line":"        tags \u003d [tag_db.tag for tag_db in res.standard_attr.tags]"},{"line_number":94,"context_line":"        if tag in tags:"},{"line_number":95,"context_line":"            raise tag_ext.TagExists(tag\u003dtag, resource_id\u003dresource_id)"},{"line_number":96,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_b755ce1e","line":93,"updated":"2016-02-25 22:39:55.000000000","message":"we don\u0027t need to build tags: \n\n if any(tag \u003d\u003d tag_db.tag for tag_db in ...):","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    @log_helpers.log_method_call"},{"line_number":91,"context_line":"    def update_tag(self, context, resource, resource_id, tag):"},{"line_number":92,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":93,"context_line":"        tags \u003d [tag_db.tag for tag_db in res.standard_attr.tags]"},{"line_number":94,"context_line":"        if tag in tags:"},{"line_number":95,"context_line":"            raise tag_ext.TagExists(tag\u003dtag, resource_id\u003dresource_id)"},{"line_number":96,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_7bf1bf6a","line":93,"in_reply_to":"9aed3d3a_b755ce1e","updated":"2016-03-01 02:25:54.000000000","message":"Nice suggestion. I used your suggestion in get_tag().","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @log_helpers.log_method_call"},{"line_number":102,"context_line":"    def delete_tags(self, context, resource, resource_id):"},{"line_number":103,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":104,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":105,"context_line":"            for tag_db in res.standard_attr.tags:"},{"line_number":106,"context_line":"                context.session.delete(tag_db)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_9a41cf3c","line":103,"range":{"start_line":103,"start_character":19,"end_line":103,"end_character":32},"updated":"2016-02-25 22:39:55.000000000","message":"1+ tag can be deleted between select and delete so you should do:\n\n query.filter().delete()","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @log_helpers.log_method_call"},{"line_number":102,"context_line":"    def delete_tags(self, context, resource, resource_id):"},{"line_number":103,"context_line":"        res \u003d self._get_resource(context, resource, resource_id)"},{"line_number":104,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":105,"context_line":"            for tag_db in res.standard_attr.tags:"},{"line_number":106,"context_line":"                context.session.delete(tag_db)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_7b989f1c","line":103,"range":{"start_line":103,"start_character":19,"end_line":103,"end_character":32},"in_reply_to":"9aed3d3a_9a41cf3c","updated":"2016-03-01 02:25:54.000000000","message":"You\u0027re right. Done.","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @log_helpers.log_method_call"},{"line_number":109,"context_line":"    def delete_tag(self, context, resource, resource_id, tag):"},{"line_number":110,"context_line":"        tag_db \u003d self._get_resource_tag(context, resource, resource_id, tag)"},{"line_number":111,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":112,"context_line":"            context.session.delete(tag_db)"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_5a20e79b","line":110,"updated":"2016-02-25 22:39:55.000000000","message":"the tag can be deleted between select and delete so you should do:\n\n if not query.filter(....).delete():\n   raise TagNotFound(...)","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    @log_helpers.log_method_call"},{"line_number":109,"context_line":"    def delete_tag(self, context, resource, resource_id, tag):"},{"line_number":110,"context_line":"        tag_db \u003d self._get_resource_tag(context, resource, resource_id, tag)"},{"line_number":111,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":112,"context_line":"            context.session.delete(tag_db)"},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_9ba12349","line":110,"in_reply_to":"9aed3d3a_5a20e79b","updated":"2016-03-01 02:25:54.000000000","message":"Done","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"}],"neutron/tests/unit/api/test_extensions.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"92d7a438adcb55416f99974df7ae16a49656d1f2","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        response \u003d test_app.get(\"/tweedles\")"},{"line_number":369,"context_line":"        self.assertEqual(200, response.status_int)"},{"line_number":370,"context_line":"        LOG.debug(jsonutils.loads(response.body))"},{"line_number":371,"context_line":"        self.assertEqual(jsonutils.loads(response.body)[\u0027collection\u0027], \"value\")"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    def test_resource_extension_for_put_custom_collection_method(self):"},{"line_number":374,"context_line":"        controller \u003d self.ResourceExtensionController()"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_bbf1ee6c","line":371,"range":{"start_line":371,"start_character":25,"end_line":371,"end_character":78},"updated":"2016-02-22 07:26:16.000000000","message":"The order is (actual, expected).... but it is used throughout this file, so it looks okay.","commit_id":"8f73b9c1bc9f4cafeedeb5cae963dbf7b49bb25f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"8b29a8ad282c60ced5ffd39c7406243f72e51f3d","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        response \u003d test_app.get(\"/tweedles\")"},{"line_number":369,"context_line":"        self.assertEqual(200, response.status_int)"},{"line_number":370,"context_line":"        LOG.debug(jsonutils.loads(response.body))"},{"line_number":371,"context_line":"        self.assertEqual(jsonutils.loads(response.body)[\u0027collection\u0027], \"value\")"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    def test_resource_extension_for_put_custom_collection_method(self):"},{"line_number":374,"context_line":"        controller \u003d self.ResourceExtensionController()"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_349ccc68","line":371,"range":{"start_line":371,"start_character":25,"end_line":371,"end_character":78},"in_reply_to":"bae84128_bbf1ee6c","updated":"2016-02-22 08:04:21.000000000","message":"You\u0027re right. Done.","commit_id":"8f73b9c1bc9f4cafeedeb5cae963dbf7b49bb25f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"92d7a438adcb55416f99974df7ae16a49656d1f2","unresolved":false,"context_lines":[{"line_number":421,"context_line":"    def test_resource_ext_for_nested_resource_custom_collection_method(self):"},{"line_number":422,"context_line":"        controller \u003d self.ResourceExtensionController()"},{"line_number":423,"context_line":"        collections \u003d {\u0027custom_collection_method\u0027: \"GET\"}"},{"line_number":424,"context_line":"        parent \u003d dict(collection_name\u003d\u0027beetles\u0027, member_name\u003d\u0027beetle\u0027)"},{"line_number":425,"context_line":"        res_ext \u003d extensions.ResourceExtension(\u0027tweedles\u0027, controller,"},{"line_number":426,"context_line":"                                               collection_methods\u003dcollections,"},{"line_number":427,"context_line":"                                               parent\u003dparent)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_db95d2e4","line":424,"range":{"start_line":424,"start_character":17,"end_line":424,"end_character":22},"updated":"2016-02-22 07:26:16.000000000","message":"nit: Consider using {}. The previous lines uses {}.","commit_id":"8f73b9c1bc9f4cafeedeb5cae963dbf7b49bb25f"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"8b29a8ad282c60ced5ffd39c7406243f72e51f3d","unresolved":false,"context_lines":[{"line_number":421,"context_line":"    def test_resource_ext_for_nested_resource_custom_collection_method(self):"},{"line_number":422,"context_line":"        controller \u003d self.ResourceExtensionController()"},{"line_number":423,"context_line":"        collections \u003d {\u0027custom_collection_method\u0027: \"GET\"}"},{"line_number":424,"context_line":"        parent \u003d dict(collection_name\u003d\u0027beetles\u0027, member_name\u003d\u0027beetle\u0027)"},{"line_number":425,"context_line":"        res_ext \u003d extensions.ResourceExtension(\u0027tweedles\u0027, controller,"},{"line_number":426,"context_line":"                                               collection_methods\u003dcollections,"},{"line_number":427,"context_line":"                                               parent\u003dparent)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_748c9435","line":424,"range":{"start_line":424,"start_character":17,"end_line":424,"end_character":22},"in_reply_to":"bae84128_db95d2e4","updated":"2016-02-22 08:04:21.000000000","message":"Done","commit_id":"8f73b9c1bc9f4cafeedeb5cae963dbf7b49bb25f"}],"neutron/tests/unit/extensions/test_tag.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"26d485750d055d8adb68f9dea295a7dedd44a472","unresolved":false,"context_lines":[{"line_number":20,"context_line":"extensions_path \u003d \u0027:\u0027.join(neutron.extensions.__path__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class TestTagApiCommon(test_db_base_plugin_v2.NeutronDbPluginV2TestCase):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        service_plugins \u003d {\u0027TAG\u0027: \"neutron.services.tag.tag_plugin.TagPlugin\"}"}],"source_content_type":"text/x-python","patch_set":13,"id":"dae33548_e40fb486","line":23,"range":{"start_line":23,"start_character":16,"end_line":23,"end_character":22},"updated":"2016-02-19 02:05:56.000000000","message":"I think the most tests use \u0027Base\u0027 for such classes.","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c6e1c935fd65b3dc3e45fa2209cdea42b9320c5b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"extensions_path \u003d \u0027:\u0027.join(neutron.extensions.__path__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class TestTagApiCommon(test_db_base_plugin_v2.NeutronDbPluginV2TestCase):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        service_plugins \u003d {\u0027TAG\u0027: \"neutron.services.tag.tag_plugin.TagPlugin\"}"}],"source_content_type":"text/x-python","patch_set":13,"id":"bae84128_463f8625","line":23,"range":{"start_line":23,"start_character":16,"end_line":23,"end_character":22},"in_reply_to":"dae33548_e40fb486","updated":"2016-02-19 09:26:43.000000000","message":"Done","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":22,"context_line":"extensions_path \u003d \u0027:\u0027.join(neutron.extensions.__path__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestTagApiBase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        service_plugins \u003d {\u0027TAG\u0027: \"neutron.services.tag.tag_plugin.TagPlugin\"}"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_e3eb5ada","line":25,"updated":"2016-02-24 05:30:24.000000000","message":"food for thought: consider writing a real API test instead?","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"extensions_path \u003d \u0027:\u0027.join(neutron.extensions.__path__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestTagApiBase(test_db_base_plugin_v2.NeutronDbPluginV2TestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        service_plugins \u003d {\u0027TAG\u0027: \"neutron.services.tag.tag_plugin.TagPlugin\"}"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_e56790e8","line":25,"in_reply_to":"bae84128_e3eb5ada","updated":"2016-02-25 10:52:07.000000000","message":"I have thought the same. I try to parepare it although I don\u0027t think we should remove UT.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"995ae9972b552a3cdb5e70a8739d0e7ab8b202bc","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            res \u003d self._put_tag(net_id, \u0027blue\u0027)"},{"line_number":89,"context_line":"            self.assertEqual(201, res.status_int)"},{"line_number":90,"context_line":"            res \u003d self._put_tag(net_id, \u0027blue\u0027)"},{"line_number":91,"context_line":"            self.assertEqual(409, res.status_int)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test_put_tags(self):"},{"line_number":94,"context_line":"        with self.network() as net:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_ba4653bd","line":91,"updated":"2016-02-25 22:39:55.000000000","message":"it should return 100","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"ecede7af62c2b65cfffa4ec2f8b3f13d1f6964ca","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            res \u003d self._put_tag(net_id, \u0027blue\u0027)"},{"line_number":89,"context_line":"            self.assertEqual(201, res.status_int)"},{"line_number":90,"context_line":"            res \u003d self._put_tag(net_id, \u0027blue\u0027)"},{"line_number":91,"context_line":"            self.assertEqual(409, res.status_int)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test_put_tags(self):"},{"line_number":94,"context_line":"        with self.network() as net:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_9b1408f6","line":91,"in_reply_to":"9aed3d3a_20c2ed33","updated":"2016-02-26 14:16:37.000000000","message":"Sorry, you should read 204 :)","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"377a3f9c391e091e8eb8907096679a31fa0ceab2","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            res \u003d self._put_tag(net_id, \u0027blue\u0027)"},{"line_number":89,"context_line":"            self.assertEqual(201, res.status_int)"},{"line_number":90,"context_line":"            res \u003d self._put_tag(net_id, \u0027blue\u0027)"},{"line_number":91,"context_line":"            self.assertEqual(409, res.status_int)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test_put_tags(self):"},{"line_number":94,"context_line":"        with self.network() as net:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_3baa9719","line":91,"in_reply_to":"9aed3d3a_9b1408f6","updated":"2016-03-01 02:25:54.000000000","message":"I selected 201 according with discussion in dev-mail.","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"97d51ffc9fd2ac0461df4365863573f38628d5c6","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            res \u003d self._put_tag(net_id, \u0027blue\u0027)"},{"line_number":89,"context_line":"            self.assertEqual(201, res.status_int)"},{"line_number":90,"context_line":"            res \u003d self._put_tag(net_id, \u0027blue\u0027)"},{"line_number":91,"context_line":"            self.assertEqual(409, res.status_int)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def test_put_tags(self):"},{"line_number":94,"context_line":"        with self.network() as net:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9aed3d3a_20c2ed33","line":91,"in_reply_to":"9aed3d3a_ba4653bd","updated":"2016-02-26 14:11:52.000000000","message":"100 sounds tricky. 100 means Continue (which means a server starts processing.\n\nIn this case, the processing completes when a response is returned, so 100 sounds incorrect to me.  200 or 204 sounds better to me if we don\u0027t treat it as an error.","commit_id":"d96f15b1bcc577e4f0de7c5dd7315dd7ff36222c"}],"releasenotes/notes/add-tags-to-core-resources-b05330a129900609.yaml":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"26d485750d055d8adb68f9dea295a7dedd44a472","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Add tags for neutron resources"},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - Users can set tags on their network resources."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"dae33548_443e602a","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":13},"updated":"2016-02-19 02:05:56.000000000","message":"\"Add tag mechanism for neutron resources\"?\n\nThis patch does not add tags to neutron resources. it provides a way to add tags.","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c6e1c935fd65b3dc3e45fa2209cdea42b9320c5b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Add tags for neutron resources"},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - Users can set tags on their network resources."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"bae84128_66460ac1","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":13},"in_reply_to":"dae33548_443e602a","updated":"2016-02-19 09:26:43.000000000","message":"Done","commit_id":"d6b460eb57f528017dec7a3b3cd5cd4fc4af89bd"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Add tag mechanism for neutron resources"},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - Users can set tags on their network resources."},{"line_number":6,"context_line":"  - The number of tags is limited by configuration option"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"bae84128_63b62afa","line":3,"updated":"2016-02-24 05:30:24.000000000","message":"you just did for networks only though. We need to be clear whether in Mitaka we\u0027re targeting Networks only (which I would be still reasonably happy with - perhaps you could consider adding ports and subnets too, as it\u0027s not too hard to do that)","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Add tag mechanism for neutron resources"},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - Users can set tags on their network resources."},{"line_number":6,"context_line":"  - The number of tags is limited by configuration option"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"bae84128_0569d48b","line":3,"in_reply_to":"bae84128_63b62afa","updated":"2016-02-25 10:52:07.000000000","message":"I\u0027d like to target Network only on base patch so that Tag feature go forward Mitaka smoothly. I will prepare it for other resources on a separate patch.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"8c651b3b3d2d304aa51f9214208fda21bdfe8344","unresolved":false,"context_lines":[{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - Users can set tags on their network resources."},{"line_number":6,"context_line":"  - The number of tags is limited by configuration option"},{"line_number":7,"context_line":"    \u0027max_tags_per_resource\u0027."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"bae84128_c3d1f624","line":7,"updated":"2016-02-24 05:30:24.000000000","message":"I\u0027d drop this complication, unless you can provide a compelling reason for it.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"93b32e576dab8f2da514f23f566afe4dcc05276c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - Users can set tags on their network resources."},{"line_number":6,"context_line":"  - The number of tags is limited by configuration option"},{"line_number":7,"context_line":"    \u0027max_tags_per_resource\u0027."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"bae84128_c5924c9f","line":7,"in_reply_to":"bae84128_c3d1f624","updated":"2016-02-25 10:52:07.000000000","message":"OK. I will remove.","commit_id":"091e1f5c7747dfec4eb8d04e20e383a8c2ea2674"}]}
