)]}'
{"specs/rocky/approved/placement-req-filter.rst":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"294eaab124767ec3c9a6265a166d0836daf59b4f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"many thousands of hosts in order to make a selection, most of which"},{"line_number":41,"context_line":"are categorically not valid based on the tenant mapping."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Although not covered by this spec directly, the mechanism added here"},{"line_number":44,"context_line":"would enable other such request-limiting filters in the future. For"},{"line_number":45,"context_line":"example, such a filter could identify boot-from-volume requests and"},{"line_number":46,"context_line":"always add in a trait to limit those instances to hosts with that"},{"line_number":47,"context_line":"trait."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"Use Cases"},{"line_number":50,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_11ff1635","line":47,"range":{"start_line":43,"start_character":0,"end_line":47,"end_character":6},"updated":"2018-02-14 19:02:38.000000000","message":"Same idea I have here for booting from a multiattach volume:\n\nhttp://lists.openstack.org/pipermail/openstack-dev/2018-January/126653.html","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"738f887385a7a0b501cb2594fca810fd6e159209","unresolved":false,"context_lines":[{"line_number":40,"context_line":"many thousands of hosts in order to make a selection, most of which"},{"line_number":41,"context_line":"are categorically not valid based on the tenant mapping."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Although not covered by this spec directly, the mechanism added here"},{"line_number":44,"context_line":"would enable other such request-limiting filters in the future. For"},{"line_number":45,"context_line":"example, such a filter could identify boot-from-volume requests and"},{"line_number":46,"context_line":"always add in a trait to limit those instances to hosts with that"},{"line_number":47,"context_line":"trait."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"Use Cases"},{"line_number":50,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_03202d49","line":47,"range":{"start_line":43,"start_character":0,"end_line":47,"end_character":6},"in_reply_to":"3fa0c359_11ff1635","updated":"2018-02-14 19:12:09.000000000","message":"Cool.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"294eaab124767ec3c9a6265a166d0836daf59b4f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"filter will be provided and enabled by a single boolean configuration"},{"line_number":75,"context_line":"knob in the ``scheduler`` group. When enabled, this filter will:"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":" #. Look for aggregates with metadata items of `only_tenant\u003d$tenant`,"},{"line_number":78,"context_line":"    for the tenant id making the request"},{"line_number":79,"context_line":" #. Augment the `RequestSpec` object to indicate that the result"},{"line_number":80,"context_line":"    should be limited to the matching aggregates"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_83d0bd55","line":77,"updated":"2018-02-14 19:02:38.000000000","message":"This sounds a lot like the existing AggregateMultiTenancyIsolation filter. Why not just rely on the same metadata key that filter is already using (filter_tenant_id)? Then anyone already using that filter gets this for free, and the benefit is we move that post-placement HostState filter into a pre-placement filter where the actual filtering happens in SQL in Placement.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"738f887385a7a0b501cb2594fca810fd6e159209","unresolved":false,"context_lines":[{"line_number":74,"context_line":"filter will be provided and enabled by a single boolean configuration"},{"line_number":75,"context_line":"knob in the ``scheduler`` group. When enabled, this filter will:"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":" #. Look for aggregates with metadata items of `only_tenant\u003d$tenant`,"},{"line_number":78,"context_line":"    for the tenant id making the request"},{"line_number":79,"context_line":" #. Augment the `RequestSpec` object to indicate that the result"},{"line_number":80,"context_line":"    should be limited to the matching aggregates"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_632b3130","line":77,"in_reply_to":"3fa0c359_83d0bd55","updated":"2018-02-14 19:12:09.000000000","message":"Sure.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"294eaab124767ec3c9a6265a166d0836daf59b4f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"``RequestSpec.destination`` to contain an ``aggregates``, peer to the"},{"line_number":85,"context_line":"``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indcating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates."},{"line_number":90,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_d129ae9b","line":87,"range":{"start_line":87,"start_character":42,"end_line":87,"end_character":47},"updated":"2018-02-14 19:02:38.000000000","message":"Are these the compute node UUIDs of the hosts that are members of the nova host aggregate? Or the aggregate UUIDs of the placement aggregate? It gets confusing here, because we do have a filter on GET /resource_providers to only get resource providers in a set of resource provider aggregates.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"738f887385a7a0b501cb2594fca810fd6e159209","unresolved":false,"context_lines":[{"line_number":84,"context_line":"``RequestSpec.destination`` to contain an ``aggregates``, peer to the"},{"line_number":85,"context_line":"``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indcating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates."},{"line_number":90,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_a3d61927","line":87,"range":{"start_line":87,"start_character":42,"end_line":87,"end_character":47},"in_reply_to":"3fa0c359_d129ae9b","updated":"2018-02-14 19:12:09.000000000","message":"Aggregate uuid of our host aggregate, which will be the same as the placement aggregate.\n\nTo your second point, there is a dependent spec (see deps) that jay is going to write to add the aggregate filter to allocation_candidates so we don\u0027t have to do anything else.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"294eaab124767ec3c9a6265a166d0836daf59b4f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indcating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_714a1a84","line":88,"range":{"start_line":88,"start_character":0,"end_line":88,"end_character":9},"updated":"2018-02-14 19:02:38.000000000","message":"indicating","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"ba1e82623b5ba2e0282bd7f7ec91d19905cffa27","unresolved":false,"context_lines":[{"line_number":85,"context_line":"``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indcating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"Alternatives"},{"line_number":92,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_c39c856c","line":89,"range":{"start_line":88,"start_character":15,"end_line":89,"end_character":10},"updated":"2018-02-14 19:13:23.000000000","message":"Placement doesn\u0027t know anything about Nova aggregates. How will it do that sort of filtering? Or are you sending a list of compute node UUIDs that are members of the agg?","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"03fb659c07fd95c2a6d98e9563d2391336ffc07f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indcating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"Alternatives"},{"line_number":92,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_b99c086b","line":89,"range":{"start_line":88,"start_character":15,"end_line":89,"end_character":10},"in_reply_to":"3fa0c359_26469723","updated":"2018-02-14 20:24:55.000000000","message":"Working on it currently, Ed.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"c9f9639ca50f6659266590fb0773ff8f521ed517","unresolved":false,"context_lines":[{"line_number":85,"context_line":"``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indcating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"Alternatives"},{"line_number":92,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_79ee808c","line":89,"range":{"start_line":88,"start_character":15,"end_line":89,"end_character":10},"in_reply_to":"3fa0c359_39b0f8dd","updated":"2018-02-14 20:34:45.000000000","message":"No need to apologize. Just letting you know I\u0027m currently in process of writing it.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"ae1d93b8da5b4fd5557e2b1285f490f2bd05314f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indcating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"Alternatives"},{"line_number":92,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_26469723","line":89,"range":{"start_line":88,"start_character":15,"end_line":89,"end_character":10},"in_reply_to":"3fa0c359_a3ca9917","updated":"2018-02-14 19:48:43.000000000","message":"\u003e When we do the mirroring of host\n \u003e aggregates to placement these will be enforced as the same\n\nAh, I wasn\u0027t aware that that was planned. Is there a spec for this yet?","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"e59e79b8f1c2102833436119b1121f7f3e11a80f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indcating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"Alternatives"},{"line_number":92,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_39b0f8dd","line":89,"range":{"start_line":88,"start_character":15,"end_line":89,"end_character":10},"in_reply_to":"3fa0c359_b99c086b","updated":"2018-02-14 20:27:16.000000000","message":"Sorry for the noise then. I must have missed the discussion where this change was decided upon. I was still operating under the general understanding that \"Placement aggregates are not Nova aggregates\".","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"877c4ef37db9955e1e8f6f9da35aabf4aeffb681","unresolved":false,"context_lines":[{"line_number":85,"context_line":"``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indcating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"Alternatives"},{"line_number":92,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_a3ca9917","line":89,"range":{"start_line":88,"start_character":15,"end_line":89,"end_character":10},"in_reply_to":"3fa0c359_c39c856c","updated":"2018-02-14 19:25:24.000000000","message":"Nope, sending aggregate uuids. When we do the mirroring of host aggregates to placement these will be enforced as the same, but until that point, they\u0027ll need to be the same uuid. No real sanity comes from having them be non-uniform and with different uuids.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"ba1e82623b5ba2e0282bd7f7ec91d19905cffa27","unresolved":false,"context_lines":[{"line_number":91,"context_line":"Alternatives"},{"line_number":92,"context_line":"------------"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"We could build knowledge of tenant affinity into placement"},{"line_number":95,"context_line":"itself. This would require a less generic change to the API, as well"},{"line_number":96,"context_line":"as require another purpose-built change for the next thing we need"},{"line_number":97,"context_line":"along these lines."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"We could not provide a mechanism for this sort of filtering. This may"},{"line_number":100,"context_line":"result in cellsv1 users not migrating to cellsv2, hamper cellsv2"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_a392994a","line":97,"range":{"start_line":94,"start_character":0,"end_line":97,"end_character":18},"updated":"2018-02-14 19:13:23.000000000","message":"Cell membership is simply another form of affinity. We could do all sorts of affinity modeling in placement with a single approach. On the Nova side, the change would require specifying what type of (anti)affinity, as well as the UUID of the compute node to be used for comparison.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"ae1d93b8da5b4fd5557e2b1285f490f2bd05314f","unresolved":false,"context_lines":[{"line_number":91,"context_line":"Alternatives"},{"line_number":92,"context_line":"------------"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"We could build knowledge of tenant affinity into placement"},{"line_number":95,"context_line":"itself. This would require a less generic change to the API, as well"},{"line_number":96,"context_line":"as require another purpose-built change for the next thing we need"},{"line_number":97,"context_line":"along these lines."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"We could not provide a mechanism for this sort of filtering. This may"},{"line_number":100,"context_line":"result in cellsv1 users not migrating to cellsv2, hamper cellsv2"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_66125f0c","line":97,"range":{"start_line":94,"start_character":0,"end_line":97,"end_character":18},"in_reply_to":"3fa0c359_8393dd00","updated":"2018-02-14 19:48:43.000000000","message":"I meant that if you had a placement agg representing a cell, you would specify \"agg \u003d\u003d cellagg.uuid\", in whatever form we add that to a request.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"877c4ef37db9955e1e8f6f9da35aabf4aeffb681","unresolved":false,"context_lines":[{"line_number":91,"context_line":"Alternatives"},{"line_number":92,"context_line":"------------"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"We could build knowledge of tenant affinity into placement"},{"line_number":95,"context_line":"itself. This would require a less generic change to the API, as well"},{"line_number":96,"context_line":"as require another purpose-built change for the next thing we need"},{"line_number":97,"context_line":"along these lines."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"We could not provide a mechanism for this sort of filtering. This may"},{"line_number":100,"context_line":"result in cellsv1 users not migrating to cellsv2, hamper cellsv2"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_8393dd00","line":97,"range":{"start_line":94,"start_character":0,"end_line":97,"end_character":18},"in_reply_to":"3fa0c359_a392994a","updated":"2018-02-14 19:25:24.000000000","message":"I don\u0027t think I know what you mean here. If I\u0027m booting the first instance in my tenant, I don\u0027t have a compute node or other instance uuid to ask for affinity. Nor do I, as the user, know anything about my assignment into a cell.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"294eaab124767ec3c9a6265a166d0836daf59b4f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"result in cellsv1 users not migrating to cellsv2, hamper cellsv2"},{"line_number":101,"context_line":"adoption in general, or worst-case cause cellsv1 users to migrate away"},{"line_number":102,"context_line":"from nova."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Data model impact"},{"line_number":105,"context_line":"-----------------"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_033a6dcc","line":103,"updated":"2018-02-14 19:02:38.000000000","message":"What about the idea of private flavors for these special tenants where the flavors have required traits on them? That\u0027s already built into nova/placement in queens. Belmiro said they generally restrict tenants to specific cells based on hardware, so I could see having resource providers with certain hardware tagged with those traits, then have associated flavors that require compute nodes with those traits, and restrict those flavors to the tenants.\n\nSo your cheap tenants get the nodes running on cheap hardware, and your HPC megabuck tenants get the fast hardware.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"738f887385a7a0b501cb2594fca810fd6e159209","unresolved":false,"context_lines":[{"line_number":100,"context_line":"result in cellsv1 users not migrating to cellsv2, hamper cellsv2"},{"line_number":101,"context_line":"adoption in general, or worst-case cause cellsv1 users to migrate away"},{"line_number":102,"context_line":"from nova."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Data model impact"},{"line_number":105,"context_line":"-----------------"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_23e20903","line":103,"in_reply_to":"3fa0c359_033a6dcc","updated":"2018-02-14 19:12:09.000000000","message":"That won\u0027t work as nicely for cases (like belmiro\u0027s) where every tenant would need their own private set of flavors. It\u0027s doable, but not as great.\n\nBut yeah, I can add it here as an alternate.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dc4e48f25e9d35fd133463b996994f135498940f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"result in cellsv1 users not migrating to cellsv2, hamper cellsv2"},{"line_number":101,"context_line":"adoption in general, or worst-case cause cellsv1 users to migrate away"},{"line_number":102,"context_line":"from nova."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Data model impact"},{"line_number":105,"context_line":"-----------------"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_e343c1ae","line":103,"in_reply_to":"3fa0c359_23e20903","updated":"2018-02-14 19:20:28.000000000","message":"I agree it would be at least an explosion of flavors which would be a pain in the ass to manage for an admin.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"294eaab124767ec3c9a6265a166d0836daf59b4f","unresolved":false,"context_lines":[{"line_number":105,"context_line":"-----------------"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"The `Destination` object (stored in the `RequestSpec`) will need to"},{"line_number":108,"context_line":"gain an `AggregateList` field. Besides this, no othe data model"},{"line_number":109,"context_line":"changes will be required (`Aggregate` already has metadata for us to"},{"line_number":110,"context_line":"use)."},{"line_number":111,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_236529e2","line":108,"range":{"start_line":108,"start_character":48,"end_line":108,"end_character":52},"updated":"2018-02-14 19:02:38.000000000","message":"other","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"294eaab124767ec3c9a6265a166d0836daf59b4f","unresolved":false,"context_lines":[{"line_number":113,"context_line":"---------------"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"The Nova REST API will not be changed. The placement API will need to"},{"line_number":116,"context_line":"provide for aggregates to be specified in the ``allocation_candidates``"},{"line_number":117,"context_line":"query, which will be handled as part of a different spec."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_8382fd51","line":116,"updated":"2018-02-14 19:02:38.000000000","message":"So will GET /allocation_candidates get a member_of filter that works the same way as the member_of filter on GET /resource_providers?","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"738f887385a7a0b501cb2594fca810fd6e159209","unresolved":false,"context_lines":[{"line_number":113,"context_line":"---------------"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"The Nova REST API will not be changed. The placement API will need to"},{"line_number":116,"context_line":"provide for aggregates to be specified in the ``allocation_candidates``"},{"line_number":117,"context_line":"query, which will be handled as part of a different spec."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"Security impact"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_23cbe972","line":116,"in_reply_to":"3fa0c359_8382fd51","updated":"2018-02-14 19:12:09.000000000","message":"Yeah, in a dependent spec. Jay just isn\u0027t as fast as I am :)","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"294eaab124767ec3c9a6265a166d0836daf59b4f","unresolved":false,"context_lines":[{"line_number":143,"context_line":"No impact to deployers not choosing to enable the"},{"line_number":144,"context_line":"functionality. Direct impact to deployers that need to be able to"},{"line_number":145,"context_line":"isolate tenants into cells (or other aggregates)."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"Developer impact"},{"line_number":148,"context_line":"----------------"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_03726d7d","line":146,"updated":"2018-02-14 19:02:38.000000000","message":"The nova host aggregates have a uuid, and the resource provider aggregates in placement have a uuid, but they are not necessarily the same since nova doesn\u0027t create the aggregates in placement to mirror it\u0027s host aggregates. \n\nSo I\u0027m assuming deployers that do want to leverage this would need to do some tooling to actually mirror the nova host aggregates, and their compute host members, to the compute node resource providers and their aggregates in placement, using the exact same aggregate UUID, otherwise the member_of filtering won\u0027t work.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"738f887385a7a0b501cb2594fca810fd6e159209","unresolved":false,"context_lines":[{"line_number":143,"context_line":"No impact to deployers not choosing to enable the"},{"line_number":144,"context_line":"functionality. Direct impact to deployers that need to be able to"},{"line_number":145,"context_line":"isolate tenants into cells (or other aggregates)."},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"Developer impact"},{"line_number":148,"context_line":"----------------"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_839f5d64","line":146,"in_reply_to":"3fa0c359_03726d7d","updated":"2018-02-14 19:12:09.000000000","message":"I think the plan has been to auto-create host aggregates in placement as the latter is a superset of the former. If that\u0027s not the case yet, then yes, and if it doesn\u0027t materialize then it\u0027ll be manual until it does, yeah.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"294eaab124767ec3c9a6265a166d0836daf59b4f","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"* Unit and functional tests for the filter mechanism, filter itself,"},{"line_number":190,"context_line":"  and the scheduler-to-placement API changes are simple"},{"line_number":191,"context_line":"* A tempest test for multinode jobs will be able to validate both"},{"line_number":192,"context_line":"  host selection and rejection of unmapped tenants"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"Documentation Impact"},{"line_number":195,"context_line":"\u003d\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":2,"id":"3fa0c359_8303ddbe","line":192,"range":{"start_line":191,"start_character":2,"end_line":192,"end_character":50},"updated":"2018-02-14 19:02:38.000000000","message":"We likely don\u0027t even need a tempest test for this, we should be able to handle all of this with in-tree functional tests, since there are no changes to the compute API.\n\nAlso, tempest gets a bit weird when it\u0027s asked to test specific compute scheduler filters (which have to be defined by devstack - so we\u0027d need to configure a CI job for this, likely the nova-next job).","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"738f887385a7a0b501cb2594fca810fd6e159209","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"* Unit and functional tests for the filter mechanism, filter itself,"},{"line_number":190,"context_line":"  and the scheduler-to-placement API changes are simple"},{"line_number":191,"context_line":"* A tempest test for multinode jobs will be able to validate both"},{"line_number":192,"context_line":"  host selection and rejection of unmapped tenants"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"Documentation Impact"},{"line_number":195,"context_line":"\u003d\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":2,"id":"3fa0c359_8388bd22","line":192,"range":{"start_line":191,"start_character":2,"end_line":192,"end_character":50},"in_reply_to":"3fa0c359_8303ddbe","updated":"2018-02-14 19:12:09.000000000","message":"Yeah, happy to not do this, hence the first bullet. I\u0027ll remove it for now.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"294eaab124767ec3c9a6265a166d0836daf59b4f","unresolved":false,"context_lines":[{"line_number":194,"context_line":"Documentation Impact"},{"line_number":195,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"Yeah."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"References"},{"line_number":200,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_03f7cdd6","line":197,"updated":"2018-02-14 19:02:38.000000000","message":"Probably at least two things here:\n\n1. Placement API reference for GET /allocation_candidates.\n\n2. Compute scheduler admin guide: https://docs.openstack.org/nova/latest/admin/configuration/schedulers.html","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a29af5546c0d8f7664a9de1211b598ca4e1ac665","unresolved":false,"context_lines":[{"line_number":194,"context_line":"Documentation Impact"},{"line_number":195,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"Yeah."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"References"},{"line_number":200,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3fa0c359_635fb172","line":197,"in_reply_to":"3fa0c359_03f7cdd6","updated":"2018-02-14 19:22:49.000000000","message":"#1 will be covered in Jay\u0027s spec to add that API.","commit_id":"a7ee5dc238db41096daf9959e3f3d60b9b862548"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0d4db4c16cfac3746587ee78f13ca98c04002c5c","unresolved":false,"context_lines":[{"line_number":74,"context_line":"filter will be provided and enabled by a single boolean configuration"},{"line_number":75,"context_line":"knob in the ``scheduler`` group. When enabled, this filter will:"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":" #. Look for aggregates with metadata items of"},{"line_number":78,"context_line":"    `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":79,"context_line":" #. Augment the `RequestSpec` object to indicate that the result"},{"line_number":80,"context_line":"    should be limited to the matching aggregates"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3fa0c359_063a7bcc","line":77,"range":{"start_line":77,"start_character":0,"end_line":77,"end_character":1},"updated":"2018-02-14 19:35:49.000000000","message":"Remove the spaces here, it causes a double indent.","commit_id":"6d98cd95b1c9c0eabbed87f004be40e9da199b5b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a4533ea32667478fe1ab89f94f934cfce4755a23","unresolved":false,"context_lines":[{"line_number":209,"context_line":"Documentation Impact"},{"line_number":210,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"*. Compute scheduler admin guide updates to describe the setup and use"},{"line_number":213,"context_line":"   of this feature"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3fa0c359_c3056516","line":212,"range":{"start_line":212,"start_character":1,"end_line":212,"end_character":2},"updated":"2018-02-14 19:33:41.000000000","message":"You don\u0027t need this, it breaks the docs build.","commit_id":"6d98cd95b1c9c0eabbed87f004be40e9da199b5b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"cfd43097539730a09e48acde3c74dfd3841720b7","unresolved":false,"context_lines":[{"line_number":209,"context_line":"Documentation Impact"},{"line_number":210,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"*. Compute scheduler admin guide updates to describe the setup and use"},{"line_number":213,"context_line":"   of this feature"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3fa0c359_c63333f6","line":212,"range":{"start_line":212,"start_character":1,"end_line":212,"end_character":2},"in_reply_to":"3fa0c359_c3056516","updated":"2018-02-14 19:35:59.000000000","message":"Oops, started that off as a #","commit_id":"6d98cd95b1c9c0eabbed87f004be40e9da199b5b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5161bc1bd2ad38aa5d8c8e959a52f8aecbdf9e30","unresolved":false,"context_lines":[{"line_number":43,"context_line":"Although not covered by this spec directly, the mechanism added here"},{"line_number":44,"context_line":"would enable other such request-limiting filters in the future. For"},{"line_number":45,"context_line":"example, such a filter could identify boot-from-volume requests and"},{"line_number":46,"context_line":"always add in a trait to limit those instances to hosts with that"},{"line_number":47,"context_line":"trait."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"Use Cases"},{"line_number":50,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_9917cca4","line":47,"range":{"start_line":46,"start_character":16,"end_line":47,"end_character":6},"updated":"2018-02-14 20:53:39.000000000","message":"The mention of traits here seems out of place.  The spec talks about implementing these filters via aggregates.  And in fact explicitly calls out traits as the wrong way to do things (in Alternatives).","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"bec77988bfdfa952b13b2a60ff7674c80cc73172","unresolved":false,"context_lines":[{"line_number":43,"context_line":"Although not covered by this spec directly, the mechanism added here"},{"line_number":44,"context_line":"would enable other such request-limiting filters in the future. For"},{"line_number":45,"context_line":"example, such a filter could identify boot-from-volume requests and"},{"line_number":46,"context_line":"always add in a trait to limit those instances to hosts with that"},{"line_number":47,"context_line":"trait."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"Use Cases"},{"line_number":50,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_bc75d634","line":47,"range":{"start_line":46,"start_character":16,"end_line":47,"end_character":6},"in_reply_to":"3fa0c359_9917cca4","updated":"2018-02-14 21:16:03.000000000","message":"Right, so this spec is about the general \"request filter\" construct, as well as using that construct to limit tenants by aggregate.\n\nOther things that fit into the \"augment the request before it goes to placement\" bucket are \"add a trait for BFV requests\", etc.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5161bc1bd2ad38aa5d8c8e959a52f8aecbdf9e30","unresolved":false,"context_lines":[{"line_number":74,"context_line":"filter will be provided and enabled by a single boolean configuration"},{"line_number":75,"context_line":"knob in the ``scheduler`` group. When enabled, this filter will:"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"#. Look for aggregates with metadata items of"},{"line_number":78,"context_line":"   `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":79,"context_line":"#. Augment the `RequestSpec` object to indicate that the result"},{"line_number":80,"context_line":"   should be limited to the matching aggregates"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_193c1cbe","line":77,"range":{"start_line":77,"start_character":12,"end_line":77,"end_character":22},"updated":"2018-02-14 20:53:39.000000000","message":"This is a \u0027host aggregate\u0027? As opposed to a placement aggregate?","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"bec77988bfdfa952b13b2a60ff7674c80cc73172","unresolved":false,"context_lines":[{"line_number":74,"context_line":"filter will be provided and enabled by a single boolean configuration"},{"line_number":75,"context_line":"knob in the ``scheduler`` group. When enabled, this filter will:"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"#. Look for aggregates with metadata items of"},{"line_number":78,"context_line":"   `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":79,"context_line":"#. Augment the `RequestSpec` object to indicate that the result"},{"line_number":80,"context_line":"   should be limited to the matching aggregates"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_7c8d0e29","line":77,"range":{"start_line":77,"start_character":12,"end_line":77,"end_character":22},"in_reply_to":"3fa0c359_193c1cbe","updated":"2018-02-14 21:16:03.000000000","message":"Yep.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"18b867f3bf4f44ea2dc7d9b5a0104d8723a688be","unresolved":false,"context_lines":[{"line_number":77,"context_line":"#. Look for aggregates with metadata items of"},{"line_number":78,"context_line":"   `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":79,"context_line":"#. Augment the `RequestSpec` object to indicate that the result"},{"line_number":80,"context_line":"   should be limited to the matching aggregates"},{"line_number":81,"context_line":"#. Fail if no aggregates match"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"To make this work, we will need to extend the"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_e6ebcfd9","line":80,"range":{"start_line":80,"start_character":28,"end_line":80,"end_character":47},"updated":"2018-02-14 19:52:01.000000000","message":"Can placement be made to do this for? I feel like it would be its responsibility - ie, we just ask for \"I want X, Y and Z for tenant Alpha\" and it comes back with \"Here you go\". Aggregates could be \"resource providers\" for tenants.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"19163de3935105daa911a3550115595baca84e90","unresolved":false,"context_lines":[{"line_number":84,"context_line":"``RequestSpec.destination`` to contain an ``aggregates`` field, peer"},{"line_number":85,"context_line":"to the ``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indicating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates. The aggregate metadata key used here"},{"line_number":90,"context_line":"(``filter_tenant_id``) is the same as the one used by the"},{"line_number":91,"context_line":"AggregateMultiTenancyIsolation scheduler filter to accomplish the same"},{"line_number":92,"context_line":"thing via filtering. As such, existing users of that filter will be"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_f702970b","line":89,"range":{"start_line":87,"start_character":33,"end_line":89,"end_character":10},"updated":"2018-02-14 22:13:55.000000000","message":"Just making sure that I understood this correctly - So the concept of nova host aggregates will be taught/introduced to placement in the future and using that placement will have the brains to decide this ?","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"74da5e645aa0289ea0f6e61fbfab0b5acb894d55","unresolved":false,"context_lines":[{"line_number":84,"context_line":"``RequestSpec.destination`` to contain an ``aggregates`` field, peer"},{"line_number":85,"context_line":"to the ``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"},{"line_number":88,"context_line":"indicating that the resulting nodes must be members of one of those"},{"line_number":89,"context_line":"aggregates. The aggregate metadata key used here"},{"line_number":90,"context_line":"(``filter_tenant_id``) is the same as the one used by the"},{"line_number":91,"context_line":"AggregateMultiTenancyIsolation scheduler filter to accomplish the same"},{"line_number":92,"context_line":"thing via filtering. As such, existing users of that filter will be"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_b2cadd17","line":89,"range":{"start_line":87,"start_character":33,"end_line":89,"end_character":10},"in_reply_to":"3fa0c359_f702970b","updated":"2018-02-14 22:48:11.000000000","message":"Jay Pipes is going to be working on a spec that proposes nova synchronizing the host aggregates with placement so this all works automatically and operators don\u0027t have to do the mirror outside of nova.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5161bc1bd2ad38aa5d8c8e959a52f8aecbdf9e30","unresolved":false,"context_lines":[{"line_number":93,"context_line":"able to easily convert to this request filter approach which will be"},{"line_number":94,"context_line":"more efficient as well."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"This depends on placement aggregates overlaying with host aggregates"},{"line_number":97,"context_line":"configured with this key. Mirroring of those aggregates has been"},{"line_number":98,"context_line":"planned to happen automatically in nova, but this functionality will"},{"line_number":99,"context_line":"work with manual aggregate setup until that point and would only be"},{"line_number":100,"context_line":"required by deployers wishing to use this feature."}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_59eaa4ac","line":97,"range":{"start_line":96,"start_character":0,"end_line":97,"end_character":25},"updated":"2018-02-14 20:53:39.000000000","message":"Suggest moving this paragraph way earlier, and then being explicit about which aggregates you\u0027re talking about any time you mention them.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"bec77988bfdfa952b13b2a60ff7674c80cc73172","unresolved":false,"context_lines":[{"line_number":93,"context_line":"able to easily convert to this request filter approach which will be"},{"line_number":94,"context_line":"more efficient as well."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"This depends on placement aggregates overlaying with host aggregates"},{"line_number":97,"context_line":"configured with this key. Mirroring of those aggregates has been"},{"line_number":98,"context_line":"planned to happen automatically in nova, but this functionality will"},{"line_number":99,"context_line":"work with manual aggregate setup until that point and would only be"},{"line_number":100,"context_line":"required by deployers wishing to use this feature."}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_5c9cd25c","line":97,"range":{"start_line":96,"start_character":0,"end_line":97,"end_character":25},"in_reply_to":"3fa0c359_59eaa4ac","updated":"2018-02-14 21:16:03.000000000","message":"Well, there\u0027s another spec coming for that mirroring, but I\u0027ll try.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"18b867f3bf4f44ea2dc7d9b5a0104d8723a688be","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Alternatives"},{"line_number":103,"context_line":"------------"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"We could build knowledge of tenant affinity into placement"},{"line_number":106,"context_line":"itself. This would require a less generic change to the API, as well"},{"line_number":107,"context_line":"as require another purpose-built change for the next thing we need"},{"line_number":108,"context_line":"along these lines."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"We could not provide a mechanism for this sort of filtering. This may"},{"line_number":111,"context_line":"result in cellsv1 users not migrating to cellsv2, hamper cellsv2"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_869f6b64","line":108,"range":{"start_line":105,"start_character":0,"end_line":108,"end_character":18},"updated":"2018-02-14 19:52:01.000000000","message":"Ah, I see you\u0027ve covered my previous thought here. Honestly, I can\u0027t comment with much authority on this, not until I read placement\u0027s api-ref or something.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d543007f8822d2dfef92acfd1ae20d3f69b828bd","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Alternatives"},{"line_number":103,"context_line":"------------"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"We could build knowledge of tenant affinity into placement"},{"line_number":106,"context_line":"itself. This would require a less generic change to the API, as well"},{"line_number":107,"context_line":"as require another purpose-built change for the next thing we need"},{"line_number":108,"context_line":"along these lines."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"We could not provide a mechanism for this sort of filtering. This may"},{"line_number":111,"context_line":"result in cellsv1 users not migrating to cellsv2, hamper cellsv2"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_19f41ccf","line":108,"range":{"start_line":105,"start_character":0,"end_line":108,"end_character":18},"in_reply_to":"3fa0c359_06cfdb57","updated":"2018-02-14 20:21:05.000000000","message":"Yeah, I just feel like we\u0027ll end up with scheduler filters all over again, and then we\u0027ll make Placement V2 ;)\n\nDon\u0027t think I have anything better to offer though, so this is all just open ended hypothetical thoughts.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aeeb9ce466120e02a84092bdc58cb2f8e60e3b11","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Alternatives"},{"line_number":103,"context_line":"------------"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"We could build knowledge of tenant affinity into placement"},{"line_number":106,"context_line":"itself. This would require a less generic change to the API, as well"},{"line_number":107,"context_line":"as require another purpose-built change for the next thing we need"},{"line_number":108,"context_line":"along these lines."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"We could not provide a mechanism for this sort of filtering. This may"},{"line_number":111,"context_line":"result in cellsv1 users not migrating to cellsv2, hamper cellsv2"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_99a4acbb","line":108,"range":{"start_line":105,"start_character":0,"end_line":108,"end_character":18},"in_reply_to":"3fa0c359_19f41ccf","updated":"2018-02-14 20:24:01.000000000","message":"This is really a much different thing than scheduler filters. Scheduler filters operate on hosts, and thus performance scales inversely to the number of hosts. The request filter thing I\u0027m discussing here operates on a request. And, we\u0027re speaking to placement about data structures that placement already supports and deals with, this is just about refining what we ask placement for. Right now we ask it pretty dumb questions, even though we have the ability to ask it smarter ones.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f634ff2a41d3a3d6364c433e8a183bae4b44e9b0","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Alternatives"},{"line_number":103,"context_line":"------------"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"We could build knowledge of tenant affinity into placement"},{"line_number":106,"context_line":"itself. This would require a less generic change to the API, as well"},{"line_number":107,"context_line":"as require another purpose-built change for the next thing we need"},{"line_number":108,"context_line":"along these lines."},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"We could not provide a mechanism for this sort of filtering. This may"},{"line_number":111,"context_line":"result in cellsv1 users not migrating to cellsv2, hamper cellsv2"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_06cfdb57","line":108,"range":{"start_line":105,"start_character":0,"end_line":108,"end_character":18},"in_reply_to":"3fa0c359_869f6b64","updated":"2018-02-14 19:57:38.000000000","message":"Yeah, and teaching placement about a tenant-to-placement mapping would address the one situation we\u0027re talking about here, but not the other one from L43 and not the one Matt wants for multiattach. So, this generic mechanism provides us a solution for all three, and it keeps placement further out of things nova needs and more in the generic space.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5161bc1bd2ad38aa5d8c8e959a52f8aecbdf9e30","unresolved":false,"context_lines":[{"line_number":116,"context_line":"flavors with trait requirements to control scheduling. This would"},{"line_number":117,"context_line":"result in a flavor explosion (aka `The Skittles(tm) Effect`) for cases"},{"line_number":118,"context_line":"like the one driving this, where all tenants would need their own"},{"line_number":119,"context_line":"flavors."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"Data model impact"},{"line_number":122,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_5c0cd23a","line":119,"updated":"2018-02-14 20:53:39.000000000","message":"This isn\u0027t the only way traits could be used to solve this class of problem.  Another alternative which should be included/considered:\n\nMirror host aggregates (tenant membership, boot-from-volume-ness, or whatever) as traits on the compute RP, but add the trait to the allocation candidate request based on the RequestSpec datum (which can be more or less the same as you\u0027ve suggested herein) rather than requiring it to come from the flavor.\n\nThis approach has the benefit of no need to change the placement API.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"bec77988bfdfa952b13b2a60ff7674c80cc73172","unresolved":false,"context_lines":[{"line_number":116,"context_line":"flavors with trait requirements to control scheduling. This would"},{"line_number":117,"context_line":"result in a flavor explosion (aka `The Skittles(tm) Effect`) for cases"},{"line_number":118,"context_line":"like the one driving this, where all tenants would need their own"},{"line_number":119,"context_line":"flavors."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"Data model impact"},{"line_number":122,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_5cb5b2cc","line":119,"in_reply_to":"3fa0c359_5c0cd23a","updated":"2018-02-14 21:16:03.000000000","message":"Traits to solve the tenant isolation problem is the wrong thing, IMHO, because it means bulk adding traits to large swaths of compute nodes, which is what aggregates (host or placement) is for.\n\nThe placement API deals with aggregates already, and allocation_candidates should allow us to limit to an aggregate _anyway_. If we have information about ways to limit unusable results from that query to placement, we should provide it. As noted here, flavors per tenant, for all tenants, is not a reasonable solution to the tenant isolation problem.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"19163de3935105daa911a3550115595baca84e90","unresolved":false,"context_lines":[{"line_number":116,"context_line":"flavors with trait requirements to control scheduling. This would"},{"line_number":117,"context_line":"result in a flavor explosion (aka `The Skittles(tm) Effect`) for cases"},{"line_number":118,"context_line":"like the one driving this, where all tenants would need their own"},{"line_number":119,"context_line":"flavors."},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"Data model impact"},{"line_number":122,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_bc571627","line":119,"in_reply_to":"3fa0c359_5cb5b2cc","updated":"2018-02-14 22:13:55.000000000","message":"\u003e  As\n \u003e noted here, flavors per tenant, for all tenants, is not a\n \u003e reasonable solution to the tenant isolation problem.\n\n+1","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5161bc1bd2ad38aa5d8c8e959a52f8aecbdf9e30","unresolved":false,"context_lines":[{"line_number":197,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"* This will require adding aggregate membership to"},{"line_number":200,"context_line":"  the `allocation_candidates` API"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"Testing"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_792f60a7","line":200,"updated":"2018-02-14 20:53:39.000000000","message":"That spec should be proposed and linked here before this one merges, please.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"bec77988bfdfa952b13b2a60ff7674c80cc73172","unresolved":false,"context_lines":[{"line_number":197,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"* This will require adding aggregate membership to"},{"line_number":200,"context_line":"  the `allocation_candidates` API"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"Testing"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3fa0c359_7cdbce20","line":200,"in_reply_to":"3fa0c359_792f60a7","updated":"2018-02-14 21:16:03.000000000","message":"It doesn\u0027t exist yet, but sure.","commit_id":"7faf7a5a3b1f0750e863525547c8ab4265eba753"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7e6b0a45754d9a31e951285ac18d3412e8ed9bad","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"This spec specifically addresses one such concern of existing cellsv1"},{"line_number":21,"context_line":"users, but represents a class of problems that center around a need to"},{"line_number":22,"context_line":"make a more efficient request to placement than one purely based on"},{"line_number":23,"context_line":"the resources and traits implied by the flavor the user has"},{"line_number":24,"context_line":"chosen. Thus while a solution to this single problem is the goal of"},{"line_number":25,"context_line":"the implementation described here, we aim to provide a generic"},{"line_number":26,"context_line":"mechanism for solving those other problems along the way."},{"line_number":27,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_f4a83cdc","line":24,"range":{"start_line":22,"start_character":43,"end_line":24,"end_character":7},"updated":"2018-02-15 16:50:33.000000000","message":"TBC, that spec proposes a mechanism that will allow the scheduler to make calls to Placement by asking more than just resources or traits, but will anyway be tied by what Placement provides.\n\nThe purpose of that spec is not to introduce more complex objects or logic in Placement, but rather have a flexible way to express a query.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2daa0e3a80dd0b3d8ba3d187b5ed22a212e56b19","unresolved":false,"context_lines":[{"line_number":29,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"With cellsv1, some deployments use the top-level filtering cell"},{"line_number":32,"context_line":"scheduler to pre-select a cell based soley on the tenant of the"},{"line_number":33,"context_line":"user making the request. This then limits the amount of work"},{"line_number":34,"context_line":"(i.e. hosts that must be filtered) that the scheduler within the cell"},{"line_number":35,"context_line":"must do in order to make a selection. With the global nature of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_7aec15f3","line":32,"range":{"start_line":32,"start_character":37,"end_line":32,"end_character":42},"updated":"2018-02-15 17:58:27.000000000","message":"solely","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7e6b0a45754d9a31e951285ac18d3412e8ed9bad","unresolved":false,"context_lines":[{"line_number":34,"context_line":"(i.e. hosts that must be filtered) that the scheduler within the cell"},{"line_number":35,"context_line":"must do in order to make a selection. With the global nature of"},{"line_number":36,"context_line":"cellsv2\u0027s scheduler and placement scope, this is not currently"},{"line_number":37,"context_line":"possible. Thus, for a cloud with a large amount of free space, a"},{"line_number":38,"context_line":"modest request that previously only considered ~200 hosts within a"},{"line_number":39,"context_line":"cell (due to pre-selection of a cell by tenant) may now have to filter"},{"line_number":40,"context_line":"many thousands of hosts in order to make a selection, most of which"},{"line_number":41,"context_line":"are categorically not valid based on the tenant mapping."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Use Cases"},{"line_number":44,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_74318cec","line":41,"range":{"start_line":37,"start_character":10,"end_line":41,"end_character":56},"updated":"2018-02-15 16:50:33.000000000","message":"Yeah, that is the *real* problem needing that spec to solve it. We could end up doing all the filtering post-placement but given the limit we have by getting results from Placement, having a mechanism that would refine the Placement results on a large cloud is sometimes crucial.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7e6b0a45754d9a31e951285ac18d3412e8ed9bad","unresolved":false,"context_lines":[{"line_number":44,"context_line":"---------"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"As a deployer, I wish to segregate users into cells for technical,"},{"line_number":47,"context_line":"security, or budget reasons and need efficient scheduling of the"},{"line_number":48,"context_line":"resources within those cells."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_f49cbc5e","line":47,"range":{"start_line":47,"start_character":37,"end_line":47,"end_character":57},"updated":"2018-02-15 16:50:33.000000000","message":"one could argue that the efficiency could be achieved by having a regular scheduler filter that would do my cell segregation, but since Placement only returns a subset of the result, it\u0027s not efficient anyway (as I would have to get a larger subset of the result in order to make sure I won\u0027t get NoValidHosts).","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7e6b0a45754d9a31e951285ac18d3412e8ed9bad","unresolved":false,"context_lines":[{"line_number":50,"context_line":"Proposed change"},{"line_number":51,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"This spec aims to add a small and lightweight mechanism to the early"},{"line_number":54,"context_line":"phase of the scheduling process, where the request to placement is"},{"line_number":55,"context_line":"formed from things like the flavor selected by the user. It should"},{"line_number":56,"context_line":"provide us a way to opt in to certain behaviors, represented by simple"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_d4b0a0e0","line":53,"range":{"start_line":53,"start_character":24,"end_line":53,"end_character":55},"updated":"2018-02-15 16:50:33.000000000","message":"but absolutely not pluggable, by opposition to the fact we have the possibility to have custom filters.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7e6b0a45754d9a31e951285ac18d3412e8ed9bad","unresolved":false,"context_lines":[{"line_number":54,"context_line":"phase of the scheduling process, where the request to placement is"},{"line_number":55,"context_line":"formed from things like the flavor selected by the user. It should"},{"line_number":56,"context_line":"provide us a way to opt in to certain behaviors, represented by simple"},{"line_number":57,"context_line":"modular transformations made to the `RequestSpec` object before we"},{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_340a248a","line":58,"range":{"start_line":57,"start_character":64,"end_line":58,"end_character":16},"updated":"2018-02-15 16:50:33.000000000","message":"since that mechanism is tied to what the Placement API exposes, that necessarly has to stay a non-pluggable and versioned mechanism that would handle Placement API microversions, not something an operator could use or implement.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7e6b0a45754d9a31e951285ac18d3412e8ed9bad","unresolved":false,"context_lines":[{"line_number":57,"context_line":"modular transformations made to the `RequestSpec` object before we"},{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_147848f6","line":60,"range":{"start_line":60,"start_character":30,"end_line":60,"end_character":46},"updated":"2018-02-15 16:50:33.000000000","message":"I don\u0027t want to argue on the wording, but since \"filters\" stand for \"scheduler filters\", could we avoid the term \"filters\" and rather use another word, like \"request strain\" ?","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c49a8d877395c562b43af25e4ab3af152cb2b540","unresolved":false,"context_lines":[{"line_number":57,"context_line":"modular transformations made to the `RequestSpec` object before we"},{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_ef9ce95e","line":60,"range":{"start_line":60,"start_character":30,"end_line":60,"end_character":46},"in_reply_to":"3fa0c359_147848f6","updated":"2018-02-15 17:13:21.000000000","message":"That sounds like a deadly virus...","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"de3793c94e81b1026c4fabfd1c8e5ada406d1ae4","unresolved":false,"context_lines":[{"line_number":57,"context_line":"modular transformations made to the `RequestSpec` object before we"},{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_1a2ab1e6","line":60,"range":{"start_line":60,"start_character":30,"end_line":60,"end_character":46},"in_reply_to":"3fa0c359_ef7069df","updated":"2018-02-15 17:56:57.000000000","message":"We can, although that doesn\u0027t sound as nice to me.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ce11588a8cfd42d273f3b23ddce27898b219a157","unresolved":false,"context_lines":[{"line_number":57,"context_line":"modular transformations made to the `RequestSpec` object before we"},{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_cf6b2def","line":60,"range":{"start_line":60,"start_character":30,"end_line":60,"end_character":46},"in_reply_to":"3fa0c359_ef9ce95e","updated":"2018-02-15 17:22:15.000000000","message":"Anyway, nevermind the above, I feel that we should just see if operators are confused or not, and just amend that if needed. \nAfter all, for operators, it\u0027s just a config option name, right?","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4ec96b61249a392a4e2f0f4ecfe060eebef3bacd","unresolved":false,"context_lines":[{"line_number":57,"context_line":"modular transformations made to the `RequestSpec` object before we"},{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_ef7069df","line":60,"range":{"start_line":60,"start_character":30,"end_line":60,"end_character":46},"in_reply_to":"3fa0c359_ef9ce95e","updated":"2018-02-15 17:45:49.000000000","message":"If this do transformation on the request, can we call it request transformer or request transformation?","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7e6b0a45754d9a31e951285ac18d3412e8ed9bad","unresolved":false,"context_lines":[{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_f45fdc6f","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":43},"updated":"2018-02-15 16:50:33.000000000","message":"do we consider that the augmented RequestSpec object will be persisted ? That has some important in the context of having a move operation that can happen later. \n\nI think we somehow need to be clear whether we accept those changes to be persisted or not.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c0b685819703c939324784d23c2c83d92a9168d4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_4f471dbe","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":43},"in_reply_to":"3fa0c359_2f8e512e","updated":"2018-02-15 17:18:00.000000000","message":"Yeah, or if the instance exists. I thought about passing more into the filter to indicate more context, but for the moment I think being simple is a virtue, and when we get to a filter that needs more context we can address it then.\n\nFor the filter I\u0027m adding here, recalculating the aggregate for a tenant on reschedule makes sense (IMHO) in case it has changed, and we don\u0027t have to do anything different for that case.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4ec96b61249a392a4e2f0f4ecfe060eebef3bacd","unresolved":false,"context_lines":[{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_8f23e5be","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":43},"in_reply_to":"3fa0c359_4f471dbe","updated":"2018-02-15 17:45:49.000000000","message":"Do we persist the result of the transformations? I.e. the final RequestSpec object after every transformation was run or we persist the original RequestSpec object and a list of transformations that needs to be run if re-calculation is needed?","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"ce11588a8cfd42d273f3b23ddce27898b219a157","unresolved":false,"context_lines":[{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_8f8765b7","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":43},"in_reply_to":"3fa0c359_4f471dbe","updated":"2018-02-15 17:22:15.000000000","message":"There is no way to know whether it\u0027s a reschedule or just a single boot (and I think we should never implement that). If we care about stale data, then the simple solution is to *always* recalculate the values and set the field accordingly, without looking up the old value, that\u0027s it.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"de3793c94e81b1026c4fabfd1c8e5ada406d1ae4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_ba237d05","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":43},"in_reply_to":"3fa0c359_8f23e5be","updated":"2018-02-15 17:56:57.000000000","message":"I think we should transform the requestspec and then persist the result. Keeping track of a virgin one either before or after the transformation seems unnecessarily complex to me. Do you have an argument/opinion either way?","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"78c9da9cdd60e12bec4783b8963a8d048ed36954","unresolved":false,"context_lines":[{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_ef3e29d9","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":43},"in_reply_to":"3fa0c359_8f8765b7","updated":"2018-02-15 17:25:25.000000000","message":"Sure there is, the RequestSpec.retry field gets populated on reschedules. It\u0027s not, however, properly cleaned up:\n\nhttps://review.openstack.org/#/c/505771/","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bca400637104658223ddba3e1037c60d08369125","unresolved":false,"context_lines":[{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_2f8e512e","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":43},"in_reply_to":"3fa0c359_af0ee12f","updated":"2018-02-15 17:09:57.000000000","message":"\u003e I think we should persist the changes, yeah. Then each filter, when\n \u003e re-run on a migration or something, would be able to look at the\n \u003e persisted data, and either re-use it or recalculate it depending on\n \u003e the context and intent of the filter.\n\nPlaying devil\u0027s advocate, how would the request filter know if it\u0027s a reschedule? I guess if the RequestSpec field is populated...","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b3d9c1f13d5518b6c5ba89a5014c0f71598f020e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"make the request to placement."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"These modules will be called \"request filters\" and will perform"},{"line_number":61,"context_line":"transformations on the `RequestSpec` object. They will be enabled"},{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_af0ee12f","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":43},"in_reply_to":"3fa0c359_f45fdc6f","updated":"2018-02-15 16:54:27.000000000","message":"I think we should persist the changes, yeah. Then each filter, when re-run on a migration or something, would be able to look at the persisted data, and either re-use it or recalculate it depending on the context and intent of the filter.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7e6b0a45754d9a31e951285ac18d3412e8ed9bad","unresolved":false,"context_lines":[{"line_number":62,"context_line":"initially through dedicated configuration variables (ideally boolean)"},{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"},{"line_number":65,"context_line":"configuration paradigm, like our existing scheduler filters."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"For the tenant-to-cell limiting functionality, a single new request"},{"line_number":68,"context_line":"filter will be provided and enabled by a single boolean configuration"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_744bccaf","line":65,"updated":"2018-02-15 16:50:33.000000000","message":"yup, maybe just don\u0027t wait for that and start with a ListOpt from the beginning ? Either way, implementation detail.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4ec96b61249a392a4e2f0f4ecfe060eebef3bacd","unresolved":false,"context_lines":[{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"},{"line_number":65,"context_line":"configuration paradigm, like our existing scheduler filters."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"For the tenant-to-cell limiting functionality, a single new request"},{"line_number":68,"context_line":"filter will be provided and enabled by a single boolean configuration"},{"line_number":69,"context_line":"knob in the ``scheduler`` group. When enabled, this filter will:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_1ad2b135","line":66,"updated":"2018-02-15 17:45:49.000000000","message":"Instead of transforming the RequestSpec we could insert the transformers into the get_allocation_candidates() call path and let them transform how the allocation_candidate request is formed. This way we could force the author of the request filter to express the needed transformation in Placement terms (using features from the Placement API) instead of Nova terms (i.e. writing changes to the RequestSpec). I think this could lead to cleaner transformations. In the other hand this would mean that the result of the request filter cannot be persisted in the RequestSpec (as that would not be changed) but need to be recalculated at every get_allocation_candidates() call. \n\nThis would also remove the behavior split of the request filter. In the current proposal a request-filter would impact the RequestSpec (by changing it) and would impact the get_allocation_candidates() call to make sure the changes on the RequestSpec are considered when the allocation candidate request is formed. Moving the whole transformation to the get_allocation_candidates call path would allow better encapsulation of this behavior.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"de3793c94e81b1026c4fabfd1c8e5ada406d1ae4","unresolved":false,"context_lines":[{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"},{"line_number":65,"context_line":"configuration paradigm, like our existing scheduler filters."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"For the tenant-to-cell limiting functionality, a single new request"},{"line_number":68,"context_line":"filter will be provided and enabled by a single boolean configuration"},{"line_number":69,"context_line":"knob in the ``scheduler`` group. When enabled, this filter will:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_9ab0018e","line":66,"in_reply_to":"3fa0c359_1ad2b135","updated":"2018-02-15 17:56:57.000000000","message":"Hmm, I see your point, but I\u0027m not sure I want to interface at that layer. I want the scheduler to be able to express a request to placement, however that request is created (either because a flavor asked for a trait, or because one of these filters implied a request for one). I think it would be harder to reason and debug about transformations made between what the scheduler was asking for and what the actual request to placement was.\n\nAlso, get_allocation_candidates() doesn\u0027t really have enough information for us to be able to do some of the things we want to do in the filter described by this spec and the other ones highlighted as good use-cases. For this one, we need to know tenant information, and for the BFV example we need to examine information about the nova request to know if they asked for a BFV instance or not. Similar for the multi-attach case.\n\nI guess what I\u0027m saying is, I don\u0027t want this to be a placement-focused filter, but a request-focused one. That request is the request to nova, which turns into the thing we ask placement for.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"174b8c4441e2ad05f1d63d38b8408736e37ce770","unresolved":false,"context_lines":[{"line_number":63,"context_line":"in the short term for the sake of simplicity. As we grow more of"},{"line_number":64,"context_line":"these, it may make sense to enable a list-of-request-filters sort of"},{"line_number":65,"context_line":"configuration paradigm, like our existing scheduler filters."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"For the tenant-to-cell limiting functionality, a single new request"},{"line_number":68,"context_line":"filter will be provided and enabled by a single boolean configuration"},{"line_number":69,"context_line":"knob in the ``scheduler`` group. When enabled, this filter will:"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_55e56a37","line":66,"in_reply_to":"3fa0c359_9ab0018e","updated":"2018-02-15 18:08:36.000000000","message":"Thanks for the explanation. I think I missed how much nova specific information these request filters are needed. So these will depend on nova internals anyhow.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":2033,"name":"Belmiro Moreira","email":"moreira.belmiro.email.lists@gmail.com","username":"moreira-belmiro-email-lists"},"change_message_id":"b151b65af592b12ebcf12030bd79bffdbfc394aa","unresolved":false,"context_lines":[{"line_number":69,"context_line":"knob in the ``scheduler`` group. When enabled, this filter will:"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"#. Look for host aggregates with metadata items of"},{"line_number":72,"context_line":"   `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":73,"context_line":"#. Augment the `RequestSpec` object to indicate that the result"},{"line_number":74,"context_line":"   should be limited to the matching aggregates"},{"line_number":75,"context_line":"#. Fail if no aggregates match"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_d4cae09f","line":72,"range":{"start_line":72,"start_character":21,"end_line":72,"end_character":28},"updated":"2018-02-15 22:11:11.000000000","message":"Needs to be a list of tenants otherwise for each tenant a new aggregate needs to be defined with the same nodes (cell).","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3313e298aff113d08926e76f6d9b9680afd41d8b","unresolved":false,"context_lines":[{"line_number":69,"context_line":"knob in the ``scheduler`` group. When enabled, this filter will:"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"#. Look for host aggregates with metadata items of"},{"line_number":72,"context_line":"   `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":73,"context_line":"#. Augment the `RequestSpec` object to indicate that the result"},{"line_number":74,"context_line":"   should be limited to the matching aggregates"},{"line_number":75,"context_line":"#. Fail if no aggregates match"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_1b8e302e","line":72,"range":{"start_line":72,"start_character":21,"end_line":72,"end_character":28},"in_reply_to":"3fa0c359_d4cae09f","updated":"2018-02-15 22:20:22.000000000","message":"Well, these values are limited to 255 chars, so we need some other way to handle that I think. Let\u0027s continue that discussion here:\n\nhttps://review.openstack.org/#/c/545002/","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4ec96b61249a392a4e2f0f4ecfe060eebef3bacd","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"#. Look for host aggregates with metadata items of"},{"line_number":72,"context_line":"   `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":73,"context_line":"#. Augment the `RequestSpec` object to indicate that the result"},{"line_number":74,"context_line":"   should be limited to the matching aggregates"},{"line_number":75,"context_line":"#. Fail if no aggregates match"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"This depends on placement aggregates overlaying with host aggregates"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_5a49195e","line":74,"range":{"start_line":73,"start_character":0,"end_line":74,"end_character":47},"updated":"2018-02-15 17:45:49.000000000","message":"What augmentation is allowed to be done from a request filter? Can it change everything on the RequestSpec or there will be some rules to follow when implementing a request-filter?","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7624ec1d1433afc2b899b2a9d1916697566ccb15","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"#. Look for host aggregates with metadata items of"},{"line_number":72,"context_line":"   `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":73,"context_line":"#. Augment the `RequestSpec` object to indicate that the result"},{"line_number":74,"context_line":"   should be limited to the matching aggregates"},{"line_number":75,"context_line":"#. Fail if no aggregates match"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"This depends on placement aggregates overlaying with host aggregates"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_753186ec","line":74,"range":{"start_line":73,"start_character":0,"end_line":74,"end_character":47},"in_reply_to":"3fa0c359_5a49195e","updated":"2018-02-15 18:05:31.000000000","message":"It\u0027s all internal code, so I\u0027m not sure we need a set of rules. What kind of rules would you suggest?\n\nFor my case, I need to adjust requested_destination, but for the BFV or multiattach example we\u0027d need to adjust .flavor or .filter_properties.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7e6b0a45754d9a31e951285ac18d3412e8ed9bad","unresolved":false,"context_lines":[{"line_number":72,"context_line":"   `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":73,"context_line":"#. Augment the `RequestSpec` object to indicate that the result"},{"line_number":74,"context_line":"   should be limited to the matching aggregates"},{"line_number":75,"context_line":"#. Fail if no aggregates match"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"This depends on placement aggregates overlaying with host aggregates"},{"line_number":78,"context_line":"configured with this key. Mirroring of those aggregates has been"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_d4cf4027","line":75,"updated":"2018-02-15 16:50:33.000000000","message":"so it would raise a NoValidHost ?","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7624ec1d1433afc2b899b2a9d1916697566ccb15","unresolved":false,"context_lines":[{"line_number":72,"context_line":"   `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":73,"context_line":"#. Augment the `RequestSpec` object to indicate that the result"},{"line_number":74,"context_line":"   should be limited to the matching aggregates"},{"line_number":75,"context_line":"#. Fail if no aggregates match"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"This depends on placement aggregates overlaying with host aggregates"},{"line_number":78,"context_line":"configured with this key. Mirroring of those aggregates has been"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_953f72b4","line":75,"in_reply_to":"3fa0c359_1ac63118","updated":"2018-02-15 18:05:31.000000000","message":"Yep, same as having no hosts available to you (for whatever reason). In my code, I log a warning when a tenant doesn\u0027t have any aggregates","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2daa0e3a80dd0b3d8ba3d187b5ed22a212e56b19","unresolved":false,"context_lines":[{"line_number":72,"context_line":"   `filter_tenant_id\u003d$tenant`, for the tenant id making the request"},{"line_number":73,"context_line":"#. Augment the `RequestSpec` object to indicate that the result"},{"line_number":74,"context_line":"   should be limited to the matching aggregates"},{"line_number":75,"context_line":"#. Fail if no aggregates match"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"This depends on placement aggregates overlaying with host aggregates"},{"line_number":78,"context_line":"configured with this key. Mirroring of those aggregates has been"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_1ac63118","line":75,"in_reply_to":"3fa0c359_d4cf4027","updated":"2018-02-15 17:58:27.000000000","message":"@bauzas: yes","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4ec96b61249a392a4e2f0f4ecfe060eebef3bacd","unresolved":false,"context_lines":[{"line_number":81,"context_line":"required by deployers wishing to use this feature."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"To make this work, we will need to extend the"},{"line_number":84,"context_line":"``RequestSpec.destination`` to contain an ``aggregates`` field, peer"},{"line_number":85,"context_line":"to the ``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_3a88cd6f","line":84,"range":{"start_line":84,"start_character":14,"end_line":84,"end_character":25},"updated":"2018-02-15 17:45:49.000000000","message":"nit: requested_destination","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"de3793c94e81b1026c4fabfd1c8e5ada406d1ae4","unresolved":false,"context_lines":[{"line_number":81,"context_line":"required by deployers wishing to use this feature."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"To make this work, we will need to extend the"},{"line_number":84,"context_line":"``RequestSpec.destination`` to contain an ``aggregates`` field, peer"},{"line_number":85,"context_line":"to the ``host``, ``node``, and ``cell`` limits already present. The"},{"line_number":86,"context_line":"``get_allocation_candidates()`` scheduler client method will also need"},{"line_number":87,"context_line":"to consider those aggregates and pass the UUIDs to placement,"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_3a7d2de7","line":84,"range":{"start_line":84,"start_character":14,"end_line":84,"end_character":25},"in_reply_to":"3fa0c359_3a88cd6f","updated":"2018-02-15 17:56:57.000000000","message":"Heh, yeah, thanks I already made that change in my prototype code :)","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"83b271b5e12fee0a39643c5daf459f914d6a0805","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"We could also take the approach of a request filter, but instead of"},{"line_number":116,"context_line":"mapping tenants to host/placement aggregates, simply map them to a"},{"line_number":117,"context_line":"an auto-generated trait with the tenant id in the name. This approach"},{"line_number":118,"context_line":"would require a lot more trait churn on hosts when changing the"},{"line_number":119,"context_line":"boundaries, but may be a very viable option for other use-cases of the"},{"line_number":120,"context_line":"request filter pattern."}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_923561ab","line":117,"range":{"start_line":117,"start_character":33,"end_line":117,"end_character":42},"updated":"2018-02-14 22:19:15.000000000","message":"or cell","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6ecf43eb447926257ac4b811e38958986a3186f8","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"We could also take the approach of a request filter, but instead of"},{"line_number":116,"context_line":"mapping tenants to host/placement aggregates, simply map them to a"},{"line_number":117,"context_line":"an auto-generated trait with the tenant id in the name. This approach"},{"line_number":118,"context_line":"would require a lot more trait churn on hosts when changing the"},{"line_number":119,"context_line":"boundaries, but may be a very viable option for other use-cases of the"},{"line_number":120,"context_line":"request filter pattern."}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_a0903650","line":117,"range":{"start_line":117,"start_character":33,"end_line":117,"end_character":42},"in_reply_to":"3fa0c359_38d6a4f3","updated":"2018-02-15 14:38:30.000000000","message":"I\u0027m not opposed to having another filter that maps them to traits instead of aggregates. It\u0027s not the best solution for this, IMHO, but I can see some reasons why people might want that.\n\nPerhaps I shouldn\u0027t have squashed these two things into one spec, but I felt the resulting two would to too small to have a meaningful signal-to-noise ratio.\n\nIf it would help people grok this, I can certainly just implement both aggregate-based and trait-based request filters, even though I would only want to use the former.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"82a3ed8030968673c6f40161cac604dab6fc4adc","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"We could also take the approach of a request filter, but instead of"},{"line_number":116,"context_line":"mapping tenants to host/placement aggregates, simply map them to a"},{"line_number":117,"context_line":"an auto-generated trait with the tenant id in the name. This approach"},{"line_number":118,"context_line":"would require a lot more trait churn on hosts when changing the"},{"line_number":119,"context_line":"boundaries, but may be a very viable option for other use-cases of the"},{"line_number":120,"context_line":"request filter pattern."}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_38d6a4f3","line":117,"range":{"start_line":117,"start_character":33,"end_line":117,"end_character":42},"in_reply_to":"3fa0c359_923561ab","updated":"2018-02-15 11:46:39.000000000","message":"If I recall correctly the idea of mapping tenents to traits is something that both Ironic and Blazar have considered. In Blazar\u0027s case, especially, they have acknowledged that it could mean lots of trait churn, but it\u0027s not clear that this is (or should be considered) an issue.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"83b271b5e12fee0a39643c5daf459f914d6a0805","unresolved":false,"context_lines":[{"line_number":117,"context_line":"an auto-generated trait with the tenant id in the name. This approach"},{"line_number":118,"context_line":"would require a lot more trait churn on hosts when changing the"},{"line_number":119,"context_line":"boundaries, but may be a very viable option for other use-cases of the"},{"line_number":120,"context_line":"request filter pattern."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"Data model impact"},{"line_number":123,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_f2baa508","line":120,"updated":"2018-02-14 22:19:15.000000000","message":"++ nice","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"82a3ed8030968673c6f40161cac604dab6fc4adc","unresolved":false,"context_lines":[{"line_number":118,"context_line":"would require a lot more trait churn on hosts when changing the"},{"line_number":119,"context_line":"boundaries, but may be a very viable option for other use-cases of the"},{"line_number":120,"context_line":"request filter pattern."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"Data model impact"},{"line_number":123,"context_line":"-----------------"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_38ef84b1","line":121,"updated":"2018-02-15 11:46:39.000000000","message":"Is another option could be to make the host members of the cell have the cell itself as their parent resource provider and that parent has traits and we do the \"in the same tree\" filtering discussed elsewhere with regard to numa-affinity?\n\nNot saying we _should_ do that, just that it\u0027s an option and explicitly discounting it will help to clarify the heuristics over when to use aggregates and when to use nested (for now the main heuristic seems to be \"bulk\" which I suppose is as good as any).\n\nI tend to think of nested as a fairly natural match for anything in which there\u0027s a model of single-parent, hierarchical containership. When I first became aware of this spec (but before reading it) I thought the goal was to be able to say \"I need to be in this cell\", which is not quite the same as \"I want to go where this tenant goes\".","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cc0fd3c905af4d5b9b2c4580d4c44ae027b3c91b","unresolved":false,"context_lines":[{"line_number":118,"context_line":"would require a lot more trait churn on hosts when changing the"},{"line_number":119,"context_line":"boundaries, but may be a very viable option for other use-cases of the"},{"line_number":120,"context_line":"request filter pattern."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"Data model impact"},{"line_number":123,"context_line":"-----------------"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_b43cf4bf","line":121,"in_reply_to":"3fa0c359_002d6a45","updated":"2018-02-15 16:23:35.000000000","message":"If we had a cell provider as a root provider for the compute node providers, I\u0027m not sure how that would really be leaking cells anymore than other nested providers for other uses (compute node with vGPUs, or compute node with PFs that are parents of VFs for SR-IOV).\n\nIt\u0027s leaked in the fact that nova would be creating those providers and managing the relationships between them, which would be complex, but probably not any more than the complexity we already have dealing with aggregates.\n\nI\u0027m not advocating that approach, just saying it\u0027s an option, and I hadn\u0027t thought about it before Chris mentioned it.\n\nUltimately I like the solution Dan is proposing here for this specific problem because it also allows us to eventually replace / remove the AggregateMultiTenancyIsolation filter.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6ecf43eb447926257ac4b811e38958986a3186f8","unresolved":false,"context_lines":[{"line_number":118,"context_line":"would require a lot more trait churn on hosts when changing the"},{"line_number":119,"context_line":"boundaries, but may be a very viable option for other use-cases of the"},{"line_number":120,"context_line":"request filter pattern."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"Data model impact"},{"line_number":123,"context_line":"-----------------"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_002d6a45","line":121,"in_reply_to":"3fa0c359_38ef84b1","updated":"2018-02-15 14:38:30.000000000","message":"Not, IMHO. I don\u0027t think we should leak the cell notion outside of nova at all. That has been one of the tenets of the v2 design, learning from v1.\n\nCompute nodes could be moved from one cell to another, cells could be split or combined. All of that is based purely on infrastructure needs of the deployer and is not something that anything external should need to know about.\n\nThe only thing we should leak, IMHO, is that these compute nodes are related by something, using our grouping mechanism to represent that.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"28c055e4b96bb1f981595234f0561cf40e954582","unresolved":false,"context_lines":[{"line_number":118,"context_line":"would require a lot more trait churn on hosts when changing the"},{"line_number":119,"context_line":"boundaries, but may be a very viable option for other use-cases of the"},{"line_number":120,"context_line":"request filter pattern."},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"Data model impact"},{"line_number":123,"context_line":"-----------------"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_542010f8","line":121,"in_reply_to":"3fa0c359_b43cf4bf","updated":"2018-02-15 16:43:48.000000000","message":"\u003e It\u0027s leaked in the fact that nova would be creating those providers\n \u003e and managing the relationships between them, which would be\n \u003e complex, but probably not any more than the complexity we already\n \u003e have dealing with aggregates.\n\nIt would make the structure and hierarchy visible outside of nova, right.\n\nAlso, a cell doesn\u0027t provide any resource, and thus would have no inventory, which would be an awkward way to provide the grouping, IMHO.","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"7e6b0a45754d9a31e951285ac18d3412e8ed9bad","unresolved":false,"context_lines":[{"line_number":125,"context_line":"The `Destination` object (stored in the `RequestSpec`) will need to"},{"line_number":126,"context_line":"gain an `AggregateList` field. Besides this, no other data model"},{"line_number":127,"context_line":"changes will be required (`Aggregate` already has metadata for us to"},{"line_number":128,"context_line":"use)."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"REST API impact"},{"line_number":131,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3fa0c359_d4e8a07d","line":128,"updated":"2018-02-15 16:50:33.000000000","message":"again, do we plan to persist the change ?","commit_id":"b4db4ea9a3b500f658ac561cad8e240afcbbd06d"}]}
