)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b0c9e8614bddcd605b83cd276bee70d139ccdfa8","unresolved":false,"context_lines":[{"line_number":10,"context_line":"are the best way to do that. This talks about how we integrate ironic"},{"line_number":11,"context_line":"nodes having associated traits into a Nova boot."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"The depends on changes in Ironic to allow operators to set"},{"line_number":14,"context_line":"traits on ironic nodes, alongside the existing ability to add a resource"},{"line_number":15,"context_line":"class for each node."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7f515b1d_e0ecb72a","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":3},"updated":"2017-10-04 21:18:49.000000000","message":"This spec","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"}],"specs/queens/approved/ironic-traits.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e874dc5f8ff0752af34000dcc29407758333f4ea","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"All this work depends on the ability for a flavor to have a required trait"},{"line_number":47,"context_line":"and for Nova to be able to request from placement resource providers that"},{"line_number":48,"context_line":"have the request set of traits. This is all implemented in the two blueprints"},{"line_number":49,"context_line":"bp add-trait-support-in-allocation-candidates and bp request-traits-in-nova."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"There are two main parts to this spec:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_e2643424","line":48,"range":{"start_line":48,"start_character":9,"end_line":48,"end_character":16},"updated":"2017-09-28 17:16:09.000000000","message":"requested","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e874dc5f8ff0752af34000dcc29407758333f4ea","unresolved":false,"context_lines":[{"line_number":46,"context_line":"All this work depends on the ability for a flavor to have a required trait"},{"line_number":47,"context_line":"and for Nova to be able to request from placement resource providers that"},{"line_number":48,"context_line":"have the request set of traits. This is all implemented in the two blueprints"},{"line_number":49,"context_line":"bp add-trait-support-in-allocation-candidates and bp request-traits-in-nova."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"There are two main parts to this spec:"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_027bd0bd","line":49,"range":{"start_line":49,"start_character":3,"end_line":49,"end_character":75},"updated":"2017-09-28 17:16:09.000000000","message":"link these?","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e874dc5f8ff0752af34000dcc29407758333f4ea","unresolved":false,"context_lines":[{"line_number":57,"context_line":"When Nova boot is called, the ironic driver already sets capabilities related"},{"line_number":58,"context_line":"extra specs from the requested flavor in `_add_instance_info_to_node`. It is"},{"line_number":59,"context_line":"set on the path `/instance_info/capabilities`. In a similar way we will set"},{"line_number":60,"context_line":"the traits related flavor extra specs on a path `/instance_info/traits`. This"},{"line_number":61,"context_line":"requires no API changes on the Ironic side."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_afcd0432","line":60,"range":{"start_line":60,"start_character":49,"end_line":60,"end_character":70},"updated":"2017-09-28 17:16:09.000000000","message":"Sorry, is this an ironic API or a nova API?  Or something totally different?","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c5cff6ef9cfc1a56fc0aece7238ef104aa7de9e6","unresolved":false,"context_lines":[{"line_number":57,"context_line":"When Nova boot is called, the ironic driver already sets capabilities related"},{"line_number":58,"context_line":"extra specs from the requested flavor in `_add_instance_info_to_node`. It is"},{"line_number":59,"context_line":"set on the path `/instance_info/capabilities`. In a similar way we will set"},{"line_number":60,"context_line":"the traits related flavor extra specs on a path `/instance_info/traits`. This"},{"line_number":61,"context_line":"requires no API changes on the Ironic side."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_d379fec7","line":60,"range":{"start_line":60,"start_character":49,"end_line":60,"end_character":70},"in_reply_to":"7f515b1d_afcd0432","updated":"2017-09-29 08:32:30.000000000","message":"This is the ironic API, can make that clearer.","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e874dc5f8ff0752af34000dcc29407758333f4ea","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Currently the nova virt driver has a `get_inventory` call to list the inventory"},{"line_number":65,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"},{"line_number":66,"context_line":"to the virt driver interface to fetch the traits for a given nodename. In a"},{"line_number":67,"context_line":"similar way to get_inventory, this will used the cached node details."},{"line_number":68,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_32a17b95","line":65,"range":{"start_line":65,"start_character":48,"end_line":65,"end_character":70},"updated":"2017-09-28 17:16:09.000000000","message":"Okay, I think I get where this is going.  It\u0027s a temporary step on the path toward virt having full control of its resource provider(s).  It assumes the current setup whereby the RT has full ownership over a single resource provider per node.  The proposed get_traits method hands over the reins for a sec to let virt set up traits, just as get_inventory does for inventory.\n\nSeems like, long term, once we\u0027re full-bore placement and RPs, this method would be obsolete, replaced by a virt method (or possibly just code in init_host) that does all the setup.","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c5cff6ef9cfc1a56fc0aece7238ef104aa7de9e6","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Currently the nova virt driver has a `get_inventory` call to list the inventory"},{"line_number":65,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"},{"line_number":66,"context_line":"to the virt driver interface to fetch the traits for a given nodename. In a"},{"line_number":67,"context_line":"similar way to get_inventory, this will used the cached node details."},{"line_number":68,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_13455670","line":65,"range":{"start_line":65,"start_character":48,"end_line":65,"end_character":70},"in_reply_to":"7f515b1d_32a17b95","updated":"2017-09-29 08:32:30.000000000","message":"Sure, this is about making baby steps forward given the current structure.","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e874dc5f8ff0752af34000dcc29407758333f4ea","unresolved":false,"context_lines":[{"line_number":76,"context_line":"for the appropriate node. Internally the pattern in `_ensure_resource_provider`"},{"line_number":77,"context_line":"method that ensures the resource provider is in the correct state will be used"},{"line_number":78,"context_line":"to ensure the traits are updated correctly. The existing resource provider APIs"},{"line_number":79,"context_line":"will be use to update the traits."},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"PROBLEM: when user deletes a trait in ironic, how do we know in Nova that it"},{"line_number":82,"context_line":"isn\u0027t a trait on the RP that some admin set on purpose? We really need a single"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_620f2437","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":11},"updated":"2017-09-28 17:16:09.000000000","message":"used","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e874dc5f8ff0752af34000dcc29407758333f4ea","unresolved":false,"context_lines":[{"line_number":83,"context_line":"writer to the list of traits, we need to decide who that is: Operator direct"},{"line_number":84,"context_line":"to placement, Ironic driver (and resource tracker) or Ironic directly."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"PROBLEM: what should happen for other virt drivers one ironic starts reporting"},{"line_number":87,"context_line":"traits? Should we default to some config value pushing traits into placement?"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_dd00fd03","line":86,"range":{"start_line":86,"start_character":51,"end_line":86,"end_character":54},"updated":"2017-09-28 17:16:09.000000000","message":"once","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e874dc5f8ff0752af34000dcc29407758333f4ea","unresolved":false,"context_lines":[{"line_number":89,"context_line":"Alternatives"},{"line_number":90,"context_line":"------------"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"We could allow admins to set traits directly by operators in placement, but"},{"line_number":93,"context_line":"this is a bit strange when Nova is creating the resource provider. Its possible"},{"line_number":94,"context_line":"ironic could create the resource provider on Nova\u0027s behalf."},{"line_number":95,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_5d140d44","line":92,"range":{"start_line":92,"start_character":48,"end_line":92,"end_character":57},"updated":"2017-09-28 17:16:09.000000000","message":"operations?","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c5cff6ef9cfc1a56fc0aece7238ef104aa7de9e6","unresolved":false,"context_lines":[{"line_number":89,"context_line":"Alternatives"},{"line_number":90,"context_line":"------------"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"We could allow admins to set traits directly by operators in placement, but"},{"line_number":93,"context_line":"this is a bit strange when Nova is creating the resource provider. Its possible"},{"line_number":94,"context_line":"ironic could create the resource provider on Nova\u0027s behalf."},{"line_number":95,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_73536a3a","line":92,"range":{"start_line":92,"start_character":48,"end_line":92,"end_character":57},"in_reply_to":"7f515b1d_5d140d44","updated":"2017-09-29 08:32:30.000000000","message":"I was meaning the operator people, plural.","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e874dc5f8ff0752af34000dcc29407758333f4ea","unresolved":false,"context_lines":[{"line_number":96,"context_line":"We could allow admins to extend the list of traits with a configuration"},{"line_number":97,"context_line":"variable on the compute host, and that could be behaviour for all drivers that"},{"line_number":98,"context_line":"don\u0027t implement `get_traits`, but for the moment this has been ignored because"},{"line_number":99,"context_line":"it it not relevant to the iroinc driver."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Data model impact"},{"line_number":102,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_7d2469af","line":99,"range":{"start_line":99,"start_character":26,"end_line":99,"end_character":32},"updated":"2017-09-28 17:16:09.000000000","message":"ironic","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e874dc5f8ff0752af34000dcc29407758333f4ea","unresolved":false,"context_lines":[{"line_number":96,"context_line":"We could allow admins to extend the list of traits with a configuration"},{"line_number":97,"context_line":"variable on the compute host, and that could be behaviour for all drivers that"},{"line_number":98,"context_line":"don\u0027t implement `get_traits`, but for the moment this has been ignored because"},{"line_number":99,"context_line":"it it not relevant to the iroinc driver."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Data model impact"},{"line_number":102,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7f515b1d_bd2e618f","line":99,"range":{"start_line":99,"start_character":3,"end_line":99,"end_character":5},"updated":"2017-09-28 17:16:09.000000000","message":"is","commit_id":"14b349fa93a02fa20635ce028138172a93985b54"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"79e8dc8987406ef98302f9eea4051b9e2eab5ec0","unresolved":false,"context_lines":[{"line_number":29,"context_line":"Use Cases"},{"line_number":30,"context_line":"---------"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Consider flavor Gold targeting resource class CUSTOM_GOLD. Some users need to"},{"line_number":33,"context_line":"Gold++ where it also targets CUSTOM_GOLD but in addition requires specific set"},{"line_number":34,"context_line":"of CPU flags that are not available on all nodes with the resource class of"},{"line_number":35,"context_line":"CUSTOM_GOLD."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7f515b1d_d36674bb","line":32,"range":{"start_line":32,"start_character":70,"end_line":32,"end_character":77},"updated":"2017-10-02 19:09:21.000000000","message":"\"want a kind of\"","commit_id":"c477a9aaea6301b78486c4a9c546ae88f490dedf"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"79e8dc8987406ef98302f9eea4051b9e2eab5ec0","unresolved":false,"context_lines":[{"line_number":37,"context_line":"Another use case is using a per project flavor to expose a subset of nodes"},{"line_number":38,"context_line":"only to a specific user. The per project flavor, called Gold_projectB flavor,"},{"line_number":39,"context_line":"requires the trait CUSTOM_IRONIC_NODE_PROJECT_B and the public flavor, called"},{"line_number":40,"context_line":"Gold, requires the trait CUSTOM_IRONIC_NODE_GENERAL_USE. The operator now tags"},{"line_number":41,"context_line":"nodes with the appropriate trait for either project_b or general use."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7f515b1d_b33098a0","line":40,"range":{"start_line":40,"start_character":25,"end_line":40,"end_character":55},"updated":"2017-10-02 19:09:21.000000000","message":"Why is this necessary?","commit_id":"c477a9aaea6301b78486c4a9c546ae88f490dedf"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"204a87c181e957fc05b8af093cfe62d6af958fbe","unresolved":false,"context_lines":[{"line_number":37,"context_line":"Another use case is using a per project flavor to expose a subset of nodes"},{"line_number":38,"context_line":"only to a specific user. The per project flavor, called Gold_projectB flavor,"},{"line_number":39,"context_line":"requires the trait CUSTOM_IRONIC_NODE_PROJECT_B and the public flavor, called"},{"line_number":40,"context_line":"Gold, requires the trait CUSTOM_IRONIC_NODE_GENERAL_USE. The operator now tags"},{"line_number":41,"context_line":"nodes with the appropriate trait for either project_b or general use."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7f515b1d_0ba5e8a1","line":40,"range":{"start_line":40,"start_character":25,"end_line":40,"end_character":55},"in_reply_to":"7f515b1d_b33098a0","updated":"2017-10-03 08:51:48.000000000","message":"well, if we don\u0027t have this, the flavor for general use might just pick CUSTOM_IRONIC_NODE_PROJECT_B. Even if we implemented must not have trait X in the flavor, you would end up having to keep adding each exclution tag to the general flavor.\n\nI will try capture this better here.","commit_id":"c477a9aaea6301b78486c4a9c546ae88f490dedf"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"79e8dc8987406ef98302f9eea4051b9e2eab5ec0","unresolved":false,"context_lines":[{"line_number":49,"context_line":"blueprints:"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"* https://blueprints.launchpad.net/nova/+spec/add-trait-support-in-allocation-candidates"},{"line_number":52,"context_line":"* https://blueprints.launchpad.net/nova/+spec/request-traits-in-nova"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"There are two main parts to this spec:"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7f515b1d_93335cab","line":52,"updated":"2017-10-02 19:09:21.000000000","message":"ack.","commit_id":"c477a9aaea6301b78486c4a9c546ae88f490dedf"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"839a3d42991169b4b55a026ec16b06c22eb39ade","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"When Nova boot is called, the ironic driver already sets capabilities related"},{"line_number":60,"context_line":"extra specs from the requested flavor on the ironic node via the Ironic API."},{"line_number":61,"context_line":"This is done int he virt drivers `_add_instance_info_to_node` method. It is"},{"line_number":62,"context_line":"set on the path `/instance_info/capabilities`. In a similar way we will also"},{"line_number":63,"context_line":"set the traits related flavor extra specs on a path `/instance_info/traits`."},{"line_number":64,"context_line":"Note, this requires no API changes on the Ironic side."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7f515b1d_d9923c57","line":61,"range":{"start_line":61,"start_character":13,"end_line":61,"end_character":32},"updated":"2017-09-29 13:50:05.000000000","message":"in the virt driver\u0027s","commit_id":"c477a9aaea6301b78486c4a9c546ae88f490dedf"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"839a3d42991169b4b55a026ec16b06c22eb39ade","unresolved":false,"context_lines":[{"line_number":61,"context_line":"This is done int he virt drivers `_add_instance_info_to_node` method. It is"},{"line_number":62,"context_line":"set on the path `/instance_info/capabilities`. In a similar way we will also"},{"line_number":63,"context_line":"set the traits related flavor extra specs on a path `/instance_info/traits`."},{"line_number":64,"context_line":"Note, this requires no API changes on the Ironic side."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"Currently the nova virt driver has a `get_inventory` call to list the inventory"},{"line_number":67,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7f515b1d_b99d4067","line":64,"updated":"2017-09-29 13:50:05.000000000","message":"Right, so this is where I was confused.  It\u0027s not critical that I understand or that it be spelled out here, but wouldn\u0027t `/instance_info/traits` be a new Ironic API path, hence a required API change on the Ironic side?","commit_id":"c477a9aaea6301b78486c4a9c546ae88f490dedf"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"15c818791bc7d3777e0eaea5f30933cf72e652d9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"This is done int he virt drivers `_add_instance_info_to_node` method. It is"},{"line_number":62,"context_line":"set on the path `/instance_info/capabilities`. In a similar way we will also"},{"line_number":63,"context_line":"set the traits related flavor extra specs on a path `/instance_info/traits`."},{"line_number":64,"context_line":"Note, this requires no API changes on the Ironic side."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"Currently the nova virt driver has a `get_inventory` call to list the inventory"},{"line_number":67,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7f515b1d_d7bd4ab7","line":64,"in_reply_to":"7f515b1d_b99d4067","updated":"2017-10-02 09:34:05.000000000","message":"No its a path in a PATCH call to a dict interface.\n\nYou can see the prototype change uploaded here:\nhttps://review.openstack.org/#/c/508116/\n\nI could well be wrong though, I am no Ironic expert at this point.","commit_id":"c477a9aaea6301b78486c4a9c546ae88f490dedf"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"dc6368ce60799c77f529944fe33fa9c8d6aefaf7","unresolved":false,"context_lines":[{"line_number":61,"context_line":"This is done int he virt drivers `_add_instance_info_to_node` method. It is"},{"line_number":62,"context_line":"set on the path `/instance_info/capabilities`. In a similar way we will also"},{"line_number":63,"context_line":"set the traits related flavor extra specs on a path `/instance_info/traits`."},{"line_number":64,"context_line":"Note, this requires no API changes on the Ironic side."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"Currently the nova virt driver has a `get_inventory` call to list the inventory"},{"line_number":67,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7f515b1d_c2c0e3e3","line":64,"in_reply_to":"7f515b1d_d7bd4ab7","updated":"2017-10-02 14:14:17.000000000","message":"Okay, I see.  Thanks.","commit_id":"c477a9aaea6301b78486c4a9c546ae88f490dedf"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0657c8294f754721f4122b1bcd7a7a753f79d42d","unresolved":false,"context_lines":[{"line_number":40,"context_line":"Gold, requires the trait CUSTOM_IRONIC_NODE_GENERAL_USE. The operator now tags"},{"line_number":41,"context_line":"nodes with the appropriate trait for either project_b or general use. This"},{"line_number":42,"context_line":"approach means when adding sets of nodes specific to project e and project t,"},{"line_number":43,"context_line":"there is no needed to modify any of the existing flavors and node traits."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Proposed change"},{"line_number":46,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7f515b1d_a0a706a8","line":43,"updated":"2017-10-03 20:00:23.000000000","message":"Not sure this clarifies it.  We really don\u0027t need to get bogged down in this, because it\u0027s not the point of the spec, but GENERAL_USE could do one of several things depending on how you\u0027re modeling.\n\n- It could ensure your PROJECT_X nodes are reserved for PROJECT_X use.  In that case, you do need to specify GENERAL_USE when you don\u0027t want project X.\n- If you don\u0027t mind PROJECT_X nodes being in the pool for general purposes (but still want to ensure PROJECT_X nodes are used for project X purposes), then you don\u0027t need a GENERAL_USE trait; you just omit the traits entirely and you\u0027ll get whatever node.","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"affd4419011bec387166c0a0dd06415d72dada61","unresolved":false,"context_lines":[{"line_number":40,"context_line":"Gold, requires the trait CUSTOM_IRONIC_NODE_GENERAL_USE. The operator now tags"},{"line_number":41,"context_line":"nodes with the appropriate trait for either project_b or general use. This"},{"line_number":42,"context_line":"approach means when adding sets of nodes specific to project e and project t,"},{"line_number":43,"context_line":"there is no needed to modify any of the existing flavors and node traits."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Proposed change"},{"line_number":46,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7f515b1d_e9fed469","line":43,"in_reply_to":"7f515b1d_a0a706a8","updated":"2017-10-05 09:31:43.000000000","message":"I can try reword this. I guess the use case seems very clear in my head, and I am not expressing it well.","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b0c9e8614bddcd605b83cd276bee70d139ccdfa8","unresolved":false,"context_lines":[{"line_number":45,"context_line":"Proposed change"},{"line_number":46,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"All this work depends on the ability for a flavor to have a required trait"},{"line_number":49,"context_line":"and for Nova to be able to request from placement resource providers that"},{"line_number":50,"context_line":"have the requested set of traits. This is all implemented in the two"},{"line_number":51,"context_line":"blueprints:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7f515b1d_40beebff","line":48,"range":{"start_line":48,"start_character":58,"end_line":48,"end_character":74},"updated":"2017-10-04 21:18:49.000000000","message":"set of required traits, but yeah.","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"affd4419011bec387166c0a0dd06415d72dada61","unresolved":false,"context_lines":[{"line_number":45,"context_line":"Proposed change"},{"line_number":46,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"All this work depends on the ability for a flavor to have a required trait"},{"line_number":49,"context_line":"and for Nova to be able to request from placement resource providers that"},{"line_number":50,"context_line":"have the requested set of traits. This is all implemented in the two"},{"line_number":51,"context_line":"blueprints:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7f515b1d_89f52086","line":48,"range":{"start_line":48,"start_character":58,"end_line":48,"end_character":74},"in_reply_to":"7f515b1d_40beebff","updated":"2017-10-05 09:31:43.000000000","message":"Done","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b0c9e8614bddcd605b83cd276bee70d139ccdfa8","unresolved":false,"context_lines":[{"line_number":61,"context_line":"When Nova boot is called, the ironic driver already sets capabilities related"},{"line_number":62,"context_line":"extra specs from the requested flavor on the ironic node via the Ironic API."},{"line_number":63,"context_line":"This is done in the virt drivers `_add_instance_info_to_node` method. It is"},{"line_number":64,"context_line":"set on the path `/instance_info/capabilities`. In a similar way we will also"},{"line_number":65,"context_line":"set the traits related flavor extra specs on a path `/instance_info/traits`."},{"line_number":66,"context_line":"Note, this requires no API changes on the Ironic side."},{"line_number":67,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"7f515b1d_406cab9b","line":64,"updated":"2017-10-04 21:18:49.000000000","message":"Probably worth a little sidenote here that you\u0027re referring to a \"path\" above as a PATCH request\u0027s JSONPath change identifier.","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b0c9e8614bddcd605b83cd276bee70d139ccdfa8","unresolved":false,"context_lines":[{"line_number":68,"context_line":"Currently the nova virt driver has a `get_inventory` call to list the inventory"},{"line_number":69,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"},{"line_number":70,"context_line":"to the virt driver interface to fetch the traits for a given nodename. In a"},{"line_number":71,"context_line":"similar way to get_inventory, this will used the cached node details."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"For drivers that don\u0027t override the new `get_traits` call, but already have the"},{"line_number":74,"context_line":"`get_inventory` call, we default to an empty list of traits."}],"source_content_type":"text/x-rst","patch_set":4,"id":"7f515b1d_e00837da","line":71,"range":{"start_line":71,"start_character":40,"end_line":71,"end_character":44},"updated":"2017-10-04 21:18:49.000000000","message":"use","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b0c9e8614bddcd605b83cd276bee70d139ccdfa8","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"These traits for each ironic node need to be checked against the current traits"},{"line_number":77,"context_line":"for the associated Resource Provider, and updated if needed. This is likely"},{"line_number":78,"context_line":"going to be done in the scheduler report client\u0027s `set_inventory_for_provider`"},{"line_number":79,"context_line":"method that currently creates the resource provider and updates its inventory"},{"line_number":80,"context_line":"for the appropriate node. Internally the pattern in `_ensure_resource_provider`"},{"line_number":81,"context_line":"method that ensures the resource provider is in the correct state will be used"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7f515b1d_a0e0fffb","line":78,"range":{"start_line":78,"start_character":51,"end_line":78,"end_character":77},"updated":"2017-10-04 21:18:49.000000000","message":"There will need to be a new set_traits_for_provider() method, since traits and inventory aren\u0027t related.\n\nWhen, in the future, we get to the whole new proposed update_provider_tree() virt driver API method, we will just have the virt driver tag providers and set inventory against the ProviderTree object supplied to it, but this proposed get_traits()/set_traits_for_provider() approach is perfectly fine for now.","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"affd4419011bec387166c0a0dd06415d72dada61","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"These traits for each ironic node need to be checked against the current traits"},{"line_number":77,"context_line":"for the associated Resource Provider, and updated if needed. This is likely"},{"line_number":78,"context_line":"going to be done in the scheduler report client\u0027s `set_inventory_for_provider`"},{"line_number":79,"context_line":"method that currently creates the resource provider and updates its inventory"},{"line_number":80,"context_line":"for the appropriate node. Internally the pattern in `_ensure_resource_provider`"},{"line_number":81,"context_line":"method that ensures the resource provider is in the correct state will be used"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7f515b1d_e95a5481","line":78,"range":{"start_line":78,"start_character":51,"end_line":78,"end_character":77},"in_reply_to":"7f515b1d_a0e0fffb","updated":"2017-10-05 09:31:43.000000000","message":"I agree, although the set_inventory_for_provider method is currently responsible for creating the resource providers, as required. We could split that up, but seemed overkill.\n\nI will reward this to say I will follow the existing pattern, and lets see how that all looks at the end.","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b0c9e8614bddcd605b83cd276bee70d139ccdfa8","unresolved":false,"context_lines":[{"line_number":85,"context_line":"PROBLEM: when user deletes a trait in ironic, how do we know in Nova that it"},{"line_number":86,"context_line":"isn\u0027t a trait on the RP that some admin set on purpose? We really need a single"},{"line_number":87,"context_line":"writer to the list of traits, we need to decide who that is: Operator direct"},{"line_number":88,"context_line":"to placement, Ironic driver (and resource tracker) or Ironic directly."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"PROBLEM: what should happen for other virt drivers once ironic starts reporting"},{"line_number":91,"context_line":"traits? Should we default to some config value pushing traits into placement?"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7f515b1d_6090c74f","line":88,"updated":"2017-10-04 21:18:49.000000000","message":"The Ironic API is the owner and single source of truth for this information. The Ironic virt driver is merely a mechanism for interfacing with the nova-compute resource tracker and ensuring trait records against the resource provider representing an Ironic baremetal node are kept in sync with what the Ironic API (the single source of truth) says those traits should be.","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b0c9e8614bddcd605b83cd276bee70d139ccdfa8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"to placement, Ironic driver (and resource tracker) or Ironic directly."},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"PROBLEM: what should happen for other virt drivers once ironic starts reporting"},{"line_number":91,"context_line":"traits? Should we default to some config value pushing traits into placement?"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"Alternatives"},{"line_number":94,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"7f515b1d_e08dd731","line":91,"updated":"2017-10-04 21:18:49.000000000","message":"Don\u0027t worry about that for right now. We\u0027ll do a similar technique that checks for NotImplementedError being raised from get_traits() while other virt drivers are updated to use that method.","commit_id":"585463f33a25eac94d6a70ffdfd0b5b98016c514"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"eabdb27548b0a87fc72eb80d7702eeaaf5b91515","unresolved":false,"context_lines":[{"line_number":42,"context_line":"like this is assigning traits such as CUSTOM_IRONIC_NODE_PROJECT_B and"},{"line_number":43,"context_line":"CUSTOM_IRONIC_NODE_GENERAL_USE to the appropriate ironic nodes. Then there is"},{"line_number":44,"context_line":"a public flavor to target the general pool of hosts, and a private project"},{"line_number":45,"context_line":"specific flavor that targets their dedicated pool."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Proposed change"},{"line_number":48,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_3727a215","line":45,"updated":"2017-10-05 12:57:35.000000000","message":"WFM.  (This is clearly expressing my first bullet in the PS4 comment.)","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f03835021ccfb71326f1bf19b9eab5721701b0d8","unresolved":false,"context_lines":[{"line_number":42,"context_line":"like this is assigning traits such as CUSTOM_IRONIC_NODE_PROJECT_B and"},{"line_number":43,"context_line":"CUSTOM_IRONIC_NODE_GENERAL_USE to the appropriate ironic nodes. Then there is"},{"line_number":44,"context_line":"a public flavor to target the general pool of hosts, and a private project"},{"line_number":45,"context_line":"specific flavor that targets their dedicated pool."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Proposed change"},{"line_number":48,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_4bf9527e","line":45,"in_reply_to":"7f515b1d_3727a215","updated":"2017-10-05 15:28:19.000000000","message":"I\u0027m confused about this paragraph. Why do we need traits to circumvent the flavor-access API?","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d67aabf9be3a420ad309abeea1d0a82531e30786","unresolved":false,"context_lines":[{"line_number":42,"context_line":"like this is assigning traits such as CUSTOM_IRONIC_NODE_PROJECT_B and"},{"line_number":43,"context_line":"CUSTOM_IRONIC_NODE_GENERAL_USE to the appropriate ironic nodes. Then there is"},{"line_number":44,"context_line":"a public flavor to target the general pool of hosts, and a private project"},{"line_number":45,"context_line":"specific flavor that targets their dedicated pool."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Proposed change"},{"line_number":48,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_0b211afc","line":45,"in_reply_to":"7f515b1d_4bf9527e","updated":"2017-10-05 15:29:55.000000000","message":"I don\u0027t think anyone is suggesting circumventing the flavor-access API?","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"eabdb27548b0a87fc72eb80d7702eeaaf5b91515","unresolved":false,"context_lines":[{"line_number":66,"context_line":"set on the path `/instance_info/capabilities`. In a similar way we will also"},{"line_number":67,"context_line":"set the traits related flavor extra specs on a path `/instance_info/traits`."},{"line_number":68,"context_line":"Note, this requires no API changes on the Ironic side, the path is a PATCH"},{"line_number":69,"context_line":"requests JSONPath change identifier."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"Currently the nova virt driver has a `get_inventory` call to list the inventory"},{"line_number":72,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_d71baec7","line":69,"updated":"2017-10-05 12:57:35.000000000","message":"Thanks","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"eabdb27548b0a87fc72eb80d7702eeaaf5b91515","unresolved":false,"context_lines":[{"line_number":72,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"},{"line_number":73,"context_line":"to the virt driver interface to fetch the traits for a given nodename. In a"},{"line_number":74,"context_line":"similar way to get_inventory, this will use the cached node details. For"},{"line_number":75,"context_line":"drivers that don\u0027t override the new `get_traits` call we will raise a"},{"line_number":76,"context_line":"NotImplementedError."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"These traits for each ironic node need to be checked against the current traits"},{"line_number":79,"context_line":"for the associated Resource Provider, and updated if needed. This is likely"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_b7c6f215","line":76,"range":{"start_line":75,"start_character":54,"end_line":76,"end_character":20},"updated":"2017-10-05 12:57:35.000000000","message":"This seems harsh.  Why not have the default impl return an empty list?\n\nOr you\u0027ll just trap and ignore NotImplementedError from set_traits_for_provider?  Which is effectively the same result.","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"da6c1e94c5451cc8e564a31d0556a2a3a58f0d38","unresolved":false,"context_lines":[{"line_number":72,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"},{"line_number":73,"context_line":"to the virt driver interface to fetch the traits for a given nodename. In a"},{"line_number":74,"context_line":"similar way to get_inventory, this will use the cached node details. For"},{"line_number":75,"context_line":"drivers that don\u0027t override the new `get_traits` call we will raise a"},{"line_number":76,"context_line":"NotImplementedError."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"These traits for each ironic node need to be checked against the current traits"},{"line_number":79,"context_line":"for the associated Resource Provider, and updated if needed. This is likely"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_8b0e2ae3","line":76,"range":{"start_line":75,"start_character":54,"end_line":76,"end_character":20},"in_reply_to":"7f515b1d_78862616","updated":"2017-10-05 15:21:01.000000000","message":"This.","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"13d7c64d96727c917355d3fd0832aac5567edffa","unresolved":false,"context_lines":[{"line_number":72,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"},{"line_number":73,"context_line":"to the virt driver interface to fetch the traits for a given nodename. In a"},{"line_number":74,"context_line":"similar way to get_inventory, this will use the cached node details. For"},{"line_number":75,"context_line":"drivers that don\u0027t override the new `get_traits` call we will raise a"},{"line_number":76,"context_line":"NotImplementedError."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"These traits for each ironic node need to be checked against the current traits"},{"line_number":79,"context_line":"for the associated Resource Provider, and updated if needed. This is likely"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_8ecbd8a3","line":76,"range":{"start_line":75,"start_character":54,"end_line":76,"end_character":20},"in_reply_to":"7f515b1d_8b0e2ae3","updated":"2017-10-16 13:55:52.000000000","message":"Dig","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"662f2fea18b14dc9f4ac7365c0c8248b46585853","unresolved":false,"context_lines":[{"line_number":72,"context_line":"of a given compute_node. This change will add a `get_traits(nodename)` call"},{"line_number":73,"context_line":"to the virt driver interface to fetch the traits for a given nodename. In a"},{"line_number":74,"context_line":"similar way to get_inventory, this will use the cached node details. For"},{"line_number":75,"context_line":"drivers that don\u0027t override the new `get_traits` call we will raise a"},{"line_number":76,"context_line":"NotImplementedError."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"These traits for each ironic node need to be checked against the current traits"},{"line_number":79,"context_line":"for the associated Resource Provider, and updated if needed. This is likely"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_78862616","line":76,"range":{"start_line":75,"start_character":54,"end_line":76,"end_character":20},"in_reply_to":"7f515b1d_b7c6f215","updated":"2017-10-05 15:00:16.000000000","message":"Because that\u0027s the way we currently work with the get_inventory() method. If the get_inventory() method raises NotIMplementedError, we know to continue using the get_available_resource() method which mashes the capabilities and resources into the returned single dict of randomness.\n\nSee here:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/resource_tracker.py#L809-L821","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"eabdb27548b0a87fc72eb80d7702eeaaf5b91515","unresolved":false,"context_lines":[{"line_number":88,"context_line":"We are considering the Ironic API as the single source of truth for the Traits"},{"line_number":89,"context_line":"for a given Node. So should someone set any traits directly on the Placement"},{"line_number":90,"context_line":"API, they will be overridden on the next virt driver sync, with will reset the"},{"line_number":91,"context_line":"traits to what is in the Ironic API."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"Alternatives"},{"line_number":94,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_f706aa20","line":91,"updated":"2017-10-05 12:57:35.000000000","message":"Just making sure I\u0027m understanding this:\n\nTo satisfy the Use Cases, the operator needs to be able to assign traits to nodes.  The operator will do this \"from the other end\" by talking to the Ironic API as expressed in [1].  And then the virt driver in nova will be gleaning those values from the Ironic API in order to report them via get_traits().\n\nCool.\n\nCourse, you\u0027ll still have the boggle on the \"other end\" of reconciling traits detected by inspector with those specified by the operator...\n\n[1] https://review.openstack.org/#/c/504531/4/specs/approved/node-traits.rst","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"448f0fca64ad6fcd351800a37fa1aa5a530bb672","unresolved":false,"context_lines":[{"line_number":120,"context_line":"REST API impact"},{"line_number":121,"context_line":"---------------"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"None, uses exiting placement APIs."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Security impact"},{"line_number":126,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_0e1c8868","line":123,"range":{"start_line":123,"start_character":0,"end_line":123,"end_character":34},"updated":"2017-10-05 15:37:55.000000000","message":"I think I asked about this in IRC at one point, but we should double check that the resource provider generation is updated when traits are updated for the given RP, otherwise we could have parallel requests overwriting each other\u0027s RP traits updates.","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"58e9f12f6246a1661498907c91d71ef34a96fb06","unresolved":false,"context_lines":[{"line_number":120,"context_line":"REST API impact"},{"line_number":121,"context_line":"---------------"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"None, uses exiting placement APIs."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Security impact"},{"line_number":126,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7f515b1d_ee8b6c65","line":123,"range":{"start_line":123,"start_character":0,"end_line":123,"end_character":34},"in_reply_to":"7f515b1d_0e1c8868","updated":"2017-10-05 15:39:57.000000000","message":"Matt, please see here:\n\nhttps://review.openstack.org/#/c/509028/3/nova/objects/resource_provider.py","commit_id":"f63e7ad96c24a6015f7972147102190a6448f396"}]}
