)]}'
{"nova/conf/ironic.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6bd9ea52e4c4a75b49bc19a1e78bfd8e5f2fbe4c","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        min\u003d0,"},{"line_number":80,"context_line":"        help\u003d\u0027Timeout (seconds) to wait for node serial console state \u0027"},{"line_number":81,"context_line":"             \u0027changed. Set to 0 to disable timeout.\u0027),"},{"line_number":82,"context_line":"    cfg.StrOpt("},{"line_number":83,"context_line":"        \u0027partition_key\u0027,"},{"line_number":84,"context_line":"        default\u003dNone,"},{"line_number":85,"context_line":"        mutable\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_2e1aeb16","line":82,"updated":"2019-02-05 20:39:24.000000000","message":"Going to want a feature release note for this stuff, unless there are more changes to come.","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cecce27d56c8c10e2498487e7aae078ad3245607","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        min\u003d0,"},{"line_number":80,"context_line":"        help\u003d\u0027Timeout (seconds) to wait for node serial console state \u0027"},{"line_number":81,"context_line":"             \u0027changed. Set to 0 to disable timeout.\u0027),"},{"line_number":82,"context_line":"    cfg.StrOpt("},{"line_number":83,"context_line":"        \u0027partition_key\u0027,"},{"line_number":84,"context_line":"        default\u003dNone,"},{"line_number":85,"context_line":"        mutable\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_df64fe4b","line":82,"in_reply_to":"9fdfeff1_0e936751","updated":"2019-02-08 13:07:29.000000000","message":"Done","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"49387ddfc237efd0e720429ee2f744d2aa0d6075","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        min\u003d0,"},{"line_number":80,"context_line":"        help\u003d\u0027Timeout (seconds) to wait for node serial console state \u0027"},{"line_number":81,"context_line":"             \u0027changed. Set to 0 to disable timeout.\u0027),"},{"line_number":82,"context_line":"    cfg.StrOpt("},{"line_number":83,"context_line":"        \u0027partition_key\u0027,"},{"line_number":84,"context_line":"        default\u003dNone,"},{"line_number":85,"context_line":"        mutable\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_0e936751","line":82,"in_reply_to":"9fdfeff1_2e1aeb16","updated":"2019-02-05 20:43:07.000000000","message":"Yep, on my list. I\u0027m terrible at making sure I mark things WIP. Still need functional tests.","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f52c62dbdd8c79585378932a2e54b8cfa924a80e","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        regex\u003dr\u0027^[a-zA-Z0-9_\\-\\.]*$\u0027,"},{"line_number":88,"context_line":"        help\u003d\u0027Limit the set of nodes that may be managed by this service \u0027"},{"line_number":89,"context_line":"             \u0027to the set of nodes in Ironic which have a matching \u0027"},{"line_number":90,"context_line":"             \u0027conductor_group property. If unset, all available nodes may \u0027"},{"line_number":91,"context_line":"             \u0027be managed by this service.\u0027),"},{"line_number":92,"context_line":"    cfg.ListOpt("},{"line_number":93,"context_line":"        \u0027peer_list\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_0ebcc7b9","line":90,"range":{"start_line":90,"start_character":14,"end_line":90,"end_character":29},"updated":"2019-02-05 20:43:49.000000000","message":"Hmm, the partition_key is case sensitive here but according to the ironic config docs, the conductor_group option there is case insensitive:\n\nhttps://docs.openstack.org/ironic/rocky/configuration/config.html#conductor.conductor_group\n\nIs that also what gets exposed in the API for the node.conductor_group? I\u0027m just wondering how we deal with case issues if let\u0027s say we have FOO in nova and foo in conductor config - will that work? Clearly most sane people would probably have config management setting the same values in both configurations, but I\u0027m just wondering out loud.","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"416c9139a8ee36e8d0d527ad60e015473814581f","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        regex\u003dr\u0027^[a-zA-Z0-9_\\-\\.]*$\u0027,"},{"line_number":88,"context_line":"        help\u003d\u0027Limit the set of nodes that may be managed by this service \u0027"},{"line_number":89,"context_line":"             \u0027to the set of nodes in Ironic which have a matching \u0027"},{"line_number":90,"context_line":"             \u0027conductor_group property. If unset, all available nodes may \u0027"},{"line_number":91,"context_line":"             \u0027be managed by this service.\u0027),"},{"line_number":92,"context_line":"    cfg.ListOpt("},{"line_number":93,"context_line":"        \u0027peer_list\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_4e7c0fb5","line":90,"range":{"start_line":90,"start_character":14,"end_line":90,"end_character":29},"in_reply_to":"9fdfeff1_0ebcc7b9","updated":"2019-02-05 20:59:02.000000000","message":"So in ironic, we allow the same regex as we are here, we just lower() it at runtime. I should make a note that it\u0027s case-insensitive in this help option, though, fair point. \n\nI could also lower() it when used here, but the ironic API will handle it for us (see the request is caps, the response is not):\n\n    $ curl --silent -g -X GET http://10.88.211.175/baremetal/v1/nodes/?conductor_group\u003dFOO\\\u0026fields\u003dname,conductor_group -H \"Accept: application/json\" -H \"Content-Type: application/json\" -H \"User-Agent: python-ironicclient\" -H \"X-Auth-Token: $OS_TOKEN\" -H \"X-OpenStack-Ironic-API-Version: 1.46\" | python -m json.tool\n    {\n        \"nodes\": [\n            {\n                \"conductor_group\": \"foo\",\n                \"links\": [\n                    {\n                        \"href\": \"http://10.88.211.175/baremetal/v1/nodes/6dd31be0-4cb2-47a8-8b36-45b02bc076fd\",\n                        \"rel\": \"self\"\n                    },\n                    {\n                        \"href\": \"http://10.88.211.175/baremetal/nodes/6dd31be0-4cb2-47a8-8b36-45b02bc076fd\",\n                        \"rel\": \"bookmark\"\n                    }\n                ],\n                \"name\": \"node-0\"\n            }\n        ]\n    }\n\nI did find a bug around setting conductor_group which doesn\u0027t behave case-insensitive, though, so thanks for that :)","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cecce27d56c8c10e2498487e7aae078ad3245607","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        regex\u003dr\u0027^[a-zA-Z0-9_\\-\\.]*$\u0027,"},{"line_number":88,"context_line":"        help\u003d\u0027Limit the set of nodes that may be managed by this service \u0027"},{"line_number":89,"context_line":"             \u0027to the set of nodes in Ironic which have a matching \u0027"},{"line_number":90,"context_line":"             \u0027conductor_group property. If unset, all available nodes may \u0027"},{"line_number":91,"context_line":"             \u0027be managed by this service.\u0027),"},{"line_number":92,"context_line":"    cfg.ListOpt("},{"line_number":93,"context_line":"        \u0027peer_list\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_5f67ae52","line":90,"range":{"start_line":90,"start_character":14,"end_line":90,"end_character":29},"in_reply_to":"9fdfeff1_4e7c0fb5","updated":"2019-02-08 13:07:29.000000000","message":"Done","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e050ca2843a943a5728a1945179d094d5eb1e942","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        help\u003d\u0027Case-insensitive key to limit the set of nodes that may be \u0027"},{"line_number":89,"context_line":"             \u0027managed by this service to the set of nodes in Ironic which \u0027"},{"line_number":90,"context_line":"             \u0027have a matching conductor_group property. If unset, all \u0027"},{"line_number":91,"context_line":"             \u0027available nodes may be managed by this service.\u0027),"},{"line_number":92,"context_line":"    cfg.ListOpt("},{"line_number":93,"context_line":"        \u0027peer_list\u0027,"},{"line_number":94,"context_line":"        default\u003d[],"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_b8490661","line":91,"range":{"start_line":91,"start_character":30,"end_line":91,"end_character":33},"updated":"2019-02-08 13:07:56.000000000","message":"s/may/will/ to make it a bit less ambiguous?","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"d31ad3aa5a1b90ebceec2f78996081dabbcded1d","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        help\u003d\u0027Case-insensitive key to limit the set of nodes that may be \u0027"},{"line_number":89,"context_line":"             \u0027managed by this service to the set of nodes in Ironic which \u0027"},{"line_number":90,"context_line":"             \u0027have a matching conductor_group property. If unset, all \u0027"},{"line_number":91,"context_line":"             \u0027available nodes may be managed by this service.\u0027),"},{"line_number":92,"context_line":"    cfg.ListOpt("},{"line_number":93,"context_line":"        \u0027peer_list\u0027,"},{"line_number":94,"context_line":"        default\u003d[],"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_1e77be3c","line":91,"range":{"start_line":91,"start_character":30,"end_line":91,"end_character":33},"in_reply_to":"9fdfeff1_4fb84429","updated":"2019-02-11 16:28:26.000000000","message":"Done","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cffc23a3beaeb3434169334e0f0b4b29b7a6f502","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        help\u003d\u0027Case-insensitive key to limit the set of nodes that may be \u0027"},{"line_number":89,"context_line":"             \u0027managed by this service to the set of nodes in Ironic which \u0027"},{"line_number":90,"context_line":"             \u0027have a matching conductor_group property. If unset, all \u0027"},{"line_number":91,"context_line":"             \u0027available nodes may be managed by this service.\u0027),"},{"line_number":92,"context_line":"    cfg.ListOpt("},{"line_number":93,"context_line":"        \u0027peer_list\u0027,"},{"line_number":94,"context_line":"        default\u003d[],"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_4fb84429","line":91,"range":{"start_line":91,"start_character":30,"end_line":91,"end_character":33},"in_reply_to":"9fdfeff1_b8490661","updated":"2019-02-09 15:50:17.000000000","message":"Well... if there are multiple compute services with it unset, it will only manage some of the available nodes. I do understand the confusion, maybe \"will be eligible to be managed\"?","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"610cd09ac64898b2d11588637c9d872407ffc3b6","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        \u0027partition_key\u0027,"},{"line_number":84,"context_line":"        default\u003dNone,"},{"line_number":85,"context_line":"        mutable\u003dTrue,"},{"line_number":86,"context_line":"        max_length\u003d255,"},{"line_number":87,"context_line":"        regex\u003dr\u0027^[a-zA-Z0-9_\\-\\.]*$\u0027,"},{"line_number":88,"context_line":"        help\u003d\u0027Case-insensitive key to limit the set of nodes that may be \u0027"},{"line_number":89,"context_line":"             \u0027managed by this service to the set of nodes in Ironic which \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_317adef0","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":22},"updated":"2019-02-12 15:28:22.000000000","message":"Optionally, you could control this in the regex itself. More below.","commit_id":"b18e905de6a0ab24f90e6dee207214d126347e10"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"610cd09ac64898b2d11588637c9d872407ffc3b6","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        default\u003dNone,"},{"line_number":85,"context_line":"        mutable\u003dTrue,"},{"line_number":86,"context_line":"        max_length\u003d255,"},{"line_number":87,"context_line":"        regex\u003dr\u0027^[a-zA-Z0-9_\\-\\.]*$\u0027,"},{"line_number":88,"context_line":"        help\u003d\u0027Case-insensitive key to limit the set of nodes that may be \u0027"},{"line_number":89,"context_line":"             \u0027managed by this service to the set of nodes in Ironic which \u0027"},{"line_number":90,"context_line":"             \u0027have a matching conductor_group property. If unset, all \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_71d706f0","line":87,"range":{"start_line":87,"start_character":33,"end_line":87,"end_character":34},"updated":"2019-02-12 15:28:22.000000000","message":"Splat here allows the string to be empty. Is that legit? (I would expect you don\u0027t want \u0027\u0027 and None to both be acceptable and meaningful.)\n\nYou could use a min_length on the StrOpt; or you could replace * with e.g. {1,255} and remove max_length.","commit_id":"b18e905de6a0ab24f90e6dee207214d126347e10"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"610cd09ac64898b2d11588637c9d872407ffc3b6","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        default\u003dNone,"},{"line_number":85,"context_line":"        mutable\u003dTrue,"},{"line_number":86,"context_line":"        max_length\u003d255,"},{"line_number":87,"context_line":"        regex\u003dr\u0027^[a-zA-Z0-9_\\-\\.]*$\u0027,"},{"line_number":88,"context_line":"        help\u003d\u0027Case-insensitive key to limit the set of nodes that may be \u0027"},{"line_number":89,"context_line":"             \u0027managed by this service to the set of nodes in Ironic which \u0027"},{"line_number":90,"context_line":"             \u0027have a matching conductor_group property. If unset, all \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_31b97ecb","line":87,"range":{"start_line":87,"start_character":28,"end_line":87,"end_character":30},"updated":"2019-02-12 15:28:22.000000000","message":"nit: if you put the \u0027-\u0027 at the end of the character class (right before the closing bracket), you don\u0027t need to escape it.","commit_id":"b18e905de6a0ab24f90e6dee207214d126347e10"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"610cd09ac64898b2d11588637c9d872407ffc3b6","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        default\u003dNone,"},{"line_number":85,"context_line":"        mutable\u003dTrue,"},{"line_number":86,"context_line":"        max_length\u003d255,"},{"line_number":87,"context_line":"        regex\u003dr\u0027^[a-zA-Z0-9_\\-\\.]*$\u0027,"},{"line_number":88,"context_line":"        help\u003d\u0027Case-insensitive key to limit the set of nodes that may be \u0027"},{"line_number":89,"context_line":"             \u0027managed by this service to the set of nodes in Ironic which \u0027"},{"line_number":90,"context_line":"             \u0027have a matching conductor_group property. If unset, all \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_11b47ad0","line":87,"range":{"start_line":87,"start_character":30,"end_line":87,"end_character":32},"updated":"2019-02-12 15:28:22.000000000","message":"nit: period doesn\u0027t need to be escaped in a character class.","commit_id":"b18e905de6a0ab24f90e6dee207214d126347e10"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"0e62ba791ed07ba41903729a0c4353d4901d2143","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        default\u003dNone,"},{"line_number":85,"context_line":"        mutable\u003dTrue,"},{"line_number":86,"context_line":"        max_length\u003d255,"},{"line_number":87,"context_line":"        regex\u003dr\u0027^[a-zA-Z0-9_\\-\\.]*$\u0027,"},{"line_number":88,"context_line":"        help\u003d\u0027Case-insensitive key to limit the set of nodes that may be \u0027"},{"line_number":89,"context_line":"             \u0027managed by this service to the set of nodes in Ironic which \u0027"},{"line_number":90,"context_line":"             \u0027have a matching conductor_group property. If unset, all \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_f0b8ba11","line":87,"range":{"start_line":87,"start_character":33,"end_line":87,"end_character":34},"in_reply_to":"9fdfeff1_71d706f0","updated":"2019-02-13 13:00:00.000000000","message":"Neat, learned some things about escaping today. :)\n\nThe * is intentional, as the default conductor group in ironic is the empty string. A bit confusing, but it is what it is. I\u0027ll clarify in the help text.\n\nI like the explicitness of max_length, going to leave that.\n\nSide note: I forgot my ^ and $ when playing around with this in a shell, which got some confusing results. Took a look and some other configs could use this. Patch incoming to fix that soon :)","commit_id":"b18e905de6a0ab24f90e6dee207214d126347e10"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"29cf016a18340006776e775f241a92bf5fb2df9b","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        default\u003dNone,"},{"line_number":85,"context_line":"        mutable\u003dTrue,"},{"line_number":86,"context_line":"        max_length\u003d255,"},{"line_number":87,"context_line":"        regex\u003dr\u0027^[a-zA-Z0-9_\\-\\.]*$\u0027,"},{"line_number":88,"context_line":"        help\u003d\u0027Case-insensitive key to limit the set of nodes that may be \u0027"},{"line_number":89,"context_line":"             \u0027managed by this service to the set of nodes in Ironic which \u0027"},{"line_number":90,"context_line":"             \u0027have a matching conductor_group property. If unset, all \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_a446774f","line":87,"range":{"start_line":87,"start_character":33,"end_line":87,"end_character":34},"in_reply_to":"9fdfeff1_f0b8ba11","updated":"2019-02-13 13:28:25.000000000","message":"Side note patch is here: https://review.openstack.org/#/c/636627/","commit_id":"b18e905de6a0ab24f90e6dee207214d126347e10"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0aad7a7fe8e0d11c41664aebb273f48d40fc792a","unresolved":false,"context_lines":[{"line_number":89,"context_line":"             \u0027managed by this service to the set of nodes in Ironic which \u0027"},{"line_number":90,"context_line":"             \u0027have a matching conductor_group property. If unset, all \u0027"},{"line_number":91,"context_line":"             \u0027available nodes will be eligible to be managed by this \u0027"},{"line_number":92,"context_line":"             \u0027service. Note that setting this to the empty string (``\"\"``) \u0027"},{"line_number":93,"context_line":"             \u0027will match the default conductor group, and is different than \u0027"},{"line_number":94,"context_line":"             \u0027leaving the option unset.\u0027),"},{"line_number":95,"context_line":"    cfg.ListOpt("},{"line_number":96,"context_line":"        \u0027peer_list\u0027,"},{"line_number":97,"context_line":"        default\u003d[],"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_47dd406e","line":94,"range":{"start_line":92,"start_character":23,"end_line":94,"end_character":38},"updated":"2019-02-13 23:09:13.000000000","message":"++ thanks for adding this","commit_id":"080587b75e14cadadfabc9ac007278b0b62f041a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"91ae14bbea53adb9da57c76851d79c4309fc88f5","unresolved":false,"context_lines":[{"line_number":100,"context_line":"             \u0027partition_key config value. Nodes matching the partition_key \u0027"},{"line_number":101,"context_line":"             \u0027value will be distributed between this service and the other \u0027"},{"line_number":102,"context_line":"             \u0027services specified here. If partition_key is unset, this option \u0027"},{"line_number":103,"context_line":"             \u0027is ignored.\u0027),"},{"line_number":104,"context_line":"]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"deprecated_opts \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_4fd92420","line":103,"updated":"2019-02-22 18:46:48.000000000","message":"See my comment later, but you\u0027re assuming that this is _other_ hosts not \"the list of hosts\" (which would include $self)? That doesn\u0027t seem very config-mgmt-friendly.\n\nI would think that requiring that we be in the list helps to make sure that if they set partition_key, they also saw/set this option, and makes it more declarative.","commit_id":"080587b75e14cadadfabc9ac007278b0b62f041a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"91eed53b5cf5e647f320709f355171076675fee3","unresolved":false,"context_lines":[{"line_number":100,"context_line":"             \u0027partition_key config value. Nodes matching the partition_key \u0027"},{"line_number":101,"context_line":"             \u0027value will be distributed between this service and the other \u0027"},{"line_number":102,"context_line":"             \u0027services specified here. If partition_key is unset, this option \u0027"},{"line_number":103,"context_line":"             \u0027is ignored.\u0027),"},{"line_number":104,"context_line":"]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"deprecated_opts \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_8275a3ce","line":103,"in_reply_to":"9fdfeff1_4fd92420","updated":"2019-02-22 20:09:36.000000000","message":"++ good idea","commit_id":"080587b75e14cadadfabc9ac007278b0b62f041a"}],"nova/exception.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8faeb6373862de82f532384566b2be5cc17b7af","unresolved":false,"context_lines":[{"line_number":2315,"context_line":""},{"line_number":2316,"context_line":""},{"line_number":2317,"context_line":"class InvalidPeerList(NovaException):"},{"line_number":2318,"context_line":"    msg_fmt \u003d _(\"Configured peer list is invalid.\")"},{"line_number":2319,"context_line":""},{"line_number":2320,"context_line":""},{"line_number":2321,"context_line":"class InstanceDiskMappingFailed(NovaException):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_c102920c","line":2318,"updated":"2019-02-26 15:42:17.000000000","message":"probably would be good to include a mention of Ironic and the nova-compute service in this exception message. I can imagine a reader of the Nova codebase looking in here and seeing a generic InvalidPeerList exception and thinking it might be raised by the nova-conductor or other distributed components when in fact it\u0027s specific to the Ironic nova-compute service hash ring.\n\nBetter yet would be to call the exception InvalidIronicComputeServicePeerList or similar, even though it\u0027s not exactly pithy.","commit_id":"451d41a9deaf4bdba20509afc15a73df02e400f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"5bbe5d8cc48070d9fa58ca6691979917af65b573","unresolved":false,"context_lines":[{"line_number":2315,"context_line":""},{"line_number":2316,"context_line":""},{"line_number":2317,"context_line":"class InvalidPeerList(NovaException):"},{"line_number":2318,"context_line":"    msg_fmt \u003d _(\"Configured peer list is invalid.\")"},{"line_number":2319,"context_line":""},{"line_number":2320,"context_line":""},{"line_number":2321,"context_line":"class InstanceDiskMappingFailed(NovaException):"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_7ba57402","line":2318,"in_reply_to":"9fdfeff1_c102920c","updated":"2019-02-27 15:47:23.000000000","message":"Done","commit_id":"451d41a9deaf4bdba20509afc15a73df02e400f7"}],"nova/virt/ironic/client_wrapper.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e050ca2843a943a5728a1945179d094d5eb1e942","unresolved":false,"context_lines":[{"line_number":35,"context_line":"IRONIC_API_VERSION \u003d (1, 46)"},{"line_number":36,"context_line":"# NOTE(TheJulia): This version should ALWAYS be the _last_ release"},{"line_number":37,"context_line":"# supported version of the API version used by nova. If a feature"},{"line_number":38,"context_line":"# needs 1.38 to be negotiated to operate properly, then the version"},{"line_number":39,"context_line":"# above should be updated, and this version should only be changed"},{"line_number":40,"context_line":"# once a cycle to the API version desired for features merging in"},{"line_number":41,"context_line":"# that cycle."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_58a7ba0c","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":12},"updated":"2019-02-08 13:07:56.000000000","message":"nit: needs updating?","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cffc23a3beaeb3434169334e0f0b4b29b7a6f502","unresolved":false,"context_lines":[{"line_number":35,"context_line":"IRONIC_API_VERSION \u003d (1, 46)"},{"line_number":36,"context_line":"# NOTE(TheJulia): This version should ALWAYS be the _last_ release"},{"line_number":37,"context_line":"# supported version of the API version used by nova. If a feature"},{"line_number":38,"context_line":"# needs 1.38 to be negotiated to operate properly, then the version"},{"line_number":39,"context_line":"# above should be updated, and this version should only be changed"},{"line_number":40,"context_line":"# once a cycle to the API version desired for features merging in"},{"line_number":41,"context_line":"# that cycle."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_6fb3c84e","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":12},"in_reply_to":"9fdfeff1_58a7ba0c","updated":"2019-02-09 15:50:17.000000000","message":"Really it should be s/1.38/a higher version/","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e050ca2843a943a5728a1945179d094d5eb1e942","unresolved":false,"context_lines":[{"line_number":39,"context_line":"# above should be updated, and this version should only be changed"},{"line_number":40,"context_line":"# once a cycle to the API version desired for features merging in"},{"line_number":41,"context_line":"# that cycle."},{"line_number":42,"context_line":"PRIOR_IRONIC_API_VERSION \u003d (1, 37)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_989d22bd","line":42,"range":{"start_line":42,"start_character":31,"end_line":42,"end_character":33},"updated":"2019-02-08 13:07:56.000000000","message":"nit: Should be 38 now since we use it for Rescue. Both versions come from Queens, so it should not matter much.\n\nAnd then we can remove all explicit mentions of version 1.38..","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cffc23a3beaeb3434169334e0f0b4b29b7a6f502","unresolved":false,"context_lines":[{"line_number":39,"context_line":"# above should be updated, and this version should only be changed"},{"line_number":40,"context_line":"# once a cycle to the API version desired for features merging in"},{"line_number":41,"context_line":"# that cycle."},{"line_number":42,"context_line":"PRIOR_IRONIC_API_VERSION \u003d (1, 37)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_2f870064","line":42,"range":{"start_line":42,"start_character":31,"end_line":42,"end_character":33},"in_reply_to":"9fdfeff1_989d22bd","updated":"2019-02-09 15:50:17.000000000","message":"Yep, that\u0027s a separate patch (which I hope to do soon). I\u0027ll also update the above comment when I do that.","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6bd9ea52e4c4a75b49bc19a1e78bfd8e5f2fbe4c","unresolved":false,"context_lines":[{"line_number":668,"context_line":""},{"line_number":669,"context_line":"    def _refresh_hash_ring(self, ctxt):"},{"line_number":670,"context_line":"        peer_list \u003d None"},{"line_number":671,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":672,"context_line":"            peer_list \u003d CONF.ironic.peer_list + [CONF.host]"},{"line_number":673,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":674,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_6ef793d6","line":671,"updated":"2019-02-05 20:39:24.000000000","message":"Code comments here would be nice.","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cecce27d56c8c10e2498487e7aae078ad3245607","unresolved":false,"context_lines":[{"line_number":668,"context_line":""},{"line_number":669,"context_line":"    def _refresh_hash_ring(self, ctxt):"},{"line_number":670,"context_line":"        peer_list \u003d None"},{"line_number":671,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":672,"context_line":"            peer_list \u003d CONF.ironic.peer_list + [CONF.host]"},{"line_number":673,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":674,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_7aa40009","line":671,"in_reply_to":"9fdfeff1_2e766b40","updated":"2019-02-08 13:07:29.000000000","message":"Done","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"49387ddfc237efd0e720429ee2f744d2aa0d6075","unresolved":false,"context_lines":[{"line_number":668,"context_line":""},{"line_number":669,"context_line":"    def _refresh_hash_ring(self, ctxt):"},{"line_number":670,"context_line":"        peer_list \u003d None"},{"line_number":671,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":672,"context_line":"            peer_list \u003d CONF.ironic.peer_list + [CONF.host]"},{"line_number":673,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":674,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_2e766b40","line":671,"in_reply_to":"9fdfeff1_6ef793d6","updated":"2019-02-05 20:43:07.000000000","message":"Will do","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6bd9ea52e4c4a75b49bc19a1e78bfd8e5f2fbe4c","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            ctxt, self._get_hypervisor_type())"},{"line_number":677,"context_line":"        services \u003d set()"},{"line_number":678,"context_line":"        for svc in service_list:"},{"line_number":679,"context_line":"            if peer_list is None or svc.host in peer_list:"},{"line_number":680,"context_line":"                is_up \u003d self.servicegroup_api.service_is_up(svc)"},{"line_number":681,"context_line":"                if is_up:"},{"line_number":682,"context_line":"                    services.add(svc.host)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_2e018bb0","line":679,"updated":"2019-02-05 20:39:24.000000000","message":"and here","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cecce27d56c8c10e2498487e7aae078ad3245607","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            ctxt, self._get_hypervisor_type())"},{"line_number":677,"context_line":"        services \u003d set()"},{"line_number":678,"context_line":"        for svc in service_list:"},{"line_number":679,"context_line":"            if peer_list is None or svc.host in peer_list:"},{"line_number":680,"context_line":"                is_up \u003d self.servicegroup_api.service_is_up(svc)"},{"line_number":681,"context_line":"                if is_up:"},{"line_number":682,"context_line":"                    services.add(svc.host)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_3aae78e7","line":679,"in_reply_to":"9fdfeff1_2e018bb0","updated":"2019-02-08 13:07:29.000000000","message":"Done","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6bd9ea52e4c4a75b49bc19a1e78bfd8e5f2fbe4c","unresolved":false,"context_lines":[{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        kwargs \u003d {}"},{"line_number":700,"context_line":"        partition_key \u003d CONF.ironic.partition_key"},{"line_number":701,"context_line":"        if partition_key is not None:"},{"line_number":702,"context_line":"            kwargs[\u0027conductor_group\u0027] \u003d partition_key"},{"line_number":703,"context_line":"            LOG.debug(\u0027Limiting manageable ironic nodes to partition key %s\u0027,"},{"line_number":704,"context_line":"                      partition_key)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_ee2ce34b","line":701,"updated":"2019-02-05 20:39:24.000000000","message":"and here","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cecce27d56c8c10e2498487e7aae078ad3245607","unresolved":false,"context_lines":[{"line_number":698,"context_line":""},{"line_number":699,"context_line":"        kwargs \u003d {}"},{"line_number":700,"context_line":"        partition_key \u003d CONF.ironic.partition_key"},{"line_number":701,"context_line":"        if partition_key is not None:"},{"line_number":702,"context_line":"            kwargs[\u0027conductor_group\u0027] \u003d partition_key"},{"line_number":703,"context_line":"            LOG.debug(\u0027Limiting manageable ironic nodes to partition key %s\u0027,"},{"line_number":704,"context_line":"                      partition_key)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_5aa9fcda","line":701,"in_reply_to":"9fdfeff1_ee2ce34b","updated":"2019-02-08 13:07:29.000000000","message":"Done","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6bd9ea52e4c4a75b49bc19a1e78bfd8e5f2fbe4c","unresolved":false,"context_lines":[{"line_number":699,"context_line":"        kwargs \u003d {}"},{"line_number":700,"context_line":"        partition_key \u003d CONF.ironic.partition_key"},{"line_number":701,"context_line":"        if partition_key is not None:"},{"line_number":702,"context_line":"            kwargs[\u0027conductor_group\u0027] \u003d partition_key"},{"line_number":703,"context_line":"            LOG.debug(\u0027Limiting manageable ironic nodes to partition key %s\u0027,"},{"line_number":704,"context_line":"                      partition_key)"},{"line_number":705,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_8ecbd770","line":702,"range":{"start_line":702,"start_character":20,"end_line":702,"end_character":35},"updated":"2019-02-05 20:39:24.000000000","message":"This means you need to bump the ironicclient wrapper minimum required version to 1.46 right?\n\nhttps://github.com/openstack/nova/blob/75d52556066cf56b33e61bc4a80b6dc81b846c07/nova/virt/ironic/client_wrapper.py#L35","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cecce27d56c8c10e2498487e7aae078ad3245607","unresolved":false,"context_lines":[{"line_number":699,"context_line":"        kwargs \u003d {}"},{"line_number":700,"context_line":"        partition_key \u003d CONF.ironic.partition_key"},{"line_number":701,"context_line":"        if partition_key is not None:"},{"line_number":702,"context_line":"            kwargs[\u0027conductor_group\u0027] \u003d partition_key"},{"line_number":703,"context_line":"            LOG.debug(\u0027Limiting manageable ironic nodes to partition key %s\u0027,"},{"line_number":704,"context_line":"                      partition_key)"},{"line_number":705,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_3f5f4a42","line":702,"range":{"start_line":702,"start_character":20,"end_line":702,"end_character":35},"in_reply_to":"9fdfeff1_6e93135e","updated":"2019-02-08 13:07:29.000000000","message":"Done","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"49387ddfc237efd0e720429ee2f744d2aa0d6075","unresolved":false,"context_lines":[{"line_number":699,"context_line":"        kwargs \u003d {}"},{"line_number":700,"context_line":"        partition_key \u003d CONF.ironic.partition_key"},{"line_number":701,"context_line":"        if partition_key is not None:"},{"line_number":702,"context_line":"            kwargs[\u0027conductor_group\u0027] \u003d partition_key"},{"line_number":703,"context_line":"            LOG.debug(\u0027Limiting manageable ironic nodes to partition key %s\u0027,"},{"line_number":704,"context_line":"                      partition_key)"},{"line_number":705,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9fdfeff1_6e93135e","line":702,"range":{"start_line":702,"start_character":20,"end_line":702,"end_character":35},"in_reply_to":"9fdfeff1_8ecbd770","updated":"2019-02-05 20:43:07.000000000","message":"Good point, thanks.","commit_id":"97ca6f8106f91af65980f47f1bcff7a6f8d7d01a"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e050ca2843a943a5728a1945179d094d5eb1e942","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        # and specified in the peer_list config option, as there\u0027s no way"},{"line_number":674,"context_line":"        # to check which partition_key other compute services are using."},{"line_number":675,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":676,"context_line":"            peer_list \u003d CONF.ironic.peer_list + [CONF.host]"},{"line_number":677,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        service_list \u003d objects.ServiceList.get_all_computes_by_hv_type("}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_58801a47","line":676,"range":{"start_line":676,"start_character":24,"end_line":676,"end_character":59},"updated":"2019-02-08 13:07:56.000000000","message":"nit: use a set here since we only need it for \"in\" operation?\n\nnit #2: I hope we\u0027re fine with the potential duplication of CONF.host in case we do not use a set here.","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cffc23a3beaeb3434169334e0f0b4b29b7a6f502","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        # and specified in the peer_list config option, as there\u0027s no way"},{"line_number":674,"context_line":"        # to check which partition_key other compute services are using."},{"line_number":675,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":676,"context_line":"            peer_list \u003d CONF.ironic.peer_list + [CONF.host]"},{"line_number":677,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        service_list \u003d objects.ServiceList.get_all_computes_by_hv_type("}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_cf7d146f","line":676,"range":{"start_line":676,"start_character":24,"end_line":676,"end_character":59},"in_reply_to":"9fdfeff1_58801a47","updated":"2019-02-09 15:50:17.000000000","message":"+1. Re #2 It does become a set below","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"d31ad3aa5a1b90ebceec2f78996081dabbcded1d","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        # and specified in the peer_list config option, as there\u0027s no way"},{"line_number":674,"context_line":"        # to check which partition_key other compute services are using."},{"line_number":675,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":676,"context_line":"            peer_list \u003d CONF.ironic.peer_list + [CONF.host]"},{"line_number":677,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        service_list \u003d objects.ServiceList.get_all_computes_by_hv_type("}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_de05b67b","line":676,"range":{"start_line":676,"start_character":24,"end_line":676,"end_character":59},"in_reply_to":"9fdfeff1_cf7d146f","updated":"2019-02-11 16:28:26.000000000","message":"Done","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e050ca2843a943a5728a1945179d094d5eb1e942","unresolved":false,"context_lines":[{"line_number":717,"context_line":"            try:"},{"line_number":718,"context_line":"                self._can_send_version(min_version\u003d\u00271.46\u0027)"},{"line_number":719,"context_line":"                nodes \u003d _get_node_list(conductor_group\u003dpartition_key)"},{"line_number":720,"context_line":"                LOG.debug(\u0027Limiting manageable ironic nodes to partition key \u0027"},{"line_number":721,"context_line":"                          \u0027%s\u0027, partition_key)"},{"line_number":722,"context_line":"            except exception.IronicAPIVersionNotAvailable:"},{"line_number":723,"context_line":"                LOG.error(\u0027Required Ironic API version %(version)s is not \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_38cbd6a5","line":720,"range":{"start_line":720,"start_character":63,"end_line":720,"end_character":76},"updated":"2019-02-08 13:07:56.000000000","message":"In this message you use \"partition key\", in the one below you use \"conductor group\". I\u0027d prefer we settled on \"conductor group\".","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cffc23a3beaeb3434169334e0f0b4b29b7a6f502","unresolved":false,"context_lines":[{"line_number":717,"context_line":"            try:"},{"line_number":718,"context_line":"                self._can_send_version(min_version\u003d\u00271.46\u0027)"},{"line_number":719,"context_line":"                nodes \u003d _get_node_list(conductor_group\u003dpartition_key)"},{"line_number":720,"context_line":"                LOG.debug(\u0027Limiting manageable ironic nodes to partition key \u0027"},{"line_number":721,"context_line":"                          \u0027%s\u0027, partition_key)"},{"line_number":722,"context_line":"            except exception.IronicAPIVersionNotAvailable:"},{"line_number":723,"context_line":"                LOG.error(\u0027Required Ironic API version %(version)s is not \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_4f912499","line":720,"range":{"start_line":720,"start_character":63,"end_line":720,"end_character":76},"in_reply_to":"9fdfeff1_38cbd6a5","updated":"2019-02-09 15:50:17.000000000","message":"++ will update.","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"d31ad3aa5a1b90ebceec2f78996081dabbcded1d","unresolved":false,"context_lines":[{"line_number":717,"context_line":"            try:"},{"line_number":718,"context_line":"                self._can_send_version(min_version\u003d\u00271.46\u0027)"},{"line_number":719,"context_line":"                nodes \u003d _get_node_list(conductor_group\u003dpartition_key)"},{"line_number":720,"context_line":"                LOG.debug(\u0027Limiting manageable ironic nodes to partition key \u0027"},{"line_number":721,"context_line":"                          \u0027%s\u0027, partition_key)"},{"line_number":722,"context_line":"            except exception.IronicAPIVersionNotAvailable:"},{"line_number":723,"context_line":"                LOG.error(\u0027Required Ironic API version %(version)s is not \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_be02326e","line":720,"range":{"start_line":720,"start_character":63,"end_line":720,"end_character":76},"in_reply_to":"9fdfeff1_4f912499","updated":"2019-02-11 16:28:26.000000000","message":"Done","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e050ca2843a943a5728a1945179d094d5eb1e942","unresolved":false,"context_lines":[{"line_number":723,"context_line":"                LOG.error(\u0027Required Ironic API version %(version)s is not \u0027"},{"line_number":724,"context_line":"                          \u0027available to filter nodes by conductor group. \u0027"},{"line_number":725,"context_line":"                          \u0027All nodes will be eligible to be managed by \u0027"},{"line_number":726,"context_line":"                          \u0027this compute service.\u0027, version\u003d\u00271.46\u0027)"},{"line_number":727,"context_line":"                nodes \u003d _get_node_list()"},{"line_number":728,"context_line":"        else:"},{"line_number":729,"context_line":"            nodes \u003d _get_node_list()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_98d44249","line":726,"range":{"start_line":726,"start_character":51,"end_line":726,"end_character":65},"updated":"2019-02-08 13:07:56.000000000","message":"LOG formatting does not work this way, should be {\"version\": \"1.46\"}. Actually, why are you formatting a constant? :)","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"d31ad3aa5a1b90ebceec2f78996081dabbcded1d","unresolved":false,"context_lines":[{"line_number":723,"context_line":"                LOG.error(\u0027Required Ironic API version %(version)s is not \u0027"},{"line_number":724,"context_line":"                          \u0027available to filter nodes by conductor group. \u0027"},{"line_number":725,"context_line":"                          \u0027All nodes will be eligible to be managed by \u0027"},{"line_number":726,"context_line":"                          \u0027this compute service.\u0027, version\u003d\u00271.46\u0027)"},{"line_number":727,"context_line":"                nodes \u003d _get_node_list()"},{"line_number":728,"context_line":"        else:"},{"line_number":729,"context_line":"            nodes \u003d _get_node_list()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_7e228a03","line":726,"range":{"start_line":726,"start_character":51,"end_line":726,"end_character":65},"in_reply_to":"9fdfeff1_6f8c287f","updated":"2019-02-11 16:28:26.000000000","message":"Done","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"cffc23a3beaeb3434169334e0f0b4b29b7a6f502","unresolved":false,"context_lines":[{"line_number":723,"context_line":"                LOG.error(\u0027Required Ironic API version %(version)s is not \u0027"},{"line_number":724,"context_line":"                          \u0027available to filter nodes by conductor group. \u0027"},{"line_number":725,"context_line":"                          \u0027All nodes will be eligible to be managed by \u0027"},{"line_number":726,"context_line":"                          \u0027this compute service.\u0027, version\u003d\u00271.46\u0027)"},{"line_number":727,"context_line":"                nodes \u003d _get_node_list()"},{"line_number":728,"context_line":"        else:"},{"line_number":729,"context_line":"            nodes \u003d _get_node_list()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fdfeff1_6f8c287f","line":726,"range":{"start_line":726,"start_character":51,"end_line":726,"end_character":65},"in_reply_to":"9fdfeff1_98d44249","updated":"2019-02-09 15:50:17.000000000","message":"I think I wrote this line of code while under sleep deprivation :)","commit_id":"e160cb69d99792049aba8511f3515cae8c8025f7"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"91ae14bbea53adb9da57c76851d79c4309fc88f5","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        # and specified in the peer_list config option, as there\u0027s no way"},{"line_number":674,"context_line":"        # to check which partition_key other compute services are using."},{"line_number":675,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":676,"context_line":"            peer_list \u003d set(CONF.ironic.peer_list + [CONF.host])"},{"line_number":677,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        service_list \u003d objects.ServiceList.get_all_computes_by_hv_type("}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_2fbaa0bf","line":676,"updated":"2019-02-22 18:46:48.000000000","message":"And what happens if peer_list is left unset in the config, but partition_key is set? Will every compute think it owns all the nodes within a conductor group? Presumably we need to at least assert that _we_ are in the list, right? So maybe we should:\n\n 1. Fail if the list is empty\n 2. Log a BFW if we\u0027re the only thing in the list\n\nI assume a single compute for a conductor group is legit, but potentially not what the operator was expecting, yeah?","commit_id":"080587b75e14cadadfabc9ac007278b0b62f041a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"a71b13aac3fcb65483f158c19f78371b24e2d5a3","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        # and specified in the peer_list config option, as there\u0027s no way"},{"line_number":674,"context_line":"        # to check which partition_key other compute services are using."},{"line_number":675,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":676,"context_line":"            peer_list \u003d set(CONF.ironic.peer_list + [CONF.host])"},{"line_number":677,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        service_list \u003d objects.ServiceList.get_all_computes_by_hv_type("}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_625d1f14","line":676,"in_reply_to":"9fdfeff1_2fbaa0bf","updated":"2019-02-22 19:19:00.000000000","message":"\u003e And what happens if peer_list is left unset in the config, but\n \u003e partition_key is set? Will every compute think it owns all the\n \u003e nodes within a conductor group? Presumably we need to at least\n \u003e assert that _we_ are in the list, right? So maybe we should:\n \u003e \n \u003e 1. Fail if the list is empty\n \u003e 2. Log a BFW if we\u0027re the only thing in the list\n\nThat seems like a good failsafe, thanks for pointing this out.\n\n \u003e \n \u003e I assume a single compute for a conductor group is legit, but\n \u003e potentially not what the operator was expecting, yeah?\n\nYeah, it\u0027s legit. May or may not be what they want.","commit_id":"080587b75e14cadadfabc9ac007278b0b62f041a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2ba48c51686f613aa987e750bee3c15b1fe86c11","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        # and specified in the peer_list config option, as there\u0027s no way"},{"line_number":674,"context_line":"        # to check which partition_key other compute services are using."},{"line_number":675,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":676,"context_line":"            peer_list \u003d set(CONF.ironic.peer_list + [CONF.host])"},{"line_number":677,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        service_list \u003d objects.ServiceList.get_all_computes_by_hv_type("}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_e57119aa","line":676,"in_reply_to":"9fdfeff1_625d1f14","updated":"2019-02-22 20:19:30.000000000","message":"If you take Dan\u0027s suggestion and require $self (meaning CONF.host comes out of L676), then we don\u0027t need to do #2, because if $self is the only thing in there, that was done explicitly and (presumably) deliberately.","commit_id":"080587b75e14cadadfabc9ac007278b0b62f041a"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"b888333307bb1322500665599399be752555cdb0","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        # and specified in the peer_list config option, as there\u0027s no way"},{"line_number":674,"context_line":"        # to check which partition_key other compute services are using."},{"line_number":675,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":676,"context_line":"            peer_list \u003d set(CONF.ironic.peer_list + [CONF.host])"},{"line_number":677,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        service_list \u003d objects.ServiceList.get_all_computes_by_hv_type("}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_712aa691","line":676,"in_reply_to":"9fdfeff1_a577913b","updated":"2019-02-25 22:00:21.000000000","message":"Done","commit_id":"080587b75e14cadadfabc9ac007278b0b62f041a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4971745c21c68671f4b6d0868da0177b07b4fb70","unresolved":false,"context_lines":[{"line_number":673,"context_line":"        # and specified in the peer_list config option, as there\u0027s no way"},{"line_number":674,"context_line":"        # to check which partition_key other compute services are using."},{"line_number":675,"context_line":"        if CONF.ironic.partition_key is not None:"},{"line_number":676,"context_line":"            peer_list \u003d set(CONF.ironic.peer_list + [CONF.host])"},{"line_number":677,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        service_list \u003d objects.ServiceList.get_all_computes_by_hv_type("}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_a577913b","line":676,"in_reply_to":"9fdfeff1_e57119aa","updated":"2019-02-22 20:51:12.000000000","message":"#2 is not required, true. I\u0027m a bit conflicted as I think if you\u0027re partitioning your ironic across multiple novas you probably don\u0027t want just one nova worker per partition. And, being a warning it\u0027s just advisory. But anyway, whatever people think is fine.","commit_id":"080587b75e14cadadfabc9ac007278b0b62f041a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bbd11252a3e4106594f778f0183bb8780e857189","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            raise exception.InvalidPeerList()"},{"line_number":143,"context_line":"        if CONF.host not in peer_list:"},{"line_number":144,"context_line":"            LOG.error(\u0027FATAL: Peer list does not contain this \u0027"},{"line_number":145,"context_line":"                      \u0027compute service hostname; add it to \u0027"},{"line_number":146,"context_line":"                      \u0027the [ironic]/peer_list option.\u0027)"},{"line_number":147,"context_line":"            raise exception.InvalidPeerList()"},{"line_number":148,"context_line":"        if set([CONF.host]) \u003d\u003d peer_list:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_9714daea","line":145,"range":{"start_line":145,"start_character":39,"end_line":145,"end_character":47},"updated":"2019-02-25 23:01:05.000000000","message":"Throw CONF.host in here for clarity, e.g. \"does not contain this compute service hostname (%s)\" ...","commit_id":"72618a4f48ccad8f8c10f83dde2b63f44b903708"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"2627d63e74fd8415b61d3c90c0eece50fefeaf5e","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            raise exception.InvalidPeerList()"},{"line_number":143,"context_line":"        if CONF.host not in peer_list:"},{"line_number":144,"context_line":"            LOG.error(\u0027FATAL: Peer list does not contain this \u0027"},{"line_number":145,"context_line":"                      \u0027compute service hostname; add it to \u0027"},{"line_number":146,"context_line":"                      \u0027the [ironic]/peer_list option.\u0027)"},{"line_number":147,"context_line":"            raise exception.InvalidPeerList()"},{"line_number":148,"context_line":"        if set([CONF.host]) \u003d\u003d peer_list:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fdfeff1_fbce6381","line":145,"range":{"start_line":145,"start_character":39,"end_line":145,"end_character":47},"in_reply_to":"9fdfeff1_9714daea","updated":"2019-02-26 13:46:16.000000000","message":"++","commit_id":"72618a4f48ccad8f8c10f83dde2b63f44b903708"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8faeb6373862de82f532384566b2be5cc17b7af","unresolved":false,"context_lines":[{"line_number":701,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        service_list \u003d objects.ServiceList.get_all_computes_by_hv_type("},{"line_number":704,"context_line":"            ctxt, self._get_hypervisor_type())"},{"line_number":705,"context_line":"        services \u003d set()"},{"line_number":706,"context_line":"        for svc in service_list:"},{"line_number":707,"context_line":"            # NOTE(jroll) if peer_list is None, we aren\u0027t partitioning by"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_2447ec1f","line":704,"updated":"2019-02-26 15:42:17.000000000","message":"A future improvement might be to only call ServiceList.get_all_computes_by_hv_type() if CONF.ironic.peer_list is None. Otherwise, add a new ServiceList.get_compute_by_hosts() method that allows you to filter to just the peer_list values.","commit_id":"451d41a9deaf4bdba20509afc15a73df02e400f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"5bbe5d8cc48070d9fa58ca6691979917af65b573","unresolved":false,"context_lines":[{"line_number":701,"context_line":"            LOG.debug(\u0027Limiting peer list to %s\u0027, peer_list)"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        service_list \u003d objects.ServiceList.get_all_computes_by_hv_type("},{"line_number":704,"context_line":"            ctxt, self._get_hypervisor_type())"},{"line_number":705,"context_line":"        services \u003d set()"},{"line_number":706,"context_line":"        for svc in service_list:"},{"line_number":707,"context_line":"            # NOTE(jroll) if peer_list is None, we aren\u0027t partitioning by"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_bbed1c26","line":704,"in_reply_to":"9fdfeff1_2447ec1f","updated":"2019-02-27 15:47:23.000000000","message":"++, added a TODO","commit_id":"451d41a9deaf4bdba20509afc15a73df02e400f7"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8faeb6373862de82f532384566b2be5cc17b7af","unresolved":false,"context_lines":[{"line_number":708,"context_line":"            # conductor group, so we check all compute services for liveness."},{"line_number":709,"context_line":"            # if we have a peer_list, don\u0027t check liveness for compute"},{"line_number":710,"context_line":"            # services that aren\u0027t in the list."},{"line_number":711,"context_line":"            if peer_list is None or svc.host in peer_list:"},{"line_number":712,"context_line":"                is_up \u003d self.servicegroup_api.service_is_up(svc)"},{"line_number":713,"context_line":"                if is_up:"},{"line_number":714,"context_line":"                    services.add(svc.host)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_249fec50","line":711,"updated":"2019-02-26 15:42:17.000000000","message":"just thinking through this... does this block need to have a guard for the 1.46 version support as well? If peer_list is not None, but Ironic doesn\u0027t support 1.46, that means that instead of hashing a subset of nodes across a subset of nova-compute peer services, *all* nodes will be hashed across a subset of nova-compute peer services.\n\nThis means that if a deployer configures two separate peering groups of nova-compute services and Ironic doesn\u0027t support 1.46 API, that multiple nova-compute services will end up managing the same Ironic node, right?","commit_id":"451d41a9deaf4bdba20509afc15a73df02e400f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"5bbe5d8cc48070d9fa58ca6691979917af65b573","unresolved":false,"context_lines":[{"line_number":708,"context_line":"            # conductor group, so we check all compute services for liveness."},{"line_number":709,"context_line":"            # if we have a peer_list, don\u0027t check liveness for compute"},{"line_number":710,"context_line":"            # services that aren\u0027t in the list."},{"line_number":711,"context_line":"            if peer_list is None or svc.host in peer_list:"},{"line_number":712,"context_line":"                is_up \u003d self.servicegroup_api.service_is_up(svc)"},{"line_number":713,"context_line":"                if is_up:"},{"line_number":714,"context_line":"                    services.add(svc.host)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_1bdc6872","line":711,"in_reply_to":"9fdfeff1_249fec50","updated":"2019-02-27 15:47:23.000000000","message":"Great catch, thanks! Done.","commit_id":"451d41a9deaf4bdba20509afc15a73df02e400f7"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8faeb6373862de82f532384566b2be5cc17b7af","unresolved":false,"context_lines":[{"line_number":740,"context_line":"        if partition_key is not None:"},{"line_number":741,"context_line":"            try:"},{"line_number":742,"context_line":"                self._can_send_version(min_version\u003d\u00271.46\u0027)"},{"line_number":743,"context_line":"                nodes \u003d _get_node_list(conductor_group\u003dpartition_key)"},{"line_number":744,"context_line":"                LOG.debug(\u0027Limiting manageable ironic nodes to conductor \u0027"},{"line_number":745,"context_line":"                          \u0027group %s\u0027, partition_key)"},{"line_number":746,"context_line":"            except exception.IronicAPIVersionNotAvailable:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_a4d75c23","line":743,"updated":"2019-02-26 15:42:17.000000000","message":"I presume that\n\n node_list \u003d self.ironicclient.call(\"node.list\", **kwargs)\n\nhandles regex expressions on kwargs like conductor_group?","commit_id":"451d41a9deaf4bdba20509afc15a73df02e400f7"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"5bbe5d8cc48070d9fa58ca6691979917af65b573","unresolved":false,"context_lines":[{"line_number":740,"context_line":"        if partition_key is not None:"},{"line_number":741,"context_line":"            try:"},{"line_number":742,"context_line":"                self._can_send_version(min_version\u003d\u00271.46\u0027)"},{"line_number":743,"context_line":"                nodes \u003d _get_node_list(conductor_group\u003dpartition_key)"},{"line_number":744,"context_line":"                LOG.debug(\u0027Limiting manageable ironic nodes to conductor \u0027"},{"line_number":745,"context_line":"                          \u0027group %s\u0027, partition_key)"},{"line_number":746,"context_line":"            except exception.IronicAPIVersionNotAvailable:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9fdfeff1_fb6f245d","line":743,"in_reply_to":"9fdfeff1_a4d75c23","updated":"2019-02-27 15:47:23.000000000","message":"It... doesn\u0027t. In retrospect, that would be a great feature to add. But until then, folks may need to use coarser conductor_groups instead.\n\nDo you ask because it would be a nice feature, or because the help text for the option mentions regex? If the latter, it\u0027s about matching said regex, not using a regex as the value.","commit_id":"451d41a9deaf4bdba20509afc15a73df02e400f7"}],"releasenotes/notes/ironic-partition-compute-nodes-fc60a6557fae9c5e.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"610cd09ac64898b2d11588637c9d872407ffc3b6","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In deployments with Ironic, adds the ability for compute services to manage"},{"line_number":5,"context_line":"    a subset of Ironic nodes. If the ``[ironic]/partition_key`` configuration"},{"line_number":6,"context_line":"    option is set, the compute service will only consider nodes with a matching"},{"line_number":7,"context_line":"    ``conductor_group`` attribute for management. Setting the"},{"line_number":8,"context_line":"    ``[ironic]/peer_list`` configuration option allows this subset of nodes to"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fdfeff1_b1280ee2","line":5,"range":{"start_line":5,"start_character":37,"end_line":5,"end_character":63},"updated":"2019-02-12 15:28:22.000000000","message":"Does :oslo.config:option:`ironic.partition_key` work in reno context?","commit_id":"b18e905de6a0ab24f90e6dee207214d126347e10"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"2fff856844b986467d316f4b2e67f471872f6ed6","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In deployments with Ironic, adds the ability for compute services to manage"},{"line_number":5,"context_line":"    a subset of Ironic nodes. If the ``[ironic]/partition_key`` configuration"},{"line_number":6,"context_line":"    option is set, the compute service will only consider nodes with a matching"},{"line_number":7,"context_line":"    ``conductor_group`` attribute for management. Setting the"},{"line_number":8,"context_line":"    ``[ironic]/peer_list`` configuration option allows this subset of nodes to"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fdfeff1_90792efd","line":5,"range":{"start_line":5,"start_character":37,"end_line":5,"end_character":63},"in_reply_to":"9fdfeff1_9037eeb0","updated":"2019-02-13 13:13:02.000000000","message":"Warning, treated as error:\n    \u003creno.sphinxext current branch\u003e:103:unknown option: ironic.partition_key\n\nApparently not :(","commit_id":"b18e905de6a0ab24f90e6dee207214d126347e10"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"0e62ba791ed07ba41903729a0c4353d4901d2143","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In deployments with Ironic, adds the ability for compute services to manage"},{"line_number":5,"context_line":"    a subset of Ironic nodes. If the ``[ironic]/partition_key`` configuration"},{"line_number":6,"context_line":"    option is set, the compute service will only consider nodes with a matching"},{"line_number":7,"context_line":"    ``conductor_group`` attribute for management. Setting the"},{"line_number":8,"context_line":"    ``[ironic]/peer_list`` configuration option allows this subset of nodes to"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fdfeff1_9037eeb0","line":5,"range":{"start_line":5,"start_character":37,"end_line":5,"end_character":63},"in_reply_to":"9fdfeff1_b1280ee2","updated":"2019-02-13 13:00:00.000000000","message":"I wasn\u0027t aware of this; will check!","commit_id":"b18e905de6a0ab24f90e6dee207214d126347e10"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"610cd09ac64898b2d11588637c9d872407ffc3b6","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    a subset of Ironic nodes. If the ``[ironic]/partition_key`` configuration"},{"line_number":6,"context_line":"    option is set, the compute service will only consider nodes with a matching"},{"line_number":7,"context_line":"    ``conductor_group`` attribute for management. Setting the"},{"line_number":8,"context_line":"    ``[ironic]/peer_list`` configuration option allows this subset of nodes to"},{"line_number":9,"context_line":"    be distributed among the compute services specified to further reduce"},{"line_number":10,"context_line":"    failure domain. This feature is useful to co-locate nova-compute services"},{"line_number":11,"context_line":"    with ironic-conductor services managing the same nodes, or to better"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fdfeff1_711e26bc","line":8,"range":{"start_line":8,"start_character":4,"end_line":8,"end_character":26},"updated":"2019-02-12 15:28:22.000000000","message":"likewise","commit_id":"b18e905de6a0ab24f90e6dee207214d126347e10"}]}
