)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c5dcc655504673cbfa194a2fa2d35de774a55eec","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Update nodes-tagging spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Update the spec in the following ways:"},{"line_number":10,"context_line":"- improve the DB schema for more efficient searching"},{"line_number":11,"context_line":"- include requirement for tempest API testing"},{"line_number":12,"context_line":"- cite the API Working Group\u0027s tag specification, and indicate"},{"line_number":13,"context_line":"  that we will follow it rather than create our own."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"da20952f_4e4a4fae","line":10,"updated":"2015-09-01 15:49:41.000000000","message":"I don\u0027t see how additional join will make search faster. Previously we had:\n\n select node_id from tags where tag\u003d\u0027foobar\u0027;\n\nnow we have something like (pseudo-sql, not sure I remember it right :)\n\n select nodes.node_id from nodes join tags where tags.tag\u003d\u0027foobar\u0027;","commit_id":"ed92da499b59bb4e19625500b408887f514f95f5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c5dcc655504673cbfa194a2fa2d35de774a55eec","unresolved":false,"context_lines":[{"line_number":10,"context_line":"- improve the DB schema for more efficient searching"},{"line_number":11,"context_line":"- include requirement for tempest API testing"},{"line_number":12,"context_line":"- cite the API Working Group\u0027s tag specification, and indicate"},{"line_number":13,"context_line":"  that we will follow it rather than create our own."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: I09224853279f9d851c83e4e4408391072a3c0175"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"da20952f_eec5630a","line":13,"updated":"2015-09-01 15:49:41.000000000","message":"+100 for this one","commit_id":"ed92da499b59bb4e19625500b408887f514f95f5"}],"specs/approved/nodes-tagging.rst":[{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"aac8b94be8c928645f0c3adc72ed628efd762d06","unresolved":false,"context_lines":[{"line_number":75,"context_line":"REST API impact"},{"line_number":76,"context_line":"---------------"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"We will follow the `API Working Group\u0027s specification for tagging`_, rather"},{"line_number":79,"context_line":"than invent our own."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":".. _API Working Group\u0027s specification for tagging: http://specs.openstack.org/openstack/api-wg/guidelines/tags.html"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a4dcd0f_9a115360","line":78,"updated":"2015-08-10 09:38:39.000000000","message":"Nice to know !! \n\nAre we going to support addressing individual tags ? I think we should to make sure we do only only a single API call to do ironic node-tags-update in the CLI.","commit_id":"7f7dd685a38fe59f56cd057eed1a1885290b1db8"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"734576b6de63265582c7a75a67857ca274d285db","unresolved":false,"context_lines":[{"line_number":75,"context_line":"REST API impact"},{"line_number":76,"context_line":"---------------"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"We will follow the `API Working Group\u0027s specification for tagging`_, rather"},{"line_number":79,"context_line":"than invent our own."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":".. _API Working Group\u0027s specification for tagging: http://specs.openstack.org/openstack/api-wg/guidelines/tags.html"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a4dcd0f_4d136e65","line":78,"in_reply_to":"1a4dcd0f_9a115360","updated":"2015-08-13 03:51:39.000000000","message":"I\u0027d like to not support addressing individual tags in this spec, ironic node-tags-update can use a PUT request with the complete updated tags.","commit_id":"7f7dd685a38fe59f56cd057eed1a1885290b1db8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"0f6f15131d6459fa365694a4f1b4e2965bab6966","unresolved":false,"context_lines":[{"line_number":46,"context_line":"populated on-demand (i.e. not eager-loaded)."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"A tag should be defined as a Unicode string no longer than 64 characters"},{"line_number":49,"context_line":"(196 bytes) in length, with an index on this field."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Tags are strings attached to an entity with the purpose of classification"},{"line_number":52,"context_line":"into groups. To simplify requests that specify lists of tags, the comma"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a4dcd0f_79a2634d","line":49,"updated":"2015-08-14 09:40:03.000000000","message":"nit: you can\u0027t assume how many bytes a unicode string will occupy","commit_id":"df39ef2201de4c39daafa9a111ec68ef5de8c992"},{"author":{"_account_id":9315,"name":"ramesh","email":"rameshg87@gmail.com","username":"rameshg87"},"change_message_id":"df590aed6779eec5fb04c588441bdb098448560c","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        tag_id INT(11) NOT NULL,"},{"line_number":66,"context_line":"        PRIMARY KEY (node_id, tag_id),"},{"line_number":67,"context_line":"        KEY (tag_id),"},{"line_number":68,"context_line":"        FOREIGN KEY (node_id)"},{"line_number":69,"context_line":"          REFERENCES nodes(id)"},{"line_number":70,"context_line":"          ON DELETE CASCADE"},{"line_number":71,"context_line":"    )"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a4dcd0f_f4c3da55","line":68,"updated":"2015-08-14 09:47:31.000000000","message":"Don\u0027t we need reference for tag_id also. When any tag is deleted, the corresponding entries here are supposed to be deleted as well.","commit_id":"df39ef2201de4c39daafa9a111ec68ef5de8c992"},{"author":{"_account_id":6498,"name":"Divakar Padiyar Nandavar","email":"divakar.padiyar-nandavar@hpe.com","username":"divakar-padiyar-nandavar"},"change_message_id":"4575e0c0def6508a14b55a47d94a6c681c85d3c9","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"For the database schema, the following table constructs would suffice ::"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    CREATE TABLE tags ("},{"line_number":58,"context_line":"        id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,"},{"line_number":59,"context_line":"        tag VARCHAR(64) NOT NULL CHARACTER SET utf8,"},{"line_number":60,"context_line":"        KEY (tag),"}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa1b9901_71b6f3dd","line":57,"updated":"2015-08-18 06:09:33.000000000","message":"Do we really want to manage different tags as a master list and add the constraint on the node_tags?  can we not just maintain the node_tags.\nMaintaining separate tags would need additional CRUD apis as well.","commit_id":"ed92da499b59bb4e19625500b408887f514f95f5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c5dcc655504673cbfa194a2fa2d35de774a55eec","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"For the database schema, the following table constructs would suffice ::"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    CREATE TABLE tags ("},{"line_number":58,"context_line":"        id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,"},{"line_number":59,"context_line":"        tag VARCHAR(64) NOT NULL CHARACTER SET utf8,"},{"line_number":60,"context_line":"        KEY (tag),"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_0ecbf71f","line":57,"updated":"2015-09-01 15:49:41.000000000","message":"good point. even if we don\u0027t have additional CRUD, we will need to somehow maintain this tag list..","commit_id":"ed92da499b59bb4e19625500b408887f514f95f5"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"9811051d719f9052f103f5095e9d70449d54f207","unresolved":false,"context_lines":[{"line_number":88,"context_line":"Add tags CRUD operations commands:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* ironic node-tags-list \u003cnode uuid\u003e"},{"line_number":91,"context_line":"* ironic node-tags-update \u003cnode uuid\u003e \u003cop\u003e \u003ctags\u003e"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"\u003cop\u003e Operation: \u0027add\u0027 or \u0027remove\u0027"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"da20952f_fc84455e","line":91,"updated":"2015-09-08 09:26:56.000000000","message":"for consistency with what you have below, it should be node-tag-list and node-tag-update. Or it should be node-tags-add below, but I like this less.","commit_id":"dcdab3da51625f12d2ff51ee1714eea371005dcd"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"31b4a5f2880388c387fec392fce76bf63018ad1f","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* ironic node-list --tag tag1 --tag tag2"},{"line_number":102,"context_line":"* ironic node-list --tag-any tag1 --tag-any tag2"},{"line_number":103,"context_line":"* ironic node-list --not-tag tag3"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Multiple --tag will be used to filter results in an AND expression, and"},{"line_number":106,"context_line":"--tag-any for OR expression, allowing for exclusionary tags via the"}],"source_content_type":"text/x-rst","patch_set":10,"id":"ba15a1d1_a0bcd0dc","line":103,"updated":"2015-09-16 16:17:56.000000000","message":"it seems somewhat inconsistent to have \u0027not-tag\u0027 and \u0027tag-any\u0027, vs \u0027not-tag\u0027/\u0027any-tag\u0027 OR \u0027tag-not\u0027/\u0027tag-any\u0027. What do you think?","commit_id":"270ef842f1017cf128069a4399c1f739fe8291eb"}],"specs/liberty/nodes-tagging.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"694370cfeb00aec3d3ff5929c3213e91af4a735b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"The `ironic.objects.tags.TagList` field in the python object model will be"},{"line_number":46,"context_line":"populated on-demand (i.e. not eager-loaded)."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"A tag should be defined as a Unicode string no longer than 64 characters"},{"line_number":49,"context_line":"(196 bytes) in length, with an index on this field."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Tags should exclude common punctuation characters, such as \".\", \"!\", \"\u0026\", \";\","}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_227b9529","line":48,"updated":"2015-06-18 13:31:45.000000000","message":"I wonder why we need an artificial limit in 64 chars, though I also can\u0027t imagine a tag larger","commit_id":"e063f364bf7e80848fc1a1a88214e1a724b619da"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bfdc74c0e45974c02b872728fc682bf8471e6dd6","unresolved":false,"context_lines":[{"line_number":45,"context_line":"The `ironic.objects.tags.TagList` field in the python object model will be"},{"line_number":46,"context_line":"populated on-demand (i.e. not eager-loaded)."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"A tag should be defined as a Unicode string no longer than 64 characters"},{"line_number":49,"context_line":"(196 bytes) in length, with an index on this field."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Tags should exclude common punctuation characters, such as \".\", \"!\", \"\u0026\", \";\","}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_0c59df34","line":48,"updated":"2015-06-18 16:00:23.000000000","message":"The original spec included a contradiction -- it said \"255 bytes\" but actually limited to 255 characters, which is 765 bytes (because utf8 is variable 1 to 3 bytes per char).","commit_id":"e063f364bf7e80848fc1a1a88214e1a724b619da"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"694370cfeb00aec3d3ff5929c3213e91af4a735b","unresolved":false,"context_lines":[{"line_number":48,"context_line":"A tag should be defined as a Unicode string no longer than 64 characters"},{"line_number":49,"context_line":"(196 bytes) in length, with an index on this field."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Tags should exclude common punctuation characters, such as \".\", \"!\", \"\u0026\", \";\","},{"line_number":52,"context_line":"which may be used as modifiers or separators in query strings."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"For the database schema, the following table constructs would suffice ::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_c2750932","line":51,"updated":"2015-06-18 13:31:45.000000000","message":"Also why? I especially disagree with dots, but everything else can be easily escaped.","commit_id":"e063f364bf7e80848fc1a1a88214e1a724b619da"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bfdc74c0e45974c02b872728fc682bf8471e6dd6","unresolved":false,"context_lines":[{"line_number":48,"context_line":"A tag should be defined as a Unicode string no longer than 64 characters"},{"line_number":49,"context_line":"(196 bytes) in length, with an index on this field."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Tags should exclude common punctuation characters, such as \".\", \"!\", \"\u0026\", \";\","},{"line_number":52,"context_line":"which may be used as modifiers or separators in query strings."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"For the database schema, the following table constructs would suffice ::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_ac447349","line":51,"updated":"2015-06-18 16:00:23.000000000","message":"So that punctuation can be used for parsing later on, if we need it. Like using \"!\" for negation, or \":\" or \"-\" to separate subvalues. Or I dont know, because it makes sense?","commit_id":"e063f364bf7e80848fc1a1a88214e1a724b619da"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bfdc74c0e45974c02b872728fc682bf8471e6dd6","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    );"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    CREATE TABLE node_tags ("},{"line_number":63,"context_line":"        node_id INT(11) NOT NULL,"},{"line_number":64,"context_line":"        tag_id INT(11) NOT NULL,"},{"line_number":65,"context_line":"        PRIMARY KEY (node_id, tag_id),"},{"line_number":66,"context_line":"        KEY (tag_id),"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_cc3f77b2","line":63,"updated":"2015-06-18 16:00:23.000000000","message":"Yes, except that FK\u0027s are TERRIBLE for performance, and should not be used in production in most cases.","commit_id":"e063f364bf7e80848fc1a1a88214e1a724b619da"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"694370cfeb00aec3d3ff5929c3213e91af4a735b","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    );"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    CREATE TABLE node_tags ("},{"line_number":63,"context_line":"        node_id INT(11) NOT NULL,"},{"line_number":64,"context_line":"        tag_id INT(11) NOT NULL,"},{"line_number":65,"context_line":"        PRIMARY KEY (node_id, tag_id),"},{"line_number":66,"context_line":"        KEY (tag_id),"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_e2704d42","line":63,"updated":"2015-06-18 13:31:45.000000000","message":"this should be a foreign key btw","commit_id":"e063f364bf7e80848fc1a1a88214e1a724b619da"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"694370cfeb00aec3d3ff5929c3213e91af4a735b","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"Get all nodes not having a single tag ::"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    GET /v1/nodes?tag\u003d!{tag}"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"Get all nodes having one tag and not having another tag ::"},{"line_number":132,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_8292a14a","line":129,"updated":"2015-06-18 13:31:45.000000000","message":"ah, so that\u0027s why we exclude !. Still, I think we should allow everything else (maybe also exclude space though?)","commit_id":"e063f364bf7e80848fc1a1a88214e1a724b619da"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"bfdc74c0e45974c02b872728fc682bf8471e6dd6","unresolved":false,"context_lines":[{"line_number":155,"context_line":"Add tag-list filtering support to node-list command:"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"* ironic node-list --tag tag1 --tag tag2"},{"line_number":158,"context_line":"* ironic node-list --not-tag tag3"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"Multiple --tag will be used to filter results in an AND expression,"},{"line_number":161,"context_line":"allowing for exlusionary tags via the --not-tag option."}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_6c4aeb56","line":158,"updated":"2015-06-18 16:00:23.000000000","message":"It\u0027s bash. who cares if it\u0027s consistent or not consistent with the REST API? --not-option or --no-option is a standard bash\u0027ism.\n\n\"!\" is a control character in bash. There is no way we\u0027re making that a required parameter delineator in the CLI ...","commit_id":"e063f364bf7e80848fc1a1a88214e1a724b619da"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"694370cfeb00aec3d3ff5929c3213e91af4a735b","unresolved":false,"context_lines":[{"line_number":155,"context_line":"Add tag-list filtering support to node-list command:"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"* ironic node-list --tag tag1 --tag tag2"},{"line_number":158,"context_line":"* ironic node-list --not-tag tag3"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"Multiple --tag will be used to filter results in an AND expression,"},{"line_number":161,"context_line":"allowing for exlusionary tags via the --not-tag option."}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_a2956533","line":158,"updated":"2015-06-18 13:31:45.000000000","message":"This is inconsistent with HTTP API. Maybe use not_tag there as well? Or use ! here (which is a bit pita with bash, but still)","commit_id":"e063f364bf7e80848fc1a1a88214e1a724b619da"},{"author":{"_account_id":13997,"name":"SHIGEMATSU Mitsuhiro","email":"shigematsu.mitsuhiro@lab.ntt.co.jp","username":"pshige"},"change_message_id":"122e13defdea1c25624aea267870d1e785641bcd","unresolved":false,"context_lines":[{"line_number":39,"context_line":"object model."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"A new `ironic`.`tags` table will be added to the database, along with a join"},{"line_number":42,"context_line":"table, `ironic`.`node_tags`, that will faciliate efficiently searching for"},{"line_number":43,"context_line":"nodes by their tags."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"The `ironic.objects.tags.TagList` field in the python object model will be"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_345c1318","line":42,"updated":"2015-06-19 03:50:45.000000000","message":"s/faciliate/facilitate/","commit_id":"d59dd376483801935630f776f316e1bfa7c6c473"},{"author":{"_account_id":13997,"name":"SHIGEMATSU Mitsuhiro","email":"shigematsu.mitsuhiro@lab.ntt.co.jp","username":"pshige"},"change_message_id":"122e13defdea1c25624aea267870d1e785641bcd","unresolved":false,"context_lines":[{"line_number":107,"context_line":"* ironic node-list --not-tag tag3"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Multiple --tag will be used to filter results in an AND expression,"},{"line_number":110,"context_line":"allowing for exlusionary tags via the --not-tag option."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Driver API impact"},{"line_number":113,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_74adbbe7","line":110,"updated":"2015-06-19 03:50:45.000000000","message":"s/exlusionary/exclusionary/","commit_id":"d59dd376483801935630f776f316e1bfa7c6c473"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b57c64e56cffeda881314df6cdf7d3a31cbcbbda","unresolved":false,"context_lines":[{"line_number":48,"context_line":"A tag should be defined as a Unicode string no longer than 64 characters"},{"line_number":49,"context_line":"(196 bytes) in length, with an index on this field."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Tags should exclude common punctuation characters, such as \".\", \"!\", \"\u0026\", \";\","},{"line_number":52,"context_line":"which may be used as modifiers or separators in query strings."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"For the database schema, the following table constructs would suffice ::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa32b979_53f19b94","line":51,"updated":"2015-06-19 13:39:27.000000000","message":"I still disagree with at least dot being excluded. I don\u0027t care about others too much, but the guideline you link to only disallows a comma, and you don\u0027t even mention it.","commit_id":"bc73e3a96d50369bcc15feb31f69ca51337a7127"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b6bd7445bf63c0de59ad12c181749eae613cefd5","unresolved":false,"context_lines":[{"line_number":48,"context_line":"A tag should be defined as a Unicode string no longer than 64 characters"},{"line_number":49,"context_line":"(196 bytes) in length, with an index on this field."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Tags should exclude common punctuation characters, such as \".\", \"!\", \"\u0026\", \";\","},{"line_number":52,"context_line":"which may be used as modifiers or separators in query strings."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"For the database schema, the following table constructs would suffice ::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_7fe48eab","line":51,"in_reply_to":"fa32b979_53f19b94","updated":"2015-07-24 11:00:05.000000000","message":"Agree, let\u0027s follow the API guidelines. There\u0027s provisions for separators (lists) and excluding tags (not-tags\u003dblah) there.","commit_id":"bc73e3a96d50369bcc15feb31f69ca51337a7127"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b57c64e56cffeda881314df6cdf7d3a31cbcbbda","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    );"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    CREATE TABLE node_tags ("},{"line_number":63,"context_line":"        node_id INT(11) NOT NULL,"},{"line_number":64,"context_line":"        tag_id INT(11) NOT NULL,"},{"line_number":65,"context_line":"        PRIMARY KEY (node_id, tag_id),"},{"line_number":66,"context_line":"        KEY (tag_id),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa32b979_73ee1fb6","line":63,"updated":"2015-06-19 13:39:27.000000000","message":"Saying that foreign key add \"terrible\" overhead is an overstatement. Of course ACID adds overhead, but that comes for reason. And I\u0027m not convinced we should be discussing it in the context of (let\u0027s be honest) pretty moderate-load and moderate-size database like Ironic\u0027s. Not that I mind not using foreign keys, but such decisions should be taken with care.","commit_id":"bc73e3a96d50369bcc15feb31f69ca51337a7127"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b6bd7445bf63c0de59ad12c181749eae613cefd5","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    );"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    CREATE TABLE node_tags ("},{"line_number":63,"context_line":"        node_id INT(11) NOT NULL,"},{"line_number":64,"context_line":"        tag_id INT(11) NOT NULL,"},{"line_number":65,"context_line":"        PRIMARY KEY (node_id, tag_id),"},{"line_number":66,"context_line":"        KEY (tag_id),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_9f7ddab3","line":63,"in_reply_to":"3a50d1a3_337913c9","updated":"2015-07-24 11:00:05.000000000","message":"+1, I think we should value consistency over performance here. Additionally, we\u0027ve used FKs in the past on objects that are clearly more in the critical path for normal activity.","commit_id":"bc73e3a96d50369bcc15feb31f69ca51337a7127"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"3a7f58a18e83fa0019eb822466cd8d0fa0348cdd","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    );"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    CREATE TABLE node_tags ("},{"line_number":63,"context_line":"        node_id INT(11) NOT NULL,"},{"line_number":64,"context_line":"        tag_id INT(11) NOT NULL,"},{"line_number":65,"context_line":"        PRIMARY KEY (node_id, tag_id),"},{"line_number":66,"context_line":"        KEY (tag_id),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_337913c9","line":63,"in_reply_to":"ba3cc151_fd176052","updated":"2015-07-21 15:15:48.000000000","message":"please reference https://review.openstack.org/#/c/192576/","commit_id":"bc73e3a96d50369bcc15feb31f69ca51337a7127"},{"author":{"_account_id":6610,"name":"Zhenguo Niu","email":"Niu.ZGlinux@gmail.com","username":"niu-zglinux"},"change_message_id":"53888ecb2750425d01da3e8ee7da608b4f9bcaa6","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    );"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    CREATE TABLE node_tags ("},{"line_number":63,"context_line":"        node_id INT(11) NOT NULL,"},{"line_number":64,"context_line":"        tag_id INT(11) NOT NULL,"},{"line_number":65,"context_line":"        PRIMARY KEY (node_id, tag_id),"},{"line_number":66,"context_line":"        KEY (tag_id),"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba3cc151_fd176052","line":63,"in_reply_to":"fa32b979_73ee1fb6","updated":"2015-06-29 08:10:56.000000000","message":"I can add a relation() to the Tags model. which will tell SQLALchemy which fields are used in the join expression between the nodes and node_tags table.\n\nsomething like:\n\n  node \u003d orm.relationship(\n      \"Node\",\n      primaryjoin\u003d\u0027and_(Tag.node_id \u003d\u003d Node.uuid,\u0027\n                              \u0027Node.deleted \u003d\u003d 0)\u0027,","commit_id":"bc73e3a96d50369bcc15feb31f69ca51337a7127"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b57c64e56cffeda881314df6cdf7d3a31cbcbbda","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"When either a tag or a node is deleted, the DB API layer should delete all"},{"line_number":70,"context_line":"associated records in the node_tags table; there is no need to do this with a"},{"line_number":71,"context_line":"FOREIGN KEY CONSTRAINT."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"REST API impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa32b979_132a33e8","line":71,"updated":"2015-06-19 13:39:27.000000000","message":"... said people inventing MongoDB :) This can work, but requires careful programming, i.e. doing everything in a transaction. Not sure how it works with our objects model though, but I suppose it does.","commit_id":"bc73e3a96d50369bcc15feb31f69ca51337a7127"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b6bd7445bf63c0de59ad12c181749eae613cefd5","unresolved":false,"context_lines":[{"line_number":97,"context_line":"Add tags CRUD operations commands:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"* ironic node-list-tags \u003cnode uuid\u003e"},{"line_number":100,"context_line":"* ironic node-update-tags \u003cnode uuid\u003e \u003cop\u003e \u003ctag\u003e"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"\u003cop\u003e Operation: \u0027add\u0027 or \u0027remove\u0027"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_9a19687c","line":100,"updated":"2015-07-24 11:00:05.000000000","message":"I think these commands should be node-tags-$thing, for consistency with $object-$action.","commit_id":"bc73e3a96d50369bcc15feb31f69ca51337a7127"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"b57c64e56cffeda881314df6cdf7d3a31cbcbbda","unresolved":false,"context_lines":[{"line_number":107,"context_line":"* ironic node-list --not-tag tag3"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Multiple --tag will be used to filter results in an AND expression,"},{"line_number":110,"context_line":"allowing for exclusionary tags via the --not-tag option."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Driver API impact"},{"line_number":113,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa32b979_332f37f8","line":110,"updated":"2015-06-19 13:39:27.000000000","message":"note that the guideline also recommends OR expression. I don\u0027t insist we add it, but we should be explicit: do we ignore it only for CLI or do we skip it in API as well?","commit_id":"bc73e3a96d50369bcc15feb31f69ca51337a7127"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b6bd7445bf63c0de59ad12c181749eae613cefd5","unresolved":false,"context_lines":[{"line_number":107,"context_line":"* ironic node-list --not-tag tag3"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"Multiple --tag will be used to filter results in an AND expression,"},{"line_number":110,"context_line":"allowing for exclusionary tags via the --not-tag option."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Driver API impact"},{"line_number":113,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a50d1a3_5a03e00d","line":110,"in_reply_to":"fa32b979_332f37f8","updated":"2015-07-24 11:00:05.000000000","message":"The guideline actually uses AND for tags\u003dred,blue. And recommends tags-any\u003dred,blue for OR.","commit_id":"bc73e3a96d50369bcc15feb31f69ca51337a7127"}]}
