)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12321,"name":"Ryan Brown","email":"rybrown@redhat.com","username":"ryansb"},"change_message_id":"597db21bb213dfa126cb4008633fe9a34b848e80","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Blueprint specification for server instance tagging"},{"line_number":10,"context_line":"with simple strings."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ic1b2ecf9459798b14db12d449e003648c4228550"},{"line_number":13,"context_line":"Previously-approved: juno, kilo"},{"line_number":14,"context_line":"Blueprint: tag-instances"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"bab921fb_70a574a0","line":11,"updated":"2015-04-24 12:28:09.000000000","message":"If you add \"APIImpact\" here, it will show up in the gerrit query used by members of the API-wg to help review new specs.","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"}],"specs/liberty/approved/tag-instances.rst":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"4ce05ed6cfec788212b265c7be5182491ffa2417","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"This proposal would add a API microversion for retrieving and setting tags"},{"line_number":124,"context_line":"against an instance. In addition, it would add a API microversion to allow the"},{"line_number":125,"context_line":"searching/listing of instances based on one or more string tags."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"The tag CRUD operations API microversion would look like the following:"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_4c078d1c","line":125,"updated":"2015-04-24 08:22:56.000000000","message":"Can we just be clear here please, this is for the v2.1 API only.\n\nWe have frozen the v2.0 API now.","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"4ce05ed6cfec788212b265c7be5182491ffa2417","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"Return list of tags for a server ::"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    GET /v2/{project_id}/servers/{server_id}/tags"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"returns ::"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_ac474976","line":131,"updated":"2015-04-24 08:22:56.000000000","message":"So I really want to see us align with this proposal, if possible:\nhttps://review.openstack.org/#/c/155620/8/guidelines/tags.rst,cm","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"d938683a7b69a6750927f12fc4fcc8f3ef514378","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"Return list of tags for a server ::"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    GET /v2/{project_id}/servers/{server_id}/tags"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"returns ::"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_3a8460d2","line":131,"in_reply_to":"bab921fb_ac474976","updated":"2015-04-24 21:09:56.000000000","message":"In addition to returning the tags as indicated by this endpoint, I would like to suggest that you include a \"tags\" field in the JSON representation of the server. Specifically, the representation from the following endpoint should contain a \"tags\" field:\n\nGET /v2/{project_id}/servers/{server_id}\n\nThis avoids the need of additional requests in the most common case of a client needing the complete set of attributes of an instance.","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"4ce05ed6cfec788212b265c7be5182491ffa2417","unresolved":false,"context_lines":[{"line_number":133,"context_line":"returns ::"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    ["},{"line_number":136,"context_line":"        \u0027tag-one\u0027,"},{"line_number":137,"context_line":"        \u0027tag-two\u0027"},{"line_number":138,"context_line":"    ]"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_8c0da540","line":136,"updated":"2015-04-24 08:22:56.000000000","message":"I think we need {tags:[\"asdf\",\"asf\"]} here to match the above link.","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":12321,"name":"Ryan Brown","email":"rybrown@redhat.com","username":"ryansb"},"change_message_id":"597db21bb213dfa126cb4008633fe9a34b848e80","unresolved":false,"context_lines":[{"line_number":133,"context_line":"returns ::"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    ["},{"line_number":136,"context_line":"        \u0027tag-one\u0027,"},{"line_number":137,"context_line":"        \u0027tag-two\u0027"},{"line_number":138,"context_line":"    ]"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_c535a4f7","line":136,"in_reply_to":"bab921fb_8c0da540","updated":"2015-04-24 12:28:09.000000000","message":"It\u0027s also important to note that a top-level list is a bad security practice. See[1][2], which are linked in the API-wg spec. Also a top-level list makes it impossible to add more keys to that endpoint in the future, limiting extensibility. \n\n[1]: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/\n[2]: http://haacked.com/archive/2009/06/25/json-hijacking.aspx/","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"d938683a7b69a6750927f12fc4fcc8f3ef514378","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":"Replace set of tags on a server ::"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    POST /v2/{project_id}/servers/{server_id}/tags"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"with request payload ::"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_3aac609f","line":152,"updated":"2015-04-24 21:09:56.000000000","message":"To replace the tags please use a PUT request.","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":12321,"name":"Ryan Brown","email":"rybrown@redhat.com","username":"ryansb"},"change_message_id":"597db21bb213dfa126cb4008633fe9a34b848e80","unresolved":false,"context_lines":[{"line_number":154,"context_line":"with request payload ::"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    ["},{"line_number":157,"context_line":"        \u0027tag-one\u0027,"},{"line_number":158,"context_line":"        \u0027tag-three\u0027"},{"line_number":159,"context_line":"    ]"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_105f580f","line":157,"updated":"2015-04-24 12:28:09.000000000","message":"Same here: please use {\"tags\": [.....]}","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":12321,"name":"Ryan Brown","email":"rybrown@redhat.com","username":"ryansb"},"change_message_id":"597db21bb213dfa126cb4008633fe9a34b848e80","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"* `tag` -- One or more strings that will be used to filter results in an"},{"line_number":210,"context_line":"  AND expression."},{"line_number":211,"context_line":"* `tag-any` -- One or more strings that will be used to filter results in"},{"line_number":212,"context_line":"  an OR expression."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"Get all servers having a single tag ::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_30e93c15","line":211,"updated":"2015-04-24 12:28:09.000000000","message":"Please use the plural \"tags\", since this argument could be one or many tags.","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":12321,"name":"Ryan Brown","email":"rybrown@redhat.com","username":"ryansb"},"change_message_id":"597db21bb213dfa126cb4008633fe9a34b848e80","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":"Get all servers having either of two tags ::"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    GET /v2/{project_id}/servers?tag-any\u003d{tag_a}\u0026tag-any\u003d{tag_b}"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"Would return the servers having either the `{tag_a}` or the `{tag_b}` tag."},{"line_number":226,"context_line":"No change is needed to the JSON response for the"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_501dd00d","line":223,"updated":"2015-04-24 12:28:09.000000000","message":"Repeating URL query parameters is not recommended by the API-wg, instead consider using \"?tags-any\u003dtag_a,tag_b,tag_c\" and \"?tags\u003da,b,c\".","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"4ce05ed6cfec788212b265c7be5182491ffa2417","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    GET /v2/{project_id}/servers?tag\u003dA\u0026tag\u003dB\u0026tag-any\u003dC\u0026tag-any\u003dD"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"Would yield servers that were tagged with \"A\", \"B\", and either \"C\" or \"D\"."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Security impact"},{"line_number":246,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_873b3ed1","line":243,"updated":"2015-04-24 08:22:56.000000000","message":"Can we look to see if that matches the api working group suggestions please? I am not sure.","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"d938683a7b69a6750927f12fc4fcc8f3ef514378","unresolved":false,"context_lines":[{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    GET /v2/{project_id}/servers?tag\u003dA\u0026tag\u003dB\u0026tag-any\u003dC\u0026tag-any\u003dD"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"Would yield servers that were tagged with \"A\", \"B\", and either \"C\" or \"D\"."},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Security impact"},{"line_number":246,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab921fb_5ae154cf","line":243,"in_reply_to":"bab921fb_873b3ed1","updated":"2015-04-24 21:09:56.000000000","message":"John, thanks for reaching out to API-WG.\n\nWhat\u0027s missing in this specification are the negative filtering options that I proposed on the API-WG guideline document, namely \"not-tags\" and \"not-tags-any\". These allow you obtain entities that do not have a give tag or set of tags.\n\nSee https://review.openstack.org/#/c/155620 for details.","commit_id":"7d4338880ca7bc12c22d34bcc9b8d16c00aec7b5"},{"author":{"_account_id":12321,"name":"Ryan Brown","email":"rybrown@redhat.com","username":"ryansb"},"change_message_id":"1083e70c9c267544178d6ab5c57b62e5515ae3ed","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"Add a single tag on a server ::"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    PUT /servers/{server_id}/tags/{tag}"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"Returns `204 No Content`."},{"line_number":178,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7ad32947_bcdc6947","line":175,"updated":"2015-04-27 14:15:24.000000000","message":"It may be better to return \"201 Created\" here, but 204 No Content works fine.","commit_id":"797879231b20e744c281d55202e1093a12f5030d"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6f4b7b72c49ce2f1779f3057203905ce827b80e8","unresolved":false,"context_lines":[{"line_number":36,"context_line":"Project Priority"},{"line_number":37,"context_line":"-----------------"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"This partly falls under the cross project API consistency category."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"5ad0253b_c2db971a","line":39,"updated":"2015-04-29 13:02:03.000000000","message":"This is not (yet) a priority, but lets ignore that for now.","commit_id":"83f2499268a8c0ab4663b856f0311f6d7bf3a3c7"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"376faa1867553c9b17c9f2c10f631f2059527026","unresolved":false,"context_lines":[{"line_number":164,"context_line":"Response ::"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    {"},{"line_number":167,"context_line":"        \u0027tags\u0027: [\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027]"},{"line_number":168,"context_line":"    }"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"}],"source_content_type":"text/x-rst","patch_set":5,"id":"5ad0253b_053bd9d2","line":167,"updated":"2015-04-29 13:23:09.000000000","message":"Minor point, but I don\u0027t see why we need to tell the user what they just told us in this case.  We don\u0027t do it in any other case.","commit_id":"83f2499268a8c0ab4663b856f0311f6d7bf3a3c7"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"48db73ab47d944db6f3363e4c545039229f73be2","unresolved":false,"context_lines":[{"line_number":164,"context_line":"Response ::"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    {"},{"line_number":167,"context_line":"        \u0027tags\u0027: [\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027]"},{"line_number":168,"context_line":"    }"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3acd31a7_ddbeffd3","line":167,"in_reply_to":"5ad0253b_053bd9d2","updated":"2015-04-29 15:14:24.000000000","message":"Honestly, I agree with you that we shouldn\u0027t return the same information.\nI changed response just to align with the tagging guidelines. https://review.openstack.org/#/c/155620/","commit_id":"83f2499268a8c0ab4663b856f0311f6d7bf3a3c7"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"376faa1867553c9b17c9f2c10f631f2059527026","unresolved":false,"context_lines":[{"line_number":338,"context_line":"Mailing list discussions:"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"http://lists.openstack.org/pipermail/openstack-dev/2014-April/033222.html"},{"line_number":341,"context_line":"http://www.mail-archive.com/openstack-dev@lists.openstack.org/msg23310.html"}],"source_content_type":"text/x-rst","patch_set":5,"id":"5ad0253b_85b6c9da","line":341,"updated":"2015-04-29 13:23:09.000000000","message":"http://lists.openstack.org/pipermail/openstack-dev/2014-April/034004.html","commit_id":"83f2499268a8c0ab4663b856f0311f6d7bf3a3c7"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"142195775ad36c8d62ad86654b62911f65330e8c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"Project Priority"},{"line_number":37,"context_line":"-----------------"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"This partly falls under the cross project API consistency category."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3acd31a7_8ca6fbbf","line":39,"updated":"2015-04-30 09:49:02.000000000","message":"Nit, this isn\u0027t a thing, it should just be None, but I am not going to block on that, we can fix it up later if needed.","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"b25041796ba844184cdb3498f1eba344bc533d76","unresolved":false,"context_lines":[{"line_number":36,"context_line":"Project Priority"},{"line_number":37,"context_line":"-----------------"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"This partly falls under the cross project API consistency category."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3acd31a7_92bbb0c4","line":39,"in_reply_to":"3acd31a7_8ca6fbbf","updated":"2015-04-30 10:23:47.000000000","message":"ok. If I will have to upload new patch I change it to None.","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"bd4bb80424fab204a77b86f359068d3257667042","unresolved":false,"context_lines":[{"line_number":62,"context_line":"* The key/value pairs in the existing server metadata API extension are"},{"line_number":63,"context_line":"  all exposed via the nova-metadata endpoint, and therefore some people"},{"line_number":64,"context_line":"  think they are limited to being queried only from the 169.254.169.254"},{"line_number":65,"context_line":"  address."},{"line_number":66,"context_line":"* It is not clear in the API that some metadata key/value pairs are added by"},{"line_number":67,"context_line":"  the user and some are added by Nova, Glance, or some external system. Part"},{"line_number":68,"context_line":"  of the idea behind this simple string tagging proposal is to have a way"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a0c5dc1_cc3e1ab8","line":65,"updated":"2015-05-12 18:55:49.000000000","message":"This is a really terrible argument.","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"bd4bb80424fab204a77b86f359068d3257667042","unresolved":false,"context_lines":[{"line_number":66,"context_line":"* It is not clear in the API that some metadata key/value pairs are added by"},{"line_number":67,"context_line":"  the user and some are added by Nova, Glance, or some external system. Part"},{"line_number":68,"context_line":"  of the idea behind this simple string tagging proposal is to have a way"},{"line_number":69,"context_line":"  to tag instances that is *only* for normal users."},{"line_number":70,"context_line":"* Finally, and *most importantly*, the direction that the Glance program is"},{"line_number":71,"context_line":"  taking is to use simple string tagging for **user-side categorization of"},{"line_number":72,"context_line":"  resources**, and to use key/value pairs, hierarchical metadata, and property"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a0c5dc1_6c828e54","line":69,"updated":"2015-05-12 18:55:49.000000000","message":"I don\u0027t think this is accurate. How do you distinguish between \u0027normal users\u0027 and external systems the \u0027normal users\u0027 set up.\n\nA better way to put this is, the metadata key/value pairs are used for both internal and external things. While the string tagging is explicitly for external user facing things.","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"bd4bb80424fab204a77b86f359068d3257667042","unresolved":false,"context_lines":[{"line_number":72,"context_line":"  resources**, and to use key/value pairs, hierarchical metadata, and property"},{"line_number":73,"context_line":"  bags for describing system-side metadata about resources. Property bags are"},{"line_number":74,"context_line":"  basically enumerated types for metadata, with a key and a constrained list of"},{"line_number":75,"context_line":"  value choices. The proposed Catalog program will be following a strategy"},{"line_number":76,"context_line":"  used by the Graffiti project that is designed to handle metadata/catalog data"},{"line_number":77,"context_line":"  of various formats in a structured way, and leave user-focused taxonomy as"},{"line_number":78,"context_line":"  simple-string tags only. This blueprint aligns with that direction."}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a0c5dc1_0c5c3224","line":75,"updated":"2015-05-12 18:55:49.000000000","message":"Is this section still accurate? \u0027Proposed catalog program\u0027 etc.","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"142195775ad36c8d62ad86654b62911f65330e8c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"  value choices. The proposed Catalog program will be following a strategy"},{"line_number":76,"context_line":"  used by the Graffiti project that is designed to handle metadata/catalog data"},{"line_number":77,"context_line":"  of various formats in a structured way, and leave user-focused taxonomy as"},{"line_number":78,"context_line":"  simple-string tags only. This blueprint aligns with that direction."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Data model impact"},{"line_number":81,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3acd31a7_4cb583cb","line":78,"updated":"2015-04-30 09:49:02.000000000","message":"Nit, not sure I agree with all these comments, but it doesn\u0027t change me supporting the direction this spec has chosen, so I am not going to dig into that.","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8305fade22fa23ae364582b7e726dd1bdf4a14ef","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":112,"context_line":"        tag VARCHAR(80) NOT NULL CHARACTER SET utf8"},{"line_number":113,"context_line":"         COLLATION utf8_ci PRIMARY KEY"},{"line_number":114,"context_line":"    );"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"There shall be a new hard-coded limit of 50 for the number of tags a user can"},{"line_number":117,"context_line":"use on a server. No need to make this configurable or use the quota system at"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1aca2d91_dfb38e09","line":114,"range":{"start_line":114,"start_character":0,"end_line":114,"end_character":4},"updated":"2015-05-06 08:07:22.000000000","message":"Do we support soft-delete tag? So what happened after the instance deleted? Can I filter deleted instance by tag? Can I show tag for deleted instance?","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"da44c264d644cb0c8e9a8d6d2dbf9854b8c527cb","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":112,"context_line":"        tag VARCHAR(80) NOT NULL CHARACTER SET utf8"},{"line_number":113,"context_line":"         COLLATION utf8_ci PRIMARY KEY"},{"line_number":114,"context_line":"    );"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"There shall be a new hard-coded limit of 50 for the number of tags a user can"},{"line_number":117,"context_line":"use on a server. No need to make this configurable or use the quota system at"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1aca2d91_e813dbb6","line":114,"in_reply_to":"1aca2d91_4d91d398","updated":"2015-05-08 00:08:19.000000000","message":"Apologize first. Just found I type a lot of \u0027?\u0027, that looks impolite. It\u0027s bad habit, will correct it next time.\n\nI check the code, only admin can get deleted instance. Then I didn\u0027t found any useful use-case for filter deleted instance by tag.\n\nAsk this question, just for I fixed some bug related soft-deleted system_metadata.\n\nSo let ignore it.\n\nThanks","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"297c0fcf44f8c3c2482d563bb194c1a0b07c2251","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":112,"context_line":"        tag VARCHAR(80) NOT NULL CHARACTER SET utf8"},{"line_number":113,"context_line":"         COLLATION utf8_ci PRIMARY KEY"},{"line_number":114,"context_line":"    );"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"There shall be a new hard-coded limit of 50 for the number of tags a user can"},{"line_number":117,"context_line":"use on a server. No need to make this configurable or use the quota system at"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1aca2d91_4d91d398","line":114,"in_reply_to":"1aca2d91_dfb38e09","updated":"2015-05-07 15:54:16.000000000","message":"1. No, we don\u0027t support soft-delete tag.\n\n2. Tags for this instance will be deleted.\n\n3. No\n\n4. No\n\nP.S. Do you think we should support tags for deleted instances?","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8305fade22fa23ae364582b7e726dd1bdf4a14ef","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    }"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"},{"line_number":171,"context_line":"a `400 Bad Request`"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"Add a single tag on a server ::"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"1aca2d91_1f04667c","line":171,"range":{"start_line":171,"start_character":11,"end_line":171,"end_character":18},"updated":"2015-05-06 08:07:22.000000000","message":"As the API-WG guideline, overquota should be 403 https://github.com/openstack/api-wg/blob/master/guidelines/http.rst\n\nAlthough there isn\u0027t quota for tags, But I\u0027m still thinking it is similar to over quota case. And there isn\u0027t describe about this in tag guideline in API-WG","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"297c0fcf44f8c3c2482d563bb194c1a0b07c2251","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    }"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"},{"line_number":171,"context_line":"a `400 Bad Request`"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"Add a single tag on a server ::"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"1aca2d91_8dcb6b53","line":171,"in_reply_to":"1aca2d91_1f04667c","updated":"2015-05-07 15:54:16.000000000","message":"Ryan Brown wrote: \"Our guidelines for tagging are here. but they are just that: guidelines, not hard rules.\"\n\nAbout response status: I think if user sends a request with 1000 tags when he can add just 50, it is a Bad Request, not Forbidden","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"9078260db4233f7718e4224a5a3230711c80670a","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    }"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"},{"line_number":171,"context_line":"a `400 Bad Request`"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"Add a single tag on a server ::"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"1aca2d91_f392959e","line":171,"in_reply_to":"1aca2d91_8887c7d6","updated":"2015-05-08 15:52:34.000000000","message":"Yeah, this is a grey area... we should use whatever decision the API WG makes on this. Alex, please submit a guidance patch so that the API WG can make a decision on the 403 vs. 400. In the meantime, I see no reason to hold up this particular approval. We can always amend the spec after approval...","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"da44c264d644cb0c8e9a8d6d2dbf9854b8c527cb","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    }"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"},{"line_number":171,"context_line":"a `400 Bad Request`"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"Add a single tag on a server ::"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"1aca2d91_8887c7d6","line":171,"in_reply_to":"1aca2d91_8dcb6b53","updated":"2015-05-08 00:08:19.000000000","message":"Emm....actually I hope we have some hard-rules. Then we can reduce the time for people debate on the status code, that waste a lot of time....\n\n@Jay what would you think? Sorry, I\u0027m a little confuse on how to use guidelines.","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"6cef4a19070b03859b7c962d1cd60e49d684f876","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    }"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"},{"line_number":171,"context_line":"a `400 Bad Request`"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"Add a single tag on a server ::"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9af37de9_d59fecb2","line":171,"in_reply_to":"1aca2d91_f392959e","updated":"2015-05-10 02:32:48.000000000","message":"ok, will submit a review later.","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8305fade22fa23ae364582b7e726dd1bdf4a14ef","unresolved":false,"context_lines":[{"line_number":180,"context_line":"`204 No Content`"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"If the number of tags would exceed the per-server limit, shall return a"},{"line_number":183,"context_line":"`400 Bad Request`"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"Check if a tag exists or not on a server ::"},{"line_number":186,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"1aca2d91_7f6a3a1c","line":183,"range":{"start_line":183,"start_character":9,"end_line":183,"end_character":16},"updated":"2015-05-06 08:07:22.000000000","message":"ditto","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"cd2bfce0e51357a1a5c2f5c1daa46805d35d2fa2","unresolved":false,"context_lines":[{"line_number":339,"context_line":""},{"line_number":340,"context_line":"http://lists.openstack.org/pipermail/openstack-dev/2014-April/033222.html"},{"line_number":341,"context_line":"http://www.mail-archive.com/openstack-dev@lists.openstack.org/msg23310.html"},{"line_number":342,"context_line":"http://lists.openstack.org/pipermail/openstack-dev/2014-April/034004.html"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"Tagging guidelines:"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"3acd31a7_a131c00d","line":342,"updated":"2015-04-30 09:34:51.000000000","message":"Sorry my comment before was not very clear. I think we should remove the www.mail-archive.com link. I\u0027ll put a followup patch to avoid blocking this one.","commit_id":"32e684bda8200c504e7b6e7110f231618cb6c468"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"e5a56fe71666221613a484e9078219dda247b168","unresolved":false,"context_lines":[{"line_number":45,"context_line":"are being proposed. This is *specfically* for adding a new API for *normal"},{"line_number":46,"context_line":"users* to be able to tag their instances with simple strings."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Add a v2[.1] API microversion that allows a user to add, remove, and list tags"},{"line_number":49,"context_line":"for an instance."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Add a v2[.1] API microversion to allow searching for instances based on one"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a016987_7ee36034","line":48,"updated":"2015-05-26 12:52:35.000000000","message":"Nit: You could just call it a \"microversion\" :) \"v2[.1]\" is a bit confusing, and they\u0027re in-tree now.","commit_id":"6651dbdc91e2bc87d127b51ce8b54afc1a45e070"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"e5a56fe71666221613a484e9078219dda247b168","unresolved":false,"context_lines":[{"line_number":72,"context_line":"read by the virt drivers. In the REST API changes below, non-URL-safe"},{"line_number":73,"context_line":"characters in tags will need to be urlencoded if referred in the URI (for"},{"line_number":74,"context_line":"example, doing a DELETE /servers/{server}/tags/{tag}, the {tag} would need"},{"line_number":75,"context_line":"to be urlencoded."},{"line_number":76,"context_line":""},{"line_number":77,"context_line":".. note::"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a016987_de3934da","line":75,"updated":"2015-05-26 12:52:35.000000000","message":"You seem to have dropped this: )","commit_id":"6651dbdc91e2bc87d127b51ce8b54afc1a45e070"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"e5a56fe71666221613a484e9078219dda247b168","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    CREATE TABLE tags ("},{"line_number":91,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":92,"context_line":"        tag VARCHAR(80) NOT NULL CHARACTER SET utf8"},{"line_number":93,"context_line":"         COLLATION utf8_ci PRIMARY KEY"},{"line_number":94,"context_line":"    );"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a016987_3e3ba89e","line":92,"updated":"2015-05-26 12:52:35.000000000","message":"80?  I know it\u0027s arbitrary but we said 60 earlier.","commit_id":"6651dbdc91e2bc87d127b51ce8b54afc1a45e070"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"e5a56fe71666221613a484e9078219dda247b168","unresolved":false,"context_lines":[{"line_number":100,"context_line":"REST API impact"},{"line_number":101,"context_line":"---------------"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"This proposal would add a v2[.1] API microversion for retrieving and setting"},{"line_number":104,"context_line":"tags against an instance. In addition, it would add a API microversion to allow"},{"line_number":105,"context_line":"the searching/listing of instances based on one or more string tags."},{"line_number":106,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a016987_1e57cccb","line":103,"updated":"2015-05-26 12:52:35.000000000","message":"Nit, as above :)","commit_id":"6651dbdc91e2bc87d127b51ce8b54afc1a45e070"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"986c4f684dcee7147dc2e4dae7b762bf70cd48d6","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"},{"line_number":151,"context_line":"a `400 Bad Request`"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"Add a single tag on a server ::"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_ee5777c8","line":151,"updated":"2015-05-27 09:54:40.000000000","message":"here","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"fb212c9a7c3e2c15c8155f7ba172f4ee49a7bc81","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"},{"line_number":151,"context_line":"a `400 Bad Request`"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"Add a single tag on a server ::"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_b61ab86d","line":151,"in_reply_to":"7a016987_a62bb4ea","updated":"2015-05-28 15:50:58.000000000","message":"ok, saw it","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"b4520e5113be21a3e74135f39f31b765483e38f5","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"},{"line_number":151,"context_line":"a `400 Bad Request`"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"Add a single tag on a server ::"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_a62bb4ea","line":151,"in_reply_to":"7a016987_b011ca5f","updated":"2015-05-28 13:41:57.000000000","message":"According almost merged guidelines it should be 400 https://review.openstack.org/#/c/181784/8/guidelines/tags.rst","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"0469d62449cc9771040595746ec8e4b8645995a8","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    }"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"If the number of tags exceeds the limit of tags per server, shall return"},{"line_number":151,"context_line":"a `400 Bad Request`"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"Add a single tag on a server ::"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_b011ca5f","line":151,"in_reply_to":"7a016987_ee5777c8","updated":"2015-05-27 17:17:44.000000000","message":"error to be 403\nbecause of quota exceed?","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"0469d62449cc9771040595746ec8e4b8645995a8","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"Add a single tag on a server ::"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    PUT /servers/{server_id}/tags/{tag}"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"Returns `201 Created`."},{"line_number":158,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_90148e4d","line":155,"updated":"2015-05-27 17:17:44.000000000","message":"POST?","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"b4520e5113be21a3e74135f39f31b765483e38f5","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"Add a single tag on a server ::"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    PUT /servers/{server_id}/tags/{tag}"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"Returns `201 Created`."},{"line_number":158,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_c6e0f098","line":155,"in_reply_to":"7a016987_90148e4d","updated":"2015-05-28 13:41:57.000000000","message":"According tags guidelines it should be PUT. http://specs.openstack.org/openstack/api-wg/guidelines/tags.html#modifying-the-tag-list","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"986c4f684dcee7147dc2e4dae7b762bf70cd48d6","unresolved":false,"context_lines":[{"line_number":160,"context_line":"`204 No Content`"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"If the number of tags would exceed the per-server limit, shall return a"},{"line_number":163,"context_line":"`400 Bad Request`"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Check if a tag exists or not on a server ::"},{"line_number":166,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_8e6da39b","line":163,"updated":"2015-05-27 09:54:40.000000000","message":"here","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"0469d62449cc9771040595746ec8e4b8645995a8","unresolved":false,"context_lines":[{"line_number":235,"context_line":"    GET /servers?tags\u003dred,blue\u0026tags-any\u003dgreen,orange"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"The above example returns any servers that have the \"red\" and \"blue\" tags, plus"},{"line_number":238,"context_line":"at least one of \"green\" and \"orange\"."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"No change is needed to the JSON response for the `GET /servers/` call."},{"line_number":241,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_aba4bb07","line":238,"updated":"2015-05-27 17:17:44.000000000","message":"there might be some conflict for combination\ndo we need to mention how we handle it?","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"04adb21e4e18385bb494bdd45561cb5524356c16","unresolved":false,"context_lines":[{"line_number":235,"context_line":"    GET /servers?tags\u003dred,blue\u0026tags-any\u003dgreen,orange"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"The above example returns any servers that have the \"red\" and \"blue\" tags, plus"},{"line_number":238,"context_line":"at least one of \"green\" and \"orange\"."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"No change is needed to the JSON response for the `GET /servers/` call."},{"line_number":241,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_83f6388d","line":238,"in_reply_to":"7a016987_567a6489","updated":"2015-05-29 11:58:05.000000000","message":"I put it into spec","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"fb212c9a7c3e2c15c8155f7ba172f4ee49a7bc81","unresolved":false,"context_lines":[{"line_number":235,"context_line":"    GET /servers?tags\u003dred,blue\u0026tags-any\u003dgreen,orange"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"The above example returns any servers that have the \"red\" and \"blue\" tags, plus"},{"line_number":238,"context_line":"at least one of \"green\" and \"orange\"."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"No change is needed to the JSON response for the `GET /servers/` call."},{"line_number":241,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_567a6489","line":238,"in_reply_to":"7a016987_6a8b3a1f","updated":"2015-05-28 15:50:58.000000000","message":"yes, I won\u0027t against either case since both are reasonable\nput into spec?","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"b4520e5113be21a3e74135f39f31b765483e38f5","unresolved":false,"context_lines":[{"line_number":235,"context_line":"    GET /servers?tags\u003dred,blue\u0026tags-any\u003dgreen,orange"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"The above example returns any servers that have the \"red\" and \"blue\" tags, plus"},{"line_number":238,"context_line":"at least one of \"green\" and \"orange\"."},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"No change is needed to the JSON response for the `GET /servers/` call."},{"line_number":241,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a016987_6a8b3a1f","line":238,"in_reply_to":"7a016987_aba4bb07","updated":"2015-05-28 13:41:57.000000000","message":"Hmm. interesting comment. \n\nFor example we have the follow request:\n\n GET /servers?tags\u003dblue\u0026not-tags\u003dblue\n\nObviously it\u0027s a strange request.\n\nHere we have two variants:\n\n1) Do nothing and let nova to find these servers. Obviously there are no such servers and nova will return empty list.\n\n2) Return BadRequest.\n\nI think we should chose first variant because:\n\n * technically request was correct. It was illogical, but correct.\n * Getting a BadRequest when you trying to get some instances by GET request is a little bit strange.\n\nWhat do you think?","commit_id":"3211a7dba7c53cebd817850d474bcb91bf818e82"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"d9b3bde75b6d48c045c9398911dfd6f174915d2a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"------------"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Alternatives to simple string tagging are already available in Nova through"},{"line_number":58,"context_line":"the instance metadata key/value pairs API extension."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Data model impact"},{"line_number":61,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"5afe65bd_adba6621","line":58,"updated":"2015-06-04 06:28:58.000000000","message":"I would still like to see a *good* reason why this isn\u0027t sufficient.","commit_id":"a385a2ef1ae03c2168b4850e48dff8a0b6a81294"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"d3a10e59865713f4d02b51410901c68ffe9590ba","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Problem description"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"In most popular REST API interfaces, objects in the domain model can be"},{"line_number":20,"context_line":"\"tagged\" with zero or more simple strings. These strings may then be used"},{"line_number":21,"context_line":"to group and categorize objects in the domain model."},{"line_number":22,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"fa32b979_264d303e","line":19,"updated":"2015-06-23 17:50:35.000000000","message":"GCE tags do not have a value (https://cloud.google.com/sdk/gcloud/reference/compute/instances/add-tags)\n\nAWS tags have a value (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)\n\nAzure tags have a value (https://msdn.microsoft.com/en-us/library/azure/dn848362.aspx)\n\nI still think saying this is how everyone does it, is misleading.","commit_id":"dba7be8c5ac33e6e044a0739864ed0cc6e81613b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d91b83d079136a2d62fa834aeba1478379b938bf","unresolved":false,"context_lines":[{"line_number":42,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"No changes to existing metadata, system_metadata or extra_specs functionality"},{"line_number":45,"context_line":"are being proposed. This is *specfically* for adding a new API for *normal"},{"line_number":46,"context_line":"users* to be able to tag their instances with simple strings."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Add a API microversion that allows a user to add, remove, and list tags"}],"source_content_type":"text/x-rst","patch_set":11,"id":"fa32b979_18b492d2","line":45,"updated":"2015-06-26 01:09:22.000000000","message":"s/specfically/specifically/","commit_id":"dba7be8c5ac33e6e044a0739864ed0cc6e81613b"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"c761c2c3f00f9e52dca159d3fabc8a6a862e7a2a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"No changes to existing metadata, system_metadata or extra_specs functionality"},{"line_number":45,"context_line":"are being proposed. This is *specfically* for adding a new API for *normal"},{"line_number":46,"context_line":"users* to be able to tag their instances with simple strings."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Add a API microversion that allows a user to add, remove, and list tags"}],"source_content_type":"text/x-rst","patch_set":11,"id":"fa32b979_77636142","line":45,"in_reply_to":"fa32b979_18b492d2","updated":"2015-06-26 09:03:45.000000000","message":"Done","commit_id":"dba7be8c5ac33e6e044a0739864ed0cc6e81613b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d91b83d079136a2d62fa834aeba1478379b938bf","unresolved":false,"context_lines":[{"line_number":55,"context_line":"------------"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Alternatives to simple string tagging are already available in Nova through"},{"line_number":58,"context_line":"the instance metadata key/value pairs API extension. But it not quite right to"},{"line_number":59,"context_line":"use metadata for tagging. Tags are often confused with metadata. While the two"},{"line_number":60,"context_line":"have an intersection, the main function of tags is to classify a collection of"},{"line_number":61,"context_line":"entities in groups, while metadata is used to attach additional information to"}],"source_content_type":"text/x-rst","patch_set":11,"id":"fa32b979_b8c5663e","line":58,"updated":"2015-06-26 01:09:22.000000000","message":"s/it/it\u0027s/","commit_id":"dba7be8c5ac33e6e044a0739864ed0cc6e81613b"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"c761c2c3f00f9e52dca159d3fabc8a6a862e7a2a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"------------"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Alternatives to simple string tagging are already available in Nova through"},{"line_number":58,"context_line":"the instance metadata key/value pairs API extension. But it not quite right to"},{"line_number":59,"context_line":"use metadata for tagging. Tags are often confused with metadata. While the two"},{"line_number":60,"context_line":"have an intersection, the main function of tags is to classify a collection of"},{"line_number":61,"context_line":"entities in groups, while metadata is used to attach additional information to"}],"source_content_type":"text/x-rst","patch_set":11,"id":"fa32b979_1758d589","line":58,"in_reply_to":"fa32b979_b8c5663e","updated":"2015-06-26 09:03:45.000000000","message":"Done","commit_id":"dba7be8c5ac33e6e044a0739864ed0cc6e81613b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d91b83d079136a2d62fa834aeba1478379b938bf","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"The `nova.objects.instance.Instance` object would have a new `tags` field"},{"line_number":68,"context_line":"of type `nova.objects.fields.ListOfStrings` that would be populated on-demand"},{"line_number":69,"context_line":"(i.e. not eager-loaded)."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"A tag shall be defined as a Unicode bytestring no longer than 60 bytes in"},{"line_number":72,"context_line":"length. (This length is entirely arbitrary and could be reduced or expanded"}],"source_content_type":"text/x-rst","patch_set":11,"id":"fa32b979_58d9ba21","line":69,"updated":"2015-06-26 01:09:22.000000000","message":"In other words, lazy loaded (which is what the nova objects code calls it).","commit_id":"dba7be8c5ac33e6e044a0739864ed0cc6e81613b"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"c761c2c3f00f9e52dca159d3fabc8a6a862e7a2a","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"The `nova.objects.instance.Instance` object would have a new `tags` field"},{"line_number":68,"context_line":"of type `nova.objects.fields.ListOfStrings` that would be populated on-demand"},{"line_number":69,"context_line":"(i.e. not eager-loaded)."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"A tag shall be defined as a Unicode bytestring no longer than 60 bytes in"},{"line_number":72,"context_line":"length. (This length is entirely arbitrary and could be reduced or expanded"}],"source_content_type":"text/x-rst","patch_set":11,"id":"fa32b979_375dd979","line":69,"in_reply_to":"fa32b979_58d9ba21","updated":"2015-06-26 09:03:45.000000000","message":"Done","commit_id":"dba7be8c5ac33e6e044a0739864ed0cc6e81613b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d91b83d079136a2d62fa834aeba1478379b938bf","unresolved":false,"context_lines":[{"line_number":97,"context_line":"         COLLATION utf8_ci PRIMARY KEY"},{"line_number":98,"context_line":"    );"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"There shall be a new hard-coded limit of 50 for the number of tags a user can"},{"line_number":101,"context_line":"use on a server. No need to make this configurable or use the quota system at"},{"line_number":102,"context_line":"this point."},{"line_number":103,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"fa32b979_9824220f","line":100,"updated":"2015-06-26 01:09:22.000000000","message":"How about UniqueConstraint for a per-instance-tag combination?","commit_id":"dba7be8c5ac33e6e044a0739864ed0cc6e81613b"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"c761c2c3f00f9e52dca159d3fabc8a6a862e7a2a","unresolved":false,"context_lines":[{"line_number":97,"context_line":"         COLLATION utf8_ci PRIMARY KEY"},{"line_number":98,"context_line":"    );"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"There shall be a new hard-coded limit of 50 for the number of tags a user can"},{"line_number":101,"context_line":"use on a server. No need to make this configurable or use the quota system at"},{"line_number":102,"context_line":"this point."},{"line_number":103,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"fa32b979_37d4f9bb","line":100,"in_reply_to":"fa32b979_9824220f","updated":"2015-06-26 09:03:45.000000000","message":"Very good idea! Thanks","commit_id":"dba7be8c5ac33e6e044a0739864ed0cc6e81613b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6ff1dbdbb7527d2dd60a3911df6fa80a59a7d717","unresolved":false,"context_lines":[{"line_number":92,"context_line":"For the database schema, the following table constructs would suffice ::"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    CREATE TABLE tags ("},{"line_number":95,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":96,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":97,"context_line":"         COLLATION utf8_ci PRIMARY KEY"},{"line_number":98,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa32b979_18af992c","line":95,"updated":"2015-06-26 13:54:25.000000000","message":"Sorry, is the resource_id the instance uuid from the instances table?  Or is it just a randomly generated uuid?  I assume the former so you can actually tie tags and instances together without another bridge table using foreign keys.","commit_id":"1f457e007cc93132c5809744cd3c5f7c9cf61d32"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"5ed9c17d86d55fd1342eff1b9a75227c3d50c607","unresolved":false,"context_lines":[{"line_number":92,"context_line":"For the database schema, the following table constructs would suffice ::"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    CREATE TABLE tags ("},{"line_number":95,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":96,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":97,"context_line":"         COLLATION utf8_ci PRIMARY KEY"},{"line_number":98,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa32b979_b3ca4e19","line":95,"in_reply_to":"fa32b979_18af992c","updated":"2015-06-26 14:59:14.000000000","message":"resource_id is a uuid of a some resource :) I my case this is a instance uuid. In Juno, when this spec was Jay Pipes\u0027 spec, He planned to use this table not only for instance tags, but for tags of any resource in future. My instance tags just first resource witch use it. It was discussed in the last year in Juno/Kilo specs and in patches with codes. Moreover it\u0027s already in master. \n\nhttps://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/migrate_repo/versions/266_add_instance_tags.py","commit_id":"1f457e007cc93132c5809744cd3c5f7c9cf61d32"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6ff1dbdbb7527d2dd60a3911df6fa80a59a7d717","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":96,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":97,"context_line":"         COLLATION utf8_ci PRIMARY KEY"},{"line_number":98,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag)"},{"line_number":99,"context_line":"    );"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"There shall be a new hard-coded limit of 50 for the number of tags a user can"}],"source_content_type":"text/x-rst","patch_set":13,"id":"fa32b979_982f29a7","line":98,"updated":"2015-06-26 13:54:25.000000000","message":"Without a foreign key constraint with cascading deletes, what is going to happen with the tags associated with an instance when the instance is deleted?  I guess the instance isn\u0027t actually \u0027deleted\u0027 since it\u0027s soft-deleted, but I thought I remember seeing somewhere in the code changes for this that tags aren\u0027t soft deletable, so when they are deleted they are gone.  So what happens when I soft-delete an instance - are the associated tags deleted?  And then if I restore the previously soft-deleted instance, wouldn\u0027t the tags be gone and I\u0027d have to start over with building them up again?","commit_id":"1f457e007cc93132c5809744cd3c5f7c9cf61d32"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2b102349eb7a6aadcaaa245ce004a29fc94a188e","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":"Work Items"},{"line_number":303,"context_line":"----------"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"Changes would be made, in order, to:"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"1. the database API layer to add support for CRUD operations on instance tags"}],"source_content_type":"text/x-rst","patch_set":14,"id":"fa32b979_99b968ce","line":304,"updated":"2015-06-26 15:37:53.000000000","message":"You need to add a database migration to this list to update the tags table to make it soft-deletable now, right?  And update the model to inherit the SoftDeleteMixin.","commit_id":"530db330014ecec53e1d348093b0402ddda1f423"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"e4123124aa0cf1f202f20cfd471b9c95e63018f0","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":99,"context_line":"        deleted_at DATETIME,"},{"line_number":100,"context_line":"        deleted INT DEFAULT 0"},{"line_number":101,"context_line":"    );"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"There shall be a new hard-coded limit of 50 for the number of tags a user can"},{"line_number":104,"context_line":"use on a server. No need to make this configurable or use the quota system at"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba3cc151_58b11646","line":101,"updated":"2015-07-02 05:03:49.000000000","message":"Do we really want soft delete of tags? Especially if they\u0027re a user only concept?","commit_id":"3172d58636cf33f8f08d417163b35bb09cb731fa"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"aca548dcd1fbce3c5523cd8604e36ade5071f563","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":99,"context_line":"        deleted_at DATETIME,"},{"line_number":100,"context_line":"        deleted INT DEFAULT 0"},{"line_number":101,"context_line":"    );"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"There shall be a new hard-coded limit of 50 for the number of tags a user can"},{"line_number":104,"context_line":"use on a server. No need to make this configurable or use the quota system at"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba3cc151_a0e541dc","line":101,"in_reply_to":"ba3cc151_58b11646","updated":"2015-07-03 13:31:00.000000000","message":"IMHO, that\u0027s an implementation detail but agreed.","commit_id":"3172d58636cf33f8f08d417163b35bb09cb731fa"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d9bcf82bcafa961d86f330177daf44200cc4b21b","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":99,"context_line":"        deleted_at DATETIME,"},{"line_number":100,"context_line":"        deleted INT DEFAULT 0"},{"line_number":101,"context_line":"    );"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"There shall be a new hard-coded limit of 50 for the number of tags a user can"},{"line_number":104,"context_line":"use on a server. No need to make this configurable or use the quota system at"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ba3cc151_d730100a","line":101,"in_reply_to":"ba3cc151_a0e541dc","updated":"2015-07-06 16:15:10.000000000","message":"See the discussion in patch set 13:\n\nhttps://review.openstack.org/#/c/177112/13/specs/liberty/approved/tag-instances.rst","commit_id":"3172d58636cf33f8f08d417163b35bb09cb731fa"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"6fb51d42de6a7c4f64e3083c7130ad1e2f1203a6","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    DELETE /servers/{server_id}/tags"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Returns `204 No Content`."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"The API microversion that would allow searching/filtering of the `GET /servers`"},{"line_number":194,"context_line":"REST API call would add the following query parameters:"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa32b979_944dad9b","line":191,"updated":"2015-06-26 16:02:55.000000000","message":"These appear to be contradictory. If a server has no tags, and you call the above, you don\u0027t get a 404. But deleting a single tag that doesn\u0027t exist *does* return 404.\n\nDeleting a non-existent tag should return a 204, as per the API-WG guidelines; see https://review.openstack.org/#/c/179386/7/guidelines/http.rst,cmu","commit_id":"3172d58636cf33f8f08d417163b35bb09cb731fa"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"fc003b9230297ef9ce797c05ab5a1efe7a41979c","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    DELETE /servers/{server_id}/tags"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Returns `204 No Content`."},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"The API microversion that would allow searching/filtering of the `GET /servers`"},{"line_number":194,"context_line":"REST API call would add the following query parameters:"}],"source_content_type":"text/x-rst","patch_set":15,"id":"fa32b979_0f9f4651","line":191,"in_reply_to":"fa32b979_944dad9b","updated":"2015-06-26 16:16:24.000000000","message":"According API-WG tags guidelines it should return 404 http://specs.openstack.org/openstack/api-wg/guidelines/tags.html","commit_id":"3172d58636cf33f8f08d417163b35bb09cb731fa"}]}
