)]}'
{"specs/keystone/pike/project-tags.rst":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f3799134c7ca31f5770496a861f89b2147c816e0","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":""},{"line_number":8,"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\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":9,"context_line":"Allow keystone projects to have tags"},{"line_number":10,"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\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Blueprint `project-tags"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_efe672af","line":9,"updated":"2017-03-06 19:03:28.000000000","message":"nit: I\u0027d be fine shortening this to just Project Tags since the location of the spec implies it\u0027s happening within keystone.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c9e83c19f16b2c83ffc943ee853f0cf979eec7d1","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":""},{"line_number":8,"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\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":9,"context_line":"Allow keystone projects to have tags"},{"line_number":10,"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\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Blueprint `project-tags"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_e3b929cd","line":9,"in_reply_to":"ba2be162_efe672af","updated":"2017-03-06 20:26:42.000000000","message":"Sure!","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9f685f39cb2395d395bdcc8f5ff42a77c7af2907","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    CREATE TABLE `tags` ("},{"line_number":55,"context_line":"        `id`                     int(11) NOT NULL AUTO_INCREMENT,"},{"line_number":56,"context_line":"        `resource_id`            int(11) NOT NULL,"},{"line_number":57,"context_line":"        `name`                   varchar(80) NOT NULL,"},{"line_number":58,"context_line":"        `created_at`             timestamp NOT NULL,"},{"line_number":59,"context_line":"        `updated_at`             timestamp"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_163cab92","line":56,"range":{"start_line":56,"start_character":9,"end_line":56,"end_character":20},"updated":"2017-03-07 12:37:09.000000000","message":"We could use just \"project_id\" here, since a domain is also a project nowadays. However, I guess this is the default in other tables (like assignment).","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9f685f39cb2395d395bdcc8f5ff42a77c7af2907","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        `id`                     int(11) NOT NULL AUTO_INCREMENT,"},{"line_number":56,"context_line":"        `resource_id`            int(11) NOT NULL,"},{"line_number":57,"context_line":"        `name`                   varchar(80) NOT NULL,"},{"line_number":58,"context_line":"        `created_at`             timestamp NOT NULL,"},{"line_number":59,"context_line":"        `updated_at`             timestamp"},{"line_number":60,"context_line":"    )"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Add new API calls to interact with both project tags for basic CRUD"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_96c17b83","line":59,"range":{"start_line":58,"start_character":0,"end_line":59,"end_character":42},"updated":"2017-03-07 12:37:09.000000000","message":"why are these fields useful?","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9f685f39cb2395d395bdcc8f5ff42a77c7af2907","unresolved":false,"context_lines":[{"line_number":63,"context_line":"functionality."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. Note:: Tags will have the following restrictions:"},{"line_number":66,"context_line":"    * Tags are case sensitive"},{"line_number":67,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":68,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":69,"context_line":"    requests that specify lists of tags"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_16310ba3","line":67,"range":{"start_line":66,"start_character":0,"end_line":67,"end_character":44},"updated":"2017-03-07 12:37:09.000000000","message":"why? Could you elaborate here? (in the same way for the comma restriction below)","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"892fd77a2e4032c92a8845104330d3abc98c48a8","unresolved":false,"context_lines":[{"line_number":63,"context_line":"functionality."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. Note:: Tags will have the following restrictions:"},{"line_number":66,"context_line":"    * Tags are case sensitive"},{"line_number":67,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":68,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":69,"context_line":"    requests that specify lists of tags"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_ef1d70be","line":67,"range":{"start_line":66,"start_character":0,"end_line":67,"end_character":44},"in_reply_to":"9a30ddce_16310ba3","updated":"2017-03-07 16:22:49.000000000","message":"These were taken fron the API-WG\u0027s spec on tags:\n\nhttps://specs.openstack.org/openstack/api-wg/guidelines/tags.html#tags-restrictions","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"746911247eadc6bd65137e8db9ddebc1f2ab3cd6","unresolved":false,"context_lines":[{"line_number":63,"context_line":"functionality."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. Note:: Tags will have the following restrictions:"},{"line_number":66,"context_line":"    * Tags are case sensitive"},{"line_number":67,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":68,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":69,"context_line":"    requests that specify lists of tags"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_65e246a1","line":67,"range":{"start_line":66,"start_character":0,"end_line":67,"end_character":44},"in_reply_to":"9a30ddce_ef1d70be","updated":"2017-03-08 20:11:10.000000000","message":"Add the same note here or a reference to this spec.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9f685f39cb2395d395bdcc8f5ff42a77c7af2907","unresolved":false,"context_lines":[{"line_number":84,"context_line":"Projects"},{"line_number":85,"context_line":"--------"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"List all tags of a project"},{"line_number":88,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"**Request:** ``GET /v3/projects/{project_id}/tags``"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_d6c5b35b","line":87,"range":{"start_line":87,"start_character":0,"end_line":87,"end_character":26},"updated":"2017-03-07 12:37:09.000000000","message":"are the tags going to be returned for a default GET /v3/projects/\u003cproject_id\u003e call?\n\nthink you also need to elaborate here for the reasons to include or not the tags in the response.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"892fd77a2e4032c92a8845104330d3abc98c48a8","unresolved":false,"context_lines":[{"line_number":84,"context_line":"Projects"},{"line_number":85,"context_line":"--------"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"List all tags of a project"},{"line_number":88,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"**Request:** ``GET /v3/projects/{project_id}/tags``"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_82b04b8d","line":87,"range":{"start_line":87,"start_character":0,"end_line":87,"end_character":26},"in_reply_to":"9a30ddce_d6c5b35b","updated":"2017-03-07 16:22:49.000000000","message":"Yes, as they will be part of the project resource.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f3799134c7ca31f5770496a861f89b2147c816e0","unresolved":false,"context_lines":[{"line_number":116,"context_line":".. code:: JSON"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    {"},{"line_number":119,"context_line":"        \"id\": {project_id},"},{"line_number":120,"context_line":"        ..."},{"line_number":121,"context_line":"        \"tags\": [\"foo\", \"bar\"]"},{"line_number":122,"context_line":"    },"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_af163a56","line":119,"updated":"2017-03-06 19:03:28.000000000","message":"nit: this could be replaced with some example uuid\n\n  {\n      \"id\": \"c361f791503c4ca89c3baba06e4c0900\",\n      ...\n      \"tags\": ...\n  }\n  {\n      \"id\": \"8e88216a218c4d88a1d15065a82c2bf5\",\n      ...\n      \"tags\": ...\n  }","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c9e83c19f16b2c83ffc943ee853f0cf979eec7d1","unresolved":false,"context_lines":[{"line_number":116,"context_line":".. code:: JSON"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    {"},{"line_number":119,"context_line":"        \"id\": {project_id},"},{"line_number":120,"context_line":"        ..."},{"line_number":121,"context_line":"        \"tags\": [\"foo\", \"bar\"]"},{"line_number":122,"context_line":"    },"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_03e63de8","line":119,"in_reply_to":"ba2be162_af163a56","updated":"2017-03-06 20:26:42.000000000","message":"I\u0027ll clean this up to look like a real example","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9f685f39cb2395d395bdcc8f5ff42a77c7af2907","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    {"},{"line_number":119,"context_line":"        \"id\": {project_id},"},{"line_number":120,"context_line":"        ..."},{"line_number":121,"context_line":"        \"tags\": [\"foo\", \"bar\"]"},{"line_number":122,"context_line":"    },"},{"line_number":123,"context_line":"    {"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_d69cd36b","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":11},"updated":"2017-03-07 12:37:09.000000000","message":"this is supposed to represent other fields from the project?","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"892fd77a2e4032c92a8845104330d3abc98c48a8","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    {"},{"line_number":119,"context_line":"        \"id\": {project_id},"},{"line_number":120,"context_line":"        ..."},{"line_number":121,"context_line":"        \"tags\": [\"foo\", \"bar\"]"},{"line_number":122,"context_line":"    },"},{"line_number":123,"context_line":"    {"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_2fa6a8c1","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":11},"in_reply_to":"9a30ddce_d69cd36b","updated":"2017-03-07 16:22:49.000000000","message":"yeah","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f3799134c7ca31f5770496a861f89b2147c816e0","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    {"},{"line_number":144,"context_line":"        \"id\": {project_id},"},{"line_number":145,"context_line":"        ..."},{"line_number":146,"context_line":"        \"tags\": [\"blue\"]"},{"line_number":147,"context_line":"    },"},{"line_number":148,"context_line":"    {"},{"line_number":149,"context_line":"        \"id\": {project_id},"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_925ef910","line":146,"updated":"2017-03-06 19:03:28.000000000","message":"So, this response would be for the following request:\n\n  GET /v3/projects?not-tags\u003dblue,red","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c9e83c19f16b2c83ffc943ee853f0cf979eec7d1","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    {"},{"line_number":144,"context_line":"        \"id\": {project_id},"},{"line_number":145,"context_line":"        ..."},{"line_number":146,"context_line":"        \"tags\": [\"blue\"]"},{"line_number":147,"context_line":"    },"},{"line_number":148,"context_line":"    {"},{"line_number":149,"context_line":"        \"id\": {project_id},"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_c32985f4","line":146,"in_reply_to":"ba2be162_925ef910","updated":"2017-03-06 20:26:42.000000000","message":"Yeah this is a bit confusing, it should be:\n\nGET /v3/projects?not-tags\u003dfoo,bar","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9f685f39cb2395d395bdcc8f5ff42a77c7af2907","unresolved":false,"context_lines":[{"line_number":155,"context_line":"Check if a project contains a specified tag"},{"line_number":156,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"**Request:** ``HEAD /v3/projects/{project_id}/tags/{value}``"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"**Parameters**"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_16bbcbc5","line":158,"range":{"start_line":158,"start_character":15,"end_line":158,"end_character":19},"updated":"2017-03-07 12:37:09.000000000","message":"don\u0027t we have a similar GET equivalent? I find strange having a API with HEAD that doesn\u0027t have the equivalent with GET.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0acc42fb5c63b62e4780c7fd29309fca65cac7a6","unresolved":false,"context_lines":[{"line_number":155,"context_line":"Check if a project contains a specified tag"},{"line_number":156,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"**Request:** ``HEAD /v3/projects/{project_id}/tags/{value}``"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"**Parameters**"},{"line_number":161,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_a3353adb","line":158,"range":{"start_line":158,"start_character":15,"end_line":158,"end_character":19},"in_reply_to":"9a30ddce_16bbcbc5","updated":"2017-03-08 02:12:56.000000000","message":"I believe the equivalent GET call would be:\n\nGET /v3/projects/{project_id}/tags\n\nwhere you could specify \"tags\u003d{value}\" if you wanted.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9f685f39cb2395d395bdcc8f5ff42a77c7af2907","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"Creates the specified tag and adds it to the list in the project"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"**Request:** ``PATCH /v3/projects/{project_id}/tags/{value}``"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"**Parameters**"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_16302b56","line":175,"range":{"start_line":175,"start_character":15,"end_line":175,"end_character":20},"updated":"2017-03-07 12:37:09.000000000","message":"PATCH without providing a content body?\n\nyou use PATCH whenever you don\u0027t want to include the whole body to update an object (like you need to do with PUT). My idea of PATCH here would be the inclusion of a new tag but using a content body.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"892fd77a2e4032c92a8845104330d3abc98c48a8","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"Creates the specified tag and adds it to the list in the project"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"**Request:** ``PATCH /v3/projects/{project_id}/tags/{value}``"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"**Parameters**"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_ef4bb0ae","line":175,"range":{"start_line":175,"start_character":15,"end_line":175,"end_character":20},"in_reply_to":"9a30ddce_16302b56","updated":"2017-03-07 16:22:49.000000000","message":"Ah, yeah this should probably be a PUT then","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9f685f39cb2395d395bdcc8f5ff42a77c7af2907","unresolved":false,"context_lines":[{"line_number":208,"context_line":"Modifies the tags for a project. Any existing tags not"},{"line_number":209,"context_line":"specified won\u0027t be affected."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"**Request:** ``PATCH /v3/projects/{project_id}/tags``"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":".. code:: JSON"},{"line_number":214,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_d64693be","line":211,"range":{"start_line":211,"start_character":15,"end_line":211,"end_character":20},"updated":"2017-03-07 12:37:09.000000000","message":"here is a good example of PATCH, I would recommend to not have the other PATCH above.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f3799134c7ca31f5770496a861f89b2147c816e0","unresolved":false,"context_lines":[{"line_number":225,"context_line":""},{"line_number":226,"context_line":"Remove the specified tag from the project with the given id."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"**Request:** ``DELETE /v3/projects/{project_id}/{tag}``"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"**Parameters**"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_32c38d8c","line":228,"updated":"2017-03-06 19:03:28.000000000","message":"Wouldn\u0027t this be:\n\n  DELETE /v3/projects/{project_id}/tags/{tag}","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6d52f247307d71e2cba000f3a8553379ddbd2e9c","unresolved":false,"context_lines":[{"line_number":225,"context_line":""},{"line_number":226,"context_line":"Remove the specified tag from the project with the given id."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"**Request:** ``DELETE /v3/projects/{project_id}/{tag}``"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"**Parameters**"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_a5b499d4","line":228,"in_reply_to":"ba2be162_32c38d8c","updated":"2017-03-06 19:48:57.000000000","message":"++","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c9e83c19f16b2c83ffc943ee853f0cf979eec7d1","unresolved":false,"context_lines":[{"line_number":225,"context_line":""},{"line_number":226,"context_line":"Remove the specified tag from the project with the given id."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"**Request:** ``DELETE /v3/projects/{project_id}/{tag}``"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"**Parameters**"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_c377c506","line":228,"in_reply_to":"ba2be162_a5b499d4","updated":"2017-03-06 20:26:42.000000000","message":"yes, thanks for catching this","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9f685f39cb2395d395bdcc8f5ff42a77c7af2907","unresolved":false,"context_lines":[{"line_number":225,"context_line":""},{"line_number":226,"context_line":"Remove the specified tag from the project with the given id."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"**Request:** ``DELETE /v3/projects/{project_id}/{tag}``"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"**Parameters**"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_966a5b19","line":228,"in_reply_to":"ba2be162_c377c506","updated":"2017-03-07 12:37:09.000000000","message":"++\n\nthe deletion of a specific tag can be done via PUT, so I don\u0027t think we need to have a DELETE /v3/projects/\u003cproject_id\u003e/tags/\u003ctag\u003e","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"4bab1db5d1485191467a70bb0a424120ef721514","unresolved":false,"context_lines":[{"line_number":276,"context_line":"existing tags which could interfere with any administrative functions that"},{"line_number":277,"context_line":"these tags would be used for."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"Adding rules to ``policy.json`` to control role-based access to the API calls."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":".. code-block:: ini"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"da36d5c6_bc177443","line":279,"range":{"start_line":279,"start_character":0,"end_line":279,"end_character":78},"updated":"2017-02-26 07:13:04.000000000","message":"Since we are codifying policy in Pike, we should update this to use the same framework.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"6993c1962a6ab01ae6af470c48786365ac3ef629","unresolved":false,"context_lines":[{"line_number":276,"context_line":"existing tags which could interfere with any administrative functions that"},{"line_number":277,"context_line":"these tags would be used for."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"Adding rules to ``policy.json`` to control role-based access to the API calls."},{"line_number":280,"context_line":""},{"line_number":281,"context_line":".. code-block:: ini"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"da36d5c6_fc52cc11","line":279,"range":{"start_line":279,"start_character":0,"end_line":279,"end_character":78},"in_reply_to":"da36d5c6_bc177443","updated":"2017-02-26 07:22:11.000000000","message":"good point","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f3799134c7ca31f5770496a861f89b2147c816e0","unresolved":false,"context_lines":[{"line_number":281,"context_line":".. code-block:: ini"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"   \"identity:get_tags\": : \"rule:admin_or_owner\","},{"line_number":284,"context_line":"   \"identity:list_tags\": \"rule:admin_or_owner\","},{"line_number":285,"context_line":"   \"identity:create_tags\": \"rule:admin_required\","},{"line_number":286,"context_line":"   \"identity:update_tags\": \"rule:admin_required\","},{"line_number":287,"context_line":"   \"identity:delete_tags\": \"rule:admin_required\""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba2be162_f28015fa","line":284,"updated":"2017-03-06 19:03:28.000000000","message":"So members of a project will be able to get and list tags? This seems sensitive if tags are used for admin-like data (billing or accounting tags for example?).","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"28f7128e20a05e9fd1db9596cdc21e962cb84ca4","unresolved":false,"context_lines":[{"line_number":281,"context_line":".. code-block:: ini"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"   \"identity:get_tags\": : \"rule:admin_or_owner\","},{"line_number":284,"context_line":"   \"identity:list_tags\": \"rule:admin_or_owner\","},{"line_number":285,"context_line":"   \"identity:create_tags\": \"rule:admin_required\","},{"line_number":286,"context_line":"   \"identity:update_tags\": \"rule:admin_required\","},{"line_number":287,"context_line":"   \"identity:delete_tags\": \"rule:admin_required\""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_382be395","line":284,"in_reply_to":"9a30ddce_16658b44","updated":"2017-03-09 19:40:03.000000000","message":"I\u0027m inclined to say the opposite. If the primary usecase for tags is to make things easier for admins or operators, then I\u0027d suggest the default policy be tighter.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"14604696909836188dcd900c73805b09553e02ce","unresolved":false,"context_lines":[{"line_number":281,"context_line":".. code-block:: ini"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"   \"identity:get_tags\": : \"rule:admin_or_owner\","},{"line_number":284,"context_line":"   \"identity:list_tags\": \"rule:admin_or_owner\","},{"line_number":285,"context_line":"   \"identity:create_tags\": \"rule:admin_required\","},{"line_number":286,"context_line":"   \"identity:update_tags\": \"rule:admin_required\","},{"line_number":287,"context_line":"   \"identity:delete_tags\": \"rule:admin_required\""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_43e34c33","line":284,"in_reply_to":"9a30ddce_382be395","updated":"2017-03-09 19:43:45.000000000","message":"hmm how this conflicts with the regular \"get_project\" rule? Since the project object will return the tags...","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9f685f39cb2395d395bdcc8f5ff42a77c7af2907","unresolved":false,"context_lines":[{"line_number":281,"context_line":".. code-block:: ini"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"   \"identity:get_tags\": : \"rule:admin_or_owner\","},{"line_number":284,"context_line":"   \"identity:list_tags\": \"rule:admin_or_owner\","},{"line_number":285,"context_line":"   \"identity:create_tags\": \"rule:admin_required\","},{"line_number":286,"context_line":"   \"identity:update_tags\": \"rule:admin_required\","},{"line_number":287,"context_line":"   \"identity:delete_tags\": \"rule:admin_required\""}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a30ddce_16658b44","line":284,"in_reply_to":"ba2be162_f28015fa","updated":"2017-03-07 12:37:09.000000000","message":"++\n\nI would relax a bit the restrictions here.","commit_id":"ed51924dd0f38099bad1a769d34efd21163d7924"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3286a3f8bc9cb9e54ef5b59b59a6c2eb3ba237ae","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"Creates the specified tag and adds it to the list in the project"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"**Request:** ``PUT /v3/projects/{project_id}/tags/{value}``"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"**Parameters**"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"9a30ddce_20a03c90","line":219,"range":{"start_line":219,"start_character":15,"end_line":219,"end_character":57},"updated":"2017-03-08 20:11:01.000000000","message":"I think we should either provide PUT/PATCH /v3/projects/\u003cproject_id\u003e/tags with a body or PUT /v3/projects/\u003cproject_id\u003e/tags/\u003cvalue\u003e. I don\u0027t see the benefit of having both.","commit_id":"1f4186bc34c92f3a323720649e4b67d5e3043d03"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":63,"context_line":"functionality."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Tags will have the following restrictions as set by the"},{"line_number":66,"context_line":"API Working Group[1]_:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":".. Note::"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_9ecd6433","line":66,"updated":"2017-03-10 20:07:21.000000000","message":"I think we need a space between Group and [ here in order for the link to render properly (http://docs-draft.openstack.org/85/431785/7/check/gate-keystone-specs-docs-ubuntu-xenial/cf87145//doc/build/html/specs/keystone/pike/project-tags.html)","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1173d8191c26fd5ada1c6932ae4a638ad97de219","unresolved":false,"context_lines":[{"line_number":63,"context_line":"functionality."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Tags will have the following restrictions as set by the"},{"line_number":66,"context_line":"API Working Group[1]_:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":".. Note::"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_4caeb82e","line":66,"in_reply_to":"9a30ddce_9ecd6433","updated":"2017-03-13 16:20:15.000000000","message":"Done","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":85,"context_line":""},{"line_number":86,"context_line":"* ``project_id`` - The project ID."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"**Respone**"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":".. code:: JSON"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_5e53ec38","line":88,"updated":"2017-03-10 20:07:21.000000000","message":"Response*","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":96,"context_line":"Check if a project contains a specified tag"},{"line_number":97,"context_line":"-------------------------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"**Request:** ``HEAD /v3/projects/{project_id}/tags/{value}``"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"**Parameters**"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_9e500434","line":99,"updated":"2017-03-10 20:07:21.000000000","message":"According to the tag guidelines set by the API WG, this should be a GET.\n\n\n\"To check if a tag exists or not, the client should send a GET request to the individual tag URL. If the tag exists, the server responds with a status code 204 and no response body. If the tag does not exist, the server responds with a status code 404.\"\n\n\nhttps://specs.openstack.org/openstack/api-wg/guidelines/tags.html#addressing-individual-tags","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"71fc1639c473149d60dbd233fe080f3f4142b61f","unresolved":false,"context_lines":[{"line_number":96,"context_line":"Check if a project contains a specified tag"},{"line_number":97,"context_line":"-------------------------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"**Request:** ``HEAD /v3/projects/{project_id}/tags/{value}``"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"**Parameters**"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_a933b0f4","line":99,"in_reply_to":"9a30ddce_9e500434","updated":"2017-03-13 12:15:39.000000000","message":"++\n\nalthough I find strange having a GET returning 204.","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1173d8191c26fd5ada1c6932ae4a638ad97de219","unresolved":false,"context_lines":[{"line_number":96,"context_line":"Check if a project contains a specified tag"},{"line_number":97,"context_line":"-------------------------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"**Request:** ``HEAD /v3/projects/{project_id}/tags/{value}``"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"**Parameters**"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_b92e9440","line":99,"in_reply_to":"9a30ddce_9e500434","updated":"2017-03-13 16:20:15.000000000","message":"Ok, will do","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1173d8191c26fd5ada1c6932ae4a638ad97de219","unresolved":false,"context_lines":[{"line_number":96,"context_line":"Check if a project contains a specified tag"},{"line_number":97,"context_line":"-------------------------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"**Request:** ``HEAD /v3/projects/{project_id}/tags/{value}``"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"**Parameters**"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_b9d5b41c","line":99,"in_reply_to":"9a30ddce_a933b0f4","updated":"2017-03-13 16:20:15.000000000","message":"++","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":106,"context_line":"**Response**"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"   200 - Exists"},{"line_number":109,"context_line":"   404 - Does not exist"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Add single tag to a project"},{"line_number":112,"context_line":"---------------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_fed4a0ec","line":109,"updated":"2017-03-10 20:07:21.000000000","message":"These render as a single line, instead of a list. If we prepend them with * they should render as a list (if that was the desired outcome).","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1173d8191c26fd5ada1c6932ae4a638ad97de219","unresolved":false,"context_lines":[{"line_number":106,"context_line":"**Response**"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"   200 - Exists"},{"line_number":109,"context_line":"   404 - Does not exist"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Add single tag to a project"},{"line_number":112,"context_line":"---------------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_0c6f60fc","line":109,"in_reply_to":"9a30ddce_fed4a0ec","updated":"2017-03-13 16:20:15.000000000","message":"Yeah, was going for something like that.","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":123,"context_line":"**Response**"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"   201 - Created"},{"line_number":126,"context_line":"   404 - Project does not exist"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Modify tag list for a project"},{"line_number":129,"context_line":"-----------------------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_9e3724fe","line":126,"updated":"2017-03-10 20:07:21.000000000","message":"Convert to a list\n\n  * 201 - Created\n  * 404 - Project does not exist","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":142,"context_line":"**Parameters**"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"* ``project_id`` - The project ID."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"Delete single tag from project"},{"line_number":147,"context_line":"------------------------------"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_be11485f","line":145,"updated":"2017-03-10 20:07:21.000000000","message":"We should include a sample response here to be consistent with the other examples in this spec.","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1173d8191c26fd5ada1c6932ae4a638ad97de219","unresolved":false,"context_lines":[{"line_number":142,"context_line":"**Parameters**"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"* ``project_id`` - The project ID."},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"Delete single tag from project"},{"line_number":147,"context_line":"------------------------------"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_d9bfc8cd","line":145,"in_reply_to":"9a30ddce_be11485f","updated":"2017-03-13 16:20:15.000000000","message":"sure!","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":158,"context_line":"**Response**"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"   204 - Tags deleted"},{"line_number":161,"context_line":"   404 - Tag or Project was not found"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"Remove all tags from a project"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_de3d1cde","line":161,"updated":"2017-03-10 20:07:21.000000000","message":"Convert to a list","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":175,"context_line":"**Response**"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"   204 - Tags deleted"},{"line_number":178,"context_line":"   404 - Project was not found"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"Filtering and Searching by Tags"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_fe28209c","line":178,"updated":"2017-03-10 20:07:21.000000000","message":"Convert to a list","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"To request the list of projects that have two or more tags, the ``tags``"},{"line_number":215,"context_line":"argument should be set to the list of tags, separated by commas. In this"},{"line_number":216,"context_line":"situation, the tags given must all be present for an project to be included"},{"line_number":217,"context_line":"in the query result. Example will return all projects that have the ``foo``"},{"line_number":218,"context_line":"and ``bar`` tags:"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_c108e12a","line":216,"updated":"2017-03-10 20:07:21.000000000","message":"a*","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":214,"context_line":"To request the list of projects that have two or more tags, the ``tags``"},{"line_number":215,"context_line":"argument should be set to the list of tags, separated by commas. In this"},{"line_number":216,"context_line":"situation, the tags given must all be present for an project to be included"},{"line_number":217,"context_line":"in the query result. Example will return all projects that have the ``foo``"},{"line_number":218,"context_line":"and ``bar`` tags:"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":".. code-block:: bash"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_e1a7a508","line":217,"updated":"2017-03-10 20:07:21.000000000","message":"In the examples provided by the API WG, I\u0027d be inclined to use double quotes here instead of literals.\n\nhttps://specs.openstack.org/openstack/api-wg/guidelines/tags.html#filtering-and-searching-by-tags","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"9ec5648571f20b19be288335ef45e7bf59abf9e7","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":".. code-block:: ini"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"   \"identity:get_tags\": : \"rule:admin_or_owner\","},{"line_number":305,"context_line":"   \"identity:list_tags\": \"rule:admin_or_owner\","},{"line_number":306,"context_line":"   \"identity:create_tags\": \"rule:admin_required\","},{"line_number":307,"context_line":"   \"identity:update_tags\": \"rule:admin_required\","},{"line_number":308,"context_line":"   \"identity:delete_tags\": \"rule:admin_required\""},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_236bb886","line":308,"range":{"start_line":304,"start_character":0,"end_line":308,"end_character":48},"updated":"2017-03-09 19:45:33.000000000","message":"how will this be handled alongside the *_projects rules?","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a8ebc187fde76c68f554550f0ee4810746edcea0","unresolved":false,"context_lines":[{"line_number":305,"context_line":"   \"identity:list_tags\": \"rule:admin_or_owner\","},{"line_number":306,"context_line":"   \"identity:create_tags\": \"rule:admin_required\","},{"line_number":307,"context_line":"   \"identity:update_tags\": \"rule:admin_required\","},{"line_number":308,"context_line":"   \"identity:delete_tags\": \"rule:admin_required\""},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_e15a45f1","line":308,"in_reply_to":"9a30ddce_236bb886","updated":"2017-03-10 20:07:21.000000000","message":"Since the create and update project operations are admin only - I\u0027d be in favor of saying tags should be the same: \n\nhttps://github.com/openstack/keystone/blob/cd642d2d4e67f60712bbbac87d81ecfcae292fbb/etc/policy.json#L40-L41","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1173d8191c26fd5ada1c6932ae4a638ad97de219","unresolved":false,"context_lines":[{"line_number":305,"context_line":"   \"identity:list_tags\": \"rule:admin_or_owner\","},{"line_number":306,"context_line":"   \"identity:create_tags\": \"rule:admin_required\","},{"line_number":307,"context_line":"   \"identity:update_tags\": \"rule:admin_required\","},{"line_number":308,"context_line":"   \"identity:delete_tags\": \"rule:admin_required\""},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_6c929cf7","line":308,"in_reply_to":"9a30ddce_2eb5067d","updated":"2017-03-13 16:20:15.000000000","message":"Probably should just follow the rules for /v3/projects so we don\u0027t conflict.","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"71fc1639c473149d60dbd233fe080f3f4142b61f","unresolved":false,"context_lines":[{"line_number":305,"context_line":"   \"identity:list_tags\": \"rule:admin_or_owner\","},{"line_number":306,"context_line":"   \"identity:create_tags\": \"rule:admin_required\","},{"line_number":307,"context_line":"   \"identity:update_tags\": \"rule:admin_required\","},{"line_number":308,"context_line":"   \"identity:delete_tags\": \"rule:admin_required\""},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_2eb5067d","line":308,"in_reply_to":"9a30ddce_e15a45f1","updated":"2017-03-13 12:15:39.000000000","message":"Also... We have a rule that controls GET /v3/projects/\u003cproject_id\u003e and another rule that controls /v3/projects/\u003cproject_id\u003e/tags.\n\nWe are no longer returning the tags in the regular GET project call, correct? Otherwise we would have both rules conflicting.","commit_id":"f622adc76cf559310cd78c676fbba6d783f25f35"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a60c153b32cb9e6a3d383c9e90816e06cadabea6","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":".. code:: SQL"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    CREATE TABLE `tags` ("},{"line_number":55,"context_line":"        `id`                     int(11) NOT NULL AUTO_INCREMENT,"},{"line_number":56,"context_line":"        `project_id`             int(11) NOT NULL,"},{"line_number":57,"context_line":"        `name`                   varchar(80) NOT NULL"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Add tags field as part of default response when listing projects."},{"line_number":61,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a30ddce_4f6b0a1e","line":58,"range":{"start_line":54,"start_character":0,"end_line":58,"end_character":5},"updated":"2017-03-13 16:40:26.000000000","message":"why int(11) for project_id.\n\nWhy is this a new SQL table instead of using the resource_option code [as implemented for users, can be implemented for project(S) easily].","commit_id":"6f8c28d717eca5871bf03b2f65238887b5df010b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"2647e4086ca7eb3c1bcd7f69a3f614fa55e7fc28","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":".. code:: SQL"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    CREATE TABLE `tags` ("},{"line_number":55,"context_line":"        `id`                     int(11) NOT NULL AUTO_INCREMENT,"},{"line_number":56,"context_line":"        `project_id`             int(11) NOT NULL,"},{"line_number":57,"context_line":"        `name`                   varchar(80) NOT NULL"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Add tags field as part of default response when listing projects."},{"line_number":61,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a25e98e_afc0f9e1","line":58,"range":{"start_line":54,"start_character":0,"end_line":58,"end_character":5},"in_reply_to":"7a25e98e_462f72a1","updated":"2017-03-13 19:23:08.000000000","message":"Yeah, as long as we can get indexing/filtering and the security parts implemented, it would probably be better to go this route. Putting this in a resource_options table vs a separate tags table.","commit_id":"6f8c28d717eca5871bf03b2f65238887b5df010b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"cfa0ee219e92b2db166b3c91b36e281c9a5e3ebb","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":".. code:: SQL"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    CREATE TABLE `tags` ("},{"line_number":55,"context_line":"        `id`                     int(11) NOT NULL AUTO_INCREMENT,"},{"line_number":56,"context_line":"        `project_id`             int(11) NOT NULL,"},{"line_number":57,"context_line":"        `name`                   varchar(80) NOT NULL"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Add tags field as part of default response when listing projects."},{"line_number":61,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a25e98e_462f72a1","line":58,"range":{"start_line":54,"start_character":0,"end_line":58,"end_character":5},"in_reply_to":"9a30ddce_0adf403a","updated":"2017-03-13 18:03:42.000000000","message":"Take a look at the user resource_options. It\u0027s not meeting 100% of your needs, but it is slated to do so in the not-too-far-off.\n\nA couple things missing at the moment are the indexing/filtering on options *and* the security for each option to be set. It shouldn\u0027t be a ton of work to add both capabilities to resource_options as we apply it to projects.","commit_id":"6f8c28d717eca5871bf03b2f65238887b5df010b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"8b1eb5b47f33f5f824e8576fa0d339686d0fcf2e","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":".. code:: SQL"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    CREATE TABLE `tags` ("},{"line_number":55,"context_line":"        `id`                     int(11) NOT NULL AUTO_INCREMENT,"},{"line_number":56,"context_line":"        `project_id`             int(11) NOT NULL,"},{"line_number":57,"context_line":"        `name`                   varchar(80) NOT NULL"},{"line_number":58,"context_line":"    )"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Add tags field as part of default response when listing projects."},{"line_number":61,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a30ddce_0adf403a","line":58,"range":{"start_line":54,"start_character":0,"end_line":58,"end_character":5},"in_reply_to":"9a30ddce_4f6b0a1e","updated":"2017-03-13 16:52:36.000000000","message":"I\u0027m not entirely familiar with resource_options, but I\u0027ll take a look and I\u0027m open for using that if it would be better.","commit_id":"6f8c28d717eca5871bf03b2f65238887b5df010b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a60c153b32cb9e6a3d383c9e90816e06cadabea6","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":".. Note::"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    * Tags are case sensitive"},{"line_number":71,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":72,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":73,"context_line":"      requests that specify lists of tags"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a30ddce_4f006a34","line":70,"range":{"start_line":70,"start_character":6,"end_line":70,"end_character":29},"updated":"2017-03-13 16:40:26.000000000","message":"Why are tags case sensitive?\n\nI would prefer to see them be case-preserving, but case insensitive.","commit_id":"6f8c28d717eca5871bf03b2f65238887b5df010b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"64f74551def145c8ef51ed9c7321ed1b79f21ec7","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":".. Note::"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    * Tags are case sensitive"},{"line_number":71,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":72,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":73,"context_line":"      requests that specify lists of tags"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a25e98e_c6d0c2cc","line":70,"range":{"start_line":70,"start_character":6,"end_line":70,"end_character":29},"in_reply_to":"9a30ddce_4f006a34","updated":"2017-03-13 18:00:18.000000000","message":"These are from the API Working Group spec, deviating from the case sensitivity part would probably be ok though. Definitely want to preserve case.","commit_id":"6f8c28d717eca5871bf03b2f65238887b5df010b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a60c153b32cb9e6a3d383c9e90816e06cadabea6","unresolved":false,"context_lines":[{"line_number":65,"context_line":"Tags will have the following restrictions as set by the"},{"line_number":66,"context_line":"API Working Group [1]_:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":".. Note::"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    * Tags are case sensitive"},{"line_number":71,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":72,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":73,"context_line":"      requests that specify lists of tags"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"New API Calls"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a30ddce_2fded6dc","line":73,"range":{"start_line":68,"start_character":0,"end_line":73,"end_character":41},"updated":"2017-03-13 16:40:26.000000000","message":"Please provide something more aligned with an RFC form for what is and is not allowed, or an explicit regex. It would be much easier to follow / implement.","commit_id":"6f8c28d717eca5871bf03b2f65238887b5df010b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"64f74551def145c8ef51ed9c7321ed1b79f21ec7","unresolved":false,"context_lines":[{"line_number":65,"context_line":"Tags will have the following restrictions as set by the"},{"line_number":66,"context_line":"API Working Group [1]_:"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":".. Note::"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    * Tags are case sensitive"},{"line_number":71,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":72,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":73,"context_line":"      requests that specify lists of tags"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"New API Calls"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a25e98e_06dbbaee","line":73,"range":{"start_line":68,"start_character":0,"end_line":73,"end_character":41},"in_reply_to":"9a30ddce_2fded6dc","updated":"2017-03-13 18:00:18.000000000","message":"will do!","commit_id":"6f8c28d717eca5871bf03b2f65238887b5df010b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a60c153b32cb9e6a3d383c9e90816e06cadabea6","unresolved":false,"context_lines":[{"line_number":303,"context_line":"     For larger scale deployments with many temporary projects that are"},{"line_number":304,"context_line":"     regularly purged, this is both clumsy and difficult to maintain."},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"2. Store the tags in ``extra`` column."},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"   * Pro: No additional SQL table modification is needed."},{"line_number":309,"context_line":"   * Con: The ``extra`` column currently stores some ancillary data,"},{"line_number":310,"context_line":"     e.g. user\u0027s email address. Allowing the API to modify this data"},{"line_number":311,"context_line":"     may cause conflicts. There is not a standard API way to manipulate"},{"line_number":312,"context_line":"     this data and the data is not indexed. Security issues are also a"},{"line_number":313,"context_line":"     concern if there is a desire to limit who has access to this."},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"3. Use a naming schema for projects to categorize them."},{"line_number":316,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a30ddce_ef6bdeee","line":313,"range":{"start_line":306,"start_character":0,"end_line":313,"end_character":66},"updated":"2017-03-13 16:40:26.000000000","message":"This should never ever even be an option.\n\n\nTags are either public info or not, please do not wave hands around \"who has access to these\". It should not be a security issue at all. Please drop \"security\" concerns. Keep in mind resource_options will eventually (slated for code soon) have the ability to be given their own policy entry [each option].\n\n\nSee above question regarding resource_option code.","commit_id":"6f8c28d717eca5871bf03b2f65238887b5df010b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"8b1eb5b47f33f5f824e8576fa0d339686d0fcf2e","unresolved":false,"context_lines":[{"line_number":303,"context_line":"     For larger scale deployments with many temporary projects that are"},{"line_number":304,"context_line":"     regularly purged, this is both clumsy and difficult to maintain."},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"2. Store the tags in ``extra`` column."},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"   * Pro: No additional SQL table modification is needed."},{"line_number":309,"context_line":"   * Con: The ``extra`` column currently stores some ancillary data,"},{"line_number":310,"context_line":"     e.g. user\u0027s email address. Allowing the API to modify this data"},{"line_number":311,"context_line":"     may cause conflicts. There is not a standard API way to manipulate"},{"line_number":312,"context_line":"     this data and the data is not indexed. Security issues are also a"},{"line_number":313,"context_line":"     concern if there is a desire to limit who has access to this."},{"line_number":314,"context_line":""},{"line_number":315,"context_line":"3. Use a naming schema for projects to categorize them."},{"line_number":316,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a30ddce_4aa13893","line":313,"range":{"start_line":306,"start_character":0,"end_line":313,"end_character":66},"in_reply_to":"9a30ddce_ef6bdeee","updated":"2017-03-13 16:52:36.000000000","message":"\"This should never ever even be an option.\"\n++\n\nresource_option is interesting, if it\u0027s better to do it that way (which is what it looks like if it will have it\u0027s own policy enforcement), then that is probably the better route to take.","commit_id":"6f8c28d717eca5871bf03b2f65238887b5df010b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"977c5db3d59dbaf2f36704fdaec6e9bfb6c6d09f","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Currently, in order to be able to mark or tag a project within keystone"},{"line_number":26,"context_line":"that operator/administrator either must utilize the extras field to associate"},{"line_number":27,"context_line":"any specified markers for that project. This extras field is not clearly"},{"line_number":28,"context_line":"defined and does not provide a API standard way to retrieve nor index"},{"line_number":29,"context_line":"this data."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a25e98e_cd353af8","line":27,"updated":"2017-03-13 21:40:08.000000000","message":"The opening sentence here reads a little strange and I think it is because of the use of \"either\". Maybe something like:\n\nToday, operators must rely on naming conventions or the extras implementation in order to tag or categorize projects within keystone.","commit_id":"3b7487da285de50bd7092d2e2eb2184ed2e86eea"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"977c5db3d59dbaf2f36704fdaec6e9bfb6c6d09f","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"* Utilize the resource_options table for projects, adding a `tags` field"},{"line_number":51,"context_line":"  within a project\u0027s `options` structure. This `tags` will consist of"},{"line_number":52,"context_line":"  an array of simple strings."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":55,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a25e98e_901a796d","line":52,"updated":"2017-03-13 21:40:08.000000000","message":"Just double checking, but is this an indexable approach?","commit_id":"3b7487da285de50bd7092d2e2eb2184ed2e86eea"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"977c5db3d59dbaf2f36704fdaec6e9bfb6c6d09f","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":".. Note::"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    * Tags are not case sensitive, but case-preserving"},{"line_number":65,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":66,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":67,"context_line":"      requests that specify lists of tags"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a25e98e_d0edd126","line":64,"updated":"2017-03-13 21:40:08.000000000","message":"I\u0027m OK with deviating if we have a valid reason to do so. If we deviate from the API WG guideline here, we should clearly state why.","commit_id":"3b7487da285de50bd7092d2e2eb2184ed2e86eea"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"977c5db3d59dbaf2f36704fdaec6e9bfb6c6d09f","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"Creates the specified tag and adds it to the list in the project"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"**Request:** ``PUT /v3/projects/{project_id}/tags/{value}``"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"**Parameters**"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a25e98e_304b852d","line":116,"updated":"2017-03-13 21:40:08.000000000","message":"We could update this with an example like we do with the others. I find the examples useful, especially for the calls that have a non-204 return code.","commit_id":"3b7487da285de50bd7092d2e2eb2184ed2e86eea"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"977c5db3d59dbaf2f36704fdaec6e9bfb6c6d09f","unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"To request the list of projects that have a single tag, `tags` argument"},{"line_number":236,"context_line":"should be set to the desired tag name. Example will return all projects"},{"line_number":237,"context_line":"with the `foo` tag:"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":".. code-block:: bash"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a25e98e_10e20904","line":237,"updated":"2017-03-13 21:40:08.000000000","message":"Some examples here use \" and some use `, which either treats foo as \"foo\" or a literal. I\u0027d be in favor of using \" since that\u0027s what the API WG uses in their examples.","commit_id":"3b7487da285de50bd7092d2e2eb2184ed2e86eea"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"977c5db3d59dbaf2f36704fdaec6e9bfb6c6d09f","unresolved":false,"context_lines":[{"line_number":251,"context_line":"   GET /v3/projects?tags\u003dfoo,bar"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"To request the list of projects that have one OR more of a list of given"},{"line_number":254,"context_line":"tags, the `tags-any` argument should be set to the list of tags, separated"},{"line_number":255,"context_line":"by commas. In this situation as long as one of the given tags is present,"},{"line_number":256,"context_line":"the project will be included in the query result. Example that returns the"},{"line_number":257,"context_line":"projects that have the “foo” OR “bar” tag:"}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a25e98e_d0beb1d3","line":254,"updated":"2017-03-13 21:40:08.000000000","message":"I think this is a good use of literals in these examples.","commit_id":"3b7487da285de50bd7092d2e2eb2184ed2e86eea"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"977c5db3d59dbaf2f36704fdaec6e9bfb6c6d09f","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":"The `tags`, `tags-any`, `not-tags` and `not-tags-any` arguments can"},{"line_number":285,"context_line":"be combined to build more complex queries. Example that returns any projects"},{"line_number":286,"context_line":"that have the “foo” and “bar” tags, plus at least one of “red” and “blue”."},{"line_number":287,"context_line":""},{"line_number":288,"context_line":".. code-block:: bash"},{"line_number":289,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a25e98e_70c89d75","line":286,"updated":"2017-03-13 21:40:08.000000000","message":"++\n\nThis is how the API WG references their examples. I\u0027m all for maintaining consistency.","commit_id":"3b7487da285de50bd7092d2e2eb2184ed2e86eea"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"977c5db3d59dbaf2f36704fdaec6e9bfb6c6d09f","unresolved":false,"context_lines":[{"line_number":324,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"Typically, only the project admin should be able to create/edit the tags"},{"line_number":327,"context_line":"for a project. This is to avoid allowing unauthorized users to change any"},{"line_number":328,"context_line":"existing tags which could interfere with any administrative functions that"},{"line_number":329,"context_line":"these tags would be used for. The roles for tags will follow the roles set"},{"line_number":330,"context_line":"for /v3/projects."}],"source_content_type":"text/x-rst","patch_set":9,"id":"7a25e98e_70db3d1c","line":327,"updated":"2017-03-13 21:40:08.000000000","message":"nit: This keeps unprivileged users from viewing or changing any existing tags, which could possibly denote administrative functions.\n\nI prefer the wording around unprivileged because someone could be authenticated but not authorized to view or edit tags (i.e. I\u0027m a member of a project but not an admin of a project - so I probably shouldn\u0027t be able to see billing information tagged to the project).","commit_id":"3b7487da285de50bd7092d2e2eb2184ed2e86eea"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"d45316bb3cfb1ddb77b5b09b72d5ffebf0b1b018","unresolved":false,"context_lines":[{"line_number":46,"context_line":"Proposed Changes"},{"line_number":47,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Utilize the resource_options table for projects, adding a `tags` field"},{"line_number":50,"context_line":"  within a project\u0027s `options` structure. This `tags` will consist of"},{"line_number":51,"context_line":"  an array of simple strings."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":54,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"7a25e98e_83aa316f","line":51,"range":{"start_line":49,"start_character":0,"end_line":51,"end_character":29},"updated":"2017-03-13 22:05:09.000000000","message":"Not quite sure if/how this will be index-able, might need to tweak this a bit.","commit_id":"3bf6e590eddddb1fcb8bf07fd1d512084d007545"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1dc787a01eaa4e8974944dff0ca5bc9c3b6b3fbb","unresolved":false,"context_lines":[{"line_number":53,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* Add new API calls to interact with both project tags for basic CRUD"},{"line_number":56,"context_line":"  functionality."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Tags will have the following restrictions as set by the API Working"},{"line_number":59,"context_line":"Group [1]_:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"3a1ff146_d3b5de7e","line":56,"updated":"2017-03-14 15:57:41.000000000","message":"The API WG makes a reference to the number of tags a resource can have. Are we going to implement that in keystone and if so - what does that look like? Is it going to be a configuration option? Is is going to be built into resource_options? Will it have its own API?","commit_id":"3bf6e590eddddb1fcb8bf07fd1d512084d007545"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"0dc9fb801c21607382f9f44cc8b1e1f7e00e67bd","unresolved":false,"context_lines":[{"line_number":53,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* Add new API calls to interact with both project tags for basic CRUD"},{"line_number":56,"context_line":"  functionality."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Tags will have the following restrictions as set by the API Working"},{"line_number":59,"context_line":"Group [1]_:"}],"source_content_type":"text/x-rst","patch_set":10,"id":"3a1ff146_f91631a6","line":56,"in_reply_to":"3a1ff146_d3b5de7e","updated":"2017-03-14 20:28:58.000000000","message":"I\u0027m fine with specifying the number in the json schema like nova does:\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/kilo/approved/tag-instances.html#rest-api-impact","commit_id":"3bf6e590eddddb1fcb8bf07fd1d512084d007545"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1dc787a01eaa4e8974944dff0ca5bc9c3b6b3fbb","unresolved":false,"context_lines":[{"line_number":110,"context_line":"**Response**"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* 204 - No Content"},{"line_number":113,"context_line":"* 404 - Does not exist"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"Add single tag to a project"},{"line_number":116,"context_line":"---------------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"3a1ff146_53dbae1b","line":113,"updated":"2017-03-14 15:57:41.000000000","message":"Tag or project does not exist*","commit_id":"3bf6e590eddddb1fcb8bf07fd1d512084d007545"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1dc787a01eaa4e8974944dff0ca5bc9c3b6b3fbb","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"**Response**"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"* 200 - OK"},{"line_number":132,"context_line":"* 404 - Project does not exist"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"**Response Body**"}],"source_content_type":"text/x-rst","patch_set":10,"id":"3a1ff146_53ad6e87","line":131,"updated":"2017-03-14 15:57:41.000000000","message":"According to the API WG guidelines, this should return a 201 and no body: \n\nhttps://specs.openstack.org/openstack/api-wg/guidelines/tags.html#addressing-individual-tags","commit_id":"3bf6e590eddddb1fcb8bf07fd1d512084d007545"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1dc787a01eaa4e8974944dff0ca5bc9c3b6b3fbb","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"**Response Body**"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":".. code:: json"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"   {"},{"line_number":139,"context_line":"       \"links\": {"}],"source_content_type":"text/x-rst","patch_set":10,"id":"3a1ff146_73c18a2e","line":136,"updated":"2017-03-14 15:57:41.000000000","message":"according to the API WG guidelines, this is suppose to return no body, but it should contain a Location header with the URL of the new tag.\n\n  **Response Body**\n    Location: http://identity:5000/v3/projects/3d4c2c82bd5948f0bcab0cf3a7c9b48c/tags/red\n    \u003cno body\u003e","commit_id":"3bf6e590eddddb1fcb8bf07fd1d512084d007545"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"fc43075760236907cdf69d5755d5a45bed48d7f5","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":67,"context_line":"      requests that specify lists of tags"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"A regex example that is matching anything invalid would be:"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":".. code-block:: bash"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a1ced50_dff10c6c","line":69,"range":{"start_line":69,"start_character":0,"end_line":69,"end_character":59},"updated":"2017-03-20 12:57:48.000000000","message":"what is this referring to? I guess it is a \"regex\" to validate tags according to the rules above? So I guess this would be inside the \"Note\" block or you should create a block for the restrictions.","commit_id":"17bb390e0a8b9f7e2719f7f95e3408ac0f57affd"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"6a67a8cfdd6f336d818e971dbebfafa83693a6a3","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":67,"context_line":"      requests that specify lists of tags"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"A regex example that is matching anything invalid would be:"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":".. code-block:: bash"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a1ced50_b59aac61","line":69,"range":{"start_line":69,"start_character":0,"end_line":69,"end_character":59},"in_reply_to":"1a1ced50_dff10c6c","updated":"2017-03-20 15:25:51.000000000","message":"I could add this to the above note block, that would probably be clearer.","commit_id":"17bb390e0a8b9f7e2719f7f95e3408ac0f57affd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0c85746b43c16185d525f4bb94856948b67c4542","unresolved":false,"context_lines":[{"line_number":82,"context_line":"       \"items\": {"},{"line_number":83,"context_line":"           \"$ref\": \"#/definitions/tag\""},{"line_number":84,"context_line":"       },"},{"line_number":85,"context_line":"       \"maxItems\": 50,"},{"line_number":86,"context_line":"       \"definitions\": {"},{"line_number":87,"context_line":"           \"tag\": {"},{"line_number":88,"context_line":"               \"type\": \"string\","}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a1ced50_ed964b93","line":85,"updated":"2017-03-17 20:36:36.000000000","message":"This is limiting the total number of tags sent per request. What if I send a request adding 25 unique tags to a project and another request with another 30 unique tags to the same project?\n\nShould we have a total limit for the number of tags a project can have? What does that look like and how does an operator use it?","commit_id":"17bb390e0a8b9f7e2719f7f95e3408ac0f57affd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"27444d83308cf72b0d6fc5cfdbeef25b8067d3ce","unresolved":false,"context_lines":[{"line_number":82,"context_line":"       \"items\": {"},{"line_number":83,"context_line":"           \"$ref\": \"#/definitions/tag\""},{"line_number":84,"context_line":"       },"},{"line_number":85,"context_line":"       \"maxItems\": 50,"},{"line_number":86,"context_line":"       \"definitions\": {"},{"line_number":87,"context_line":"           \"tag\": {"},{"line_number":88,"context_line":"               \"type\": \"string\","}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a1ced50_9ef22d6e","line":85,"in_reply_to":"1a1ced50_35af9c82","updated":"2017-03-20 16:17:39.000000000","message":"I should have been more descriptive in my last comment. The way I see it, we can limit tags in two ways. The first is to limit the number of tags that can be sent in a single request (i.e. which is easily done using jsonschema as shown here). The second is to limit the total number of tags a project can have. For example, if a project is already has 50 tags persisted in the database, should be let it have another 50 tags? Is this a limit we need to enforce?\n\nThe proposed change here addresses the number of tags you can have in a single request, but it doesn\u0027t limit the number of total tags a project can have.\n\nI\u0027ve read the guidelines, but I don\u0027t think that is something that is explicitly called out. Maybe we should follow up with someone from the API WG to double check.","commit_id":"17bb390e0a8b9f7e2719f7f95e3408ac0f57affd"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"6a67a8cfdd6f336d818e971dbebfafa83693a6a3","unresolved":false,"context_lines":[{"line_number":82,"context_line":"       \"items\": {"},{"line_number":83,"context_line":"           \"$ref\": \"#/definitions/tag\""},{"line_number":84,"context_line":"       },"},{"line_number":85,"context_line":"       \"maxItems\": 50,"},{"line_number":86,"context_line":"       \"definitions\": {"},{"line_number":87,"context_line":"           \"tag\": {"},{"line_number":88,"context_line":"               \"type\": \"string\","}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a1ced50_35af9c82","line":85,"in_reply_to":"1a1ced50_ed964b93","updated":"2017-03-20 15:25:51.000000000","message":"ah, good point, I\u0027ll clean this up.","commit_id":"17bb390e0a8b9f7e2719f7f95e3408ac0f57affd"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"fc43075760236907cdf69d5755d5a45bed48d7f5","unresolved":false,"context_lines":[{"line_number":134,"context_line":"* 204 - No Content"},{"line_number":135,"context_line":"* 404 - Tag or Project does not exist"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"Add single tag to a project"},{"line_number":138,"context_line":"---------------------------"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Creates the specified tag and adds it to the list in the project"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a1ced50_df1bcc7e","line":137,"range":{"start_line":137,"start_character":0,"end_line":137,"end_character":27},"updated":"2017-03-20 12:57:48.000000000","message":"I don\u0027t think we should provide two APIs using PUT. If we want to add one tag to a project, we can use \"PATCH /v3/projects/{project_id}/tags\" passing the desired tag.","commit_id":"17bb390e0a8b9f7e2719f7f95e3408ac0f57affd"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"98ebb2db34d41a3c2d71a2a3085c4dff7d91edba","unresolved":false,"context_lines":[{"line_number":134,"context_line":"* 204 - No Content"},{"line_number":135,"context_line":"* 404 - Tag or Project does not exist"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"Add single tag to a project"},{"line_number":138,"context_line":"---------------------------"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Creates the specified tag and adds it to the list in the project"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a1ced50_983b259c","line":137,"range":{"start_line":137,"start_character":0,"end_line":137,"end_character":27},"in_reply_to":"1a1ced50_d548088a","updated":"2017-03-20 15:32:03.000000000","message":"yeah, that\u0027s the reason. If it is what was approved in the API-WG spec, we should stick to it.","commit_id":"17bb390e0a8b9f7e2719f7f95e3408ac0f57affd"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"6a67a8cfdd6f336d818e971dbebfafa83693a6a3","unresolved":false,"context_lines":[{"line_number":134,"context_line":"* 204 - No Content"},{"line_number":135,"context_line":"* 404 - Tag or Project does not exist"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"Add single tag to a project"},{"line_number":138,"context_line":"---------------------------"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Creates the specified tag and adds it to the list in the project"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a1ced50_d548088a","line":137,"range":{"start_line":137,"start_character":0,"end_line":137,"end_character":27},"in_reply_to":"1a1ced50_df1bcc7e","updated":"2017-03-20 15:25:51.000000000","message":"This is based on the API-WG guidelines:\n\nmodify tag list: https://specs.openstack.org/opens tack/api-wg/guidelines/tags.html#modifying-the-tag-list\n\nmodify single tag: https://specs.openstack.org/openstack/api-wg/guidelines/tags.html#addressing-individual-tags\n\nwhere they both use PUT. I think this spec is trying to stick to the API-WG guidelines as much as possible, but I do know that PUT vs PATCH is a topic. I wonder if they used PUT because you are editing the entire tags list when you specify a body vs just editing one tag?","commit_id":"17bb390e0a8b9f7e2719f7f95e3408ac0f57affd"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b6c03144d3ae3548a86485f07b69e7448d3cd971","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Use Case: Project Organization via Tagging"},{"line_number":32,"context_line":"--------------------------------------------"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"In the case of a large private cloud containing many projects with lifespans"},{"line_number":35,"context_line":"that can range from days to a much longer time, there is a need to be able to"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_2b237da8","line":32,"range":{"start_line":32,"start_character":42,"end_line":32,"end_character":44},"updated":"2017-03-21 19:54:20.000000000","message":"(nit) leading --","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b6c03144d3ae3548a86485f07b69e7448d3cd971","unresolved":false,"context_lines":[{"line_number":31,"context_line":"Use Case: Project Organization via Tagging"},{"line_number":32,"context_line":"--------------------------------------------"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"In the case of a large private cloud containing many projects with lifespans"},{"line_number":35,"context_line":"that can range from days to a much longer time, there is a need to be able to"},{"line_number":36,"context_line":"tag and categorize projects based on how they are intended to be used, who is"},{"line_number":37,"context_line":"using them, and how long they will exist. The operator would be able to query"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_cb9ca9c2","line":34,"range":{"start_line":34,"start_character":48,"end_line":34,"end_character":61},"updated":"2017-03-21 19:54:20.000000000","message":"Just to have an idea, are we talking about tens, hundreds or thousands of projects ?","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"27fc645863e447d3acabbc752f42b8f86d8d04a8","unresolved":false,"context_lines":[{"line_number":31,"context_line":"Use Case: Project Organization via Tagging"},{"line_number":32,"context_line":"--------------------------------------------"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"In the case of a large private cloud containing many projects with lifespans"},{"line_number":35,"context_line":"that can range from days to a much longer time, there is a need to be able to"},{"line_number":36,"context_line":"tag and categorize projects based on how they are intended to be used, who is"},{"line_number":37,"context_line":"using them, and how long they will exist. The operator would be able to query"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_0b108158","line":34,"range":{"start_line":34,"start_character":48,"end_line":34,"end_character":61},"in_reply_to":"1a1ced50_cb9ca9c2","updated":"2017-03-21 20:05:50.000000000","message":"In this example, \u003e 1,000.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b6c03144d3ae3548a86485f07b69e7448d3cd971","unresolved":false,"context_lines":[{"line_number":36,"context_line":"tag and categorize projects based on how they are intended to be used, who is"},{"line_number":37,"context_line":"using them, and how long they will exist. The operator would be able to query"},{"line_number":38,"context_line":"all projects with a specific tag without resorting to naming projects with"},{"line_number":39,"context_line":"particular conventions. Additionally, on resource modification or deletion,"},{"line_number":40,"context_line":"proper cleanup of these tags could occur without the need of setting up an"},{"line_number":41,"context_line":"external tracking system. Currently, using an external system for keeping"},{"line_number":42,"context_line":"track of tags for projects is difficult for larger scale deployments, where"},{"line_number":43,"context_line":"projects change frequently and are often deleted within a few days."},{"line_number":44,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_eb7a4587","line":41,"range":{"start_line":39,"start_character":24,"end_line":41,"end_character":25},"updated":"2017-03-21 19:54:20.000000000","message":"How ? When you say \"on resource modification or deletion\", is that referring to OpenStack resources like VMs, networks, etc?","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"27fc645863e447d3acabbc752f42b8f86d8d04a8","unresolved":false,"context_lines":[{"line_number":36,"context_line":"tag and categorize projects based on how they are intended to be used, who is"},{"line_number":37,"context_line":"using them, and how long they will exist. The operator would be able to query"},{"line_number":38,"context_line":"all projects with a specific tag without resorting to naming projects with"},{"line_number":39,"context_line":"particular conventions. Additionally, on resource modification or deletion,"},{"line_number":40,"context_line":"proper cleanup of these tags could occur without the need of setting up an"},{"line_number":41,"context_line":"external tracking system. Currently, using an external system for keeping"},{"line_number":42,"context_line":"track of tags for projects is difficult for larger scale deployments, where"},{"line_number":43,"context_line":"projects change frequently and are often deleted within a few days."},{"line_number":44,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_cbc82925","line":41,"range":{"start_line":39,"start_character":24,"end_line":41,"end_character":25},"in_reply_to":"1a1ced50_eb7a4587","updated":"2017-03-21 20:05:50.000000000","message":"Ah, this should be s/resource/project/","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b6c03144d3ae3548a86485f07b69e7448d3cd971","unresolved":false,"context_lines":[{"line_number":46,"context_line":"Proposed Changes"},{"line_number":47,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Utilize the resource_options table for projects, adding a `tags` field"},{"line_number":50,"context_line":"  within a project\u0027s `options` structure. This `tags` will consist of"},{"line_number":51,"context_line":"  an array of simple strings. A project will be able to have zero, one"},{"line_number":52,"context_line":"  or more tags associated with it."},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_8b8e3177","line":50,"range":{"start_line":49,"start_character":2,"end_line":50,"end_character":41},"updated":"2017-03-21 19:54:20.000000000","message":"I do not agree with this. Resource options are to determine the system behavior, just as keystone global options, but they are configured on a per resource basis, on this case, in a per project basis.\n\nI do not see any clue on how projects tags is configuring anything, it is not an options, it is for me a first-citizen attribute of projects.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cf44efa648e1d459e518a996f503e4823de36293","unresolved":false,"context_lines":[{"line_number":47,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Utilize the resource_options table for projects, adding a `tags` field"},{"line_number":50,"context_line":"  within a project\u0027s `options` structure. This `tags` will consist of"},{"line_number":51,"context_line":"  an array of simple strings. A project will be able to have zero, one"},{"line_number":52,"context_line":"  or more tags associated with it."},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"ff0f0b1f_af907444","line":50,"in_reply_to":"1a1ced50_5e9e99b9","updated":"2017-05-23 20:06:17.000000000","message":"We discussed this in IRC today. Using a separate table will be simpler to understand and implement, even though we could do this with resource_options [0]. Using resource_options would allow for more code reuse and less moving parts, but we can move to that later with a migration.\n\n\n[0] http://eavesdrop.openstack.org/irclogs/%23openstack-keystone/%23openstack-keystone.2017-05-23.log.html#t2017-05-23T20:00:04","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"27fc645863e447d3acabbc752f42b8f86d8d04a8","unresolved":false,"context_lines":[{"line_number":46,"context_line":"Proposed Changes"},{"line_number":47,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Utilize the resource_options table for projects, adding a `tags` field"},{"line_number":50,"context_line":"  within a project\u0027s `options` structure. This `tags` will consist of"},{"line_number":51,"context_line":"  an array of simple strings. A project will be able to have zero, one"},{"line_number":52,"context_line":"  or more tags associated with it."},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_a646c44c","line":50,"range":{"start_line":49,"start_character":2,"end_line":50,"end_character":41},"in_reply_to":"1a1ced50_8b8e3177","updated":"2017-03-21 20:05:50.000000000","message":"The other option is to just have tags be it\u0027s own table (like neutron\u0027s network implementation). Either way works for me, but I\u0027m up for letting others chime in on this.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"186e3b840ee703911ba2e400c55d7f84765b9dab","unresolved":false,"context_lines":[{"line_number":47,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Utilize the resource_options table for projects, adding a `tags` field"},{"line_number":50,"context_line":"  within a project\u0027s `options` structure. This `tags` will consist of"},{"line_number":51,"context_line":"  an array of simple strings. A project will be able to have zero, one"},{"line_number":52,"context_line":"  or more tags associated with it."},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_5e9e99b9","line":50,"in_reply_to":"1a1ced50_917f40aa","updated":"2017-03-22 12:20:21.000000000","message":"Right... We didn\u0027t discuss the trade offs of each implementation, though.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7fdb3f337980b1a00a21505912df2f5cba2a02e9","unresolved":false,"context_lines":[{"line_number":47,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Utilize the resource_options table for projects, adding a `tags` field"},{"line_number":50,"context_line":"  within a project\u0027s `options` structure. This `tags` will consist of"},{"line_number":51,"context_line":"  an array of simple strings. A project will be able to have zero, one"},{"line_number":52,"context_line":"  or more tags associated with it."},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_917f40aa","line":50,"in_reply_to":"1a1ced50_a646c44c","updated":"2017-03-21 20:52:53.000000000","message":"Using resource options was a suggestion made by Morgan a few patch sets ago.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b6c03144d3ae3548a86485f07b69e7448d3cd971","unresolved":false,"context_lines":[{"line_number":56,"context_line":"* Add new API calls to interact with both project tags for basic CRUD"},{"line_number":57,"context_line":"  functionality."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Tags will have the following restrictions as set by the API Working"},{"line_number":60,"context_line":"Group [1]_:"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":".. Note::"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_cb3829a3","line":60,"range":{"start_line":59,"start_character":0,"end_line":60,"end_character":11},"updated":"2017-03-21 19:54:20.000000000","message":"Just to make sure, is this fully URL-safe? As we will need to pass tags in the URL later for filtering, correct?","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"27fc645863e447d3acabbc752f42b8f86d8d04a8","unresolved":false,"context_lines":[{"line_number":56,"context_line":"* Add new API calls to interact with both project tags for basic CRUD"},{"line_number":57,"context_line":"  functionality."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Tags will have the following restrictions as set by the API Working"},{"line_number":60,"context_line":"Group [1]_:"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":".. Note::"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_e67a7c87","line":60,"range":{"start_line":59,"start_character":0,"end_line":60,"end_character":11},"in_reply_to":"1a1ced50_cb3829a3","updated":"2017-03-21 20:05:50.000000000","message":"This should be URL-safe yes.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3cab405128aed80aeb14d23d09b628e1302660fb","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    A regex that matches any invalid tag would be:"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    \u0027/\\\\|,/g\u0027"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"The schema for project tags would be:"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_c7d5b5b9","line":71,"range":{"start_line":71,"start_character":4,"end_line":71,"end_character":13},"updated":"2017-03-20 19:09:13.000000000","message":"NIT please make a regex that will match \"valid\" tags. In general I prefer the \"is_it_valid\" vs \"is it invalid\" approach.\n\nThis can be fixed after the spec merges.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b6c03144d3ae3548a86485f07b69e7448d3cd971","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"The schema for project tags would be:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":".. code-block:: json"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"   {"},{"line_number":78,"context_line":"       \"title\": \"Project tags\","},{"line_number":79,"context_line":"       \"type\": \"array\","},{"line_number":80,"context_line":"       \"items\": {"},{"line_number":81,"context_line":"           \"$ref\": \"#/definitions/tag\""},{"line_number":82,"context_line":"       },"},{"line_number":83,"context_line":"       \"definitions\": {"},{"line_number":84,"context_line":"           \"tag\": {"},{"line_number":85,"context_line":"               \"type\": \"string\","},{"line_number":86,"context_line":"               \"maxLength\": 60,"},{"line_number":87,"context_line":"               \"maxItems\": 100"},{"line_number":88,"context_line":"           }"},{"line_number":89,"context_line":"       }"},{"line_number":90,"context_line":"   }"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"where if a tag would be added to a project and the max number of items"},{"line_number":93,"context_line":"is exceeded, a 400 Bad Request would be returned."}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_6b4ad527","line":90,"range":{"start_line":75,"start_character":0,"end_line":90,"end_character":4},"updated":"2017-03-21 19:54:20.000000000","message":"We wouldn\u0027t need to enter in this depth of details, this is a spec, no need to go in technical details like this. But this is OK.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bed5d9aa198c55a4f521e9035ccea757eaaeb9f8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"   }"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"where if a tag would be added to a project and the max number of items"},{"line_number":93,"context_line":"is exceeded, a 400 Bad Request would be returned."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"New API Calls"},{"line_number":96,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_317ec7ae","line":93,"updated":"2017-03-20 18:33:47.000000000","message":"I had a couple comments regarding this in a previous patch set, and I brought those to the API WG [0].\n\nThe net of the discussion was:\n\n- We as the project should limit the total number of tags that can be sent in a single request, this essentially limits the total number of tags a project can have by way of usage (it doesn\u0027t make sense to let the tag list grow beyond the max number possible to modify in a single request).\n- We should advertise that tag usage should be small/granular (have a bunch of small tags instead of one huge tag).\n- The tag limit in tag list operations can be exceeded by adding individual tags, but at a certain point it isn\u0027t usable/beneficial because modifying the list becomes hard (i.e. if the limit of tags associated to a project in a single PUT operation is 50, I should be able to add tags individually regardless - even though bulk management gets harder due to the usage of PUT replacing the entire list. For example, if a project has 100 tags, but I can only modify 50 of them via PUT operation any subsequent valid PUT operation will remove at least 50 tags from the project).\n- We as a project can enforce extra validation around the length and size of a tag (technically, a single *massive* tag can cause a 400 by exceeding the max request size of the web server). Is this something we want to enforce?\n\n\n[0] http://eavesdrop.openstack.org/irclogs/%23openstack-sdks/%23openstack-sdks.2017-03-20.log.html#t2017-03-20T16:19:28","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b6c03144d3ae3548a86485f07b69e7448d3cd971","unresolved":false,"context_lines":[{"line_number":90,"context_line":"   }"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"where if a tag would be added to a project and the max number of items"},{"line_number":93,"context_line":"is exceeded, a 400 Bad Request would be returned."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"New API Calls"},{"line_number":96,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_8b747136","line":93,"in_reply_to":"1a1ced50_277929f7","updated":"2017-03-21 19:54:20.000000000","message":"If we are going to store that in a blob column, what about just starting with sane defaults for the column size and tag max length ? Then we will know the number of tags that we can add from that.\n\nIMO there is no easy way to customize that, as changing the tag max length would require a db migration (to resize column size) or would reduce the max number of tags ?\n\nThis looks complicated, I agree with Morgan to just start simple.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ea445e8a4993cf1ebe143a39a2277bc678d79c9a","unresolved":false,"context_lines":[{"line_number":90,"context_line":"   }"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"where if a tag would be added to a project and the max number of items"},{"line_number":93,"context_line":"is exceeded, a 400 Bad Request would be returned."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"New API Calls"},{"line_number":96,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_8cd76222","line":93,"in_reply_to":"1a1ced50_317ec7ae","updated":"2017-03-20 18:36:53.000000000","message":"Also - do we want to make the maxItems property configurable?","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"27fc645863e447d3acabbc752f42b8f86d8d04a8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"   }"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"where if a tag would be added to a project and the max number of items"},{"line_number":93,"context_line":"is exceeded, a 400 Bad Request would be returned."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"New API Calls"},{"line_number":96,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_ab53ed37","line":93,"in_reply_to":"1a1ced50_8b747136","updated":"2017-03-21 20:05:50.000000000","message":"simple is fine","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3cab405128aed80aeb14d23d09b628e1302660fb","unresolved":false,"context_lines":[{"line_number":90,"context_line":"   }"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"where if a tag would be added to a project and the max number of items"},{"line_number":93,"context_line":"is exceeded, a 400 Bad Request would be returned."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"New API Calls"},{"line_number":96,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_277929f7","line":93,"in_reply_to":"1a1ced50_8cd76222","updated":"2017-03-20 19:09:13.000000000","message":"No, please do not make it configurable to start. Do not encode in the API ref that it is a fixed number, but code wise can be, we can expand and make it configurable if needed.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b6c03144d3ae3548a86485f07b69e7448d3cd971","unresolved":false,"context_lines":[{"line_number":92,"context_line":"where if a tag would be added to a project and the max number of items"},{"line_number":93,"context_line":"is exceeded, a 400 Bad Request would be returned."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"New API Calls"},{"line_number":96,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"List all tags for a project"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_6ba2d59a","line":95,"range":{"start_line":95,"start_character":0,"end_line":95,"end_character":13},"updated":"2017-03-21 19:54:20.000000000","message":"Shouldn\u0027t this all (until L235) be in the API ref change ?\nSpecs do not need to contain so much implementation details.","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b6c03144d3ae3548a86485f07b69e7448d3cd971","unresolved":false,"context_lines":[{"line_number":355,"context_line":"for a project. This is to prevent unprivileged users from viewing or changing"},{"line_number":356,"context_line":"any existing tags, which could possibly denote administrative functions."},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"The roles for tags will follow the roles set for /v3/projects."},{"line_number":359,"context_line":""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_6bf7358b","line":358,"range":{"start_line":358,"start_character":4,"end_line":358,"end_character":9},"updated":"2017-03-21 19:54:20.000000000","message":"I\u0027d say \"policy rules\".","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b6c03144d3ae3548a86485f07b69e7448d3cd971","unresolved":false,"context_lines":[{"line_number":355,"context_line":"for a project. This is to prevent unprivileged users from viewing or changing"},{"line_number":356,"context_line":"any existing tags, which could possibly denote administrative functions."},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"The roles for tags will follow the roles set for /v3/projects."},{"line_number":359,"context_line":""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_8bf0f192","line":358,"range":{"start_line":358,"start_character":35,"end_line":358,"end_character":40},"updated":"2017-03-21 19:54:20.000000000","message":"ditto","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"27fc645863e447d3acabbc752f42b8f86d8d04a8","unresolved":false,"context_lines":[{"line_number":355,"context_line":"for a project. This is to prevent unprivileged users from viewing or changing"},{"line_number":356,"context_line":"any existing tags, which could possibly denote administrative functions."},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"The roles for tags will follow the roles set for /v3/projects."},{"line_number":359,"context_line":""},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a1ced50_c69ca0c2","line":358,"range":{"start_line":358,"start_character":35,"end_line":358,"end_character":40},"in_reply_to":"1a1ced50_8bf0f192","updated":"2017-03-21 20:05:50.000000000","message":"sure!","commit_id":"729a7896b1ece429021d92df546dc6665c04675e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9d41da7d26ddc8bc44f5369b901e002648db4daf","unresolved":false,"context_lines":[{"line_number":40,"context_line":"proper cleanup of these tags could occur without the need of setting up an"},{"line_number":41,"context_line":"external tracking system. Currently, using an external system for keeping"},{"line_number":42,"context_line":"track of tags for projects is difficult for larger scale deployments, where"},{"line_number":43,"context_line":"projects change frequently and are often deleted within a few days."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Changes"}],"source_content_type":"text/x-rst","patch_set":13,"id":"bff0334d_935de716","line":43,"updated":"2017-04-10 20:10:47.000000000","message":"If we don\u0027t want to make the tag limit per project configurable, what do we want it to be?\n\nAlso, did we come to consensus on tag validation? Should we limit the tag length?\n\nIf we did have answers for those, we should document them so that the direction is clearly defined.","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b9b03352eff15ee9b13152a5dfa2cd135670b2c4","unresolved":false,"context_lines":[{"line_number":40,"context_line":"proper cleanup of these tags could occur without the need of setting up an"},{"line_number":41,"context_line":"external tracking system. Currently, using an external system for keeping"},{"line_number":42,"context_line":"track of tags for projects is difficult for larger scale deployments, where"},{"line_number":43,"context_line":"projects change frequently and are often deleted within a few days."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Changes"}],"source_content_type":"text/x-rst","patch_set":13,"id":"bff0334d_54096193","line":43,"in_reply_to":"bff0334d_1611c504","updated":"2017-04-11 20:13:51.000000000","message":"Actually - we could use in-code options for this. An admin could set the total number of tags they want to limit on a project as an in-code option of the project.\n\nUnless that seems like too much work to be worth it?","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"667fe403bf50576bf35261c6576b0f01fc27f310","unresolved":false,"context_lines":[{"line_number":40,"context_line":"proper cleanup of these tags could occur without the need of setting up an"},{"line_number":41,"context_line":"external tracking system. Currently, using an external system for keeping"},{"line_number":42,"context_line":"track of tags for projects is difficult for larger scale deployments, where"},{"line_number":43,"context_line":"projects change frequently and are often deleted within a few days."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Changes"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9ff52f3f_c5622ed9","line":43,"in_reply_to":"bff0334d_54096193","updated":"2017-04-12 22:57:37.000000000","message":"That would be fine","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"6db9388895ad632d1727fb0822e26864d46919ed","unresolved":false,"context_lines":[{"line_number":40,"context_line":"proper cleanup of these tags could occur without the need of setting up an"},{"line_number":41,"context_line":"external tracking system. Currently, using an external system for keeping"},{"line_number":42,"context_line":"track of tags for projects is difficult for larger scale deployments, where"},{"line_number":43,"context_line":"projects change frequently and are often deleted within a few days."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Changes"}],"source_content_type":"text/x-rst","patch_set":13,"id":"bff0334d_1611c504","line":43,"in_reply_to":"bff0334d_935de716","updated":"2017-04-10 20:43:30.000000000","message":"I\u0027m fine with what nova does for servers:\n50 tags per resource\n60 character limit per tag\n\nAs for tag validation, I would say it should definitely match the regex below for the restrictions set by the API-WG.","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1ac8b134c18cf0461bd0d5046ed137d8fd0c5bfc","unresolved":false,"context_lines":[{"line_number":46,"context_line":"Proposed Changes"},{"line_number":47,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Utilize the resource_options table for projects, adding a `tags` field"},{"line_number":50,"context_line":"  within a project\u0027s `options` structure. This `tags` will consist of"},{"line_number":51,"context_line":"  an array of simple strings. A project will be able to have zero, one"},{"line_number":52,"context_line":"  or more tags associated with it."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"  `OR`"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"  Add a new table `tags` to map strings to projects:"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"  .. code:: SQL"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    CREATE TABLE `tags` ("},{"line_number":61,"context_line":"        `id`                     int(11) NOT NULL AUTO_INCREMENT,"},{"line_number":62,"context_line":"        `project_id`             int(11) NOT NULL,"},{"line_number":63,"context_line":"        `name`                   varchar(80) NOT NULL"},{"line_number":64,"context_line":"    )"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":67,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"ffe62b97_add0bf20","line":64,"range":{"start_line":49,"start_character":0,"end_line":64,"end_character":5},"updated":"2017-03-27 15:44:42.000000000","message":"Put the SQL table back in so we can talk about the tradeoffs of either implementation.","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1ac8b134c18cf0461bd0d5046ed137d8fd0c5bfc","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Regex that matches any VALID tag would be:"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"`\\w+|\\@|\\!|\\#|\\$|\\%|\\^|\\\u0026|\\*|\\(|\\)|\\;|\\\u003c|\\\u003e|\\:|\\.|\\\"|\\\u0027|\\||\\+|\\-|\\?|\\\u003d`"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"The schema for project tags would be:"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ffe62b97_cd9c235f","line":83,"range":{"start_line":83,"start_character":0,"end_line":83,"end_character":71},"updated":"2017-03-27 15:44:42.000000000","message":"This may not be entirely URL-safe regex.","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"6e7f234207e8707090debd2fc6b0eb72d1e9ed69","unresolved":false,"context_lines":[{"line_number":145,"context_line":"* 204 - No Content"},{"line_number":146,"context_line":"* 404 - Tag or Project does not exist"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"Add single tag to a project"},{"line_number":149,"context_line":"---------------------------"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"Creates the specified tag and adds it to the list in the project"}],"source_content_type":"text/x-rst","patch_set":13,"id":"5ff73747_7cfb27c0","line":148,"range":{"start_line":148,"start_character":0,"end_line":148,"end_character":27},"updated":"2017-04-28 23:14:10.000000000","message":"Why not group this into the modify case below? Setting one tag and setting multiple tags should have a consistent interface, no?","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f3bbfb8482235259a8b1bbf35e4d2d1fb55fc6be","unresolved":false,"context_lines":[{"line_number":145,"context_line":"* 204 - No Content"},{"line_number":146,"context_line":"* 404 - Tag or Project does not exist"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"Add single tag to a project"},{"line_number":149,"context_line":"---------------------------"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"Creates the specified tag and adds it to the list in the project"}],"source_content_type":"text/x-rst","patch_set":13,"id":"5ff73747_470bf428","line":148,"range":{"start_line":148,"start_character":0,"end_line":148,"end_character":27},"in_reply_to":"5ff73747_7cfb27c0","updated":"2017-04-29 01:20:58.000000000","message":"This is just copied from the API-WG\u0027s spec:\n\nhttps://specs.openstack.org/openstack/api-wg/guidelines/tags.html#addressing-individual-tags\n\nIt would be nice to be able to add single tags without needing to modify the entire list of tags if a Project already has some.","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"6e7f234207e8707090debd2fc6b0eb72d1e9ed69","unresolved":false,"context_lines":[{"line_number":387,"context_line":"Performance Impact"},{"line_number":388,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"None."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"Other Deployer Impact"}],"source_content_type":"text/x-rst","patch_set":13,"id":"5ff73747_bcfe4f68","line":390,"range":{"start_line":390,"start_character":0,"end_line":390,"end_character":4},"updated":"2017-04-28 23:14:10.000000000","message":"Really? For tables with large numbers of projects and large numbers of tags, there\u0027s no concern that the resulting join/select will be underperformant? (I guess no performance impact on existing APIs, but still might be worth a comment)","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"5e8782042dadd9bc2dd9fd2bfe6334befd418c44","unresolved":false,"context_lines":[{"line_number":387,"context_line":"Performance Impact"},{"line_number":388,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"None."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"Other Deployer Impact"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ff0f0b1f_b0b837c8","line":390,"range":{"start_line":390,"start_character":0,"end_line":390,"end_character":4},"in_reply_to":"5ff73747_bcfe4f68","updated":"2017-05-19 19:26:56.000000000","message":"Done","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f3bbfb8482235259a8b1bbf35e4d2d1fb55fc6be","unresolved":false,"context_lines":[{"line_number":387,"context_line":"Performance Impact"},{"line_number":388,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"None."},{"line_number":391,"context_line":""},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"Other Deployer Impact"}],"source_content_type":"text/x-rst","patch_set":13,"id":"5ff73747_e201ce06","line":390,"range":{"start_line":390,"start_character":0,"end_line":390,"end_character":4},"in_reply_to":"5ff73747_bcfe4f68","updated":"2017-04-29 01:20:58.000000000","message":"We could mention this here.","commit_id":"b3e3a06bf38c625cce86f634798b18a7eb663cf7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1de2044632bcced24229dab5745dd5ad5a5fe545","unresolved":false,"context_lines":[{"line_number":41,"context_line":"external tracking system. Currently, using an external system for keeping"},{"line_number":42,"context_line":"track of tags for projects is difficult for larger scale deployments, where"},{"line_number":43,"context_line":"projects change frequently and are often deleted within a few days."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Changes"},{"line_number":47,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":14,"id":"ff0f0b1f_2f40e4a4","line":44,"updated":"2017-05-23 20:11:49.000000000","message":"We should add the requirement where we are limiting the numbers of tags on a project to 50 and that each tag can\u0027t exceed 60 characters.","commit_id":"7678f6c578694e6e7fbee6e50e4f76ae5a16b63c"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"de7b06b7cb25238037c905ad7ff8904cdc1e806c","unresolved":false,"context_lines":[{"line_number":41,"context_line":"external tracking system. Currently, using an external system for keeping"},{"line_number":42,"context_line":"track of tags for projects is difficult for larger scale deployments, where"},{"line_number":43,"context_line":"projects change frequently and are often deleted within a few days."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Proposed Changes"},{"line_number":47,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":14,"id":"ff0f0b1f_55de06da","line":44,"in_reply_to":"ff0f0b1f_2f40e4a4","updated":"2017-05-24 00:27:28.000000000","message":"Will add a line in the Proposed Changes section below to clarify this in next patch set.","commit_id":"7678f6c578694e6e7fbee6e50e4f76ae5a16b63c"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"de7b06b7cb25238037c905ad7ff8904cdc1e806c","unresolved":false,"context_lines":[{"line_number":46,"context_line":"Proposed Changes"},{"line_number":47,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* Persist tags information in a datastore. There are two approaches we"},{"line_number":50,"context_line":"  can use:"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"  * Add a new table ``tags`` to map strings to projects:"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"ff0f0b1f_d5eb3675","line":50,"range":{"start_line":49,"start_character":2,"end_line":50,"end_character":10},"updated":"2017-05-24 00:27:28.000000000","message":"See below.","commit_id":"7678f6c578694e6e7fbee6e50e4f76ae5a16b63c"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"de7b06b7cb25238037c905ad7ff8904cdc1e806c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        `name`                   varchar(80) NOT NULL"},{"line_number":60,"context_line":"      )"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"  * Alternatively, utilize the resource_options table for projects and add"},{"line_number":63,"context_line":"    a ``tags`` field within a project\u0027s ``options`` structure. This ``tags``"},{"line_number":64,"context_line":"    field will consist of an array of simple strings. A project will be"},{"line_number":65,"context_line":"    able to have zero, one or more tags associated with it."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":68,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"ff0f0b1f_15f64e64","line":65,"range":{"start_line":62,"start_character":0,"end_line":65,"end_character":59},"updated":"2017-05-24 00:27:28.000000000","message":"Per discussion in IRC, this section will be removed.","commit_id":"7678f6c578694e6e7fbee6e50e4f76ae5a16b63c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3aa82fa66a4078462dad715dc36e6f3c967e752c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"     )"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* There is a limit of 50 tags on a project and each tag cannot exceed 60"},{"line_number":60,"context_line":"  characters."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_17aab217","line":60,"updated":"2017-05-24 21:04:13.000000000","message":"Where did we get these numbers from?","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"b2aa5d9ceda489a5ac09ab939e2918388adb41b9","unresolved":false,"context_lines":[{"line_number":57,"context_line":"     )"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* There is a limit of 50 tags on a project and each tag cannot exceed 60"},{"line_number":60,"context_line":"  characters."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_a2dbc24c","line":60,"in_reply_to":"ff0f0b1f_17aab217","updated":"2017-05-24 21:14:44.000000000","message":"These values are from nova\u0027s server tags [0]. We can change these values if they end up restricting usage too much.\n\n[0] https://specs.openstack.org/openstack/nova-specs/specs/kilo/approved/tag-instances.html#rest-api-impact","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"26f516bedd1260e4ec5ab8c3cdf4b9e4f1497d9b","unresolved":false,"context_lines":[{"line_number":57,"context_line":"     )"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* There is a limit of 50 tags on a project and each tag cannot exceed 60"},{"line_number":60,"context_line":"  characters."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_abeb9a10","line":60,"in_reply_to":"ff0f0b1f_a2dbc24c","updated":"2017-05-25 00:52:55.000000000","message":"Glad to be consistent","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3aa82fa66a4078462dad715dc36e6f3c967e752c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"* There is a limit of 50 tags on a project and each tag cannot exceed 60"},{"line_number":60,"context_line":"  characters."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"* Add new API calls to interact with both project tags for basic CRUD"},{"line_number":65,"context_line":"  functionality."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_b768a6f4","line":62,"updated":"2017-05-24 21:04:13.000000000","message":"Listing projects or showing a single project.","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"26f516bedd1260e4ec5ab8c3cdf4b9e4f1497d9b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"* There is a limit of 50 tags on a project and each tag cannot exceed 60"},{"line_number":60,"context_line":"  characters."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"* Add new API calls to interact with both project tags for basic CRUD"},{"line_number":65,"context_line":"  functionality."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_0b95e686","line":62,"in_reply_to":"ff0f0b1f_624daa3c","updated":"2017-05-25 00:52:55.000000000","message":"Would be nice to add this detail then","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"b2aa5d9ceda489a5ac09ab939e2918388adb41b9","unresolved":false,"context_lines":[{"line_number":59,"context_line":"* There is a limit of 50 tags on a project and each tag cannot exceed 60"},{"line_number":60,"context_line":"  characters."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"* Add tags field as part of default response when listing projects."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"* Add new API calls to interact with both project tags for basic CRUD"},{"line_number":65,"context_line":"  functionality."}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_624daa3c","line":62,"in_reply_to":"ff0f0b1f_b768a6f4","updated":"2017-05-24 21:14:44.000000000","message":"yes","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3aa82fa66a4078462dad715dc36e6f3c967e752c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    * Tags are case sensitive"},{"line_number":73,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":74,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":75,"context_line":"      requests that specify lists of tags"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"Regex that matches any VALID tag would be:"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_57794ac5","line":75,"updated":"2017-05-24 21:04:13.000000000","message":"I guess it would need to be URL safe too, correct?","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"b2aa5d9ceda489a5ac09ab939e2918388adb41b9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    * Tags are case sensitive"},{"line_number":73,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":74,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":75,"context_line":"      requests that specify lists of tags"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"Regex that matches any VALID tag would be:"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_a25862f9","line":75,"in_reply_to":"ff0f0b1f_57794ac5","updated":"2017-05-24 21:14:44.000000000","message":"Correct, the below regex is supposed to match this criteria for it.","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"26f516bedd1260e4ec5ab8c3cdf4b9e4f1497d9b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    * Tags are case sensitive"},{"line_number":73,"context_line":"    * ‘/’ is not allowed to be in a tag name"},{"line_number":74,"context_line":"    * Commas are not allowed to be in a tag name in order to simplify"},{"line_number":75,"context_line":"      requests that specify lists of tags"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"Regex that matches any VALID tag would be:"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_4b7f5e65","line":75,"in_reply_to":"ff0f0b1f_a25862f9","updated":"2017-05-25 00:52:55.000000000","message":"Ok, would be great to add this as a bullet point too","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"26f516bedd1260e4ec5ab8c3cdf4b9e4f1497d9b","unresolved":false,"context_lines":[{"line_number":289,"context_line":""},{"line_number":290,"context_line":"   GET /v3/projects?tags\u003dfoo,bar"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"To request the list of projects that have one OR more of a list of given"},{"line_number":293,"context_line":"tags, the `tags-any` argument should be set to the list of tags, separated"},{"line_number":294,"context_line":"by commas. In this situation as long as one of the given tags is present,"},{"line_number":295,"context_line":"the project will be included in the query result. Example that returns the"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_0b10464d","line":292,"range":{"start_line":292,"start_character":37,"end_line":292,"end_character":53},"updated":"2017-05-25 00:52:55.000000000","message":"at least one","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"26f516bedd1260e4ec5ab8c3cdf4b9e4f1497d9b","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":"To request the list of projects that do not have one or more tags, the"},{"line_number":303,"context_line":"`not-tags` argument should be set to the list of tags, separated by commas."},{"line_number":304,"context_line":"In this situation, only the projects that do not have any of the given tags"},{"line_number":305,"context_line":"will be included in the query results. Example that returns the projects that"},{"line_number":306,"context_line":"do not have the “foo” nor the “bar” tag:"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":".. code-block:: bash"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_585df676","line":305,"range":{"start_line":304,"start_character":0,"end_line":305,"end_character":38},"updated":"2017-05-25 00:52:55.000000000","message":"\"In this situation, the tags given must all be absent for a project to be included\nin the query result.\" would be better, since it is the opposite explanation given for ?tags\n\nfor example in this case, a project with tags foo,red would be included, because bar is absent, but foo is not","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"26f516bedd1260e4ec5ab8c3cdf4b9e4f1497d9b","unresolved":false,"context_lines":[{"line_number":311,"context_line":""},{"line_number":312,"context_line":"To request the list of projects that do not have at least one of a list of"},{"line_number":313,"context_line":"tags, the `not-tags-any` argument should be set to the list of tags,"},{"line_number":314,"context_line":"separated by commas. In this situation, only the projects that do not have"},{"line_number":315,"context_line":"at least one of the given tags will be included in the query result. Example"},{"line_number":316,"context_line":"that returns the projects that do not have the “foo” tag, or do not have"},{"line_number":317,"context_line":"the “bar” tag:"},{"line_number":318,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_3827e2cc","line":315,"range":{"start_line":314,"start_character":21,"end_line":315,"end_character":68},"updated":"2017-05-25 00:52:55.000000000","message":"In this situation as long as one of the given tags is present, the project will be included in the query result.","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"26f516bedd1260e4ec5ab8c3cdf4b9e4f1497d9b","unresolved":false,"context_lines":[{"line_number":311,"context_line":""},{"line_number":312,"context_line":"To request the list of projects that do not have at least one of a list of"},{"line_number":313,"context_line":"tags, the `not-tags-any` argument should be set to the list of tags,"},{"line_number":314,"context_line":"separated by commas. In this situation, only the projects that do not have"},{"line_number":315,"context_line":"at least one of the given tags will be included in the query result. Example"},{"line_number":316,"context_line":"that returns the projects that do not have the “foo” tag, or do not have"},{"line_number":317,"context_line":"the “bar” tag:"},{"line_number":318,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_38100257","line":315,"range":{"start_line":314,"start_character":21,"end_line":315,"end_character":68},"updated":"2017-05-25 00:52:55.000000000","message":"same suggestion here, do the opposite as tags-any: \"In this situation as long as none of the given tags is present, the project will be included in the query result.\"","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"26f516bedd1260e4ec5ab8c3cdf4b9e4f1497d9b","unresolved":false,"context_lines":[{"line_number":313,"context_line":"tags, the `not-tags-any` argument should be set to the list of tags,"},{"line_number":314,"context_line":"separated by commas. In this situation, only the projects that do not have"},{"line_number":315,"context_line":"at least one of the given tags will be included in the query result. Example"},{"line_number":316,"context_line":"that returns the projects that do not have the “foo” tag, or do not have"},{"line_number":317,"context_line":"the “bar” tag:"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":".. code-block:: bash"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_980b8e8c","line":316,"range":{"start_line":316,"start_character":58,"end_line":316,"end_character":60},"updated":"2017-05-25 00:52:55.000000000","message":"and","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3aa82fa66a4078462dad715dc36e6f3c967e752c","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":".. code-block:: bash"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"   GET /v3/projects?not-tags-any\u003dfoo,bar"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"The `tags`, `tags-any`, `not-tags` and `not-tags-any` arguments can"},{"line_number":324,"context_line":"be combined to build more complex queries. Example that returns any projects"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_623ecac1","line":321,"updated":"2017-05-24 21:04:13.000000000","message":"A project has tags foo,red,orange. Would the query ?not-tags-any\u003dfoo,green return it? Since it does not contain green, even if it contains foo?","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"b2aa5d9ceda489a5ac09ab939e2918388adb41b9","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":".. code-block:: bash"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"   GET /v3/projects?not-tags-any\u003dfoo,bar"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"The `tags`, `tags-any`, `not-tags` and `not-tags-any` arguments can"},{"line_number":324,"context_line":"be combined to build more complex queries. Example that returns any projects"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_c2bd96b7","line":321,"in_reply_to":"ff0f0b1f_623ecac1","updated":"2017-05-24 21:14:44.000000000","message":"?not-tags-any\u003dfoo,green would not return any project that has the tag \u0027foo\u0027 OR \u0027green\u0027. So a project with [\u0027foo\u0027, \u0027red\u0027, \u0027orange\u0027] would not be returned since that project contains the \u0027foo\u0027 tag.","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"26f516bedd1260e4ec5ab8c3cdf4b9e4f1497d9b","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":".. code-block:: bash"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"   GET /v3/projects?not-tags-any\u003dfoo,bar"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"The `tags`, `tags-any`, `not-tags` and `not-tags-any` arguments can"},{"line_number":324,"context_line":"be combined to build more complex queries. Example that returns any projects"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_8b89f675","line":321,"in_reply_to":"ff0f0b1f_c2bd96b7","updated":"2017-05-25 00:52:55.000000000","message":"Ok, so I do have some suggestions on the explanations above to make it clearer","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"3aa82fa66a4078462dad715dc36e6f3c967e752c","unresolved":false,"context_lines":[{"line_number":366,"context_line":"for a project. This is to prevent unprivileged users from viewing or changing"},{"line_number":367,"context_line":"any existing tags, which could possibly denote administrative functions."},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"The policy rules for tags will follow the rules set for /v3/projects."},{"line_number":370,"context_line":""},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":15,"id":"ff0f0b1f_8258be30","line":369,"updated":"2017-05-24 21:04:13.000000000","message":"++","commit_id":"cd213dcd9fefd0b108df7a539e6123ffe4325c8b"}],"specs/keystone/pike/resource-tags.rst":[{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"32bf649a456819d4b0296b65d11e3f783495adc9","unresolved":false,"context_lines":[{"line_number":16,"context_line":"operators and administrators to be able to associate and map different Users"},{"line_number":17,"context_line":"and Projects within their groups. This specification follows closely with"},{"line_number":18,"context_line":"neutron\u0027s [#]_ resource tag implementation and would also follow the"},{"line_number":19,"context_line":"guidelines for using tags by the OpenStack API Working Group [#]_."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa31d9ce_b91ce46a","line":19,"range":{"start_line":19,"start_character":26,"end_line":19,"end_character":28},"updated":"2017-02-15 20:12:48.000000000","message":"as set by","commit_id":"0acb4f1c1c8835b79c03c5556ebe72315651b5d5"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"32bf649a456819d4b0296b65d11e3f783495adc9","unresolved":false,"context_lines":[{"line_number":60,"context_line":"called \"tags\". On deletion of a user and project, any tags would also be"},{"line_number":61,"context_line":"deleted along with it."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":64,"context_line":"| Field         | Type         | Null? | Key | Default |"},{"line_number":65,"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+\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+"},{"line_number":66,"context_line":"| tags          | varchar(255) | YES   |     | NULL    |"},{"line_number":67,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"Add new API calls to interact with both Project and User tags for basic CRUD"},{"line_number":70,"context_line":"functionality."}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa31d9ce_3908f427","line":67,"range":{"start_line":63,"start_character":0,"end_line":67,"end_character":56},"updated":"2017-02-15 20:12:48.000000000","message":"Need to clean this up","commit_id":"0acb4f1c1c8835b79c03c5556ebe72315651b5d5"}]}
