)]}'
{"specs/newton/approved/ironic-multiple-compute-hosts.rst":[{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"8ccf4b038443c1cc1d14fea4e2bc18a5fbbcadd4","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"* Associating the resource pools with the resource classes"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"* Associating the flavors with the resource classes"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"These should all be one-time tasks during the initial deployment (or the"},{"line_number":108,"context_line":"addition of a new class of hardware)."}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab6814e_e19949d2","line":105,"updated":"2016-05-24 03:24:17.000000000","message":"This should be useful to distinguish baremetal flavor and VM flavor, but do you have an example about how to associate, using extra_spec or add new field in flavor too?","commit_id":"f0acda0c723ae043975b86520c2097580e31c1a4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e5fa82e47b162717de5b9f1ca972bdf1982203ee","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"* Associating the resource pools with the resource classes"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"* Associating the flavors with the resource classes"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"These should all be one-time tasks during the initial deployment (or the"},{"line_number":108,"context_line":"addition of a new class of hardware)."}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab6814e_297850f8","line":105,"in_reply_to":"bab6814e_e19949d2","updated":"2016-05-24 08:51:13.000000000","message":"Hi Tan,\n\nThe resource class spec does have a walk-through example of how it should work: https://review.openstack.org/#/c/312696/","commit_id":"f0acda0c723ae043975b86520c2097580e31c1a4"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"8ccf4b038443c1cc1d14fea4e2bc18a5fbbcadd4","unresolved":false,"context_lines":[{"line_number":117,"context_line":"deploy an instance for that resource class."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"The actual choice of a node from ironic is also simple. The ironic node"},{"line_number":120,"context_line":"object will contain a new string field `resource_class`, which will be"},{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab6814e_c13a4598","line":121,"range":{"start_line":120,"start_character":56,"end_line":121,"end_character":63},"updated":"2016-05-24 03:24:17.000000000","message":"Do we have a criteria to say two nodes are in different resource_class, CPUs, disk drive or NIC?\nFor example, if above condition is not exactly match, then say resource_class A with 2T disk and resource_class B with 4T disk, a node with 3T disk should belong to which resource class?","commit_id":"f0acda0c723ae043975b86520c2097580e31c1a4"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"90f61fd1d8406699008bbd15f48057a671d76167","unresolved":false,"context_lines":[{"line_number":117,"context_line":"deploy an instance for that resource class."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"The actual choice of a node from ironic is also simple. The ironic node"},{"line_number":120,"context_line":"object will contain a new string field `resource_class`, which will be"},{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab6814e_92599891","line":121,"range":{"start_line":120,"start_character":56,"end_line":121,"end_character":63},"in_reply_to":"bab6814e_c13a4598","updated":"2016-05-24 11:28:33.000000000","message":"Well, this is completely up to the operator. The operator will:\n\n* define the flavors Nova should provide\n* define the resource class that will provide a node to each of these flavors\n* set the resource_type for each node based on the resource class it should match\n\nIf a node has no resource_type, it will not be schedulable in this model.","commit_id":"f0acda0c723ae043975b86520c2097580e31c1a4"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"8ccf4b038443c1cc1d14fea4e2bc18a5fbbcadd4","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab6814e_216cf107","line":138,"updated":"2016-05-24 03:24:17.000000000","message":"+1","commit_id":"f0acda0c723ae043975b86520c2097580e31c1a4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e5fa82e47b162717de5b9f1ca972bdf1982203ee","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab6814e_696c1809","line":138,"in_reply_to":"bab6814e_216cf107","updated":"2016-05-24 08:51:13.000000000","message":"+1\n\nSince now Ironic will be the responsible for scheduling the node, I would like the proposal to cover cases like the capabilities because we do rely on it for a bunch of things in Ironic. ( Maybe the claims api is still needed ? )","commit_id":"f0acda0c723ae043975b86520c2097580e31c1a4"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"90f61fd1d8406699008bbd15f48057a671d76167","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab6814e_b23bfc37","line":138,"in_reply_to":"bab6814e_696c1809","updated":"2016-05-24 11:28:33.000000000","message":"I agree, I need to think a bit more on this.","commit_id":"f0acda0c723ae043975b86520c2097580e31c1a4"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e5fa82e47b162717de5b9f1ca972bdf1982203ee","unresolved":false,"context_lines":[{"line_number":248,"context_line":"References"},{"line_number":249,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"[0] https://review.openstack.org/#/c/312696/"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"History"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bab6814e_d53978a5","line":251,"updated":"2016-05-24 08:51:13.000000000","message":"We should move this under the Dependencies section","commit_id":"f0acda0c723ae043975b86520c2097580e31c1a4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7158a87ce617a95414f91a6675567925c6103da9","unresolved":false,"context_lines":[{"line_number":45,"context_line":"classes.[0] That work lays the foundation for this spec. This spec intends"},{"line_number":46,"context_line":"to show what changes should be made to the ironic virt driver to take"},{"line_number":47,"context_line":"full advantage of dynamic resource classes, and make them less of a burden"},{"line_number":48,"context_line":"for operators."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Flavors"},{"line_number":51,"context_line":"-------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_5475f02f","line":48,"updated":"2016-05-31 13:30:34.000000000","message":"While I understand the dynamics behind this modification, I wonder why we should wait for the dynamic-resource-classes blueprint to be merged. The original spec was explaining that one compute service could be there for all the Ironic nodes, I still think it would be nice to see that","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"8f78b1cf9e7dcdb05826bbdc36dd2288cbf14d3b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"classes.[0] That work lays the foundation for this spec. This spec intends"},{"line_number":46,"context_line":"to show what changes should be made to the ironic virt driver to take"},{"line_number":47,"context_line":"full advantage of dynamic resource classes, and make them less of a burden"},{"line_number":48,"context_line":"for operators."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Flavors"},{"line_number":51,"context_line":"-------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_84a8bd8e","line":48,"in_reply_to":"9abb7d3a_5475f02f","updated":"2016-05-31 16:20:23.000000000","message":"Honestly, the old method was basically a major rewrite of the ironic driver, requiring a significant amount of work in the ironic API as well (especially for something performant). I think this is the right model, and I\u0027d rather not move to the old method described and then immediately move to this model.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"0d3e63611a93c36bbfc58cf7353d08941481800c","unresolved":false,"context_lines":[{"line_number":51,"context_line":"-------"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"While this work will not change any of the flavors code, it is important"},{"line_number":54,"context_line":"to note that a baremetal flavor using this work will not have CPUs, RAM,"},{"line_number":55,"context_line":"etc. defined in the flavor, but instead will simply require a single"},{"line_number":56,"context_line":"resource that is defined by a dynamic resource class."},{"line_number":57,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"dada55a8_56d68c4f","line":54,"range":{"start_line":54,"start_character":62,"end_line":54,"end_character":72},"updated":"2016-07-26 11:07:03.000000000","message":"If nova will not filter ironic nodes by CPUs, RAM, etc, it would be better to explain how \"resource_class\" in ironic can implement this filter action.\nOr we can not filter nodes by CPUs or RAM any more?","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"73ab6700ae1dace7430b685f08f9ae2ba51a9769","unresolved":false,"context_lines":[{"line_number":53,"context_line":"While this work will not change any of the flavors code, it is important"},{"line_number":54,"context_line":"to note that a baremetal flavor using this work will not have CPUs, RAM,"},{"line_number":55,"context_line":"etc. defined in the flavor, but instead will simply require a single"},{"line_number":56,"context_line":"resource that is defined by a dynamic resource class."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Resource tracking"},{"line_number":59,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1aa78d24_ecc7a361","line":56,"updated":"2016-07-07 14:08:40.000000000","message":"@jroll: yep. correct.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"While this work will not change any of the flavors code, it is important"},{"line_number":54,"context_line":"to note that a baremetal flavor using this work will not have CPUs, RAM,"},{"line_number":55,"context_line":"etc. defined in the flavor, but instead will simply require a single"},{"line_number":56,"context_line":"resource that is defined by a dynamic resource class."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Resource tracking"},{"line_number":59,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_0e8607db","line":56,"updated":"2016-05-24 20:51:22.000000000","message":"This is correct, though technically the flavor will continue to have vCPU, RAM, and DISK until such time as flavors in Nova are not hard-coded to always have those resources in them.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":53,"context_line":"While this work will not change any of the flavors code, it is important"},{"line_number":54,"context_line":"to note that a baremetal flavor using this work will not have CPUs, RAM,"},{"line_number":55,"context_line":"etc. defined in the flavor, but instead will simply require a single"},{"line_number":56,"context_line":"resource that is defined by a dynamic resource class."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Resource tracking"},{"line_number":59,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_11290638","line":56,"in_reply_to":"bab6814e_0e8607db","updated":"2016-05-24 21:30:04.000000000","message":"They would need to be defined as zero, though, correct? Else the compute service must have resources available.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":61,"context_line":"First, compute hosts running the ironic virt driver must report zero"},{"line_number":62,"context_line":"resources to the resource tracker, as an instance cannot actually be"},{"line_number":63,"context_line":"deployed on the compute host. Rather, instances are deployed on the bare"},{"line_number":64,"context_line":"metal nodes and only managed by the compute hosts."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"So, `get_available_nodes` should be changed to only return one node, the"},{"line_number":67,"context_line":"compute host itself, just like the libvirt driver does."}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_6e6d1332","line":64,"updated":"2016-05-24 20:51:22.000000000","message":"Kinda. A better way of describing this is that the Nova compute host is merely a vessel for directing baremetal instance lifecycle commands to Ironic and that the resources managed by the compute host are owned by a generic resource pool containing X amount of resources where the class of resource is a particular baremetal node configuration.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":61,"context_line":"First, compute hosts running the ironic virt driver must report zero"},{"line_number":62,"context_line":"resources to the resource tracker, as an instance cannot actually be"},{"line_number":63,"context_line":"deployed on the compute host. Rather, instances are deployed on the bare"},{"line_number":64,"context_line":"metal nodes and only managed by the compute hosts."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"So, `get_available_nodes` should be changed to only return one node, the"},{"line_number":67,"context_line":"compute host itself, just like the libvirt driver does."}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_b11aba15","line":64,"in_reply_to":"bab6814e_6e6d1332","updated":"2016-05-24 21:30:04.000000000","message":"Mhm, I\u0027ll try to reword this.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7158a87ce617a95414f91a6675567925c6103da9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"First, compute hosts running the ironic virt driver must report zero"},{"line_number":62,"context_line":"resources to the resource tracker, as an instance cannot actually be"},{"line_number":63,"context_line":"deployed on the compute host. Rather, instances are deployed on the bare"},{"line_number":64,"context_line":"metal nodes and only managed by the compute hosts."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"So, `get_available_nodes` should be changed to only return one node, the"},{"line_number":67,"context_line":"compute host itself, just like the libvirt driver does."}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_14d408ea","line":64,"in_reply_to":"bab6814e_b11aba15","updated":"2016-05-31 13:30:34.000000000","message":"Yeah, not sure I like to see that.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":64,"context_line":"metal nodes and only managed by the compute hosts."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"So, `get_available_nodes` should be changed to only return one node, the"},{"line_number":67,"context_line":"compute host itself, just like the libvirt driver does."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"Then `get_available_resource` should return a bare resource dictionary,"},{"line_number":70,"context_line":"which exposes zero resources, as this does not need to be taken into"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_4e680f22","line":67,"updated":"2016-05-24 20:51:22.000000000","message":"Yes, the get_available_nodes() function will be removed entirely from the virt driver API actually, since it will no longer be relevant to Nova. It will be something entirely implementation-specific to Ironic and the Ironic virt driver. You can compare the Ironic node to a physical CPU on a hypervisor host. Nova doesn\u0027t care which physical CPUs are utilized by a guest VM. That is the domain of the hypervisor to manage and understand. Likewise, which Ironic node houses a Nova instance is entirely the domain of the Ironic virt driver and is of no concern to Nova.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":64,"context_line":"metal nodes and only managed by the compute hosts."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"So, `get_available_nodes` should be changed to only return one node, the"},{"line_number":67,"context_line":"compute host itself, just like the libvirt driver does."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"Then `get_available_resource` should return a bare resource dictionary,"},{"line_number":70,"context_line":"which exposes zero resources, as this does not need to be taken into"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_f1b9e2ed","line":67,"in_reply_to":"bab6814e_4e680f22","updated":"2016-05-24 21:30:04.000000000","message":"Sure, until that\u0027s removed we\u0027ll need to change it though. /me adds words about it being removed from the driver API later.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":69,"context_line":"Then `get_available_resource` should return a bare resource dictionary,"},{"line_number":70,"context_line":"which exposes zero resources, as this does not need to be taken into"},{"line_number":71,"context_line":"account for scheduling. Baremetal flavors as described above will not"},{"line_number":72,"context_line":"require any resources from the compute host itself."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"The `nova hypervisor-*` commands will not work as expected for compute"},{"line_number":75,"context_line":"hosts running the ironic driver; admins should use ironic directly for"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_ae77fb00","line":72,"updated":"2016-05-24 20:51:22.000000000","message":"Correct, though technically due to limitations in the existing resource tracker, we\u0027ll need to have the Ironic virt driver continue to return a dictionary of resources from get_available_resource(). The amounts of those resources, however, will be 0. The resource tracker inside the nova-compute daemon will already understand the resource pool inventories/allocations that are associated with that nova-compute daemon and it is that resource pool which owns the baremetal node resources. The Ironic virt driver or ironic-conductor will need to call to the new placement API\u0027s resource-pool set inventory command whenever a baremetal node resource is consumed by a Nova instance, but the call to get_available_resource() will not return any \"local\" resources.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":69,"context_line":"Then `get_available_resource` should return a bare resource dictionary,"},{"line_number":70,"context_line":"which exposes zero resources, as this does not need to be taken into"},{"line_number":71,"context_line":"account for scheduling. Baremetal flavors as described above will not"},{"line_number":72,"context_line":"require any resources from the compute host itself."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"The `nova hypervisor-*` commands will not work as expected for compute"},{"line_number":75,"context_line":"hosts running the ironic driver; admins should use ironic directly for"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_31ab6a8b","line":72,"in_reply_to":"bab6814e_ae77fb00","updated":"2016-05-24 21:30:04.000000000","message":"Yep, understood, I did mean this to be more than just `{}`. I\u0027ll add the actual data structure.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"The `nova hypervisor-*` commands will not work as expected for compute"},{"line_number":75,"context_line":"hosts running the ironic driver; admins should use ironic directly for"},{"line_number":76,"context_line":"capacity monitoring."},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"Resource pool tracking"},{"line_number":79,"context_line":"----------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_8e72f70f","line":76,"updated":"2016-05-24 20:51:22.000000000","message":"Zactly correct, and this is expected and appropriate. Ironic isn\u0027t a hypervisor and so should not appear in the output of nova hypervisor-list et al.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"----------------------"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Tracking the available resources for a given pool requires updating"},{"line_number":82,"context_line":"the `total` and `reserved` fields through nova\u0027s API. Given that"},{"line_number":83,"context_line":"nodes may be added to Ironic at any time, and that nodes can be automatically"},{"line_number":84,"context_line":"taken out of the available pool at any time (e.g. when a BMC fails),"},{"line_number":85,"context_line":"manually updating these pools will be too burdensome for an operator to"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_ee5f4373","line":82,"updated":"2016-05-24 20:51:22.000000000","message":"technically this isn\u0027t *Nova*\u0027s API. :) You should replace the reference to Nova API with \"the new placement API\" since that is what we\u0027re talking about here... the soon-to-be-broken-out scheduler component.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":79,"context_line":"----------------------"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Tracking the available resources for a given pool requires updating"},{"line_number":82,"context_line":"the `total` and `reserved` fields through nova\u0027s API. Given that"},{"line_number":83,"context_line":"nodes may be added to Ironic at any time, and that nodes can be automatically"},{"line_number":84,"context_line":"taken out of the available pool at any time (e.g. when a BMC fails),"},{"line_number":85,"context_line":"manually updating these pools will be too burdensome for an operator to"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_5190ae4e","line":82,"in_reply_to":"bab6814e_ee5f4373","updated":"2016-05-24 21:30:04.000000000","message":"Done","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":88,"context_line":"Instead, ironic will be in charge of managing these pools. The"},{"line_number":89,"context_line":"ironic-conductor service will count and update the related pool when"},{"line_number":90,"context_line":"a node in that pool goes in or out of service. A spec will be written"},{"line_number":91,"context_line":"for ironic to define this work in more detail."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"The operator will still be responsible for:"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_ce623f3d","line":91,"updated":"2016-05-24 20:51:22.000000000","message":"OK, cool, the ironic-conductor will do the reserved/total updating then. ++","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d077540bea011989099731e9d3719aab371b1706","unresolved":false,"context_lines":[{"line_number":88,"context_line":"Instead, ironic will be in charge of managing these pools. The"},{"line_number":89,"context_line":"ironic-conductor service will count and update the related pool when"},{"line_number":90,"context_line":"a node in that pool goes in or out of service. A spec will be written"},{"line_number":91,"context_line":"for ironic to define this work in more detail."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"The operator will still be responsible for:"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_07664a50","line":91,"in_reply_to":"bab6814e_ce623f3d","updated":"2016-06-01 21:29:10.000000000","message":"If (err, when) we have notifications in ironic, what about having some other process listen to notifications and make the placement API calls. Or not. I have to think about it.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"73ab6700ae1dace7430b685f08f9ae2ba51a9769","unresolved":false,"context_lines":[{"line_number":91,"context_line":"for ironic to define this work in more detail."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"The operator will still be responsible for:"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* Creating the host aggregates"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* Associating the host aggregates with compute hosts"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1aa78d24_ccc2a752","line":94,"updated":"2016-07-07 14:08:40.000000000","message":"@rloo: sure. it\u0027s mentioned in the dynamic-resource-classes spec, but would be good to mention it here, too.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d077540bea011989099731e9d3719aab371b1706","unresolved":false,"context_lines":[{"line_number":91,"context_line":"for ironic to define this work in more detail."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"The operator will still be responsible for:"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"* Creating the host aggregates"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* Associating the host aggregates with compute hosts"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_2229bc8a","line":94,"updated":"2016-06-01 21:29:10.000000000","message":"do we want to mention the nova-computes that are needed?","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d077540bea011989099731e9d3719aab371b1706","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"* Associating the host aggregates with compute hosts"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"* Creating the resource pools"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* Creating the resource classes"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_027ab887","line":99,"updated":"2016-06-01 21:29:10.000000000","message":"maybe mention that this creates the association with the host aggregates (for those of us that forgot).","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* Creating the resource classes"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"* Associating the resource pools with the resource classes"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"* Associating the flavors with the resource classes"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_2e5aeb83","line":103,"updated":"2016-05-24 20:51:22.000000000","message":"This could be rephrased as \"Adding the initial inventory records for the resource pools\"","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"* Creating the resource classes"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"* Associating the resource pools with the resource classes"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"* Associating the flavors with the resource classes"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_31824a01","line":103,"in_reply_to":"bab6814e_2e5aeb83","updated":"2016-05-24 21:30:04.000000000","message":"Done","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":105,"context_line":"* Associating the flavors with the resource classes"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"These should all be one-time tasks during the initial deployment (or the"},{"line_number":108,"context_line":"addition of a new class of hardware)."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"Scheduling"},{"line_number":111,"context_line":"----------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_0e5d6779","line":108,"updated":"2016-05-24 20:51:22.000000000","message":"++ right.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"73ab6700ae1dace7430b685f08f9ae2ba51a9769","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"These should all be one-time tasks during the initial deployment (or the"},{"line_number":108,"context_line":"addition of a new class of hardware)."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"Scheduling"},{"line_number":111,"context_line":"----------"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"1aa78d24_2ca40bb8","line":109,"updated":"2016-07-07 14:08:40.000000000","message":"@rloo: Yes.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d077540bea011989099731e9d3719aab371b1706","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"These should all be one-time tasks during the initial deployment (or the"},{"line_number":108,"context_line":"addition of a new class of hardware)."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"Scheduling"},{"line_number":111,"context_line":"----------"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_6711165d","line":109,"updated":"2016-06-01 21:29:10.000000000","message":"So if someone wants HA for each resource class, they\u0027d have at least 2 nova-computes for each aggregate, right?","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":114,"context_line":"is tied to a host aggregate, which is tied to one or more compute hosts."},{"line_number":115,"context_line":"As the request will only require an item from the pool of that resource"},{"line_number":116,"context_line":"class, the scheduler will arbitrarily choose a compute host that can"},{"line_number":117,"context_line":"deploy an instance for that resource class."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"The actual choice of a node from ironic is also simple. The ironic node"},{"line_number":120,"context_line":"object will contain a new string field `resource_class`, which will be"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_6e54f353","line":117,"updated":"2016-05-24 20:51:22.000000000","message":"All correct. The scheduler would simply do a query for all compute nodes having an association to a resource pool having available amount of the requested baremetal resource class and then pick one of those nova-compute hosts to send the instance to.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d077540bea011989099731e9d3719aab371b1706","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"The actual choice of a node from ironic is also simple. The ironic node"},{"line_number":120,"context_line":"object will contain a new string field `resource_class`, which will be"},{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_82498833","line":121,"updated":"2016-06-01 21:29:10.000000000","message":"could we use tags for this? I\u0027m not sure I like having a new node field that is only used for scheduling/nova right now.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":119,"context_line":"The actual choice of a node from ironic is also simple. The ironic node"},{"line_number":120,"context_line":"object will contain a new string field `resource_class`, which will be"},{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_4e4f6fbe","line":122,"updated":"2016-05-24 20:51:22.000000000","message":"@melwitt: Dynamic resource classes eliminates the need for the *scheduler* to understand which Ironic nodes can house a particular instance. It does not, however, eliminate the need for *Ironic* itself to understand this. The goal here is for Ironic (ironic-conductor to be specific) to understand the mapping of Nova instance to Ironic node and the Ironic virt driver in Nova would call to Ironic\u0027s API to claim a node of a particular baremetal resource class for a Nova instance.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"513da257e84ecb947cd7775eab9a359103f2ba6e","unresolved":false,"context_lines":[{"line_number":119,"context_line":"The actual choice of a node from ironic is also simple. The ironic node"},{"line_number":120,"context_line":"object will contain a new string field `resource_class`, which will be"},{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_ef53c46a","line":122,"updated":"2016-05-24 19:11:08.000000000","message":"So, I had been thinking the dynamic resources classes would eliminate the need to query ironic for matching nodes. I thought the Ironic driver would pull availability periodically and populate available resources in generic resource pools so that Nova scheduler could schedule upon them without additional querying of Ironic. I\u0027d like to get Jay\u0027s thoughts on it as I might be misunderstanding something here.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9ec704814f2ce65af95c38f6bd6b2269f642389f","unresolved":false,"context_lines":[{"line_number":119,"context_line":"The actual choice of a node from ironic is also simple. The ironic node"},{"line_number":120,"context_line":"object will contain a new string field `resource_class`, which will be"},{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_34379800","line":122,"in_reply_to":"bab6814e_07618fa8","updated":"2016-05-25 21:35:04.000000000","message":"Gotcha, thank you.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"14241bc842c24c503f069b6039f283b09ae00d52","unresolved":false,"context_lines":[{"line_number":119,"context_line":"The actual choice of a node from ironic is also simple. The ironic node"},{"line_number":120,"context_line":"object will contain a new string field `resource_class`, which will be"},{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_8083adcb","line":122,"in_reply_to":"bab6814e_4e4f6fbe","updated":"2016-05-25 16:49:39.000000000","message":"Okay, I guess I kept thinking that Nova could see the Ironic node list and choose one that matched. But Nova can only see resource classes, not as fine-grained as a node.\n\nIn that case, why isn\u0027t it just one call to Ironic to say \"claim a node with resource class X\" and Ironic responds with the claimed node, or something like that? Why do two steps of getting a node list and then claiming one?\n\nOverall, I had been thinking Nova scheduler does its thing, taking care of affinity etc and then at the end of that, it calls Ironic to say \"claim a node\" and didn\u0027t get how pulling the list of nodes is needed.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"f79ddcdef76cebbe30ff97553ae6382709264ea1","unresolved":false,"context_lines":[{"line_number":119,"context_line":"The actual choice of a node from ironic is also simple. The ironic node"},{"line_number":120,"context_line":"object will contain a new string field `resource_class`, which will be"},{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_07618fa8","line":122,"in_reply_to":"bab6814e_8083adcb","updated":"2016-05-25 18:24:25.000000000","message":"Right, so as a first pass I was hoping to just add a field to ironic\u0027s node object and not have to claim it before deploying. The race opportunity here should be fairly small, and later if/when ironic has a claims endpoint we can optimize with that.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"This will return a list of matching nodes. If the available count for"},{"line_number":127,"context_line":"the resource pool is tracked correctly (and race conditions aside), we"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_ae4edbbe","line":124,"updated":"2016-05-24 20:51:22.000000000","message":"s/resource_type/resource_class/?","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"f79ddcdef76cebbe30ff97553ae6382709264ea1","unresolved":false,"context_lines":[{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"This will return a list of matching nodes. If the available count for"},{"line_number":127,"context_line":"the resource pool is tracked correctly (and race conditions aside), we"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_e7628bd7","line":124,"in_reply_to":"bab6814e_91a85679","updated":"2016-05-25 18:24:25.000000000","message":"Reading this again, I see I have resource_class above, so you\u0027re just strictly right.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"This will return a list of matching nodes. If the available count for"},{"line_number":127,"context_line":"the resource pool is tracked correctly (and race conditions aside), we"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_91a85679","line":124,"in_reply_to":"bab6814e_ae4edbbe","updated":"2016-05-24 21:30:04.000000000","message":"Sure, naming is hard, I guess that works. It\u0027ll be whatever the ironic team decides on (maybe with another name it\u0027s useful without nova as well?)","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d077540bea011989099731e9d3719aab371b1706","unresolved":false,"context_lines":[{"line_number":121,"context_line":"matched against the name of the resource class being requested. The"},{"line_number":122,"context_line":"driver\u0027s spawn() method will query ironic for matching nodes::"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"  GET /v1/nodes?resource_type\u003dIRON_BASE"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"This will return a list of matching nodes. If the available count for"},{"line_number":127,"context_line":"the resource pool is tracked correctly (and race conditions aside), we"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_c2a710a5","line":124,"in_reply_to":"bab6814e_e7628bd7","updated":"2016-06-01 21:29:10.000000000","message":"Do we want to constrain it to get only the *available* nodes of that resource class? Or do we need all the nodes?","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":128,"context_line":"can assume there will always be at least one node in this list. But,"},{"line_number":129,"context_line":"because there is time between the scheduler forwarding this request and"},{"line_number":130,"context_line":"doing the deployment, we\u0027ll need to handle the case where this returns"},{"line_number":131,"context_line":"no free nodes by bubbling an exception back up to the scheduler."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"A node will be chosen randomly from this list and deployed to, as the"},{"line_number":134,"context_line":"spawn method already does today."}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_8e4957ba","line":131,"updated":"2016-05-24 20:51:22.000000000","message":"Correct. This exception already exists and is called ComputeResourcesUnavailable:\n\nhttps://github.com/openstack/nova/blob/master/nova/exception.py#L494\n\nWe should probably change that to ResourcesUnavailable or similar and not have it inherit from ServiceUnavailable, since resources capacity and service availability are unrelated.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":128,"context_line":"can assume there will always be at least one node in this list. But,"},{"line_number":129,"context_line":"because there is time between the scheduler forwarding this request and"},{"line_number":130,"context_line":"doing the deployment, we\u0027ll need to handle the case where this returns"},{"line_number":131,"context_line":"no free nodes by bubbling an exception back up to the scheduler."},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"A node will be chosen randomly from this list and deployed to, as the"},{"line_number":134,"context_line":"spawn method already does today."}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_11b3c6ea","line":131,"in_reply_to":"bab6814e_8e4957ba","updated":"2016-05-24 21:30:04.000000000","message":"/me adds specifics","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"73ab6700ae1dace7430b685f08f9ae2ba51a9769","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1aa78d24_0ca78fbd","line":138,"updated":"2016-07-07 14:08:40.000000000","message":"@melwitt: I think I see where your confusion is coming from. OK, here\u0027s the deal :) The thing that the Nova scheduler is selecting is *always* the nova-compute worker. It\u0027s not the Ironic node. The Ironic virt driver is responsible for selecting which Ironic node a Nova instance should get spawned on, exactly like the libvirt virt driver is responsible for selecting which vCPU a Nova instance \"gets\" (yes, I am aware that a QEMU \"vCPU\" is simply an operating system process running qemu-kvm, but bear with me on the analogy here).\n\nThe nova-compute worker is associated with one or more aggregates which in turn are associated with one or more resource providers that provide some amount of baremetal node flavor. Affinity and capability information is associated with the aggregates, and the scheduler can do a two-step selection. Step #1 is to select the nova-compute worker that meets the affinity/capability requirements by looking at the aggregate associated with the nova-compute worker. In step[ #2, the scheduler can select the set of nova-compute workers that meet the quantitative requirements (i.e. has an amount of baremetal nodes of the requested baremetal node flavor) by looking at the resource providers that are associated with the aggregates selected in that first step that have an amount of available nodes of that requested baremetal node flavor.\n\nWhat the Ironic virt driver will need to do is understand which subset of baremetal nodes that it manages. It doesn\u0027t need to re-perform the placement query that the nova-scheduler does. It merely needs to ensure that the set of baremetal nodes that it manages matches the set of baremetal node resource class amounts that are represented by the resource providers modeling in the scheduler. As long as that set is the same, the Ironic virt driver need only just pick a random node from that set to satisfy the launch request.\n\nYes, that will require Ironic operators to use Nova aggregates and resource providers (pools) for dividing up their deployment (like you mention). However, we are trying very hard to move away from having Nova store Ironic node IDs because that information isn\u0027t germane to Nova; it\u0027s germane to Ironic only. The whole mess of (compute_host, ironic_nodename) coupling in the Nova resource tracker is what we\u0027re trying to extricate from Nova.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_eec62315","line":138,"updated":"2016-05-24 20:51:22.000000000","message":"We can handle affinity and capabilities by associating that information to a host aggregate and having separate resource pools for different aggregates. Then, the scheduler (new placement API) would select an aggregate that had available baremetal resources that also had some capabilities or affinity information associated to the host aggregate the resource pool was associated with.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1b807f541a23c31ef29300e8ea99df12d868f34e","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_3b676bea","line":138,"in_reply_to":"9abb7d3a_c412c508","updated":"2016-05-31 19:47:15.000000000","message":"I guess what I\u0027m trying to say is if we don\u0027t essentially have the ability to select an Ironic node on the Nova side, operators will have to do separate node tagging/organization in Ironic to separate nodes into different pools for affinity.\n\nI had hoped with the resource pools work we could keep all of the topology definition in Nova but I keep seeing a requirement for topology definition also in Ironic in the various specs. And by topology definition in Ironic I mean an operator having to divide up nodes using the Ironic API by giving them tags resource_class\u003d\"Zone A\" resource_class\u003d\"Zone B\", for example. Not only will an operator associate pools with aggregates in Nova, they will also associate nodes with resource classes in Ironic that essentially map to the aggregates in Nova. Example: Operator wants two availabilty zones. In Nova, for Zone A, they will create a resource pool A, associate it with aggregate A, give it availability zone A, associate it with resource class A. Repeat for Zone B. Then in Ironic they will tag half the nodes with resource_class\u003d\"A\" and resource_class\u003d\"B\" (if the topology is half Zone A and half Zone B).\n\nI hope that makes sense.\n\nI don\u0027t intend to suggest adding to the Ironic node (in Ironic). If anything, I was suggesting if we had Ironic node IDs on the Nova side, as part of the InventoryList, we could select a node ID inside the Ironic driver and keep 100% of the affinity management in Nova. That is, no tagging of Ironic nodes in Ironic would be needed.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"8f78b1cf9e7dcdb05826bbdc36dd2288cbf14d3b","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_c412c508","line":138,"in_reply_to":"bab6814e_67de9112","updated":"2016-05-31 16:20:23.000000000","message":"@melwitt, well, I don\u0027t see much difference described in your second paragraph here. It\u0027s essentially what we\u0027re doing. In this spec, the list of UUIDs for a given pool that you describe is::\n\n    SELECT uuid FROM nodes WHERE resource_class\u003dfoo;\n\nWe need some way to associate the resource pool with the set of nodes that belong to that pool. What are you suggesting we use instead of resource_class? (Maybe a combination of resource_class and availability_zone, both on the ironic node?)","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_f1ed628f","line":138,"in_reply_to":"bab6814e_eec62315","updated":"2016-05-24 21:30:04.000000000","message":"My concern is capabilities that are passed to ironic for additional node configuration. I need to double check if that\u0027s a thing or not.\n\nMaybe one solution here is to allow multiple values for node.resource_class, such that a single node can be associated with multiple resource pools if it can satisfy either.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"6d1e404dbce207445bbd1a499b68af17babbb47e","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_67de9112","line":138,"in_reply_to":"bab6814e_eec62315","updated":"2016-05-26 00:18:28.000000000","message":"The thing is at the end of the scheduler selection, what are we selecting and how do we tell Ironic what we want it to return us for a node? The idea in this spec is to query ironic for nodes that match a resource class. That means in an affinity scenario two nodes of the same config would have to have different resource classes. Example, \"provision an instance of config IRON_NFV in availability zone US-West.\" That means we would have to have two resource classes IRON_NFV-US-WEST and IRON_NFV-US-EAST that are really the same \"flavor.\"\n\nThat\u0027s why I had kept thinking that a generic resource pool would contain essentially a list of resources (where in the Ironic case resource \u003d\u003d node, genericized) complete with UUIDs (that Ironic controls since it\u0027s reporting its resources to Nova) so that Nova scheduler would end up picking a compute node in charge of the right resource pool, and then a UUID is picked at random out of that pool by the Ironic virt driver, and Ironic is called with \"provision node with this UUID.\" That way operators don\u0027t have to replicate the idea of availability zones on the Ironic side by deliberately tagging portions of their nodes with different resource classes to handle affinity.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"11e2b08c37ef3478f507095d43218db45a4f2a62","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_f7e8b218","line":138,"in_reply_to":"bab6814e_eec62315","updated":"2016-05-24 22:05:17.000000000","message":"We\u0027re also trying to separate out the qualitative parts of a request so that you won\u0027t need a flavor for each combination. First pass is here: https://review.openstack.org/#/c/313784/","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"93aea345b7037d4a4ba6b5b682d29687540c2d58","unresolved":false,"context_lines":[{"line_number":135,"context_line":""},{"line_number":136,"context_line":"TODO(jroll) this is where people ask about capabilities and affinity;"},{"line_number":137,"context_line":"how do we handle this without forcing a difference resource class for each"},{"line_number":138,"context_line":"of them?"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_8eacee8d","line":138,"in_reply_to":"bab6814e_f1ed628f","updated":"2016-06-02 10:37:14.000000000","message":"@Jim, yes, capabilities are passed for additional node configuration. E.g, booting in BIOS or UEFI[0], configure the instance to boot from local boot or network [1], force a specific partition table type (gpt or mbr) [2].\n\n[0] http://docs.openstack.org/developer/ironic/deploy/install-guide.html#boot-mode-support\n\n[1] http://docs.openstack.org/developer/ironic/deploy/install-guide.html#enabling-local-boot-with-compute-service\n\n[2] http://docs.openstack.org/developer/ironic/deploy/install-guide.html#when-used-with-compute-service","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"b23289060fe87261f1c230fc38a0db58a9dcc302","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"This should improve performance a bit. Currently the resource tracker is"},{"line_number":180,"context_line":"responsible for every node in an Ironic deployment. This will make that group"},{"line_number":181,"context_line":"smaller and improve the performance of the resource tracker loop."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Other deployer impact"},{"line_number":184,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9abb7d3a_18e7a4e5","line":181,"updated":"2016-05-27 10:09:32.000000000","message":"Might want to change this too, as resource tracker will be reporting all 0s.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":184,"context_line":"---------------------"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"A version of Ironic that supports resource pool tracking must be deployed"},{"line_number":187,"context_line":"before a version of Nova with this change is deployed. Ironic must also be"},{"line_number":188,"context_line":"seeded with values for the `resource_class` field for each node. If this is not"},{"line_number":189,"context_line":"the case, the previous behavior should be used. We\u0027ll need to properly"},{"line_number":190,"context_line":"deprecate the old behavior behind a config option, as deployers will need to"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_cec99f27","line":187,"updated":"2016-05-24 20:51:22.000000000","message":"I think you mean a version of *Nova* that understands resource pool tracking must be deployed before a version of Ironic :) Otherwise, Ironic will call a resource pool API that doesn\u0027t yet exist in Nova/broken-out-placement-API-endpoint.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"11e2b08c37ef3478f507095d43218db45a4f2a62","unresolved":false,"context_lines":[{"line_number":184,"context_line":"---------------------"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"A version of Ironic that supports resource pool tracking must be deployed"},{"line_number":187,"context_line":"before a version of Nova with this change is deployed. Ironic must also be"},{"line_number":188,"context_line":"seeded with values for the `resource_class` field for each node. If this is not"},{"line_number":189,"context_line":"the case, the previous behavior should be used. We\u0027ll need to properly"},{"line_number":190,"context_line":"deprecate the old behavior behind a config option, as deployers will need to"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_b7558ac7","line":187,"in_reply_to":"bab6814e_cec99f27","updated":"2016-05-24 22:05:17.000000000","message":"I think he meant that before Nova can rely on Ironic to handle the node selection, it needs a newer Ironic. Support for resource pools is probably already assumed to be present.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":184,"context_line":"---------------------"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"A version of Ironic that supports resource pool tracking must be deployed"},{"line_number":187,"context_line":"before a version of Nova with this change is deployed. Ironic must also be"},{"line_number":188,"context_line":"seeded with values for the `resource_class` field for each node. If this is not"},{"line_number":189,"context_line":"the case, the previous behavior should be used. We\u0027ll need to properly"},{"line_number":190,"context_line":"deprecate the old behavior behind a config option, as deployers will need to"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_5caa85d3","line":187,"in_reply_to":"bab6814e_cec99f27","updated":"2016-05-24 21:30:04.000000000","message":"Twice now I\u0027ve closed gerrit trying to delete a word with ^w...........\n\nWe always upgrade ironic first because it\u0027s downstream from nova (and even go as far as to hardcode the ironic microversion in nova code).\n\nThe best way I see to do this is have ironic ignore 404s when doing the pool updates (which it will need to do for invalid resource_class anyway, I think).\n\nThis is going to be an onerous upgrade, I\u0027ll actually lay out the process here. :(","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f4f9880916a6b4ea9abe56ac46cd11fb05ce05d3","unresolved":false,"context_lines":[{"line_number":191,"context_line":"configure different scheduler filters and host managers than the current"},{"line_number":192,"context_line":"recommendation for this to work correctly. We should investigate if this can be"},{"line_number":193,"context_line":"done gracefully without a new config option, however I\u0027m not sure it\u0027s"},{"line_number":194,"context_line":"possible."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"Developer impact"},{"line_number":197,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_2ed14bce","line":194,"updated":"2016-05-24 20:51:22.000000000","message":"How does Ironic *currently* expose different node/hardware configurations? Is there some model in Ironic for this yet?","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"73ab6700ae1dace7430b685f08f9ae2ba51a9769","unresolved":false,"context_lines":[{"line_number":191,"context_line":"configure different scheduler filters and host managers than the current"},{"line_number":192,"context_line":"recommendation for this to work correctly. We should investigate if this can be"},{"line_number":193,"context_line":"done gracefully without a new config option, however I\u0027m not sure it\u0027s"},{"line_number":194,"context_line":"possible."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"Developer impact"},{"line_number":197,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"1aa78d24_6caa9386","line":194,"updated":"2016-07-07 14:08:40.000000000","message":"Yeah, I think Ironic will need some sort of node configuration class/type.","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"52e126ef5be27272f296edc91af3d3800d0ff6e0","unresolved":false,"context_lines":[{"line_number":191,"context_line":"configure different scheduler filters and host managers than the current"},{"line_number":192,"context_line":"recommendation for this to work correctly. We should investigate if this can be"},{"line_number":193,"context_line":"done gracefully without a new config option, however I\u0027m not sure it\u0027s"},{"line_number":194,"context_line":"possible."},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"Developer impact"},{"line_number":197,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"bab6814e_5c91e599","line":194,"in_reply_to":"bab6814e_2ed14bce","updated":"2016-05-24 21:30:04.000000000","message":"node.properties[\u0027key\u0027] where \u0027key\u0027 is \u0027cpus\u0027, \u0027memory_mb\u0027, etc. Is there something I should add here that would be helpful?\n\n(There\u0027s no class/flavor like model, if that\u0027s your question)","commit_id":"03907dedf5547a1bf9251ec05dc236b45bdbe8dc"}]}
