)]}'
{"keystone/resource/schema.py":[{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"25ad2dcfaa019a7f154cf4dad4319b6323e2372e","unresolved":false,"context_lines":[{"line_number":67,"context_line":"project_tag_create \u003d {"},{"line_number":68,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":69,"context_line":"    \u0027properties\u0027: _project_tag_properties,"},{"line_number":70,"context_line":"    \u0027required\u0027: [\u0027project_id\u0027, \u0027name\u0027],"},{"line_number":71,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":72,"context_line":"    # NOTE(gagehugo) A project can only have 50 tags associated with it"},{"line_number":73,"context_line":"    \u0027maxItems\u0027: 50"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_4d9c610d","line":70,"range":{"start_line":70,"start_character":18,"end_line":70,"end_character":28},"updated":"2017-07-17 20:49:03.000000000","message":"My understanding is this should be similar to nova\u0027s tag call [0], so it would just be a list of string. Since the project_id should be already in the path, do we need this in the json body as well?\n\n[0] https://developer.openstack.org/api-ref/compute/?expanded\u003dreplace-tags-detail#replace-tags","commit_id":"1e584f4aa5d5d85be7dd918568398fb65465d557"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"faf7cdeac1a1fd2d77da8658a08157bd0beef51c","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    \u0027maxItems\u0027: 50"},{"line_number":67,"context_line":"}"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"project_tag_create \u003d {"},{"line_number":70,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":71,"context_line":"    \u0027required\u0027: [],"},{"line_number":72,"context_line":"    \u0027additionalProperties\u0027: False"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f1a1f67_4cce5a63","line":69,"range":{"start_line":69,"start_character":0,"end_line":69,"end_character":18},"updated":"2017-07-19 15:07:33.000000000","message":"shouldn\u0027t this also be hooked to the project_tag_name_properties?","commit_id":"72f3071c89699fe57b2d840ed1c1349da70e93ab"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"faf7cdeac1a1fd2d77da8658a08157bd0beef51c","unresolved":false,"context_lines":[{"line_number":73,"context_line":"}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"project_tag_update \u003d {"},{"line_number":76,"context_line":"    \u0027type\u0027: \u0027object\u0027,"},{"line_number":77,"context_line":"    \u0027properties\u0027: {"},{"line_number":78,"context_line":"        \u0027tags\u0027: _project_tags_properties"},{"line_number":79,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f1a1f67_0c4742be","line":76,"range":{"start_line":76,"start_character":13,"end_line":76,"end_character":19},"updated":"2017-07-19 15:07:33.000000000","message":"i recall Nicolas telling me that whats passed into the validate is just the \"tags\" parsed out from the object and the result was a list. May need to coordinate on this to get it synced up","commit_id":"72f3071c89699fe57b2d840ed1c1349da70e93ab"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"804fcd14d8f7d5e8e2d5e6aefc674784a29dc3b2","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    \u0027additionalProperties\u0027: True"},{"line_number":60,"context_line":"}"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_b82e16f8","line":62,"updated":"2017-07-20 19:09:23.000000000","message":"Doesn\u0027t this have to associated to a list and string type, since it\u0027s possible to add a single tag to a project (e.g. a string) as well as a list (e.g. array)?","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"48f7c9f44b341e4e680054237dd447561c9bca5e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    \u0027additionalProperties\u0027: True"},{"line_number":60,"context_line":"}"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff346bd7_b6f590ef","line":62,"in_reply_to":"1f1a1f67_2061ac3a","updated":"2017-07-26 15:10:21.000000000","message":"Ah - ok that makes sense.","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f77f99a5af59887e502c12d1cbd624cfe8f8b637","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    \u0027additionalProperties\u0027: True"},{"line_number":60,"context_line":"}"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_b3ecf929","line":62,"in_reply_to":"1f1a1f67_b82e16f8","updated":"2017-07-20 19:21:13.000000000","message":"Currently we have \"project_tag_create\" for adding a single tag, which \"project_tag_update\" for the list.","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"75507eff93747fa3219e7686de7ccdf35d44c52e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    \u0027additionalProperties\u0027: True"},{"line_number":60,"context_line":"}"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_2061ac3a","line":62,"in_reply_to":"1f1a1f67_b82e16f8","updated":"2017-07-20 22:03:50.000000000","message":"yup create just takes in a tag name, and the update is the list of tag names","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"65c0bd0368716c64a4b4f8b3871405a339cd17c9","unresolved":false,"context_lines":[{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":66,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":67,"context_line":"    \u0027required\u0027: [],"},{"line_number":68,"context_line":"    \u0027maxItems\u0027: 50,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff346bd7_3fd402bd","line":65,"updated":"2017-07-25 14:31:23.000000000","message":"is it an array of tags or a string separated by commas, as it is for creating?\n\nwhy is it inconsistent between those 2 apis?","commit_id":"3c5211295c53a765c9239f7a606ef4b3d6168326"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"b4af8e2c4b5ced5ee66a27212e1de7564ea7fca3","unresolved":false,"context_lines":[{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":66,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":67,"context_line":"    \u0027required\u0027: [],"},{"line_number":68,"context_line":"    \u0027maxItems\u0027: 50,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff346bd7_3ae1a5d1","line":65,"in_reply_to":"ff346bd7_028441b0","updated":"2017-07-25 20:04:19.000000000","message":"nice!","commit_id":"3c5211295c53a765c9239f7a606ef4b3d6168326"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"025565c99c9a35837c38c8e662eaa8c342d4457d","unresolved":false,"context_lines":[{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":66,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":67,"context_line":"    \u0027required\u0027: [],"},{"line_number":68,"context_line":"    \u0027maxItems\u0027: 50,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff346bd7_b6435013","line":65,"in_reply_to":"ff346bd7_3ae1a5d1","updated":"2017-07-26 15:10:14.000000000","message":"This threw me off too the first time I read it. A comment clarifying when project_tag_update is used and when project_tag_create is used might help.","commit_id":"3c5211295c53a765c9239f7a606ef4b3d6168326"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"fdb8f3a7e6bf249fddf4eb6a23d978ea7a82d01f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":66,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":67,"context_line":"    \u0027required\u0027: [],"},{"line_number":68,"context_line":"    \u0027maxItems\u0027: 50,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff346bd7_028441b0","line":65,"in_reply_to":"ff346bd7_3fd402bd","updated":"2017-07-25 14:58:26.000000000","message":"Tags is an array of strings, this is for when you update with a body containing tags.  The create schema is just for when you update with one tag in the url ie /v3/projects/{project_id}/tags/{value}","commit_id":"3c5211295c53a765c9239f7a606ef4b3d6168326"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"be30385083950606eb340978a24e71abba443fe3","unresolved":false,"context_lines":[{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":66,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":67,"context_line":"    \u0027required\u0027: [],"},{"line_number":68,"context_line":"    \u0027maxItems\u0027: 50,"}],"source_content_type":"text/x-python","patch_set":13,"id":"ff346bd7_b780ea47","line":65,"in_reply_to":"ff346bd7_b6435013","updated":"2017-07-26 16:15:16.000000000","message":"good idea","commit_id":"3c5211295c53a765c9239f7a606ef4b3d6168326"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"78faeaac636d02031d3ab9a0128fe281cb0a22d0","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":66,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":67,"context_line":"    \u0027required\u0027: [],"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff346bd7_7cf8297a","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":18},"updated":"2017-07-26 16:03:46.000000000","message":"maybe project_tags_update since it\u0027s actually updating (replacing) all the tags at once","commit_id":"b0822e226e85364ae518b6ea0d1ff65979bc46ff"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"a7d840d5bdc78709706835f6882cf4958b71c97c","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"project_tag_create \u003d _project_tag_name_properties"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"project_tag_update \u003d {"},{"line_number":65,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":66,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":67,"context_line":"    \u0027required\u0027: [],"}],"source_content_type":"text/x-python","patch_set":14,"id":"ff346bd7_ff2e4890","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":18},"in_reply_to":"ff346bd7_7cf8297a","updated":"2017-07-26 17:19:27.000000000","message":"Done","commit_id":"b0822e226e85364ae518b6ea0d1ff65979bc46ff"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"9c051a05f0875f6b5c5b9bac6814a39d2b671428","unresolved":false,"context_lines":[{"line_number":23,"context_line":"_project_tag_name_properties \u003d {"},{"line_number":24,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":25,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":26,"context_line":"    \u0027maxLength\u0027: 60,"},{"line_number":27,"context_line":"    # NOTE(gagehugo) This pattern is for tags which follows the"},{"line_number":28,"context_line":"    # guidelines as set by the API-WG, which matches anything that"},{"line_number":29,"context_line":"    # does not contain a \u0027/\u0027 or \u0027,\u0027."}],"source_content_type":"text/x-python","patch_set":25,"id":"7f287b81_3054cb52","line":26,"updated":"2017-08-29 13:55:33.000000000","message":"The length appears to be restrictive, if there is no specific reason why we want to limit at 60, I\u0027d suggest a much larger upper bound (say \u003e\u003e250).\n\nit was my understanding that \u0027.\u0027 is allowed, and hierarchies of tags would be presented with \u0027.\u0027 as the separator. Is that not the case?","commit_id":"f19bdcb786d4ccdb99937d011d30af81e51c5121"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f09030215d14c1a99ff9d2c16b7e462a1b365932","unresolved":false,"context_lines":[{"line_number":23,"context_line":"_project_tag_name_properties \u003d {"},{"line_number":24,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":25,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":26,"context_line":"    \u0027maxLength\u0027: 60,"},{"line_number":27,"context_line":"    # NOTE(gagehugo) This pattern is for tags which follows the"},{"line_number":28,"context_line":"    # guidelines as set by the API-WG, which matches anything that"},{"line_number":29,"context_line":"    # does not contain a \u0027/\u0027 or \u0027,\u0027."}],"source_content_type":"text/x-python","patch_set":25,"id":"7f287b81_9a97fc48","line":26,"in_reply_to":"7f287b81_3054cb52","updated":"2017-08-30 14:30:32.000000000","message":"60 was just a value we grabbed, it can always be increased if there is a demand for it.","commit_id":"f19bdcb786d4ccdb99937d011d30af81e51c5121"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"7f9d3120f210da1a768f7046670caff7cd3d3b68","unresolved":false,"context_lines":[{"line_number":23,"context_line":"_project_tag_name_properties \u003d {"},{"line_number":24,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":25,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":26,"context_line":"    \u0027maxLength\u0027: 60,"},{"line_number":27,"context_line":"    # NOTE(gagehugo) This pattern is for tags which follows the"},{"line_number":28,"context_line":"    # guidelines as set by the API-WG, which matches anything that"},{"line_number":29,"context_line":"    # does not contain a \u0027/\u0027 or \u0027,\u0027."}],"source_content_type":"text/x-python","patch_set":25,"id":"7f287b81_f20379bd","line":26,"in_reply_to":"7f287b81_9a97fc48","updated":"2017-09-02 21:16:56.000000000","message":"In that case, please make it a config entry. Requiring a code change here is not a reasonable thing from a deployment perspective.","commit_id":"f19bdcb786d4ccdb99937d011d30af81e51c5121"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"9c051a05f0875f6b5c5b9bac6814a39d2b671428","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":25,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":26,"context_line":"    \u0027maxLength\u0027: 60,"},{"line_number":27,"context_line":"    # NOTE(gagehugo) This pattern is for tags which follows the"},{"line_number":28,"context_line":"    # guidelines as set by the API-WG, which matches anything that"},{"line_number":29,"context_line":"    # does not contain a \u0027/\u0027 or \u0027,\u0027."},{"line_number":30,"context_line":"    # https://specs.openstack.org/openstack/api-wg/guidelines/tags.html"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f287b81_70dff339","line":27,"updated":"2017-08-29 13:55:33.000000000","message":"minor, follow (not follows)","commit_id":"f19bdcb786d4ccdb99937d011d30af81e51c5121"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"c06b72c85dd975c0e9ffbc045933f07403c27a6c","unresolved":false,"context_lines":[{"line_number":23,"context_line":"_project_tag_name_properties \u003d {"},{"line_number":24,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":25,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":26,"context_line":"    \u0027maxLength\u0027: 80,"},{"line_number":27,"context_line":"    # NOTE(gagehugo) This pattern is for tags which follows the"},{"line_number":28,"context_line":"    # guidelines as set by the API-WG, which matches anything that"},{"line_number":29,"context_line":"    # does not contain a \u0027/\u0027 or \u0027,\u0027."}],"source_content_type":"text/x-python","patch_set":26,"id":"7f287b81_9212f508","line":26,"updated":"2017-09-02 21:16:37.000000000","message":"see comment added in #25, please make this a configuration parameter so one doesn\u0027t have to change source for this.","commit_id":"c74d07638e692e0c92c2c5eafc872dc0a491a04c"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"ff559d0e19a6e3e65614727ce97692f07540f4a8","unresolved":false,"context_lines":[{"line_number":23,"context_line":"_project_tag_name_properties \u003d {"},{"line_number":24,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":25,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":26,"context_line":"    \u0027maxLength\u0027: 80,"},{"line_number":27,"context_line":"    # NOTE(gagehugo) This pattern is for tags which follows the"},{"line_number":28,"context_line":"    # guidelines as set by the API-WG, which matches anything that"},{"line_number":29,"context_line":"    # does not contain a \u0027/\u0027 or \u0027,\u0027."}],"source_content_type":"text/x-python","patch_set":26,"id":"7f287b81_b575c29a","line":26,"in_reply_to":"7f287b81_29c5018f","updated":"2017-09-04 16:46:58.000000000","message":"I\u0027ve added this to the keystone meeting agenda for tomorrow (9/5). But as both Tin and Samuel have said, this was deliberate to match nova\u0027s implementation and early on when this spec was being reviewed there was concerns about the complexity of having this value configurable since it ties in to the Project_Tag name column.","commit_id":"c74d07638e692e0c92c2c5eafc872dc0a491a04c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"11c0487845547b019df67752689a708ec5057be0","unresolved":false,"context_lines":[{"line_number":23,"context_line":"_project_tag_name_properties \u003d {"},{"line_number":24,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":25,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":26,"context_line":"    \u0027maxLength\u0027: 80,"},{"line_number":27,"context_line":"    # NOTE(gagehugo) This pattern is for tags which follows the"},{"line_number":28,"context_line":"    # guidelines as set by the API-WG, which matches anything that"},{"line_number":29,"context_line":"    # does not contain a \u0027/\u0027 or \u0027,\u0027."}],"source_content_type":"text/x-python","patch_set":26,"id":"7f287b81_29c5018f","line":26,"in_reply_to":"7f287b81_8d0c1643","updated":"2017-09-04 13:53:30.000000000","message":"If there is a request/need to have this as something configurable, sure it\u0027s doable, but it needs to be discussed.\n\nIsn\u0027t there the same need for nova server tags (so we are consistent)?\n\nIt\u0027s technically possible, just add the column lenght to 255 and say it should be configurable between 1 and 255. what happens to existing tags if the config valued is lowered? do we trim them? there is quite a bit of additional complexity if we want this to be configurable.","commit_id":"c74d07638e692e0c92c2c5eafc872dc0a491a04c"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"a3b472bdc75532424fe589034aa9cded670ae4d5","unresolved":false,"context_lines":[{"line_number":23,"context_line":"_project_tag_name_properties \u003d {"},{"line_number":24,"context_line":"    \u0027type\u0027: \u0027string\u0027,"},{"line_number":25,"context_line":"    \u0027minLength\u0027: 1,"},{"line_number":26,"context_line":"    \u0027maxLength\u0027: 80,"},{"line_number":27,"context_line":"    # NOTE(gagehugo) This pattern is for tags which follows the"},{"line_number":28,"context_line":"    # guidelines as set by the API-WG, which matches anything that"},{"line_number":29,"context_line":"    # does not contain a \u0027/\u0027 or \u0027,\u0027."}],"source_content_type":"text/x-python","patch_set":26,"id":"7f287b81_8d0c1643","line":26,"in_reply_to":"7f287b81_9212f508","updated":"2017-09-03 04:25:05.000000000","message":"I believe this value is hardcoded similar to nova instance tag for specific reasons - perhaps fearing folks from blowing up the database with tags data. Since this value is tied to the DB column length, making it configurable may need to be documented (e.g. setting this \u003e the column length has no effect).  Perhaps it is something to discuss during the next keystone meeting.","commit_id":"c74d07638e692e0c92c2c5eafc872dc0a491a04c"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"c06b72c85dd975c0e9ffbc045933f07403c27a6c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":36,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":37,"context_line":"    \u0027required\u0027: [],"},{"line_number":38,"context_line":"    \u0027maxItems\u0027: 50,"},{"line_number":39,"context_line":"    \u0027uniqueItems\u0027: True"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"7f287b81_b20df1e9","line":38,"updated":"2017-09-02 21:16:37.000000000","message":"shouldn\u0027t this be a config parameter as well?","commit_id":"c74d07638e692e0c92c2c5eafc872dc0a491a04c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"43e416aee0e1f829e9651aba1d2c1ae3d81070da","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":36,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":37,"context_line":"    \u0027required\u0027: [],"},{"line_number":38,"context_line":"    \u0027maxItems\u0027: 100,"},{"line_number":39,"context_line":"    \u0027uniqueItems\u0027: True"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7f515b1d_03d86f1b","line":38,"range":{"start_line":38,"start_character":16,"end_line":38,"end_character":19},"updated":"2017-09-28 20:03:56.000000000","message":"Wasn\u0027t the plan to make this consistent with nova? \n\nhttp://eavesdrop.openstack.org/meetings/keystone/2017/keystone.2017-09-05-18.00.log.html#l-176","commit_id":"1ab2dfa3d46a18f4b90404341319c57e4ac20856"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"e58c470c50abc80cea77fc6e076aaf22c63f1b75","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":36,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":37,"context_line":"    \u0027required\u0027: [],"},{"line_number":38,"context_line":"    \u0027maxItems\u0027: 100,"},{"line_number":39,"context_line":"    \u0027uniqueItems\u0027: True"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7f515b1d_f4a86b20","line":38,"range":{"start_line":38,"start_character":16,"end_line":38,"end_character":19},"in_reply_to":"7f515b1d_03d86f1b","updated":"2017-09-28 22:36:48.000000000","message":"Done","commit_id":"1ab2dfa3d46a18f4b90404341319c57e4ac20856"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e72f965c8dfb4a0f5180eb13d8d5d7867149c768","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    \u0027type\u0027: \u0027array\u0027,"},{"line_number":36,"context_line":"    \u0027items\u0027: _project_tag_name_properties,"},{"line_number":37,"context_line":"    \u0027required\u0027: [],"},{"line_number":38,"context_line":"    \u0027maxItems\u0027: 80,"},{"line_number":39,"context_line":"    \u0027uniqueItems\u0027: True"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"7f515b1d_aaaa7c15","line":38,"range":{"start_line":38,"start_character":16,"end_line":38,"end_character":18},"updated":"2017-09-29 16:20:32.000000000","message":"Nice - thanks for updating for consistency. Let\u0027s make sure we update the specification, too!\n\nhttp://specs.openstack.org/openstack/keystone-specs/specs/keystone/queens/project-tags.html#proposed-changes","commit_id":"fc2cb8f076e678adbace0cacf137a7e9af416238"}],"keystone/tests/unit/test_validation.py":[{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"8178a6537bf2bd0061cd5b3616e9d84fc74be975","unresolved":false,"context_lines":[{"line_number":527,"context_line":"                          tags)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def test_validate_update_project_tags_max_values(self):"},{"line_number":530,"context_line":"        tags \u003d []"},{"line_number":531,"context_line":"        for i in range(_MAX_PROJECT_TAG_COUNT):"},{"line_number":532,"context_line":"            tags.append(\u0027tag\u0027 + str(i))"},{"line_number":533,"context_line":"        self.update_project_tags_validator.validate(tags)"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"        # Should fail for higher than max value, which is 50"}],"source_content_type":"text/x-python","patch_set":10,"id":"1f1a1f67_734a0084","line":532,"range":{"start_line":530,"start_character":0,"end_line":532,"end_character":39},"updated":"2017-07-20 03:59:45.000000000","message":"can probably rewritten this using list comprehension:\n\n  tags \u003d [\u0027tag%d\u0027 % i for i in range(_MAX_PROJECT_TAG_COUNT)]","commit_id":"785ddf7f3e81f357d20079644a67663a16c9d9b7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"804fcd14d8f7d5e8e2d5e6aefc674784a29dc3b2","unresolved":false,"context_lines":[{"line_number":483,"context_line":"        tag \u003d \u0027invalid/\u0027"},{"line_number":484,"context_line":"        self.assertRaises(exception.SchemaValidationError,"},{"line_number":485,"context_line":"                          self.create_project_tags_validator.validate,"},{"line_number":486,"context_line":"                          tag)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    def test_validate_create_project_tags_name_too_large(self):"},{"line_number":489,"context_line":"        tag \u003d \u0027a\u0027 * _MAX_PROJECT_TAG_NAME_CHARS"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_586b821e","line":486,"updated":"2017-07-20 19:09:23.000000000","message":"nit: you can exercise some reuse here:\n\n  def test_validate_create_project_tags_invalid_characters(self):\n      for invalid_tag in [uuid.uuid4().hex + \u0027,\u0027, uuid.uuid4().hex + \u0027/\u0027]\n          self.assertRaises(exception.SchemaValidationError,\n                            self.create_project_tags_validator.validate,\n                            invalid_tag)","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f77f99a5af59887e502c12d1cbd624cfe8f8b637","unresolved":false,"context_lines":[{"line_number":483,"context_line":"        tag \u003d \u0027invalid/\u0027"},{"line_number":484,"context_line":"        self.assertRaises(exception.SchemaValidationError,"},{"line_number":485,"context_line":"                          self.create_project_tags_validator.validate,"},{"line_number":486,"context_line":"                          tag)"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"    def test_validate_create_project_tags_name_too_large(self):"},{"line_number":489,"context_line":"        tag \u003d \u0027a\u0027 * _MAX_PROJECT_TAG_NAME_CHARS"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_13e5ed38","line":486,"in_reply_to":"1f1a1f67_586b821e","updated":"2017-07-20 19:21:13.000000000","message":"cool, will do!","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"804fcd14d8f7d5e8e2d5e6aefc674784a29dc3b2","unresolved":false,"context_lines":[{"line_number":504,"context_line":"        self.update_project_tags_validator.validate(tags)"},{"line_number":505,"context_line":""},{"line_number":506,"context_line":"    def test_validate_update_project_tags_invalid_characters(self):"},{"line_number":507,"context_line":"        tags \u003d [\u0027Valid\u0027, \u0027Invalid,\u0027]"},{"line_number":508,"context_line":"        self.assertRaises(exception.SchemaValidationError,"},{"line_number":509,"context_line":"                          self.create_project_tags_validator.validate,"},{"line_number":510,"context_line":"                          tags)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_b8ca9617","line":507,"updated":"2017-07-20 19:09:23.000000000","message":"Same comment here about reuse (just use sets instead).","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"804fcd14d8f7d5e8e2d5e6aefc674784a29dc3b2","unresolved":false,"context_lines":[{"line_number":526,"context_line":"                          self.create_project_tags_validator.validate,"},{"line_number":527,"context_line":"                          tags)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def test_validate_update_project_tags_max_values(self):"},{"line_number":530,"context_line":"        tags \u003d [\u0027tag%d\u0027 % i for i in range(_MAX_PROJECT_TAG_COUNT)]"},{"line_number":531,"context_line":"        self.update_project_tags_validator.validate(tags)"},{"line_number":532,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_18fcea3c","line":529,"updated":"2017-07-20 19:09:23.000000000","message":"The failure here actually happens when calling self.create_project_tags_validator.","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f77f99a5af59887e502c12d1cbd624cfe8f8b637","unresolved":false,"context_lines":[{"line_number":526,"context_line":"                          self.create_project_tags_validator.validate,"},{"line_number":527,"context_line":"                          tags)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def test_validate_update_project_tags_max_values(self):"},{"line_number":530,"context_line":"        tags \u003d [\u0027tag%d\u0027 % i for i in range(_MAX_PROJECT_TAG_COUNT)]"},{"line_number":531,"context_line":"        self.update_project_tags_validator.validate(tags)"},{"line_number":532,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_136ccd9a","line":529,"in_reply_to":"1f1a1f67_18fcea3c","updated":"2017-07-20 19:21:13.000000000","message":"oh good catch","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"804fcd14d8f7d5e8e2d5e6aefc674784a29dc3b2","unresolved":false,"context_lines":[{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def test_validate_update_project_tags_max_values(self):"},{"line_number":530,"context_line":"        tags \u003d [\u0027tag%d\u0027 % i for i in range(_MAX_PROJECT_TAG_COUNT)]"},{"line_number":531,"context_line":"        self.update_project_tags_validator.validate(tags)"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"        # Should fail for higher than max value, which is 50"},{"line_number":534,"context_line":"        tags.append(\u0027tag51\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_989d9a0c","line":531,"updated":"2017-07-20 19:09:23.000000000","message":"We could add another test case that ensure we can\u0027t update a project with 51 tags, right?","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f77f99a5af59887e502c12d1cbd624cfe8f8b637","unresolved":false,"context_lines":[{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def test_validate_update_project_tags_max_values(self):"},{"line_number":530,"context_line":"        tags \u003d [\u0027tag%d\u0027 % i for i in range(_MAX_PROJECT_TAG_COUNT)]"},{"line_number":531,"context_line":"        self.update_project_tags_validator.validate(tags)"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"        # Should fail for higher than max value, which is 50"},{"line_number":534,"context_line":"        tags.append(\u0027tag51\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_735d41e8","line":531,"in_reply_to":"1f1a1f67_989d9a0c","updated":"2017-07-20 19:21:13.000000000","message":"sure","commit_id":"2e1bd6fa6fe772503c6059acf0e2ff276cd1bfc0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"5d96202825c36b4dfd1be7d177d7a3d459d1f2f3","unresolved":false,"context_lines":[{"line_number":663,"context_line":"                              self.update_domain_validator.validate,"},{"line_number":664,"context_line":"                              request_to_validate)"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    def test_validate_domain_update_with_tag_name_too_long(self):"},{"line_number":667,"context_line":"        invalid_name \u003d \u0027a\u0027 * 61"},{"line_number":668,"context_line":"        request_to_validate \u003d {\u0027name\u0027: uuid.uuid4().hex,"},{"line_number":669,"context_line":"                               \u0027tags\u0027: [\u0027foo\u0027, invalid_name]}"}],"source_content_type":"text/x-python","patch_set":18,"id":"ff346bd7_065e3811","line":666,"updated":"2017-07-27 17:27:06.000000000","message":"could have checked 60 works before asseting 61 breaks","commit_id":"55dd5b128759cfb0744f4c74fe419d66b7bbfe8a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"16cf08d7f9a36bc3f009db4891d19a7b1dad3dad","unresolved":false,"context_lines":[{"line_number":664,"context_line":"                              request_to_validate)"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    def test_validate_domain_update_with_tag_name_too_long(self):"},{"line_number":667,"context_line":"        invalid_name \u003d \u0027a\u0027 * 61"},{"line_number":668,"context_line":"        request_to_validate \u003d {\u0027name\u0027: uuid.uuid4().hex,"},{"line_number":669,"context_line":"                               \u0027tags\u0027: [\u0027foo\u0027, invalid_name]}"},{"line_number":670,"context_line":"        self.assertRaises(exception.SchemaValidationError,"}],"source_content_type":"text/x-python","patch_set":18,"id":"ff346bd7_1b9c5568","line":667,"updated":"2017-07-27 17:10:10.000000000","message":"Why not keep these as global variables so they can be reused?","commit_id":"55dd5b128759cfb0744f4c74fe419d66b7bbfe8a"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"5d96202825c36b4dfd1be7d177d7a3d459d1f2f3","unresolved":false,"context_lines":[{"line_number":672,"context_line":"                          request_to_validate)"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":"    def test_validate_domain_update_with_too_many_tags(self):"},{"line_number":675,"context_line":"        tags \u003d []"},{"line_number":676,"context_line":"        for _ in range(51):"},{"line_number":677,"context_line":"            tags.append(uuid.uuid4().hex)"},{"line_number":678,"context_line":"        request_to_validate \u003d {\u0027name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":18,"id":"ff346bd7_a6a2ccfa","line":675,"updated":"2017-07-27 17:27:06.000000000","message":"same here, could have checked 50 tags works..\n\n\nsame comments valid for all above.","commit_id":"55dd5b128759cfb0744f4c74fe419d66b7bbfe8a"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"9c051a05f0875f6b5c5b9bac6814a39d2b671428","unresolved":false,"context_lines":[{"line_number":386,"context_line":"                               \u0027tags\u0027: [\u0027foo\u0027, \u0027bar\u0027]}"},{"line_number":387,"context_line":"        self.create_project_validator.validate(request_to_validate)"},{"line_number":388,"context_line":""},{"line_number":389,"context_line":"    def test_validate_project_create_with_tags_invalid_char(self):"},{"line_number":390,"context_line":"        invalid_chars \u003d [\u0027,\u0027, \u0027/\u0027]"},{"line_number":391,"context_line":"        for char in invalid_chars:"},{"line_number":392,"context_line":"            tag \u003d uuid.uuid4().hex + char"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f287b81_70ec938e","line":389,"updated":"2017-08-29 13:55:33.000000000","message":"the test appears to only verify tags that end with the invalid character.","commit_id":"f19bdcb786d4ccdb99937d011d30af81e51c5121"},{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"9c051a05f0875f6b5c5b9bac6814a39d2b671428","unresolved":false,"context_lines":[{"line_number":397,"context_line":"                              request_to_validate)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def test_validate_project_create_with_tag_name_too_long(self):"},{"line_number":400,"context_line":"        invalid_name \u003d \u0027a\u0027 * 61"},{"line_number":401,"context_line":"        request_to_validate \u003d {\u0027name\u0027: uuid.uuid4().hex,"},{"line_number":402,"context_line":"                               \u0027tags\u0027: [\u0027foo\u0027, invalid_name]}"},{"line_number":403,"context_line":"        self.assertRaises(exception.SchemaValidationError,"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f287b81_906a5fea","line":400,"updated":"2017-08-29 13:55:33.000000000","message":"would be good if this test verified that the limit worked and limit + 1 failed","commit_id":"f19bdcb786d4ccdb99937d011d30af81e51c5121"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"1b7f75ae1b246c64f369637469b946b2a0020791","unresolved":false,"context_lines":[{"line_number":397,"context_line":"                              request_to_validate)"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def test_validate_project_create_with_tag_name_too_long(self):"},{"line_number":400,"context_line":"        invalid_name \u003d \u0027a\u0027 * 61"},{"line_number":401,"context_line":"        request_to_validate \u003d {\u0027name\u0027: uuid.uuid4().hex,"},{"line_number":402,"context_line":"                               \u0027tags\u0027: [\u0027foo\u0027, invalid_name]}"},{"line_number":403,"context_line":"        self.assertRaises(exception.SchemaValidationError,"}],"source_content_type":"text/x-python","patch_set":25,"id":"7f287b81_378013f5","line":400,"in_reply_to":"7f287b81_906a5fea","updated":"2017-08-30 22:04:54.000000000","message":"There are tests for this in the other patch sets, this only tests against the schema","commit_id":"f19bdcb786d4ccdb99937d011d30af81e51c5121"}]}
