)]}'
{"specs/stein/approved/alloc-candidates-negative-member-of.rst":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"3c1e43c4d89d1b8e5365686af781e2cf0da4d43a","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Support filtering by forbidden aggregate membership"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/alloc-candidates-negative-member-of"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This blueprint proposes to support for negative filtering by the underlying"},{"line_number":14,"context_line":"resource provider\u0027s membership."}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_23934d50","line":11,"range":{"start_line":11,"start_character":44,"end_line":11,"end_character":61},"updated":"2018-09-18 16:10:51.000000000","message":"might be worth removing the alloc-candidates- prefix from this blueprint and also doing the corresponding GET /resource_providers?member_of\u003d!$AGG_UUID functionality?","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"b1f0b905535377ccb821350385a9dc98432af588","unresolved":false,"context_lines":[{"line_number":8,"context_line":"Support filtering by forbidden aggregate membership"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/alloc-candidates-negative-member-of"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This blueprint proposes to support for negative filtering by the underlying"},{"line_number":14,"context_line":"resource provider\u0027s membership."}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_c966332a","line":11,"range":{"start_line":11,"start_character":44,"end_line":11,"end_character":61},"in_reply_to":"3f79a3b5_23934d50","updated":"2018-09-19 00:03:35.000000000","message":"Good point. Renamed this bp to \"negative-aggregate-membership\".","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7312af82af7206f33f07c77a50dfaea527f4efc2","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Problem description"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Nova currently supports ``member_of`` query parameters for the"},{"line_number":20,"context_line":"``GET /resource_providers`` and ``GET /allocation_candidates`` endpoints."},{"line_number":21,"context_line":"This parameter is either \"a string representing an aggregate uuid\" or \"the"},{"line_number":22,"context_line":"prefix ``in:`` followed by a comma-separated list of strings representing"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_99b2d049","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":4},"updated":"2018-09-18 18:01:25.000000000","message":"Placement","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"b1f0b905535377ccb821350385a9dc98432af588","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Problem description"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Nova currently supports ``member_of`` query parameters for the"},{"line_number":20,"context_line":"``GET /resource_providers`` and ``GET /allocation_candidates`` endpoints."},{"line_number":21,"context_line":"This parameter is either \"a string representing an aggregate uuid\" or \"the"},{"line_number":22,"context_line":"prefix ``in:`` followed by a comma-separated list of strings representing"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_94084e27","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":4},"in_reply_to":"3f79a3b5_99b2d049","updated":"2018-09-19 00:03:35.000000000","message":"Done","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"3c1e43c4d89d1b8e5365686af781e2cf0da4d43a","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"Reservation projects like blazar would like to have its own aggregate for"},{"line_number":56,"context_line":"host reservation in order to have consumers without any reservations to be"},{"line_number":57,"context_line":"scheduled to out of the aggregate in order to save the reserved resources."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Proposed change"},{"line_number":60,"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":2,"id":"3f79a3b5_e3923558","line":57,"range":{"start_line":57,"start_character":10,"end_line":57,"end_character":19},"updated":"2018-09-18 16:10:51.000000000","message":"s/to out of the/outside of that/","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"b1f0b905535377ccb821350385a9dc98432af588","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"Reservation projects like blazar would like to have its own aggregate for"},{"line_number":56,"context_line":"host reservation in order to have consumers without any reservations to be"},{"line_number":57,"context_line":"scheduled to out of the aggregate in order to save the reserved resources."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Proposed change"},{"line_number":60,"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":2,"id":"3f79a3b5_34113a54","line":57,"range":{"start_line":57,"start_character":10,"end_line":57,"end_character":19},"in_reply_to":"3f79a3b5_e3923558","updated":"2018-09-19 00:03:35.000000000","message":"Done","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"3c1e43c4d89d1b8e5365686af781e2cf0da4d43a","unresolved":false,"context_lines":[{"line_number":89,"context_line":"-------------------------"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"For nested resource providers, an aggregate on a root provider automatically"},{"line_number":92,"context_line":"span the whole tree. When a root provider is in forbidden aggregates, the child"},{"line_number":93,"context_line":"providers can\u0027t be a candidate even if the child provider belongs to no"},{"line_number":94,"context_line":"(or another different) aggregate."},{"line_number":95,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_c3a3799a","line":92,"range":{"start_line":92,"start_character":0,"end_line":92,"end_character":4},"updated":"2018-09-18 16:10:51.000000000","message":"spans","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"b1f0b905535377ccb821350385a9dc98432af588","unresolved":false,"context_lines":[{"line_number":89,"context_line":"-------------------------"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"For nested resource providers, an aggregate on a root provider automatically"},{"line_number":92,"context_line":"span the whole tree. When a root provider is in forbidden aggregates, the child"},{"line_number":93,"context_line":"providers can\u0027t be a candidate even if the child provider belongs to no"},{"line_number":94,"context_line":"(or another different) aggregate."},{"line_number":95,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_540e3632","line":92,"range":{"start_line":92,"start_character":0,"end_line":92,"end_character":4},"in_reply_to":"3f79a3b5_c3a3799a","updated":"2018-09-19 00:03:35.000000000","message":"Done","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7312af82af7206f33f07c77a50dfaea527f4efc2","unresolved":false,"context_lines":[{"line_number":91,"context_line":"For nested resource providers, an aggregate on a root provider automatically"},{"line_number":92,"context_line":"span the whole tree. When a root provider is in forbidden aggregates, the child"},{"line_number":93,"context_line":"providers can\u0027t be a candidate even if the child provider belongs to no"},{"line_number":94,"context_line":"(or another different) aggregate."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"In the following environments, for example,"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_d9712879","line":94,"updated":"2018-09-18 18:01:25.000000000","message":"This reads as \"exclude children if the root is in a forbidden aggregate\", but the reverse is also true. It should be stated more generally: \"When *any* provider in a tree is a member of a forbidden aggregate, *no* member of that tree will be considered as a candidate.\"","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"034ab6655b5ee8142ae3edebbc269d39598ce275","unresolved":false,"context_lines":[{"line_number":91,"context_line":"For nested resource providers, an aggregate on a root provider automatically"},{"line_number":92,"context_line":"span the whole tree. When a root provider is in forbidden aggregates, the child"},{"line_number":93,"context_line":"providers can\u0027t be a candidate even if the child provider belongs to no"},{"line_number":94,"context_line":"(or another different) aggregate."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"In the following environments, for example,"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_1a130f03","line":94,"in_reply_to":"3f79a3b5_b4a3119b","updated":"2018-09-18 19:08:05.000000000","message":"I remember the PTG discussion differently, so I guess we need to settle on that, and make both behaviors match.\n\n[Later] Okay, see below.","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ed4dfd279266c902ba3d63b630847e1541696503","unresolved":false,"context_lines":[{"line_number":91,"context_line":"For nested resource providers, an aggregate on a root provider automatically"},{"line_number":92,"context_line":"span the whole tree. When a root provider is in forbidden aggregates, the child"},{"line_number":93,"context_line":"providers can\u0027t be a candidate even if the child provider belongs to no"},{"line_number":94,"context_line":"(or another different) aggregate."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"In the following environments, for example,"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_b4a3119b","line":94,"in_reply_to":"3f79a3b5_d9712879","updated":"2018-09-18 18:09:12.000000000","message":"I thought we agreed at the PTG that we were changing the default behaviour of member_of for the non-numbered request group to be \"The root provider is associated with these aggregates\"?\n\nI don\u0027t remember agreeing with changing the default behaviour of the member_of for the non-numbered request group to be \"The root provider or any provider ID of any child in the tree is associated with these aggregates\".\n\nThe reverse of the former is exactly what Tetsuro has put here, which is that the root provider ID shall not be associated with any of the aggregates in the \"negative member_of\".","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7312af82af7206f33f07c77a50dfaea527f4efc2","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"* ``member_of\u003d!\u003caggA\u003e`` excludes \"cn1\", \"numa1_1\" and \"numa1_2\"."},{"line_number":125,"context_line":"* ``member_of\u003d!\u003caggB\u003e`` excludes \"cn2\", \"numa2_1\", \"numa2_2\", and \"ss1\"."},{"line_number":126,"context_line":"* ``member_of\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Note that this spanning doesn\u0027t happen on numbered ``member_of`` parameters,"},{"line_number":129,"context_line":"which is used for the granular request:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_b96eac61","line":126,"range":{"start_line":126,"start_character":0,"end_line":126,"end_character":53},"updated":"2018-09-18 18:01:25.000000000","message":"Oh, see, I think this is wrong - it should exclude cn1, numa1_1, numa1_2, and ss2.\n\nMaybe we\u0027ve had a disconnect in understanding here. But I think making the behavior more general is logically closer what you\u0027ve implemented here [1].\n\nJay?\n\n[1] https://review.openstack.org/#/c/602639/1/placement/objects/resource_provider.py","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"034ab6655b5ee8142ae3edebbc269d39598ce275","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"* ``member_of\u003d!\u003caggA\u003e`` excludes \"cn1\", \"numa1_1\" and \"numa1_2\"."},{"line_number":125,"context_line":"* ``member_of\u003d!\u003caggB\u003e`` excludes \"cn2\", \"numa2_1\", \"numa2_2\", and \"ss1\"."},{"line_number":126,"context_line":"* ``member_of\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Note that this spanning doesn\u0027t happen on numbered ``member_of`` parameters,"},{"line_number":129,"context_line":"which is used for the granular request:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_faead3d6","line":126,"range":{"start_line":126,"start_character":0,"end_line":126,"end_character":53},"in_reply_to":"3f79a3b5_b96eac61","updated":"2018-09-18 19:08:05.000000000","message":"I misread that patch the first time around. I agree that what it\u0027s doing corresponds to what\u0027s written here. I\u0027m just not sure that\u0027s what we want.\n\n[Later] Okay, I thought it through some more and I whereas I\u0027m not totally convinced it\u0027s the right approach, if we\u0027re going to go that way, it needs to be more clearly described. Will comment accordingly.","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"b1f0b905535377ccb821350385a9dc98432af588","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"* ``member_of\u003d!\u003caggA\u003e`` excludes \"cn1\", \"numa1_1\" and \"numa1_2\"."},{"line_number":125,"context_line":"* ``member_of\u003d!\u003caggB\u003e`` excludes \"cn2\", \"numa2_1\", \"numa2_2\", and \"ss1\"."},{"line_number":126,"context_line":"* ``member_of\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Note that this spanning doesn\u0027t happen on numbered ``member_of`` parameters,"},{"line_number":129,"context_line":"which is used for the granular request:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_b44b0a5d","line":126,"range":{"start_line":126,"start_character":0,"end_line":126,"end_character":53},"in_reply_to":"3f79a3b5_faead3d6","updated":"2018-09-19 00:03:35.000000000","message":"Yes, this is at least consistent with that bug fix I have submitted, and I think this way gives us more sensitive control on resource aggregates. I\u0027m totally agreed that it should be well documented.","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"3c1e43c4d89d1b8e5365686af781e2cf0da4d43a","unresolved":false,"context_lines":[{"line_number":126,"context_line":"* ``member_of\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Note that this spanning doesn\u0027t happen on numbered ``member_of`` parameters,"},{"line_number":129,"context_line":"which is used for the granular request:"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggA\u003e`` excludes \"cn1\""},{"line_number":132,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggB\u003e`` excludes \"cn2\" and \"ss1\""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_03c73147","line":129,"updated":"2018-09-18 16:10:51.000000000","message":"++","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"3c1e43c4d89d1b8e5365686af781e2cf0da4d43a","unresolved":false,"context_lines":[{"line_number":172,"context_line":"------------------"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"Queries to the database will see a moderate increase in complexity but existing"},{"line_number":175,"context_line":"table indexes should handle this with aplomb."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"Other deployer impact"},{"line_number":178,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_43e689e9","line":175,"range":{"start_line":175,"start_character":13,"end_line":175,"end_character":45},"updated":"2018-09-18 16:10:51.000000000","message":"Impressive and correct use of the word \"aplomb\", Tetsuro! :)","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7312af82af7206f33f07c77a50dfaea527f4efc2","unresolved":false,"context_lines":[{"line_number":172,"context_line":"------------------"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"Queries to the database will see a moderate increase in complexity but existing"},{"line_number":175,"context_line":"table indexes should handle this with aplomb."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"Other deployer impact"},{"line_number":178,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_542cfd48","line":175,"range":{"start_line":175,"start_character":13,"end_line":175,"end_character":45},"in_reply_to":"3f79a3b5_43e689e9","updated":"2018-09-18 18:01:25.000000000","message":"I smell a cdent...\n\nhttps://review.openstack.org/#/c/548915/4/specs/rocky/approved/placement-forbidden-traits.rst@149","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"b1f0b905535377ccb821350385a9dc98432af588","unresolved":false,"context_lines":[{"line_number":172,"context_line":"------------------"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"Queries to the database will see a moderate increase in complexity but existing"},{"line_number":175,"context_line":"table indexes should handle this with aplomb."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"Other deployer impact"},{"line_number":178,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_2972477d","line":175,"range":{"start_line":175,"start_character":13,"end_line":175,"end_character":45},"in_reply_to":"3f79a3b5_542cfd48","updated":"2018-09-19 00:03:35.000000000","message":"Well, good nose, detective Eric. Let me apologize to Jay and thank to Chris :)","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"63a5a8688a1ffe17b53302521ad2ffc85aa3228e","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"   * Nova translates it to ``member_of\u003d!\u003cblazar_agg\u003e`` passing it to placement"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"Note that the translation of the reservation id is out of the scope of this spec."},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"Developer impact"},{"line_number":202,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_832ee1f7","line":199,"updated":"2018-09-18 16:12:17.000000000","message":"meh, pep8 is complaining about this line being too long:\n\nspecs/stein/approved/alloc-candidates-negative-member-of.rst:199: Line limited to a maximum of 79 characters.","commit_id":"58edd85c391fbed4c3bdb7af02a50e459b0a3f6d"}],"specs/stein/approved/negative-aggregate-membership.rst":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7c8a7055b8e3f696f85c6868749dbf10e13700c8","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/negative-aggregate-membership"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This blueprint proposes to support for negative filtering by the underlying"},{"line_number":14,"context_line":"resource provider\u0027s membership."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Problem description"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_15548afd","line":14,"range":{"start_line":14,"start_character":20,"end_line":14,"end_character":30},"updated":"2018-09-27 13:11:04.000000000","message":"If you want to be super-pedantic make \"aggregate membership\" (yes it is right above, but I did say \"super pedantic\")","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"554520713aa15f5d67ec5e79e49bfb3017593b47","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/nova/+spec/negative-aggregate-membership"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This blueprint proposes to support for negative filtering by the underlying"},{"line_number":14,"context_line":"resource provider\u0027s membership."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Problem description"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_67c1952f","line":14,"range":{"start_line":14,"start_character":20,"end_line":14,"end_character":30},"in_reply_to":"3f79a3b5_15548afd","updated":"2018-10-10 06:38:12.000000000","message":"Done","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7c8a7055b8e3f696f85c6868749dbf10e13700c8","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"would translate logically to:"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"  Candidate resource providers should be in either agg1 or agg2, but definitely"},{"line_number":80,"context_line":"  in agg3 and definitely *not* in agg4."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Note that we don\u0027t support ``!`` in the ``in:`` prefix:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_5598c2ca","line":79,"range":{"start_line":79,"start_character":31,"end_line":79,"end_character":50},"updated":"2018-09-27 13:11:04.000000000","message":"must be in at least one of","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7c8a7055b8e3f696f85c6868749dbf10e13700c8","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"would translate logically to:"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"  Candidate resource providers should be in either agg1 or agg2, but definitely"},{"line_number":80,"context_line":"  in agg3 and definitely *not* in agg4."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Note that we don\u0027t support ``!`` in the ``in:`` prefix:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_759b7ec7","line":79,"range":{"start_line":79,"start_character":65,"end_line":79,"end_character":68},"updated":"2018-09-27 13:11:04.000000000","message":"remove \"but\"","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"554520713aa15f5d67ec5e79e49bfb3017593b47","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"would translate logically to:"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"  Candidate resource providers should be in either agg1 or agg2, but definitely"},{"line_number":80,"context_line":"  in agg3 and definitely *not* in agg4."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Note that we don\u0027t support ``!`` in the ``in:`` prefix:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_87bcf1b5","line":79,"range":{"start_line":79,"start_character":31,"end_line":79,"end_character":50},"in_reply_to":"3f79a3b5_5598c2ca","updated":"2018-10-10 06:38:12.000000000","message":"Done","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"06a009649420d8b11d417c1d755d51586201bc9d","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"* ``member_of\u003d!\u003caggA\u003e`` excludes \"cn1\", \"numa1_1\" and \"numa1_2\"."},{"line_number":125,"context_line":"* ``member_of\u003d!\u003caggB\u003e`` excludes \"cn2\", \"numa2_1\", \"numa2_2\", and \"ss1\"."},{"line_number":126,"context_line":"* ``member_of\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"Note that this spanning doesn\u0027t happen on numbered ``member_of`` parameters,"},{"line_number":129,"context_line":"which is used for the granular request:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_07ab0188","line":126,"updated":"2018-09-27 13:59:38.000000000","message":"✓","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"06a009649420d8b11d417c1d755d51586201bc9d","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggA\u003e`` excludes \"cn1\""},{"line_number":132,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggB\u003e`` excludes \"cn2\" and \"ss1\""},{"line_number":133,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"See `granular-resource-request`_ spec for details."},{"line_number":136,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_c78c293b","line":133,"updated":"2018-09-27 13:59:38.000000000","message":"✓","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"078992f36427214c368957841f813e2d9e40d5f4","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"See `granular-resource-request`_ spec for details."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"Alternatives"},{"line_number":138,"context_line":"------------"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"We can create nova scheduler filters to do post-processing of compute hosts"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_71e03d28","line":137,"updated":"2018-09-29 20:09:19.000000000","message":"Why wouldn\u0027t traits work for this?","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"554520713aa15f5d67ec5e79e49bfb3017593b47","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"See `granular-resource-request`_ spec for details."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"Alternatives"},{"line_number":138,"context_line":"------------"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"We can create nova scheduler filters to do post-processing of compute hosts"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_e73cc593","line":137,"in_reply_to":"3f79a3b5_71e03d28","updated":"2018-10-10 06:38:12.000000000","message":"Because we don\u0027t want to use traits for grouping hosts or for non-capability things. Because aggregate is for that purpose, let\u0027s use it. Addressed that on this section.","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"078992f36427214c368957841f813e2d9e40d5f4","unresolved":false,"context_lines":[{"line_number":137,"context_line":"Alternatives"},{"line_number":138,"context_line":"------------"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"We can create nova scheduler filters to do post-processing of compute hosts"},{"line_number":141,"context_line":"by looking at host aggregate relationships. However, this is inefficient."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_51ec2128","line":140,"updated":"2018-09-29 20:09:19.000000000","message":"Isn\u0027t this what blazar already does today?","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"554520713aa15f5d67ec5e79e49bfb3017593b47","unresolved":false,"context_lines":[{"line_number":137,"context_line":"Alternatives"},{"line_number":138,"context_line":"------------"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"We can create nova scheduler filters to do post-processing of compute hosts"},{"line_number":141,"context_line":"by looking at host aggregate relationships. However, this is inefficient."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"Data model impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_22b16002","line":140,"in_reply_to":"3f79a3b5_51ec2128","updated":"2018-10-10 06:38:12.000000000","message":"Right. Addressed in the spec.","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"078992f36427214c368957841f813e2d9e40d5f4","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"1. User uses blazar to create reservation id"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"   * Blazar picks up a host in blazar\u0027s aggregate"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"   * Blazar creates an aggregate whose uuid is the reservation uuid"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_11f22906","line":187,"updated":"2018-09-29 20:09:19.000000000","message":"Does blazar pick a specific host from the blazar reservation pool?","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"554520713aa15f5d67ec5e79e49bfb3017593b47","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"1. User uses blazar to create reservation id"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"   * Blazar picks up a host in blazar\u0027s aggregate"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"   * Blazar creates an aggregate whose uuid is the reservation uuid"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_b4fdaeb3","line":187,"in_reply_to":"3f79a3b5_11f22906","updated":"2018-10-10 06:38:12.000000000","message":"Yes, here blazar\u0027s aggregate means the \"blazar reservation pool\".\n...This logic can be same for windows license cases. I updated this to avoid to address too much Blazar thingy here.","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"fa72fdab90779e3a0bd260c57b439a736f2fcf6b","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"1. User uses blazar to create reservation id"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"   * Blazar picks up a host in blazar\u0027s aggregate"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"   * Blazar creates an aggregate whose uuid is the reservation uuid"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_45efdf85","line":187,"in_reply_to":"3f79a3b5_ac2e228a","updated":"2018-10-19 10:15:22.000000000","message":"I restored the blazar\u0027s use case with details.","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aebb61e684a05f15c923b84e4f7614806221b0d9","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"1. User uses blazar to create reservation id"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"   * Blazar picks up a host in blazar\u0027s aggregate"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"   * Blazar creates an aggregate whose uuid is the reservation uuid"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_ac2e228a","line":187,"in_reply_to":"3f79a3b5_b4fdaeb3","updated":"2018-10-16 20:53:41.000000000","message":"I very much think you should be specific about the use case and actors in this spec, otherwise it doesn\u0027t make sense to me why we add a new API with no clear direction on how it\u0027s going to be used. So if this becomes very blazar-specific, that\u0027s OK with me.","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"078992f36427214c368957841f813e2d9e40d5f4","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"   * Blazar picks up a host in blazar\u0027s aggregate"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"   * Blazar creates an aggregate whose uuid is the reservation uuid"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"2. User creates a VM with the reservation id"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_f1ec4d29","line":189,"updated":"2018-09-29 20:09:19.000000000","message":"So blazar creates an aggregate with a single resource provider (compute host) in it? If the aggregate is just going to have a single provider in it, why is this a better solution than just putting a custom trait on the selected host and translating the scheduler hint to that custom trait?","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"554520713aa15f5d67ec5e79e49bfb3017593b47","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"   * Blazar picks up a host in blazar\u0027s aggregate"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"   * Blazar creates an aggregate whose uuid is the reservation uuid"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"2. User creates a VM with the reservation id"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_a71d6d11","line":189,"in_reply_to":"3f79a3b5_f1ec4d29","updated":"2018-10-10 06:38:12.000000000","message":"Yes, as you said, we can use traits to make a VM land on a reserved host. And that might be better than using aggregates. But, at least, to make VMs-without-a-reservation land on outside of Blazar\u0027s pool, using aggregate is more reasonable, IMO. This is because what we want do here is to *group* Blazar\u0027s hosts and that\u0027s not capability but a way we choose to use the hosts.","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"078992f36427214c368957841f813e2d9e40d5f4","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"3. User creates a VM without any reservations"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"   * Nova translates it to ``member_of\u003d!\u003cblazar_agg\u003e`` passing it to placement"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"Note that the translation of the reservation id is out of the scope of this"},{"line_number":200,"context_line":"spec."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_91ddd96e","line":197,"updated":"2018-09-29 20:09:19.000000000","message":"How does nova know what the blazar aggregate is?","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"554520713aa15f5d67ec5e79e49bfb3017593b47","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"3. User creates a VM without any reservations"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"   * Nova translates it to ``member_of\u003d!\u003cblazar_agg\u003e`` passing it to placement"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"Note that the translation of the reservation id is out of the scope of this"},{"line_number":200,"context_line":"spec."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_c774293a","line":197,"in_reply_to":"3f79a3b5_91ddd96e","updated":"2018-10-10 06:38:12.000000000","message":"We should put the aggregate into both blazar.conf and nova.conf file, I think.","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"078992f36427214c368957841f813e2d9e40d5f4","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"   * Nova translates it to ``member_of\u003d!\u003cblazar_agg\u003e`` passing it to placement"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"Note that the translation of the reservation id is out of the scope of this"},{"line_number":200,"context_line":"spec."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_31e72549","line":199,"updated":"2018-09-29 20:09:19.000000000","message":"Hmm, so is this something you, or the blazar team, plan on creating a separate nova spec to handle? The existing blazar functionality depends on a scheduler hint and a blazar filter, both of which are extension points in nova so it\u0027s possible to do that. However, the pre-request placement filters [1] in nova-scheduler are not extension points, so how would a system like blazar hook this translation in, unless you propose (maybe in a separate spec) to add a new reservation style scheduler hint to nova\u0027s known list of scheduler hints [2]?\n\n[1] https://github.com/openstack/nova/blob/0163b9bfb54aaa89b0574c86e7fd36321eebccfe/nova/scheduler/request_filter.py\n[2] https://github.com/openstack/nova/blob/0163b9bfb54aaa89b0574c86e7fd36321eebccfe/nova/api/openstack/compute/schemas/servers.py#L93","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0cba4f466111516771aa829649cbdc6de7924319","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"   * Nova translates it to ``member_of\u003d!\u003cblazar_agg\u003e`` passing it to placement"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"Note that the translation of the reservation id is out of the scope of this"},{"line_number":200,"context_line":"spec."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_50bf49c9","line":199,"in_reply_to":"3f79a3b5_31e72549","updated":"2018-10-11 12:50:43.000000000","message":"\u003e Hmm, so is this something you, or the blazar team, plan on creating\n \u003e a separate nova spec to handle? The existing blazar functionality\n \u003e depends on a scheduler hint and a blazar filter, both of which are\n \u003e extension points in nova so it\u0027s possible to do that. However, the\n \u003e pre-request placement filters [1] in nova-scheduler are not\n \u003e extension points\n\nAgreed. What we had discussed in Denver was proposing something like this\n\nCONF.scheduler.placement_request_filter_membership_keys\n\nA CONF option that would be a list of string metadata keys. If any of those metadata keys were present in the merged instance, flavor or image metadata, then nova would look up aggregates that had those metadata keys and append a member_of\u003din:\u003cAGG_UUIDS\u003e constraint to the request spec.\n\nCONF.scheduler.placement_request_filter_membership_keys_negative\n\nA CONF option that would be a list of string metadata keys. If any of those metadata keys were present on the merged metadata, nova would look up aggregates having those metadata keys and append a member_of\u003d!in:\u003cAGG_UUIDS\u003e constraint.\n\nCONF.scheduler.placement_request_filter_missing_membership_keys\n\nA CONF option that would be a list of string metadata keys. If any of those metadata keys were NOT present in the merged metadata, nova would look up aggregates having those metadata keys and append a member_of\u003din:\u003cAGG_UUIDS\u003e constraint.\n\nAnd finally...\n\nCONF.scheduler.placement_request_filter_missing_membership_keys_negative\n\nA CONF option that would be a list of string metadata keys. If any of those metadata keys were NOT present in the merged metadata, nova would look up aggregates having those metadata keys and append a member_of\u003d!in:\u003cAGG_UUIDS\u003e constraint.\n\nI\u0027m more than happy to hear different proposed names for those CONF options, but that\u0027s essentially what we discussed in Denver and would make the placement request filtering pretty flexible but relatively simple for ops to configure and set up.","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"554520713aa15f5d67ec5e79e49bfb3017593b47","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"   * Nova translates it to ``member_of\u003d!\u003cblazar_agg\u003e`` passing it to placement"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"Note that the translation of the reservation id is out of the scope of this"},{"line_number":200,"context_line":"spec."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_44260825","line":199,"in_reply_to":"3f79a3b5_31e72549","updated":"2018-10-10 06:38:12.000000000","message":"Right. At least for windows license cases Tushar-san is now working on the spec and it will come up this week. We can continue the discussion on that spec.","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"88a1ed01c402526da808533bbc9ef3295be00272","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"   * Nova translates it to ``member_of\u003d!\u003cblazar_agg\u003e`` passing it to placement"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"Note that the translation of the reservation id is out of the scope of this"},{"line_number":200,"context_line":"spec."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_6cf9d180","line":199,"in_reply_to":"3f79a3b5_50bf49c9","updated":"2018-10-17 18:09:58.000000000","message":"OK I\u0027m not sure who \"we\" is but I wasn\u0027t part of that discussion so never heard about this. So rather than use our host aggregate metadata API, which is dynamic, the operator has to modify config and restart the scheduler every time they need to change any of these keys? That doesn\u0027t sound awesome.","commit_id":"4954a9fcceee82fb310a9bfa01eef9ce07e0ecec"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2ebf69548f2da4b21b881f67ea5d4149c53c3b1a","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Note that we don\u0027t support ``!`` in the ``in:`` prefix:"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"  ``\u0026member_of\u003din:\u003cagg1\u003e,\u003cagg2\u003e,!\u003cagg3\u003e``"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"would result in HTTP 400 Bad Request error."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_30708d41","line":84,"updated":"2018-10-11 12:53:39.000000000","message":"How about supporting a:\n\n member_of\u003d!in:\u003cAGG_UUIDS\u003e\n\nconstruct? That would read a little easier IMHO than the equivalent:\n\n member_of\u003d!\u003cAGG1_UUID\u003e\u0026!\u003cAGG2_UUID\u003e\u0026!\u003cAGG3_UUID\u003e","commit_id":"6450084f3882dedbe8bf22d8395e2e46b2666970"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7dea089db382d734354efc4a1a2a0290f8ede474","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Note that we don\u0027t support ``!`` in the ``in:`` prefix:"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"  ``\u0026member_of\u003din:\u003cagg1\u003e,\u003cagg2\u003e,!\u003cagg3\u003e``"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"would result in HTTP 400 Bad Request error."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_ed9f46f3","line":84,"in_reply_to":"3f79a3b5_30708d41","updated":"2018-10-16 11:53:05.000000000","message":"I agree that something like that would be complementary.\n\nI suspect that because of the way we are likely to do parsing of the args, it will fall out naturally too.\n\n(I assume you meant, on the less readable example:\n\n    member_of\u003d!\u003cAGG1_UUID\u003e\u0026member_of\u003d!\u003cAGG2_UUID\u003e\u0026member_of\u003d!\u003cAGG3_UUID\u003e\n\n?)","commit_id":"6450084f3882dedbe8bf22d8395e2e46b2666970"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"c18c197e7d8fa715c7c1a01c7ef6454780ebef35","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Note that we don\u0027t support ``!`` in the ``in:`` prefix:"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"  ``\u0026member_of\u003din:\u003cagg1\u003e,\u003cagg2\u003e,!\u003cagg3\u003e``"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"would result in HTTP 400 Bad Request error."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_f06159a3","line":84,"in_reply_to":"3f79a3b5_ed9f46f3","updated":"2018-10-16 12:16:26.000000000","message":"or member_of\u003dnot_in:\u003cagg_uuids\u003e","commit_id":"6450084f3882dedbe8bf22d8395e2e46b2666970"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"fa72fdab90779e3a0bd260c57b439a736f2fcf6b","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"Note that we don\u0027t support ``!`` in the ``in:`` prefix:"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"  ``\u0026member_of\u003din:\u003cagg1\u003e,\u003cagg2\u003e,!\u003cagg3\u003e``"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"would result in HTTP 400 Bad Request error."},{"line_number":87,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_45627f17","line":84,"in_reply_to":"3f79a3b5_f06159a3","updated":"2018-10-19 10:15:22.000000000","message":"Both work for me. I took \"!\" just because it\u0027s shorter.","commit_id":"6450084f3882dedbe8bf22d8395e2e46b2666970"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ae0bd66ee03b3d5380e0cdce6cb7454d89980474","unresolved":false,"context_lines":[{"line_number":156,"context_line":"---------------"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"A new microversion will be created which will update the validation for the"},{"line_number":159,"context_line":"``required`` parameter on ``GET /allocation_candidates`` and ``GET"},{"line_number":160,"context_line":"/resource_providers`` to accept ``!`` as a prefix on aggregate uuid to"},{"line_number":161,"context_line":"express that the prefixed aggregate is required to be excluded in the results."},{"line_number":162,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_79633442","line":159,"range":{"start_line":159,"start_character":2,"end_line":159,"end_character":10},"updated":"2018-10-12 14:44:26.000000000","message":"member_of","commit_id":"6450084f3882dedbe8bf22d8395e2e46b2666970"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"fa72fdab90779e3a0bd260c57b439a736f2fcf6b","unresolved":false,"context_lines":[{"line_number":156,"context_line":"---------------"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"A new microversion will be created which will update the validation for the"},{"line_number":159,"context_line":"``required`` parameter on ``GET /allocation_candidates`` and ``GET"},{"line_number":160,"context_line":"/resource_providers`` to accept ``!`` as a prefix on aggregate uuid to"},{"line_number":161,"context_line":"express that the prefixed aggregate is required to be excluded in the results."},{"line_number":162,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_a8dfe365","line":159,"range":{"start_line":159,"start_character":2,"end_line":159,"end_character":10},"in_reply_to":"3f79a3b5_2d6f7efa","updated":"2018-10-19 10:15:22.000000000","message":"Done","commit_id":"6450084f3882dedbe8bf22d8395e2e46b2666970"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7dea089db382d734354efc4a1a2a0290f8ede474","unresolved":false,"context_lines":[{"line_number":156,"context_line":"---------------"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"A new microversion will be created which will update the validation for the"},{"line_number":159,"context_line":"``required`` parameter on ``GET /allocation_candidates`` and ``GET"},{"line_number":160,"context_line":"/resource_providers`` to accept ``!`` as a prefix on aggregate uuid to"},{"line_number":161,"context_line":"express that the prefixed aggregate is required to be excluded in the results."},{"line_number":162,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_2d6f7efa","line":159,"range":{"start_line":159,"start_character":2,"end_line":159,"end_character":10},"in_reply_to":"3f79a3b5_79633442","updated":"2018-10-16 11:53:05.000000000","message":"Yeah, worth fixing this sooner than later.","commit_id":"6450084f3882dedbe8bf22d8395e2e46b2666970"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2b528050631802cac9730b0b091e755ab2b82559","unresolved":false,"context_lines":[{"line_number":187,"context_line":"This helps us to develop a simple reservation mechanism without having a"},{"line_number":188,"context_line":"specific nova filter, for example, via the following feature:"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"0. Operators sets default forbidden aggregates to ``nova.conf``."},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"1. If a user creates a VM without any hints, nova request filter translates"},{"line_number":193,"context_line":"   it to ``member_of\u003d!\u003cdefault_forbidden_agg\u003e`` and passes it to placement."}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_1e7a03ba","line":190,"range":{"start_line":190,"start_character":47,"end_line":190,"end_character":49},"updated":"2018-10-15 13:25:19.000000000","message":"in","commit_id":"6450084f3882dedbe8bf22d8395e2e46b2666970"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"91fc105b4c4dbc590b399c718ff0eab5390a9b89","unresolved":false,"context_lines":[{"line_number":187,"context_line":"This helps us to develop a simple reservation mechanism without having a"},{"line_number":188,"context_line":"specific nova filter, for example, via the following feature:"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"0. Operators sets default forbidden aggregates to ``nova.conf``."},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"1. If a user creates a VM without any hints, nova request filter translates"},{"line_number":193,"context_line":"   it to ``member_of\u003d!\u003cdefault_forbidden_agg\u003e`` and passes it to placement."}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_293444f9","line":190,"range":{"start_line":190,"start_character":47,"end_line":190,"end_character":49},"in_reply_to":"3f79a3b5_1e7a03ba","updated":"2018-10-16 20:51:07.000000000","message":"Sets what in nova.conf? I don\u0027t see what nova.conf has to do with this since this spec isn\u0027t proposing new config options to tell nova which aggregates, by default, a host is in, correct?\n\n(later)\n\nOh I see, this is magic that doesn\u0027t exist...and wouldn\u0027t exist in the compute service because that would require an up-call to the API DB to put the compute service host in the aggregate defined in nova.conf...","commit_id":"6450084f3882dedbe8bf22d8395e2e46b2666970"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"27235be96025c62a3d4da835dcff5e15bb5678bf","unresolved":false,"context_lines":[{"line_number":96,"context_line":"Nested resource providers"},{"line_number":97,"context_line":"-------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"For nested resource providers, an aggregate on a root provider automatically"},{"line_number":100,"context_line":"spans the whole tree. When a root provider is in forbidden aggregates, the"},{"line_number":101,"context_line":"child providers can\u0027t be a candidate even if the child provider belongs to no"},{"line_number":102,"context_line":"(or another different) aggregate."},{"line_number":103,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_98bc9908","line":100,"range":{"start_line":99,"start_character":0,"end_line":100,"end_character":20},"updated":"2018-10-18 09:22:23.000000000","message":"Could you refer to doc or code where the placement aggregate is defined this way? With a quick look in the placement API ref I did not found such defined behavior.\n\nDoes this behavior generic and applies to subtrees as well? \n\n     A\n    /\\\n   B  C\n  /\n D\n\nSo if B is in agg1 and the request forbids agg1 then not just B but D is forbidden as well?","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9cfc69e276f5041d12489ee06928a16f2393f53f","unresolved":false,"context_lines":[{"line_number":96,"context_line":"Nested resource providers"},{"line_number":97,"context_line":"-------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"For nested resource providers, an aggregate on a root provider automatically"},{"line_number":100,"context_line":"spans the whole tree. When a root provider is in forbidden aggregates, the"},{"line_number":101,"context_line":"child providers can\u0027t be a candidate even if the child provider belongs to no"},{"line_number":102,"context_line":"(or another different) aggregate."},{"line_number":103,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_3fa74b54","line":100,"range":{"start_line":99,"start_character":0,"end_line":100,"end_character":20},"in_reply_to":"3f79a3b5_6abf4aab","updated":"2018-10-19 15:02:07.000000000","message":"Thanks for the references. I\u0027ve only looked at the API ref for info.\n\nRegarding root in an aggregate: It feels strange that we handle root nodes specially. But this is not the spec where this needs to be discussed. :)","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"fa72fdab90779e3a0bd260c57b439a736f2fcf6b","unresolved":false,"context_lines":[{"line_number":96,"context_line":"Nested resource providers"},{"line_number":97,"context_line":"-------------------------"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"For nested resource providers, an aggregate on a root provider automatically"},{"line_number":100,"context_line":"spans the whole tree. When a root provider is in forbidden aggregates, the"},{"line_number":101,"context_line":"child providers can\u0027t be a candidate even if the child provider belongs to no"},{"line_number":102,"context_line":"(or another different) aggregate."},{"line_number":103,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_6abf4aab","line":100,"range":{"start_line":99,"start_character":0,"end_line":100,"end_character":20},"in_reply_to":"3f79a3b5_98bc9908","updated":"2018-10-19 10:15:22.000000000","message":"\u003e Could you refer to doc or code where the placement aggregate is\n \u003e defined this way? \n\nWe agreed that in last Denver PTG.\n\n* Etherpad\nhttps://etherpad.openstack.org/p/nova-ptg-stein (Line 177)\n\n* Test code\nhttps://github.com/openstack/placement/blob/e7fe0ab8629165d57e71bbcda71bf198bb2dada1/placement/tests/functional/gabbits/allocation-candidates-bug-1792503.yaml.\n\n* Doc\nhttps://github.com/openstack/placement/blob/e7fe0ab8629165d57e71bbcda71bf198bb2dada1/doc/source/usage/provider-tree.rst\n\n \u003e Does this behavior generic and applies to subtrees as well?\n\nNo, it doesn\u0027t. Only aggregate on *root* spans the whole tree.\n\nhttps://github.com/openstack/placement/blob/e7fe0ab8629165d57e71bbcda71bf198bb2dada1/api-ref/source/parameters.yaml#L91-L95","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"27235be96025c62a3d4da835dcff5e15bb5678bf","unresolved":false,"context_lines":[{"line_number":115,"context_line":"      | | compute node (cn1)       | |  | |compute node (cn2)       | |"},{"line_number":116,"context_line":"      | |   agg: [aggA]            | |  | |  agg: [aggB]            | |"},{"line_number":117,"context_line":"      | +-----+-------------+------+ |  | +----+-------------+------+ |"},{"line_number":118,"context_line":"      |       | nested      | nested |  |      | nested      | nested |"},{"line_number":119,"context_line":"      | +-----+------+ +----+------+ |  | +----+------+ +----+------+ |"},{"line_number":120,"context_line":"      | | numa1_1    | | numa1_2   | |  | | numa2_1   | | numa2_2   | |"},{"line_number":121,"context_line":"      | |  agg:[aggC]| |   agg:[]  | |  | |   agg:[]  | |   agg:[]  | |"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_d83f7184","line":118,"range":{"start_line":118,"start_character":16,"end_line":118,"end_character":22},"updated":"2018-10-18 09:22:23.000000000","message":"nit: could be called \u0027parent\u0027","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"fa72fdab90779e3a0bd260c57b439a736f2fcf6b","unresolved":false,"context_lines":[{"line_number":115,"context_line":"      | | compute node (cn1)       | |  | |compute node (cn2)       | |"},{"line_number":116,"context_line":"      | |   agg: [aggA]            | |  | |  agg: [aggB]            | |"},{"line_number":117,"context_line":"      | +-----+-------------+------+ |  | +----+-------------+------+ |"},{"line_number":118,"context_line":"      |       | nested      | nested |  |      | nested      | nested |"},{"line_number":119,"context_line":"      | +-----+------+ +----+------+ |  | +----+------+ +----+------+ |"},{"line_number":120,"context_line":"      | | numa1_1    | | numa1_2   | |  | | numa2_1   | | numa2_2   | |"},{"line_number":121,"context_line":"      | |  agg:[aggC]| |   agg:[]  | |  | |   agg:[]  | |   agg:[]  | |"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_6a498ab6","line":118,"range":{"start_line":118,"start_character":16,"end_line":118,"end_character":22},"in_reply_to":"3f79a3b5_d83f7184","updated":"2018-10-19 10:15:22.000000000","message":"Done","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"27235be96025c62a3d4da835dcff5e15bb5678bf","unresolved":false,"context_lines":[{"line_number":133,"context_line":"* ``member_of\u003d!\u003caggB\u003e`` excludes \"cn2\", \"numa2_1\", \"numa2_2\", and \"ss1\"."},{"line_number":134,"context_line":"* ``member_of\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"Note that this spanning doesn\u0027t happen on numbered ``member_of`` parameters,"},{"line_number":137,"context_line":"which is used for the granular request:"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggA\u003e`` excludes \"cn1\""},{"line_number":140,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggB\u003e`` excludes \"cn2\" and \"ss1\""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_581281ff","line":137,"range":{"start_line":136,"start_character":0,"end_line":137,"end_character":39},"updated":"2018-10-18 09:22:23.000000000","message":"What is the reason we want to create a special case for numbered groups?","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"fa72fdab90779e3a0bd260c57b439a736f2fcf6b","unresolved":false,"context_lines":[{"line_number":133,"context_line":"* ``member_of\u003d!\u003caggB\u003e`` excludes \"cn2\", \"numa2_1\", \"numa2_2\", and \"ss1\"."},{"line_number":134,"context_line":"* ``member_of\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"Note that this spanning doesn\u0027t happen on numbered ``member_of`` parameters,"},{"line_number":137,"context_line":"which is used for the granular request:"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggA\u003e`` excludes \"cn1\""},{"line_number":140,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggB\u003e`` excludes \"cn2\" and \"ss1\""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_6a8c2ad8","line":137,"range":{"start_line":136,"start_character":0,"end_line":137,"end_character":39},"in_reply_to":"3f79a3b5_581281ff","updated":"2018-10-19 10:15:22.000000000","message":"Because in granular requests we only care about the traits and aggregates on that resource provider not on root provider.","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9cfc69e276f5041d12489ee06928a16f2393f53f","unresolved":false,"context_lines":[{"line_number":133,"context_line":"* ``member_of\u003d!\u003caggB\u003e`` excludes \"cn2\", \"numa2_1\", \"numa2_2\", and \"ss1\"."},{"line_number":134,"context_line":"* ``member_of\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"Note that this spanning doesn\u0027t happen on numbered ``member_of`` parameters,"},{"line_number":137,"context_line":"which is used for the granular request:"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggA\u003e`` excludes \"cn1\""},{"line_number":140,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggB\u003e`` excludes \"cn2\" and \"ss1\""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_e28b7a66","line":137,"range":{"start_line":136,"start_character":0,"end_line":137,"end_character":39},"in_reply_to":"3f79a3b5_6a8c2ad8","updated":"2018-10-19 15:02:07.000000000","message":"So having the tree:\n\n  rooRP\n  / aggregates:\u003cagg1_uuid\u003e\n /\nchildRP\n  inventory: CUSTOM_MAGIC \u003d 100\n\nand a request:\n\n  resources1:CUSTOM_MAGIC\u003d1\n  member_of1\u003d!\u003cagg1_uuid\u003e\n\ncan be fulfilled by childRP as the numbered member_of does not span the tree. But at the other hand the doc you linked says:\n\"Note that the GET /allocation_candidates operation assumes that \"an aggregate on a root provider spans the whole tree, while an aggregate on a non-root provider does NOT span the whole tree.\"\"\nIn the above example the aggregate is on the root provider so the based on the doc that aggregate spans the whole tree. If that spans the whole tree then the numbered request cannot be fulfilled with child RP","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7d34f26216be639e768c04e5319ef333a5655d0a","unresolved":false,"context_lines":[{"line_number":133,"context_line":"* ``member_of\u003d!\u003caggB\u003e`` excludes \"cn2\", \"numa2_1\", \"numa2_2\", and \"ss1\"."},{"line_number":134,"context_line":"* ``member_of\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"Note that this spanning doesn\u0027t happen on numbered ``member_of`` parameters,"},{"line_number":137,"context_line":"which is used for the granular request:"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggA\u003e`` excludes \"cn1\""},{"line_number":140,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggB\u003e`` excludes \"cn2\" and \"ss1\""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_61ffbdfe","line":137,"range":{"start_line":136,"start_character":0,"end_line":137,"end_character":39},"in_reply_to":"3f79a3b5_ce98d277","updated":"2018-11-28 09:23:51.000000000","message":"Thanks for the reference. I still feel bad about this edge case. \n\nIn my opinion the meaning of the aggregate membership should not depend on the content of the allocation_candidate query. Either a whole tree is part of an aggregate because it\u0027s root is part of it or not, regardless of what is in a given a_c query. \n\nBUT I accept that this is not the patch that causes the root of the problem.","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"ef1166087a9d90dfc377f6804079929080f3a27f","unresolved":false,"context_lines":[{"line_number":133,"context_line":"* ``member_of\u003d!\u003caggB\u003e`` excludes \"cn2\", \"numa2_1\", \"numa2_2\", and \"ss1\"."},{"line_number":134,"context_line":"* ``member_of\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"Note that this spanning doesn\u0027t happen on numbered ``member_of`` parameters,"},{"line_number":137,"context_line":"which is used for the granular request:"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggA\u003e`` excludes \"cn1\""},{"line_number":140,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggB\u003e`` excludes \"cn2\" and \"ss1\""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_ce98d277","line":137,"range":{"start_line":136,"start_character":0,"end_line":137,"end_character":39},"in_reply_to":"3f79a3b5_e28b7a66","updated":"2018-10-22 09:11:28.000000000","message":"See the `Granular Resource Requests` section at the bottom of the doc [1]. It says:\n\n---\nNote that if member_of\u003cN\u003e is specified in granular requests, the API doesn\u0027t assume that \"an aggregate on a root provider spans the whole tree.\" It just sees whether the specified aggregate is directly associated with the resource provider when looking up the candidates.\n---\n\nSo it is consistent with what was noted in the PTG and what has been written in the doc.\n\n[1] https://github.com/openstack/placement/blob/e7fe0ab8629165d57e71bbcda71bf198bb2dada1/doc/source/usage/provider-tree.rst","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"27235be96025c62a3d4da835dcff5e15bb5678bf","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"We can use forbidden traits to exclude specific resource providers, but"},{"line_number":149,"context_line":"because traits are used to indicate the capability of resource providers,"},{"line_number":150,"context_line":"it is confusing to use traits for grouping hosts and putting information"},{"line_number":151,"context_line":"to traits how we use them."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"We can also create nova scheduler filters to do post-processing of compute"},{"line_number":154,"context_line":"hosts by looking at host aggregate relationships just as `BlazarFilter`_"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_586e0165","line":151,"range":{"start_line":150,"start_character":0,"end_line":151,"end_character":26},"updated":"2018-10-18 09:22:23.000000000","message":"From the placement API ref:\n\"\nIn Nova, a host aggregate may have metadata key/value pairs attached to it. All nova-compute services associated with a Nova host aggregate share the same metadata. Placement aggregates have no such metadata because placement aggregates only represent the grouping of resource providers. In the Placement API, resource providers are individually decorated with traits that provide qualitative information about the resource provider.\n\"\n\nFor me this means that we use placement aggregates to define the RP group and then we use individual traits on the RPs in the group to specify the _why_ they are grouped together. So It feels to me that WINDOWS_LICENCED_HOST is a valid trait. And therefore either the placement API ref or the highlighted reasoning of this spec is invalid.","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"fa72fdab90779e3a0bd260c57b439a736f2fcf6b","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"We can use forbidden traits to exclude specific resource providers, but"},{"line_number":149,"context_line":"because traits are used to indicate the capability of resource providers,"},{"line_number":150,"context_line":"it is confusing to use traits for grouping hosts and putting information"},{"line_number":151,"context_line":"to traits how we use them."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"We can also create nova scheduler filters to do post-processing of compute"},{"line_number":154,"context_line":"hosts by looking at host aggregate relationships just as `BlazarFilter`_"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_e5ab8b6e","line":151,"range":{"start_line":150,"start_character":0,"end_line":151,"end_character":26},"in_reply_to":"3f79a3b5_586e0165","updated":"2018-10-19 10:15:22.000000000","message":"Yeah, it seems I was missing the point. Reworded here.","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9cfc69e276f5041d12489ee06928a16f2393f53f","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"We can use forbidden traits to exclude specific resource providers, but"},{"line_number":149,"context_line":"because traits are used to indicate the capability of resource providers,"},{"line_number":150,"context_line":"it is confusing to use traits for grouping hosts and putting information"},{"line_number":151,"context_line":"to traits how we use them."},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"We can also create nova scheduler filters to do post-processing of compute"},{"line_number":154,"context_line":"hosts by looking at host aggregate relationships just as `BlazarFilter`_"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_c2e67e4a","line":151,"range":{"start_line":150,"start_character":0,"end_line":151,"end_character":26},"in_reply_to":"3f79a3b5_e5ab8b6e","updated":"2018-10-19 15:02:07.000000000","message":"new wording make sense. thanks","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"27235be96025c62a3d4da835dcff5e15bb5678bf","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"A new microversion will be created which will update the validation for the"},{"line_number":167,"context_line":"``member_of`` parameter on ``GET /allocation_candidates`` and ``GET"},{"line_number":168,"context_line":"/resource_providers`` to accept ``!`` as a prefix on aggregate uuid to"},{"line_number":169,"context_line":"express that the prefixed aggregate is required to be excluded in the results."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_188e4926","line":168,"range":{"start_line":168,"start_character":33,"end_line":168,"end_character":67},"updated":"2018-10-18 09:22:23.000000000","message":"and prefix on the \u0027in:\u0027 prefix","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"fa72fdab90779e3a0bd260c57b439a736f2fcf6b","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"A new microversion will be created which will update the validation for the"},{"line_number":167,"context_line":"``member_of`` parameter on ``GET /allocation_candidates`` and ``GET"},{"line_number":168,"context_line":"/resource_providers`` to accept ``!`` as a prefix on aggregate uuid to"},{"line_number":169,"context_line":"express that the prefixed aggregate is required to be excluded in the results."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_85ead79d","line":168,"range":{"start_line":168,"start_character":33,"end_line":168,"end_character":67},"in_reply_to":"3f79a3b5_188e4926","updated":"2018-10-19 10:15:22.000000000","message":"Done","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"27235be96025c62a3d4da835dcff5e15bb5678bf","unresolved":false,"context_lines":[{"line_number":166,"context_line":"A new microversion will be created which will update the validation for the"},{"line_number":167,"context_line":"``member_of`` parameter on ``GET /allocation_candidates`` and ``GET"},{"line_number":168,"context_line":"/resource_providers`` to accept ``!`` as a prefix on aggregate uuid to"},{"line_number":169,"context_line":"express that the prefixed aggregate is required to be excluded in the results."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Security impact"},{"line_number":172,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_b892b549","line":169,"range":{"start_line":169,"start_character":25,"end_line":169,"end_character":35},"updated":"2018-10-18 09:22:23.000000000","message":"or aggregates","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"fa72fdab90779e3a0bd260c57b439a736f2fcf6b","unresolved":false,"context_lines":[{"line_number":166,"context_line":"A new microversion will be created which will update the validation for the"},{"line_number":167,"context_line":"``member_of`` parameter on ``GET /allocation_candidates`` and ``GET"},{"line_number":168,"context_line":"/resource_providers`` to accept ``!`` as a prefix on aggregate uuid to"},{"line_number":169,"context_line":"express that the prefixed aggregate is required to be excluded in the results."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Security impact"},{"line_number":172,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_25250317","line":169,"range":{"start_line":169,"start_character":25,"end_line":169,"end_character":35},"in_reply_to":"3f79a3b5_b892b549","updated":"2018-10-19 10:15:22.000000000","message":"Done","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"27235be96025c62a3d4da835dcff5e15bb5678bf","unresolved":false,"context_lines":[{"line_number":192,"context_line":"Other deployer impact"},{"line_number":193,"context_line":"---------------------"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"This helps us to develop a simple reservation mechanism without having a"},{"line_number":196,"context_line":"specific nova filter, for example, via the following flow:"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"0. Operator who wants to enable blazar sets default forbidden and required"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_98c7b93e","line":195,"range":{"start_line":195,"start_character":0,"end_line":195,"end_character":55},"updated":"2018-10-18 09:22:23.000000000","message":"Will there be a separate spec describing the necessary nova change for this feature? If it already exists then we can simply refer to it here instead of repeating its content.\n---later---\nOhh it is stated below. The I guess it is OK as is.","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"27235be96025c62a3d4da835dcff5e15bb5678bf","unresolved":false,"context_lines":[{"line_number":209,"context_line":"1. Operator starts up the service and makes a host-pool for reservation via"},{"line_number":210,"context_line":"   blazar API"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"   * Blazar makes an aggregate with ``reservation:\u003crandom_id\u003e`` meta_data on"},{"line_number":213,"context_line":"     initialization as blazar\u0027s free pool"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"   * Blazar puts hosts specified by the operator into the free pool aggregate"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_d8e531dd","line":212,"range":{"start_line":212,"start_character":18,"end_line":212,"end_character":30},"updated":"2018-10-18 09:22:23.000000000","message":"nova host aggregate","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"fa72fdab90779e3a0bd260c57b439a736f2fcf6b","unresolved":false,"context_lines":[{"line_number":209,"context_line":"1. Operator starts up the service and makes a host-pool for reservation via"},{"line_number":210,"context_line":"   blazar API"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"   * Blazar makes an aggregate with ``reservation:\u003crandom_id\u003e`` meta_data on"},{"line_number":213,"context_line":"     initialization as blazar\u0027s free pool"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"   * Blazar puts hosts specified by the operator into the free pool aggregate"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_058247c8","line":212,"range":{"start_line":212,"start_character":18,"end_line":212,"end_character":30},"in_reply_to":"3f79a3b5_d8e531dd","updated":"2018-10-19 10:15:22.000000000","message":"Done","commit_id":"61e65162d7ed0bfcb0ba7d3a3c3bf2ca8a5207b4"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c69dc36840ed4dc49adf524ee5f968885f96befa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"5fc1f717_a0b8cd75","updated":"2019-03-11 22:37:44.000000000","message":"We need to make a call on what happens if an agg UUID is found on both the positive and negative sides of the request. As currently coded [1] the positive will be ignored and the negative will take precedence. This could be okay - or we might want this to be a 400 instead. (I don\u0027t think the positive side taking precedence is a good option, but I suppose that\u0027s on the table too.)\n\n[1] https://review.openstack.org/#/c/641391/2/placement/objects/resource_provider.py@2303","commit_id":"d489f2007a4dbbad2bbac565ad71cd485df052e3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6d03784d8f8f4db46eb6974963f90f1c69fad4c8","unresolved":false,"context_lines":[{"line_number":99,"context_line":"For nested resource providers, an aggregate on a root provider automatically"},{"line_number":100,"context_line":"spans the whole tree. When a root provider is in forbidden aggregates, the"},{"line_number":101,"context_line":"child providers can\u0027t be a candidate even if the child provider belongs to no"},{"line_number":102,"context_line":"(or another different) aggregate."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"In the following environments, for example,"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f79a3b5_54071616","line":102,"updated":"2018-12-20 14:19:47.000000000","message":"++","commit_id":"d489f2007a4dbbad2bbac565ad71cd485df052e3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6d03784d8f8f4db46eb6974963f90f1c69fad4c8","unresolved":false,"context_lines":[{"line_number":138,"context_line":""},{"line_number":139,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggA\u003e`` excludes \"cn1\""},{"line_number":140,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggB\u003e`` excludes \"cn2\" and \"ss1\""},{"line_number":141,"context_line":"* ``member_of\u003cN\u003e\u003d!\u003caggC\u003e`` excludes \"numa1_1\" and \"ss2\"."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"See `granular-resource-request`_ spec for details."},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f79a3b5_140d1e32","line":141,"updated":"2018-12-20 14:19:47.000000000","message":"ok, makes sense. ++","commit_id":"d489f2007a4dbbad2bbac565ad71cd485df052e3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e01c37dae677816d0d5a93d8dfd852f7eebb0d00","unresolved":false,"context_lines":[{"line_number":153,"context_line":"We can also create nova scheduler filters to do post-processing of compute"},{"line_number":154,"context_line":"hosts by looking at host aggregate relationships just as `BlazarFilter`_"},{"line_number":155,"context_line":"does today. However, this is inefficient and we don\u0027t want to develop/use"},{"line_number":156,"context_line":"another filter for the windows license use case."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Data model impact"},{"line_number":159,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f79a3b5_79ac5fa7","line":156,"range":{"start_line":156,"start_character":0,"end_line":156,"end_character":48},"updated":"2018-11-27 20:32:05.000000000","message":"Well, I think there are existing filters used for this today:\n\nhttps://docs.openstack.org/nova/latest/admin/configuration/schedulers.html#aggregateimagepropertiesisolation\n\nI believe the downside to that, which I think Tushar is trying to solve in his spec ( https://review.openstack.org/#/c/609960/ ) is that while that filter makes it possible to only put certain images on certain hosts by linking the aggregate metadata to the image metadata, it does not *exclude* other images without the matching metadata from landing on those hosts. So it\u0027s a restrictive filter but not exclusive.","commit_id":"d489f2007a4dbbad2bbac565ad71cd485df052e3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6d03784d8f8f4db46eb6974963f90f1c69fad4c8","unresolved":false,"context_lines":[{"line_number":153,"context_line":"We can also create nova scheduler filters to do post-processing of compute"},{"line_number":154,"context_line":"hosts by looking at host aggregate relationships just as `BlazarFilter`_"},{"line_number":155,"context_line":"does today. However, this is inefficient and we don\u0027t want to develop/use"},{"line_number":156,"context_line":"another filter for the windows license use case."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Data model impact"},{"line_number":159,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f79a3b5_543076ea","line":156,"range":{"start_line":156,"start_character":0,"end_line":156,"end_character":48},"in_reply_to":"3f79a3b5_0e36ca51","updated":"2018-12-20 14:19:47.000000000","message":"Correct.","commit_id":"d489f2007a4dbbad2bbac565ad71cd485df052e3"},{"author":{"_account_id":1011,"name":"Tushar Patil","email":"tushar.vitthal.patil@gmail.com","username":"tpatil"},"change_message_id":"c7efbd79679caea54b129a0a33b7f77f4cf64cbb","unresolved":false,"context_lines":[{"line_number":153,"context_line":"We can also create nova scheduler filters to do post-processing of compute"},{"line_number":154,"context_line":"hosts by looking at host aggregate relationships just as `BlazarFilter`_"},{"line_number":155,"context_line":"does today. However, this is inefficient and we don\u0027t want to develop/use"},{"line_number":156,"context_line":"another filter for the windows license use case."},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Data model impact"},{"line_number":159,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f79a3b5_0e36ca51","line":156,"range":{"start_line":156,"start_character":0,"end_line":156,"end_character":48},"in_reply_to":"3f79a3b5_79ac5fa7","updated":"2018-12-05 02:33:24.000000000","message":"Yes, in my specs, this particular issue will be addressed.\n\n\nConsider following example to depict the licensing use case.\nOperator adds image metadata to classify images as below:\n\n  image 1 properties: {\"os_distro\": \"windows\"} (added by an operator)\n  image 2 properties: {} (added by a normal end user)\n\n  Host aggregate 1 metadata: {\"os_distro\": \"windows\"}\n\nNow when user boots an instance using image 2, then this scheduler filter\nallows to boot instance in host aggregate 1 which is a problem.","commit_id":"d489f2007a4dbbad2bbac565ad71cd485df052e3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6d03784d8f8f4db46eb6974963f90f1c69fad4c8","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"   * The parameter key in the configuration file is something like"},{"line_number":212,"context_line":"     ``[scheduler]/placement_req_required_member_prefix`` and the value"},{"line_number":213,"context_line":"     would is set by the operator to ``reservation:``."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"1. Operator starts up the service and makes a host-pool for reservation via"},{"line_number":216,"context_line":"   blazar API"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f79a3b5_5435d6d1","line":213,"updated":"2018-12-20 14:19:47.000000000","message":"I\u0027m not really happy with the above CONF option names or usage (I don\u0027t like the whole _prefix thing) but this is fine as a straw-man proposal to show the usefulness of this particular spec.","commit_id":"d489f2007a4dbbad2bbac565ad71cd485df052e3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6d03784d8f8f4db46eb6974963f90f1c69fad4c8","unresolved":false,"context_lines":[{"line_number":216,"context_line":"   blazar API"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"   * Blazar makes an nova aggregate with ``reservation:\u003crandom_id\u003e`` metadata"},{"line_number":219,"context_line":"     on initialization as a blazar\u0027s free pool"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"   * Blazar puts hosts specified by the operator into the free pool aggregate"},{"line_number":222,"context_line":"     on demand"}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f79a3b5_f45662fa","line":219,"updated":"2018-12-20 14:19:47.000000000","message":"To expand on my concerns about using a \"_prefix\" thing in the CONF option, you could more easily accomplish this by using a specific aggregate metadata key called \"blazar_reservation\" and set the *value* of the metadata item to the \u003creservation_id\u003e.\n\nThis way you could have a CONF option called something like \"placement_req_filter_forbid_aggregate_metadata_keys\" which would simply list the specific aggregate metadata keys that should trigger a placement forbidden aggregate request filter. In this case, you\u0027d set this CONF option\u0027s value to just \"blazar_reservation\"...","commit_id":"d489f2007a4dbbad2bbac565ad71cd485df052e3"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6d03784d8f8f4db46eb6974963f90f1c69fad4c8","unresolved":false,"context_lines":[{"line_number":232,"context_line":"3. User creates a VM with a flavor/image with ``reservation:\u003cresv_id\u003e``"},{"line_number":233,"context_line":"   meta_data/extra_specs to consume the reservation"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"   * Nova finds in the flavor that the extra_spec has a key which starts with"},{"line_number":236,"context_line":"     what is set in ``[scheduler]/placement_req_required_member_prefix``,"},{"line_number":237,"context_line":"     and looks up the table for aggregates which has the specified metadata::"},{"line_number":238,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"3f79a3b5_f4abc2d1","line":235,"range":{"start_line":235,"start_character":50,"end_line":235,"end_character":77},"updated":"2018-12-20 14:19:47.000000000","message":"or, if you just put the reservation ID in the value portion of the metadata item, you can just have \"blazar_reservation\" as the specific metadata *key* that you look up. This way you don\u0027t need the added complexity of a prefix...","commit_id":"d489f2007a4dbbad2bbac565ad71cd485df052e3"}]}
