)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7fca28ef4d97c23caef4e1c1283813e68507adac","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Microversion 1.35: root_required"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"TODO: moar gabbi"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Microversion 1.35_ adds support for the ``root_required`` query"},{"line_number":12,"context_line":"parameter to the ``GET /allocation_candidates`` API. It accepts a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"9fb8cfa7_423a93cd","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":16},"updated":"2019-06-18 20:32:55.000000000","message":"done","commit_id":"864648ab2e7f918747d44c4b608cbd16980d8abc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0e0b2e1cc9d5f78995f3cb5277b6ce435fa88501","unresolved":false,"context_lines":[{"line_number":14,"context_line":"only those whose (non-sharing) tree\u0027s root resource provider satisfies"},{"line_number":15,"context_line":"the specified trait requirements."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This is to support use cases like, \"Land my VM on a host that is capable"},{"line_number":18,"context_line":"of multi-attach,\" or, \"Reserve my Windows-licensed hosts for special"},{"line_number":19,"context_line":"use.\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Story: #2005575"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9fb8cfa7_6ad3c0d6","line":18,"range":{"start_line":17,"start_character":35,"end_line":18,"end_character":17},"updated":"2019-06-20 21:35:23.000000000","message":"Note that while I think this whole thing started from my WIP idea here:\n\nhttps://review.opendev.org/#/c/645316/\n\nI\u0027m not actively working on that right now and I think I had a workaround for it anyway by hacking the flavor extra spec to add a temporary required trait, like what Dan\u0027s request filter does here:\n\nhttps://github.com/openstack/nova/blob/fae51fcb1bf991cd04a3772693025df4d0a37bcf/nova/scheduler/request_filter.py#L148\n\nAnyway, it came up in the nova meeting today:\n\nhttp://eavesdrop.openstack.org/meetings/nova/2019/nova.2019-06-20-21.01.log.html#l-100\n\nStarting with \"21:25:26 \u003cefried\u003e oh, mriedem, re root_required, this bud\u0027s for you.\".\n\nSo my point is while it\u0027s nice everyone took this so seriously, I don\u0027t know if we have any urgency to land this until we have something ready to consume it and I\u0027m not working on that right now (I was hoping that my absence from all of the discussions was kind of an obvious indication that I\u0027m not actively working on the nova side that would use this stuff right now).","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"93bd07daff795f9638e456c984d0da298e4e7f2c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"only those whose (non-sharing) tree\u0027s root resource provider satisfies"},{"line_number":15,"context_line":"the specified trait requirements."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This is to support use cases like, \"Land my VM on a host that is capable"},{"line_number":18,"context_line":"of multi-attach,\" or, \"Reserve my Windows-licensed hosts for special"},{"line_number":19,"context_line":"use.\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Story: #2005575"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9fb8cfa7_4ae91c7e","line":18,"range":{"start_line":17,"start_character":35,"end_line":18,"end_character":17},"in_reply_to":"9fb8cfa7_6ad3c0d6","updated":"2019-06-20 22:00:14.000000000","message":"Yeah, I think this was in the scope of the stuff aspiers volunteered to take over.","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"}],"api-ref/source/parameters.yaml":[{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8f4cf15a477584e3ba9862e652ecc2919459e9c3","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    A comma-separated list of trait requirements that the root provider of the"},{"line_number":183,"context_line":"    (non-sharing) tree must satisfy::"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        required\u003dCOMPUTE_SUPPORTS_MULTI_ATTACH,!CUSTOM_WINDOWS_LICENSED"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    Allocation requests in the response will be limited to those whose"},{"line_number":188,"context_line":"    (non-sharing) tree\u0027s root provider satisfies the specified trait"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fb8cfa7_7650de0b","line":185,"range":{"start_line":185,"start_character":8,"end_line":185,"end_character":16},"updated":"2019-06-17 08:43:47.000000000","message":"root_required?","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    A comma-separated list of trait requirements that the root provider of the"},{"line_number":183,"context_line":"    (non-sharing) tree must satisfy::"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        required\u003dCOMPUTE_SUPPORTS_MULTI_ATTACH,!CUSTOM_WINDOWS_LICENSED"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    Allocation requests in the response will be limited to those whose"},{"line_number":188,"context_line":"    (non-sharing) tree\u0027s root provider satisfies the specified trait"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fb8cfa7_bf75c234","line":185,"range":{"start_line":185,"start_character":8,"end_line":185,"end_character":16},"in_reply_to":"9fb8cfa7_7650de0b","updated":"2019-06-17 22:10:51.000000000","message":"Done","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"}],"doc/source/usage/provider-tree.rst":[{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7996f85affc69529ae0e1dce51a56bf228abc492","unresolved":false,"context_lines":[{"line_number":384,"context_line":"When you want to have ``VCPU`` from wherever and ``DISK_GB`` from ``SS1``,"},{"line_number":385,"context_line":"the request may look like::"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"    GET: /allocation_candidates?resources\u003dVCPU:1"},{"line_number":388,"context_line":"                               \u0026resources1\u003dDISK_GB:10\u0026in_tree1\u003d\u003cSS1 uuid\u003e"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"which will stick to the first sharing provider for ``DISK_GB``."}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_6251e962","line":387,"range":{"start_line":387,"start_character":7,"end_line":387,"end_character":8},"updated":"2019-06-18 09:01:35.000000000","message":"meh.","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8ccc2ebcac0f5b87f9ac4d321d90e452b8607afb","unresolved":false,"context_lines":[{"line_number":384,"context_line":"When you want to have ``VCPU`` from wherever and ``DISK_GB`` from ``SS1``,"},{"line_number":385,"context_line":"the request may look like::"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"    GET: /allocation_candidates?resources\u003dVCPU:1"},{"line_number":388,"context_line":"                               \u0026resources1\u003dDISK_GB:10\u0026in_tree1\u003d\u003cSS1 uuid\u003e"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"which will stick to the first sharing provider for ``DISK_GB``."}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_c611c0ae","line":387,"range":{"start_line":387,"start_character":7,"end_line":387,"end_character":8},"in_reply_to":"9fb8cfa7_6251e962","updated":"2019-06-18 14:32:19.000000000","message":"Done","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7996f85affc69529ae0e1dce51a56bf228abc492","unresolved":false,"context_lines":[{"line_number":431,"context_line":"  |+-------------------------------+| |    +------------------------------+       |"},{"line_number":432,"context_line":"  || Compute Node (NON_NUMA_CN)    || |    | Compute Node (NUMA_CN)       |       |"},{"line_number":433,"context_line":"  ||   resources:                  || |    |  DISK_GB: 1000               |       |"},{"line_number":434,"context_line":"  ||     VCPU: 8, MEMORY_MB: 1024  || |    | trait: [STORAGE_DISK_SSD,    |       |"},{"line_number":435,"context_line":"  ||     DISK_GB: 1000             || |    | COMPUTE_VOLUME_MULTI_ATTACH] |       |"},{"line_number":436,"context_line":"  ||  trait: [HW_CPU_X86_AVX2,     || |    +-------+-------------+--------+       |"},{"line_number":437,"context_line":"  ||  STORAGE_DISK_SSD,            || |     nested |             | nested         |"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_62f56983","line":434,"range":{"start_line":434,"start_character":18,"end_line":434,"end_character":33},"updated":"2019-06-18 09:01:35.000000000","message":"I would put this MEMORY_MB: 1024 in a new line","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7996f85affc69529ae0e1dce51a56bf228abc492","unresolved":false,"context_lines":[{"line_number":431,"context_line":"  |+-------------------------------+| |    +------------------------------+       |"},{"line_number":432,"context_line":"  || Compute Node (NON_NUMA_CN)    || |    | Compute Node (NUMA_CN)       |       |"},{"line_number":433,"context_line":"  ||   resources:                  || |    |  DISK_GB: 1000               |       |"},{"line_number":434,"context_line":"  ||     VCPU: 8, MEMORY_MB: 1024  || |    | trait: [STORAGE_DISK_SSD,    |       |"},{"line_number":435,"context_line":"  ||     DISK_GB: 1000             || |    | COMPUTE_VOLUME_MULTI_ATTACH] |       |"},{"line_number":436,"context_line":"  ||  trait: [HW_CPU_X86_AVX2,     || |    +-------+-------------+--------+       |"},{"line_number":437,"context_line":"  ||  STORAGE_DISK_SSD,            || |     nested |             | nested         |"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_224451b7","line":434,"range":{"start_line":434,"start_character":51,"end_line":434,"end_character":69},"updated":"2019-06-18 09:01:35.000000000","message":"new line + indent to start [STORAGE_DISK_SSD,","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8ccc2ebcac0f5b87f9ac4d321d90e452b8607afb","unresolved":false,"context_lines":[{"line_number":431,"context_line":"  |+-------------------------------+| |    +------------------------------+       |"},{"line_number":432,"context_line":"  || Compute Node (NON_NUMA_CN)    || |    | Compute Node (NUMA_CN)       |       |"},{"line_number":433,"context_line":"  ||   resources:                  || |    |  DISK_GB: 1000               |       |"},{"line_number":434,"context_line":"  ||     VCPU: 8, MEMORY_MB: 1024  || |    | trait: [STORAGE_DISK_SSD,    |       |"},{"line_number":435,"context_line":"  ||     DISK_GB: 1000             || |    | COMPUTE_VOLUME_MULTI_ATTACH] |       |"},{"line_number":436,"context_line":"  ||  trait: [HW_CPU_X86_AVX2,     || |    +-------+-------------+--------+       |"},{"line_number":437,"context_line":"  ||  STORAGE_DISK_SSD,            || |     nested |             | nested         |"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_868428b3","line":434,"range":{"start_line":434,"start_character":51,"end_line":434,"end_character":69},"in_reply_to":"9fb8cfa7_224451b7","updated":"2019-06-18 14:32:19.000000000","message":"Done","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8ccc2ebcac0f5b87f9ac4d321d90e452b8607afb","unresolved":false,"context_lines":[{"line_number":431,"context_line":"  |+-------------------------------+| |    +------------------------------+       |"},{"line_number":432,"context_line":"  || Compute Node (NON_NUMA_CN)    || |    | Compute Node (NUMA_CN)       |       |"},{"line_number":433,"context_line":"  ||   resources:                  || |    |  DISK_GB: 1000               |       |"},{"line_number":434,"context_line":"  ||     VCPU: 8, MEMORY_MB: 1024  || |    | trait: [STORAGE_DISK_SSD,    |       |"},{"line_number":435,"context_line":"  ||     DISK_GB: 1000             || |    | COMPUTE_VOLUME_MULTI_ATTACH] |       |"},{"line_number":436,"context_line":"  ||  trait: [HW_CPU_X86_AVX2,     || |    +-------+-------------+--------+       |"},{"line_number":437,"context_line":"  ||  STORAGE_DISK_SSD,            || |     nested |             | nested         |"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_2691bcf2","line":434,"range":{"start_line":434,"start_character":18,"end_line":434,"end_character":33},"in_reply_to":"9fb8cfa7_62f56983","updated":"2019-06-18 14:32:19.000000000","message":"Done","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7996f85affc69529ae0e1dce51a56bf228abc492","unresolved":false,"context_lines":[{"line_number":433,"context_line":"  ||   resources:                  || |    |  DISK_GB: 1000               |       |"},{"line_number":434,"context_line":"  ||     VCPU: 8, MEMORY_MB: 1024  || |    | trait: [STORAGE_DISK_SSD,    |       |"},{"line_number":435,"context_line":"  ||     DISK_GB: 1000             || |    | COMPUTE_VOLUME_MULTI_ATTACH] |       |"},{"line_number":436,"context_line":"  ||  trait: [HW_CPU_X86_AVX2,     || |    +-------+-------------+--------+       |"},{"line_number":437,"context_line":"  ||  STORAGE_DISK_SSD,            || |     nested |             | nested         |"},{"line_number":438,"context_line":"  ||  COMPUTE_VOLUME_MULTI_ATTACH, || |+-----------+-------+ +---+---------------+|"},{"line_number":439,"context_line":"  ||  CUSTOM_WINDOWS_LICENSE_POOL] || || NUMA1             | | NUMA2             ||"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_c21215b5","line":436,"range":{"start_line":436,"start_character":12,"end_line":436,"end_character":29},"updated":"2019-06-18 09:01:35.000000000","message":"new line + indent","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8ccc2ebcac0f5b87f9ac4d321d90e452b8607afb","unresolved":false,"context_lines":[{"line_number":433,"context_line":"  ||   resources:                  || |    |  DISK_GB: 1000               |       |"},{"line_number":434,"context_line":"  ||     VCPU: 8, MEMORY_MB: 1024  || |    | trait: [STORAGE_DISK_SSD,    |       |"},{"line_number":435,"context_line":"  ||     DISK_GB: 1000             || |    | COMPUTE_VOLUME_MULTI_ATTACH] |       |"},{"line_number":436,"context_line":"  ||  trait: [HW_CPU_X86_AVX2,     || |    +-------+-------------+--------+       |"},{"line_number":437,"context_line":"  ||  STORAGE_DISK_SSD,            || |     nested |             | nested         |"},{"line_number":438,"context_line":"  ||  COMPUTE_VOLUME_MULTI_ATTACH, || |+-----------+-------+ +---+---------------+|"},{"line_number":439,"context_line":"  ||  CUSTOM_WINDOWS_LICENSE_POOL] || || NUMA1             | | NUMA2             ||"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_468e30d1","line":436,"range":{"start_line":436,"start_character":12,"end_line":436,"end_character":29},"in_reply_to":"9fb8cfa7_c21215b5","updated":"2019-06-18 14:32:19.000000000","message":"Done","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7996f85affc69529ae0e1dce51a56bf228abc492","unresolved":false,"context_lines":[{"line_number":438,"context_line":"  ||  COMPUTE_VOLUME_MULTI_ATTACH, || |+-----------+-------+ +---+---------------+|"},{"line_number":439,"context_line":"  ||  CUSTOM_WINDOWS_LICENSE_POOL] || || NUMA1             | | NUMA2             ||"},{"line_number":440,"context_line":"  |+-------------------------------+| ||  VCPU: 4          | |   VCPU: 4         ||"},{"line_number":441,"context_line":"  +---------------------------------+ ||  MEMORY_MB: 1024  | | MEMORY_MB: 1024   ||"},{"line_number":442,"context_line":"                                      || trait: []         | | trait:            ||"},{"line_number":443,"context_line":"                                      ||                   | | [HW_CPU_X86_AVX2] ||"},{"line_number":444,"context_line":"                                      |+-------------------+ +-------------------+|"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_423dc52a","line":441,"range":{"start_line":441,"start_character":63,"end_line":441,"end_character":72},"updated":"2019-06-18 09:01:35.000000000","message":"I would align this MEMORY_MB with VCPU above adding two spaces before","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8ccc2ebcac0f5b87f9ac4d321d90e452b8607afb","unresolved":false,"context_lines":[{"line_number":438,"context_line":"  ||  COMPUTE_VOLUME_MULTI_ATTACH, || |+-----------+-------+ +---+---------------+|"},{"line_number":439,"context_line":"  ||  CUSTOM_WINDOWS_LICENSE_POOL] || || NUMA1             | | NUMA2             ||"},{"line_number":440,"context_line":"  |+-------------------------------+| ||  VCPU: 4          | |   VCPU: 4         ||"},{"line_number":441,"context_line":"  +---------------------------------+ ||  MEMORY_MB: 1024  | | MEMORY_MB: 1024   ||"},{"line_number":442,"context_line":"                                      || trait: []         | | trait:            ||"},{"line_number":443,"context_line":"                                      ||                   | | [HW_CPU_X86_AVX2] ||"},{"line_number":444,"context_line":"                                      |+-------------------+ +-------------------+|"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_a6b60c8a","line":441,"range":{"start_line":441,"start_character":63,"end_line":441,"end_character":72},"in_reply_to":"9fb8cfa7_423dc52a","updated":"2019-06-18 14:32:19.000000000","message":"Done","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7996f85affc69529ae0e1dce51a56bf228abc492","unresolved":false,"context_lines":[{"line_number":440,"context_line":"  |+-------------------------------+| ||  VCPU: 4          | |   VCPU: 4         ||"},{"line_number":441,"context_line":"  +---------------------------------+ ||  MEMORY_MB: 1024  | | MEMORY_MB: 1024   ||"},{"line_number":442,"context_line":"                                      || trait: []         | | trait:            ||"},{"line_number":443,"context_line":"                                      ||                   | | [HW_CPU_X86_AVX2] ||"},{"line_number":444,"context_line":"                                      |+-------------------+ +-------------------+|"},{"line_number":445,"context_line":"                                      +-------------------------------------------+"},{"line_number":446,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_e21719a3","line":443,"range":{"start_line":443,"start_character":63,"end_line":443,"end_character":80},"updated":"2019-06-18 09:01:35.000000000","message":"indent would be nice","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8ccc2ebcac0f5b87f9ac4d321d90e452b8607afb","unresolved":false,"context_lines":[{"line_number":440,"context_line":"  |+-------------------------------+| ||  VCPU: 4          | |   VCPU: 4         ||"},{"line_number":441,"context_line":"  +---------------------------------+ ||  MEMORY_MB: 1024  | | MEMORY_MB: 1024   ||"},{"line_number":442,"context_line":"                                      || trait: []         | | trait:            ||"},{"line_number":443,"context_line":"                                      ||                   | | [HW_CPU_X86_AVX2] ||"},{"line_number":444,"context_line":"                                      |+-------------------+ +-------------------+|"},{"line_number":445,"context_line":"                                      +-------------------------------------------+"},{"line_number":446,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_66b0148d","line":443,"range":{"start_line":443,"start_character":63,"end_line":443,"end_character":80},"in_reply_to":"9fb8cfa7_e21719a3","updated":"2019-06-18 14:32:19.000000000","message":"Done","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8ccc2ebcac0f5b87f9ac4d321d90e452b8607afb","unresolved":false,"context_lines":[{"line_number":444,"context_line":"                                      |+-------------------+ +-------------------+|"},{"line_number":445,"context_line":"                                      +-------------------------------------------+"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"A tree modeled in this fashion can take advantage of the ``root_required``"},{"line_number":448,"context_line":"query parameter to return only allocation candidates from trees which possess"},{"line_number":449,"context_line":"(or do not possess) the specified traits on their root provider. For example,"},{"line_number":450,"context_line":"to return allocation candidates including ``VCPU`` with the ``HW_CPU_X86_AVX2``"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_08113154","line":447,"range":{"start_line":447,"start_character":57,"end_line":447,"end_character":74},"updated":"2019-06-18 14:32:19.000000000","message":"Make this a link to the appropriate section of the spec once that\u0027s updated.","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7fca28ef4d97c23caef4e1c1283813e68507adac","unresolved":false,"context_lines":[{"line_number":444,"context_line":"                                      |+-------------------+ +-------------------+|"},{"line_number":445,"context_line":"                                      +-------------------------------------------+"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"A tree modeled in this fashion can take advantage of the ``root_required``"},{"line_number":448,"context_line":"query parameter to return only allocation candidates from trees which possess"},{"line_number":449,"context_line":"(or do not possess) the specified traits on their root provider. For example,"},{"line_number":450,"context_line":"to return allocation candidates including ``VCPU`` with the ``HW_CPU_X86_AVX2``"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9fb8cfa7_2218bf73","line":447,"range":{"start_line":447,"start_character":57,"end_line":447,"end_character":74},"in_reply_to":"9fb8cfa7_08113154","updated":"2019-06-18 20:32:55.000000000","message":"Done, but change it to a link into the published spec once that\u0027s available.","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"6afecfed333df6fbcea3666276854dd404369edd","unresolved":false,"context_lines":[{"line_number":504,"context_line":".. _`Granular Resource Request`: https://specs.openstack.org/openstack/nova-specs/specs/rocky/implemented/granular-resource-requests.html"},{"line_number":505,"context_line":".. _`Filter Allocation Candidates by Provider Tree`: https://specs.openstack.org/openstack/nova-specs/specs/stein/implemented/alloc-candidates-in-tree.html"},{"line_number":506,"context_line":".. _`Support subtree filter`: https://review.opendev.org/#/c/595236/"},{"line_number":507,"context_line":".. _`root_required`: https://review.opendev.org/#/c/662191/5/doc/source/specs/train/approved/2005575-nested-magic-1.rst@304"}],"source_content_type":"text/x-rst","patch_set":16,"id":"9fb8cfa7_236625c3","line":507,"range":{"start_line":507,"start_character":21,"end_line":507,"end_character":123},"updated":"2019-06-25 02:24:31.000000000","message":"nit: The following one is better.\n\nhttps://docs.openstack.org/placement/latest/specs/train/approved/2005575-nested-magic-1.html#root-required","commit_id":"b733786a0a5bca5b56b9ace5b75e23365f10d9ce"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"af8f63f862e138e3730b3f4a74c0acb145ea0e58","unresolved":false,"context_lines":[{"line_number":504,"context_line":".. _`Granular Resource Request`: https://specs.openstack.org/openstack/nova-specs/specs/rocky/implemented/granular-resource-requests.html"},{"line_number":505,"context_line":".. _`Filter Allocation Candidates by Provider Tree`: https://specs.openstack.org/openstack/nova-specs/specs/stein/implemented/alloc-candidates-in-tree.html"},{"line_number":506,"context_line":".. _`Support subtree filter`: https://review.opendev.org/#/c/595236/"},{"line_number":507,"context_line":".. _`root_required`: https://review.opendev.org/#/c/662191/5/doc/source/specs/train/approved/2005575-nested-magic-1.rst@304"}],"source_content_type":"text/x-rst","patch_set":16,"id":"9fb8cfa7_89284b97","line":507,"range":{"start_line":507,"start_character":21,"end_line":507,"end_character":123},"in_reply_to":"9fb8cfa7_236625c3","updated":"2019-06-25 13:32:53.000000000","message":"Yup, thanks, I wrote this before the spec merged.\n\nI\u0027ll change this in [1] since Chris is on vacation and I don\u0027t want to lose his +2 here.\n\n[1] https://review.opendev.org/#/c/665691/","commit_id":"b733786a0a5bca5b56b9ace5b75e23365f10d9ce"}],"placement/errors.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3b2e06902981d0f8f697891c7b79597f9f28dd32","unresolved":false,"context_lines":[{"line_number":46,"context_line":"PROVIDER_CANNOT_DELETE_PARENT \u003d ("},{"line_number":47,"context_line":"    \u0027placement.resource_provider.cannot_delete_parent\u0027)"},{"line_number":48,"context_line":"RESOURCE_PROVIDER_NOT_FOUND \u003d \u0027placement.resource_provider.not_found\u0027"},{"line_number":49,"context_line":"ILLEGAL_DUPLICATE_QUERYPARAM \u003d \u0027placement.query.duplicate_key\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fb8cfa7_6ae8a515","line":49,"updated":"2019-06-20 17:45:47.000000000","message":"good idea","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"}],"placement/exception.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9f29e46849711b8eeb9fea37a74e8e182bcef94f","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"class ResourceProviderNotFound(NotFound):"},{"line_number":87,"context_line":"    # Marker exception indicating that we\u0027ve filtered down to zero possible"},{"line_number":88,"context_line":"    # allocation candidates. Does not represent an API error; should only be"},{"line_number":89,"context_line":"    # used internally: no results is a 200 with empty allocation_requests."},{"line_number":90,"context_line":"    msg_fmt \u003d \"No results are possible.\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_1bfe706a","line":87,"updated":"2019-06-16 21:22:13.000000000","message":"this is unrelated, but not worth putting in a separate change","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"class ResourceProviderNotFound(NotFound):"},{"line_number":87,"context_line":"    # Marker exception indicating that we\u0027ve filtered down to zero possible"},{"line_number":88,"context_line":"    # allocation candidates. Does not represent an API error; should only be"},{"line_number":89,"context_line":"    # used internally: no results is a 200 with empty allocation_requests."},{"line_number":90,"context_line":"    msg_fmt \u003d \"No results are possible.\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_3fb472f2","line":87,"in_reply_to":"9fb8cfa7_1bfe706a","updated":"2019-06-17 22:10:51.000000000","message":"https://review.opendev.org/#/c/665691","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"}],"placement/handlers/allocation_candidate.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9f29e46849711b8eeb9fea37a74e8e182bcef94f","unresolved":false,"context_lines":[{"line_number":273,"context_line":"    util.validate_query_params(req, get_schema)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    groups \u003d lib.RequestGroup.dict_from_request(req)"},{"line_number":276,"context_line":"    rqparams \u003d lib.RequestWideParams.from_request(context, req)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    if not rqparams.group_policy:"},{"line_number":279,"context_line":"        # group_policy is required if more than one numbered request group was"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_bbd3a400","line":276,"range":{"start_line":276,"start_character":19,"end_line":276,"end_character":36},"updated":"2019-06-16 21:22:13.000000000","message":"Consider splitting out the part of the change that introduces RequestWideParams and renames `requests` to `groups`.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":273,"context_line":"    util.validate_query_params(req, get_schema)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    groups \u003d lib.RequestGroup.dict_from_request(req)"},{"line_number":276,"context_line":"    rqparams \u003d lib.RequestWideParams.from_request(context, req)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    if not rqparams.group_policy:"},{"line_number":279,"context_line":"        # group_policy is required if more than one numbered request group was"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_5fae0699","line":276,"range":{"start_line":276,"start_character":19,"end_line":276,"end_character":36},"in_reply_to":"9fb8cfa7_4dee6d8c","updated":"2019-06-17 22:10:51.000000000","message":"https://review.opendev.org/#/c/665712","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8f4cf15a477584e3ba9862e652ecc2919459e9c3","unresolved":false,"context_lines":[{"line_number":273,"context_line":"    util.validate_query_params(req, get_schema)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    groups \u003d lib.RequestGroup.dict_from_request(req)"},{"line_number":276,"context_line":"    rqparams \u003d lib.RequestWideParams.from_request(context, req)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    if not rqparams.group_policy:"},{"line_number":279,"context_line":"        # group_policy is required if more than one numbered request group was"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_4dee6d8c","line":276,"range":{"start_line":276,"start_character":19,"end_line":276,"end_character":36},"in_reply_to":"9fb8cfa7_bbd3a400","updated":"2019-06-17 08:43:47.000000000","message":"++\nI would appreciate for splitting out","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"}],"placement/lib.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3965aedc624312331d2c17f6d3ba4d1023d26e75","unresolved":false,"context_lines":[{"line_number":356,"context_line":"            anchor_forbidden\u003danchor_forbidden)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    @property"},{"line_number":359,"context_line":"    def anchor_root_ids(self):"},{"line_number":360,"context_line":"        if self._anchor_root_ids is None:"},{"line_number":361,"context_line":"            # Do we have any filters that let us limit the trees we\u0027ll be"},{"line_number":362,"context_line":"            # working with?"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_904f9591","line":359,"updated":"2019-06-17 12:45:03.000000000","message":"I would prefer that this be a method somewhere within the objects hierarchy rather than here in lib. For the most part we\u0027ve managed to keep stuff that talks to the db within there.\n\nThat also makes sense since this object is supposed to be a representation of Params, not things found by those params.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":356,"context_line":"            anchor_forbidden\u003danchor_forbidden)"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    @property"},{"line_number":359,"context_line":"    def anchor_root_ids(self):"},{"line_number":360,"context_line":"        if self._anchor_root_ids is None:"},{"line_number":361,"context_line":"            # Do we have any filters that let us limit the trees we\u0027ll be"},{"line_number":362,"context_line":"            # working with?"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_5f036674","line":359,"in_reply_to":"9fb8cfa7_904f9591","updated":"2019-06-17 22:10:51.000000000","message":"Mm.\n\nWhat about a RequestWideResearchContext?\n\n[Later] That turned out to make a lot of things crisper. Thanks for (the push toward) that suggestion.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3965aedc624312331d2c17f6d3ba4d1023d26e75","unresolved":false,"context_lines":[{"line_number":361,"context_line":"            # Do we have any filters that let us limit the trees we\u0027ll be"},{"line_number":362,"context_line":"            # working with?"},{"line_number":363,"context_line":"            if self._anchor_required or self._anchor_forbidden:"},{"line_number":364,"context_line":"                self._anchor_root_ids \u003d res_ctx._get_roots_with_traits("},{"line_number":365,"context_line":"                    self._ctx, self._anchor_required, self._anchor_forbidden)"},{"line_number":366,"context_line":"        return self._anchor_root_ids"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_50703ddd","line":364,"range":{"start_line":364,"start_character":48,"end_line":364,"end_character":70},"updated":"2019-06-17 12:45:03.000000000","message":"public","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":361,"context_line":"            # Do we have any filters that let us limit the trees we\u0027ll be"},{"line_number":362,"context_line":"            # working with?"},{"line_number":363,"context_line":"            if self._anchor_required or self._anchor_forbidden:"},{"line_number":364,"context_line":"                self._anchor_root_ids \u003d res_ctx._get_roots_with_traits("},{"line_number":365,"context_line":"                    self._ctx, self._anchor_required, self._anchor_forbidden)"},{"line_number":366,"context_line":"        return self._anchor_root_ids"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_dfee76b3","line":364,"range":{"start_line":364,"start_character":48,"end_line":364,"end_character":70},"in_reply_to":"9fb8cfa7_50703ddd","updated":"2019-06-17 22:10:51.000000000","message":"https://review.opendev.org/#/c/665491","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7df5c7f7229fc22c7a65015449dba9e28a7b7816","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import webob"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from placement import microversion"},{"line_number":22,"context_line":"from placement.objects import research_context as res_ctx"},{"line_number":23,"context_line":"from placement.objects import trait as trait_obj"},{"line_number":24,"context_line":"from placement.schemas import common"},{"line_number":25,"context_line":"from placement import util"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_825ae227","line":22,"updated":"2019-06-17 20:51:54.000000000","message":"this can go away now?","commit_id":"b4066967a4e6efcc5e52e975a0aa121dcf83b867"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import webob"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from placement import microversion"},{"line_number":22,"context_line":"from placement.objects import research_context as res_ctx"},{"line_number":23,"context_line":"from placement.objects import trait as trait_obj"},{"line_number":24,"context_line":"from placement.schemas import common"},{"line_number":25,"context_line":"from placement import util"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_0d93835e","line":22,"in_reply_to":"9fb8cfa7_825ae227","updated":"2019-06-17 22:10:51.000000000","message":"yup, done","commit_id":"b4066967a4e6efcc5e52e975a0aa121dcf83b867"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5603f8d8568277cf186c919539179b447fd7ba9c","unresolved":false,"context_lines":[{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        anchor_required \u003d None"},{"line_number":328,"context_line":"        anchor_forbidden \u003d None"},{"line_number":329,"context_line":"        traits \u003d req.GET.getall(\u0027root_required\u0027)"},{"line_number":330,"context_line":"        if traits:"},{"line_number":331,"context_line":"            traits \u003d util.normalize_traits_qs_param("},{"line_number":332,"context_line":"                traits[0], allow_forbidden\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_b85861fa","line":329,"range":{"start_line":329,"start_character":8,"end_line":329,"end_character":48},"updated":"2019-06-18 18:08:00.000000000","message":"should make it a 400 to repeat root_required","commit_id":"864648ab2e7f918747d44c4b608cbd16980d8abc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7fca28ef4d97c23caef4e1c1283813e68507adac","unresolved":false,"context_lines":[{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        anchor_required \u003d None"},{"line_number":328,"context_line":"        anchor_forbidden \u003d None"},{"line_number":329,"context_line":"        traits \u003d req.GET.getall(\u0027root_required\u0027)"},{"line_number":330,"context_line":"        if traits:"},{"line_number":331,"context_line":"            traits \u003d util.normalize_traits_qs_param("},{"line_number":332,"context_line":"                traits[0], allow_forbidden\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fb8cfa7_4fa15c95","line":329,"range":{"start_line":329,"start_character":8,"end_line":329,"end_character":48},"in_reply_to":"9fb8cfa7_b85861fa","updated":"2019-06-18 20:32:55.000000000","message":"Done","commit_id":"864648ab2e7f918747d44c4b608cbd16980d8abc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0882d67076f1e993780511e98bc092c06448c50c","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        anchor_required \u003d None"},{"line_number":333,"context_line":"        anchor_forbidden \u003d None"},{"line_number":334,"context_line":"        traits \u003d req.GET.getall(\u0027root_required\u0027)"},{"line_number":335,"context_line":"        if traits:"},{"line_number":336,"context_line":"            if len(traits) \u003e 1:"},{"line_number":337,"context_line":"                raise webob.exc.HTTPBadRequest("}],"source_content_type":"text/x-python","patch_set":12,"id":"9fb8cfa7_fe3f9784","line":334,"range":{"start_line":334,"start_character":8,"end_line":334,"end_character":14},"updated":"2019-06-19 10:15:28.000000000","message":"I would call this root_required","commit_id":"924e7fcd0e4898d48b19f25990c67c323a28202f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2dceefa6a9efe3d46c82797486284b7ba4cfa0bc","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        anchor_required \u003d None"},{"line_number":333,"context_line":"        anchor_forbidden \u003d None"},{"line_number":334,"context_line":"        traits \u003d req.GET.getall(\u0027root_required\u0027)"},{"line_number":335,"context_line":"        if traits:"},{"line_number":336,"context_line":"            if len(traits) \u003e 1:"},{"line_number":337,"context_line":"                raise webob.exc.HTTPBadRequest("}],"source_content_type":"text/x-python","patch_set":12,"id":"9fb8cfa7_4336fee9","line":334,"range":{"start_line":334,"start_character":8,"end_line":334,"end_character":14},"in_reply_to":"9fb8cfa7_fe3f9784","updated":"2019-06-19 23:26:46.000000000","message":"Done","commit_id":"924e7fcd0e4898d48b19f25990c67c323a28202f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0882d67076f1e993780511e98bc092c06448c50c","unresolved":false,"context_lines":[{"line_number":337,"context_line":"                raise webob.exc.HTTPBadRequest("},{"line_number":338,"context_line":"                    \"Query parameter \u0027root_required\u0027 may be specified only \""},{"line_number":339,"context_line":"                    \"once.\", comment\u003derrors.ILLEGAL_DUPLICATE_QUERYPARAM)"},{"line_number":340,"context_line":"            traits \u003d util.normalize_traits_qs_param("},{"line_number":341,"context_line":"                traits[0], allow_forbidden\u003dTrue)"},{"line_number":342,"context_line":"            anchor_required, anchor_forbidden, conflicts \u003d _fix_one_forbidden("},{"line_number":343,"context_line":"                traits)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9fb8cfa7_1e5e2be6","line":340,"range":{"start_line":340,"start_character":12,"end_line":340,"end_character":18},"updated":"2019-06-19 10:15:28.000000000","message":"so this would not reuse the name. (this is really the list of traits so the name is appropriate here)","commit_id":"924e7fcd0e4898d48b19f25990c67c323a28202f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"93bd07daff795f9638e456c984d0da298e4e7f2c","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    above)."},{"line_number":287,"context_line":"    \"\"\""},{"line_number":288,"context_line":"    def __init__(self, limit\u003dNone, group_policy\u003dNone,"},{"line_number":289,"context_line":"                 anchor_required\u003dNone, anchor_forbidden\u003dNone):"},{"line_number":290,"context_line":"        \"\"\"Create a RequestWideParams."},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        :param limit: An integer, N, representing the maximum number of"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fb8cfa7_769decb9","line":289,"range":{"start_line":289,"start_character":17,"end_line":289,"end_character":32},"updated":"2019-06-20 22:00:14.000000000","message":"Call these anchor_required_traits/anchor_forbidden_traits (both the kwargs and in the instance attrs) to avoid confusion with required/forbidden aggs, which (rather than anything \u0027member_of\u0027) is how they\u0027re referred to internally.","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"}],"placement/microversion.py":[{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8f4cf15a477584e3ba9862e652ecc2919459e9c3","unresolved":false,"context_lines":[{"line_number":85,"context_line":"             # [A-Za-z0-9_-]{1,64}."},{"line_number":86,"context_line":"    \u00271.34\u0027,  # Include a mappings key in allocation requests that shows which"},{"line_number":87,"context_line":"             # resource providers satisfied which request group suffix."},{"line_number":88,"context_line":"    \u00271.35\u0027,  # Add a `root_required` queryparam on `GET /allocation_candidates"},{"line_number":89,"context_line":"]"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_d6a0aa94","line":88,"range":{"start_line":88,"start_character":51,"end_line":88,"end_character":78},"updated":"2019-06-17 08:43:47.000000000","message":"one more backtick needed","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":85,"context_line":"             # [A-Za-z0-9_-]{1,64}."},{"line_number":86,"context_line":"    \u00271.34\u0027,  # Include a mappings key in allocation requests that shows which"},{"line_number":87,"context_line":"             # resource providers satisfied which request group suffix."},{"line_number":88,"context_line":"    \u00271.35\u0027,  # Add a `root_required` queryparam on `GET /allocation_candidates"},{"line_number":89,"context_line":"]"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_79f685fc","line":88,"range":{"start_line":88,"start_character":51,"end_line":88,"end_character":78},"in_reply_to":"9fb8cfa7_105ba554","updated":"2019-06-17 22:10:51.000000000","message":"He meant I forgot my closing (single) backtick; fixed.\n\nI don\u0027t see a need to make these comments truly RST-compliant.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3965aedc624312331d2c17f6d3ba4d1023d26e75","unresolved":false,"context_lines":[{"line_number":85,"context_line":"             # [A-Za-z0-9_-]{1,64}."},{"line_number":86,"context_line":"    \u00271.34\u0027,  # Include a mappings key in allocation requests that shows which"},{"line_number":87,"context_line":"             # resource providers satisfied which request group suffix."},{"line_number":88,"context_line":"    \u00271.35\u0027,  # Add a `root_required` queryparam on `GET /allocation_candidates"},{"line_number":89,"context_line":"]"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_105ba554","line":88,"range":{"start_line":88,"start_character":51,"end_line":88,"end_character":78},"in_reply_to":"9fb8cfa7_d6a0aa94","updated":"2019-06-17 12:45:03.000000000","message":"If you look above, you\u0027ll see that we\u0027ve historically been bad with backticks in this list, at least with regard to RST formatting. This is consistent with the above. If we want this to be renderable (It seems unlikely to matter) we could followup with one big change that fixes all the comments.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"}],"placement/objects/allocation_candidate.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8af91710273f5d2f58e134e81a641d3384fe5979","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def _get_by_requests(cls, context, groups, rqparams, nested_aware\u003dTrue):"},{"line_number":123,"context_line":"        has_trees \u003d res_ctx.has_provider_trees(context)"},{"line_number":124,"context_line":"        sharing \u003d res_ctx.get_sharing_providers(context)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        candidates \u003d {}"},{"line_number":127,"context_line":"        for suffix, request in groups.items():"},{"line_number":128,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_473978ef","line":125,"updated":"2019-06-14 22:58:33.000000000","message":"Plumb here. Use _get_roots_with_traits to get a prefiltered list of roots. Save them. Pass them into each RequestGroupSearchContext, which should use them to narrow results. Quick and dirty: post-filter. Moar better: send those IDs into all the SQL methods (WHERE root_provider_id in $those).","commit_id":"6f2c8cdb35910f9c96f72bfdc38f98b61742acd8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d112563ac5821cf5b018d6eace957590d2dcef0d","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def _get_by_requests(cls, context, groups, rqparams, nested_aware\u003dTrue):"},{"line_number":123,"context_line":"        has_trees \u003d res_ctx.has_provider_trees(context)"},{"line_number":124,"context_line":"        sharing \u003d res_ctx.get_sharing_providers(context)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        candidates \u003d {}"},{"line_number":127,"context_line":"        for suffix, request in groups.items():"},{"line_number":128,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_36b4b3f1","line":125,"in_reply_to":"9fb8cfa7_42440674","updated":"2019-06-15 02:11:46.000000000","message":"\u003e This turned out to be easier than anticipated: was able to\n \u003e piggyback on in_tree*.\n\nI take it back.","commit_id":"6f2c8cdb35910f9c96f72bfdc38f98b61742acd8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e61809201c9e0450b790ea058ba0b2d3c7849f14","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def _get_by_requests(cls, context, groups, rqparams, nested_aware\u003dTrue):"},{"line_number":123,"context_line":"        has_trees \u003d res_ctx.has_provider_trees(context)"},{"line_number":124,"context_line":"        sharing \u003d res_ctx.get_sharing_providers(context)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        candidates \u003d {}"},{"line_number":127,"context_line":"        for suffix, request in groups.items():"},{"line_number":128,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_42440674","line":125,"in_reply_to":"9fb8cfa7_473978ef","updated":"2019-06-15 01:01:31.000000000","message":"\u003e Plumb here.\n\nDone.\n\n \u003e Moar better: send those IDs into all the SQL methods\n \u003e (WHERE root_provider_id in $those).\n\nThis turned out to be easier than anticipated: was able to piggyback on in_tree*.","commit_id":"6f2c8cdb35910f9c96f72bfdc38f98b61742acd8"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3965aedc624312331d2c17f6d3ba4d1023d26e75","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        # Optimization: Run request-wide tree filters early."},{"line_number":125,"context_line":"        # If none found, short out."},{"line_number":126,"context_line":"        if (rqparams.anchor_root_ids is not None and"},{"line_number":127,"context_line":"                not rqparams.anchor_root_ids):"},{"line_number":128,"context_line":"            return [], []"},{"line_number":129,"context_line":"        has_trees \u003d res_ctx.has_provider_trees(context)"},{"line_number":130,"context_line":"        sharing \u003d res_ctx.get_sharing_providers(context)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_f33e1bb8","line":127,"updated":"2019-06-17 12:45:03.000000000","message":"This is a good optimization I\u0027d call res_ctx.\u003csomething\u003e(context, rqparams) or something like that","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        # Optimization: Run request-wide tree filters early."},{"line_number":125,"context_line":"        # If none found, short out."},{"line_number":126,"context_line":"        if (rqparams.anchor_root_ids is not None and"},{"line_number":127,"context_line":"                not rqparams.anchor_root_ids):"},{"line_number":128,"context_line":"            return [], []"},{"line_number":129,"context_line":"        has_trees \u003d res_ctx.has_provider_trees(context)"},{"line_number":130,"context_line":"        sharing \u003d res_ctx.get_sharing_providers(context)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_82174252","line":127,"in_reply_to":"9fb8cfa7_f33e1bb8","updated":"2019-06-17 22:10:51.000000000","message":"I put it into RequestWideSearchContext, which, since that\u0027s a thing now, makes lots of sense.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3965aedc624312331d2c17f6d3ba4d1023d26e75","unresolved":false,"context_lines":[{"line_number":405,"context_line":"    :param rqparams: RequestWideParams"},{"line_number":406,"context_line":"    \"\"\""},{"line_number":407,"context_line":"    def _in_filtered_anchors(anchor_root_id):"},{"line_number":408,"context_line":"        return (not rqparams.anchor_root_ids or"},{"line_number":409,"context_line":"                anchor_root_id in rqparams.anchor_root_ids)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    if not rp_tuples:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_d3b3d74c","line":408,"updated":"2019-06-17 12:45:03.000000000","message":"Oh I see. You need somewhere to hang this cache.\n\nI still think that the _params_ object is probably less than ideal, but we can set that aside while exploring whether the overall concept is a goer.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":405,"context_line":"    :param rqparams: RequestWideParams"},{"line_number":406,"context_line":"    \"\"\""},{"line_number":407,"context_line":"    def _in_filtered_anchors(anchor_root_id):"},{"line_number":408,"context_line":"        return (not rqparams.anchor_root_ids or"},{"line_number":409,"context_line":"                anchor_root_id in rqparams.anchor_root_ids)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    if not rp_tuples:"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_e205de15","line":408,"in_reply_to":"9fb8cfa7_d3b3d74c","updated":"2019-06-17 22:10:51.000000000","message":"Done, see above","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3965aedc624312331d2c17f6d3ba4d1023d26e75","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        # Exclude this if its anchor (which is its root) isn\u0027t in our"},{"line_number":439,"context_line":"        # prefiltered list of anchors"},{"line_number":440,"context_line":"        if _in_filtered_anchors(root_id):"},{"line_number":441,"context_line":"            alloc_requests.append(req_obj)"},{"line_number":442,"context_line":"        # If this is a sharing provider, we have to include an extra"},{"line_number":443,"context_line":"        # AllocationRequest for every possible anchor."},{"line_number":444,"context_line":"        traits \u003d rp_summary.traits"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_93631fb2","line":441,"updated":"2019-06-17 12:45:03.000000000","message":"This is fine for a POC, but later we might want to change how these loops are done, and see if set maniplation could be done to limit rp_tuples before we ever enter the outer loop: If we\u0027re going to reject an AR based on the root_id already not being valid, we can do that earlier.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":438,"context_line":"        # Exclude this if its anchor (which is its root) isn\u0027t in our"},{"line_number":439,"context_line":"        # prefiltered list of anchors"},{"line_number":440,"context_line":"        if _in_filtered_anchors(root_id):"},{"line_number":441,"context_line":"            alloc_requests.append(req_obj)"},{"line_number":442,"context_line":"        # If this is a sharing provider, we have to include an extra"},{"line_number":443,"context_line":"        # AllocationRequest for every possible anchor."},{"line_number":444,"context_line":"        traits \u003d rp_summary.traits"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_ad50370c","line":441,"in_reply_to":"9fb8cfa7_93631fb2","updated":"2019-06-17 22:10:51.000000000","message":"Yeah, that\u0027s what I started off trying to do; but it turns out that we don\u0027t start distinguishing between sharing and non-sharing until quite late in the game. To wit:\n\nIf I filtered by anchors before this point, I would never look at this req_obj - which may in fact be a *sharing* component of a valid result. So it needs to stick around long enough for me to do anchors_for_sharing_providers below.\n\nIn other words, I have to check - separately and independently - whether this provider\u0027s actual root *or* any of its anchor roots are present in the filtered anchor roots. And I can\u0027t do that earlier than here.\n\n(Which is sad, and it would be nice to refactor to fix it, but that refactor wouldn\u0027t be related to this patch.)","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7df5c7f7229fc22c7a65015449dba9e28a7b7816","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        # Exclude this if its anchor (which is its root) isn\u0027t in our"},{"line_number":393,"context_line":"        # prefiltered list of anchors"},{"line_number":394,"context_line":"        if rw_ctx.in_filtered_anchors(root_id):"},{"line_number":395,"context_line":"            alloc_requests.append(req_obj)"},{"line_number":396,"context_line":"        # If this is a sharing provider, we have to include an extra"},{"line_number":397,"context_line":"        # AllocationRequest for every possible anchor."},{"line_number":398,"context_line":"        traits \u003d rp_summary.traits"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_c2ec5a2b","line":395,"updated":"2019-06-17 20:51:54.000000000","message":"If there\u0027s any value in my comments @ https://review.opendev.org/#/c/665492/6/placement/objects/allocation_candidate.py@441 then at least a TODO might be worthwhile here.","commit_id":"b4066967a4e6efcc5e52e975a0aa121dcf83b867"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":392,"context_line":"        # Exclude this if its anchor (which is its root) isn\u0027t in our"},{"line_number":393,"context_line":"        # prefiltered list of anchors"},{"line_number":394,"context_line":"        if rw_ctx.in_filtered_anchors(root_id):"},{"line_number":395,"context_line":"            alloc_requests.append(req_obj)"},{"line_number":396,"context_line":"        # If this is a sharing provider, we have to include an extra"},{"line_number":397,"context_line":"        # AllocationRequest for every possible anchor."},{"line_number":398,"context_line":"        traits \u003d rp_summary.traits"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_0d7ce31e","line":395,"in_reply_to":"9fb8cfa7_c2ec5a2b","updated":"2019-06-17 22:10:51.000000000","message":"There is, but (see response there) I don\u0027t think a TODO here is worth anything, because the refactor would be much broader, and necessarily encompass this spot if they get done.","commit_id":"b4066967a4e6efcc5e52e975a0aa121dcf83b867"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7996f85affc69529ae0e1dce51a56bf228abc492","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        # TODO(efried): If we ran anchors_for_sharing_providers here, we could"},{"line_number":130,"context_line":"        #  narrow to only sharing providers associated with our filtered trees."},{"line_number":131,"context_line":"        #  Unclear whether this would be cheaper than waiting until we\u0027ve"},{"line_number":132,"context_line":"        #  filtered sharing providers for other things (like resources)."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        candidates \u003d {}"},{"line_number":135,"context_line":"        for suffix, group in groups.items():"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_7607671a","line":132,"updated":"2019-06-18 09:01:35.000000000","message":"see below","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"7996f85affc69529ae0e1dce51a56bf228abc492","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        # AllocationRequest for every possible anchor."},{"line_number":398,"context_line":"        traits \u003d rp_summary.traits"},{"line_number":399,"context_line":"        if os_traits.MISC_SHARES_VIA_AGGREGATE in traits:"},{"line_number":400,"context_line":"            anchors \u003d res_ctx.anchors_for_sharing_providers("},{"line_number":401,"context_line":"                rg_ctx.context, [rp_summary.resource_provider.id])"},{"line_number":402,"context_line":"            for anchor in anchors:"},{"line_number":403,"context_line":"                # We already added self"},{"line_number":404,"context_line":"                if anchor.anchor_id \u003d\u003d root_id:"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_b6fddf09","line":401,"range":{"start_line":400,"start_character":0,"end_line":401,"end_character":66},"updated":"2019-06-18 09:01:35.000000000","message":"This is called $(number_of_sharing_providers) times. I\u0027m not sure how many shared storage are in real environments compared to compute hosts, but needs refactor later if we could have several sharing providers, which could be related to the TODO doc at L129.","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8ccc2ebcac0f5b87f9ac4d321d90e452b8607afb","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        # AllocationRequest for every possible anchor."},{"line_number":398,"context_line":"        traits \u003d rp_summary.traits"},{"line_number":399,"context_line":"        if os_traits.MISC_SHARES_VIA_AGGREGATE in traits:"},{"line_number":400,"context_line":"            anchors \u003d res_ctx.anchors_for_sharing_providers("},{"line_number":401,"context_line":"                rg_ctx.context, [rp_summary.resource_provider.id])"},{"line_number":402,"context_line":"            for anchor in anchors:"},{"line_number":403,"context_line":"                # We already added self"},{"line_number":404,"context_line":"                if anchor.anchor_id \u003d\u003d root_id:"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_8923d905","line":401,"range":{"start_line":400,"start_character":0,"end_line":401,"end_character":66},"in_reply_to":"9fb8cfa7_b6fddf09","updated":"2019-06-18 14:32:19.000000000","message":"Mm. It\u0027s actually run ($number_of_request_groups_matching_sharing_providers ∙ $number_of_sharing_providers_matching_one_group) times. An easy improvement would be to cache anchor information so we only hit the db for each unique sharing provider, though in real life there will probably be very little redundancy. Assuming we\u0027ve already narrowed to providers matching the request group (resources, traits, etc.) we still need to run get_anchors for each of those providers, right?\n\nWhat would be better overall is:\n- Identify all unique sharing providers matching any request group (so we\u0027ve already excluded sharing providers that can\u0027t contribute)\n- Run a *single* get_anchors query on all of those at once (this would be a fairly simple SQL change)\n- And while we\u0027re talking about changing the get_anchors method to take a list of sharing providers, we could also make it take a list of viable anchors.\n\nBut yeah, all of that requires a nontrivial rearrange of how this entire algorithm is done.","commit_id":"d422a27a958d833b965e3dc262a58a95f91833e7"}],"placement/objects/research_context.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d112563ac5821cf5b018d6eace957590d2dcef0d","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    # purposes of rough debugging of a single allocation candidates request) as"},{"line_number":351,"context_line":"    # well as reduce the necessary knowledge of SQL in order to understand the"},{"line_number":352,"context_line":"    # queries being executed here."},{"line_number":353,"context_line":"    #"},{"line_number":354,"context_line":"    # NOTE(jaypipes): The efficiency of this operation may be improved by"},{"line_number":355,"context_line":"    # passing the trait_rps and/or forbidden_ip_ids iterables to the"},{"line_number":356,"context_line":"    # get_providers_with_resource() function so that we don\u0027t have to process"},{"line_number":357,"context_line":"    # as many records inside the loop below to remove providers from the"},{"line_number":358,"context_line":"    # eventual results list"},{"line_number":359,"context_line":"    provs_with_resource \u003d set()"},{"line_number":360,"context_line":"    first \u003d True"},{"line_number":361,"context_line":"    for rc_id, amount in rg_ctx.resources.items():"},{"line_number":362,"context_line":"        rc_name \u003d rc_cache.RC_CACHE.string_from_id(rc_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_56104700","side":"PARENT","line":359,"range":{"start_line":353,"start_character":0,"end_line":359,"end_character":1},"updated":"2019-06-15 02:11:46.000000000","message":"this no longer applies since [1] when get_providers_with_resource was moved to rg_ctx\n\n[1] https://review.opendev.org/#/c/660051/","commit_id":"efc396010c334c511c5df7c53857b64b1f77ee7a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9747c6aca784d31021e35e0b20cefa0d5621bf63","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        # A set of provider ids that matches the requested positive aggregates"},{"line_number":85,"context_line":"        self.rps_in_aggs \u003d set()"},{"line_number":86,"context_line":"        if self.member_of:"},{"line_number":87,"context_line":"            # TODO(efried): Filter these by self.root_ids?"},{"line_number":88,"context_line":"            self.rps_in_aggs \u003d provider_ids_matching_aggregates("},{"line_number":89,"context_line":"                context, self.member_of)"},{"line_number":90,"context_line":"            if not self.rps_in_aggs:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_fb66fcec","line":87,"range":{"start_line":87,"start_character":11,"end_line":87,"end_character":58},"updated":"2019-06-16 17:20:49.000000000","message":"Nope. Because this could be a request group for (or including) a shared resource.","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d112563ac5821cf5b018d6eace957590d2dcef0d","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                    \"so no results are possible.\", suffix, tree_ids.root_id,"},{"line_number":123,"context_line":"                    \u0027, \u0027.join(self.root_ids))"},{"line_number":124,"context_line":"                raise exception.NoResultsPossible()"},{"line_number":125,"context_line":"            # Now we know we\u0027re down to a single root for this request group,"},{"line_number":126,"context_line":"            # regardless of how many prefiltered root IDs we got."},{"line_number":127,"context_line":"            self.root_ids \u003d set([tree_ids.root_id])"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        self._rps_with_resource \u003d {}"},{"line_number":130,"context_line":"        for rc_id, amount in self.resources.items():"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_36ca73a0","line":127,"range":{"start_line":125,"start_character":0,"end_line":127,"end_character":51},"updated":"2019-06-15 02:11:46.000000000","message":"!BUG!\n\nThis code path runs for sharing providers, which need to be excluded from the prefiltered root_ids check.\n\nKeep self.tree_root_id separate from self.root_ids.\n\nRemove this assignment.\n\nIt\u0027s possible we have to remove the Optimization: above as well, if in_tree$S is actually applying to the root (as opposed to the anchor) of the sharing provider.","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d112563ac5821cf5b018d6eace957590d2dcef0d","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            # flows down feature) rather than applying later the implicit rule"},{"line_number":135,"context_line":"            # that aggregate on root spans the whole tree"},{"line_number":136,"context_line":"            provs_with_resource \u003d get_providers_with_resource("},{"line_number":137,"context_line":"                context, rc_id, amount, tree_root_ids\u003dself.root_ids or None)"},{"line_number":138,"context_line":"            if not provs_with_resource:"},{"line_number":139,"context_line":"                raise exception.NoResultsPossible()"},{"line_number":140,"context_line":"            self._rps_with_resource[rc_id] \u003d provs_with_resource"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_7639cba1","line":137,"range":{"start_line":137,"start_character":59,"end_line":137,"end_character":67},"updated":"2019-06-15 02:11:46.000000000","message":"and here we need to go back to just passing in self.tree_root_id","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d112563ac5821cf5b018d6eace957590d2dcef0d","unresolved":false,"context_lines":[{"line_number":344,"context_line":"    that have available inventory to satisfy all the supplied requests for"},{"line_number":345,"context_line":"    resources. If no providers match, the empty list is returned."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    :note: This function is used to get results for (a) a RequestGroup with"},{"line_number":348,"context_line":"           use_same_provider\u003dTrue in a granular request, or (b) a short cut"},{"line_number":349,"context_line":"           path for scenarios that do NOT involve sharing or nested providers."},{"line_number":350,"context_line":"           Each `internal provider ID` represents a *single* provider that"},{"line_number":351,"context_line":"           can satisfy *all* of the resource/trait/aggregate criteria. This is"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_96c1df56","line":348,"range":{"start_line":347,"start_character":52,"end_line":348,"end_character":55},"updated":"2019-06-15 02:11:46.000000000","message":"..which can still be satisfied by a sharing provider, so rg_ctx.root_ids is not useful","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d112563ac5821cf5b018d6eace957590d2dcef0d","unresolved":false,"context_lines":[{"line_number":473,"context_line":"            return rp_candidates.RPCandidateList()"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        sharing_providers \u003d rg_ctx.get_rps_with_shared_capacity(rc_id)"},{"line_number":476,"context_line":"        if sharing_providers and rg_ctx.root_ids is None:"},{"line_number":477,"context_line":"            # There are sharing providers for this resource class, so we"},{"line_number":478,"context_line":"            # should also get combinations of (sharing provider, anchor root)"},{"line_number":479,"context_line":"            # in addition to (non-sharing provider, anchor root) we\u0027ve just"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_161f2f08","line":476,"range":{"start_line":476,"start_character":40,"end_line":476,"end_character":48},"updated":"2019-06-15 02:11:46.000000000","message":"I think this needs to be split back out again as well.","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d112563ac5821cf5b018d6eace957590d2dcef0d","unresolved":false,"context_lines":[{"line_number":480,"context_line":"            # got via get_providers_with_resource() above. We must skip this"},{"line_number":481,"context_line":"            # process if we\u0027re filtering by trees (the in_tree\u003d\u003crp_uuid\u003e and/or"},{"line_number":482,"context_line":"            # root_required queryparams)."},{"line_number":483,"context_line":"            rc_provs_with_inv \u003d anchors_for_sharing_providers("},{"line_number":484,"context_line":"                rg_ctx.context, sharing_providers, get_id\u003dTrue)"},{"line_number":485,"context_line":"            provs_with_inv_rc.add_rps(rc_provs_with_inv, rc_id)"},{"line_number":486,"context_line":"            LOG.debug("}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_76d54b1b","line":483,"range":{"start_line":483,"start_character":32,"end_line":483,"end_character":61},"updated":"2019-06-15 02:11:46.000000000","message":"and maybe in here we can filter out based on the anchors","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d112563ac5821cf5b018d6eace957590d2dcef0d","unresolved":false,"context_lines":[{"line_number":516,"context_line":"        # filter provs_with_inv to have only trees with enough inventories"},{"line_number":517,"context_line":"        # for this resource class. Here \"tree\" includes sharing providers"},{"line_number":518,"context_line":"        # in its terminology"},{"line_number":519,"context_line":"        provs_with_inv.merge_common_trees(provs_with_inv_rc)"},{"line_number":520,"context_line":"        LOG.debug("},{"line_number":521,"context_line":"            \"found %d providers under %d trees after filtering by \""},{"line_number":522,"context_line":"            \"previous result\","}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_36db534f","line":519,"range":{"start_line":519,"start_character":23,"end_line":519,"end_character":41},"updated":"2019-06-15 02:11:46.000000000","message":"or maybe it has to be done here","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9f29e46849711b8eeb9fea37a74e8e182bcef94f","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    # purposes of rough debugging of a single allocation candidates request) as"},{"line_number":353,"context_line":"    # well as reduce the necessary knowledge of SQL in order to understand the"},{"line_number":354,"context_line":"    # queries being executed here."},{"line_number":355,"context_line":"    #"},{"line_number":356,"context_line":"    # NOTE(jaypipes): The efficiency of this operation may be improved by"},{"line_number":357,"context_line":"    # passing the trait_rps and/or forbidden_ip_ids iterables to the"},{"line_number":358,"context_line":"    # get_providers_with_resource() function so that we don\u0027t have to process"},{"line_number":359,"context_line":"    # as many records inside the loop below to remove providers from the"},{"line_number":360,"context_line":"    # eventual results list"},{"line_number":361,"context_line":"    provs_with_resource \u003d set()"},{"line_number":362,"context_line":"    first \u003d True"},{"line_number":363,"context_line":"    for rc_id, amount in rg_ctx.resources.items():"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_dbfbf875","side":"PARENT","line":360,"range":{"start_line":355,"start_character":0,"end_line":360,"end_character":27},"updated":"2019-06-16 21:22:13.000000000","message":"Unrelated fixup. Pull it out?","commit_id":"143a671bb576ab1cf6c271d580830852894f5214"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    # purposes of rough debugging of a single allocation candidates request) as"},{"line_number":353,"context_line":"    # well as reduce the necessary knowledge of SQL in order to understand the"},{"line_number":354,"context_line":"    # queries being executed here."},{"line_number":355,"context_line":"    #"},{"line_number":356,"context_line":"    # NOTE(jaypipes): The efficiency of this operation may be improved by"},{"line_number":357,"context_line":"    # passing the trait_rps and/or forbidden_ip_ids iterables to the"},{"line_number":358,"context_line":"    # get_providers_with_resource() function so that we don\u0027t have to process"},{"line_number":359,"context_line":"    # as many records inside the loop below to remove providers from the"},{"line_number":360,"context_line":"    # eventual results list"},{"line_number":361,"context_line":"    provs_with_resource \u003d set()"},{"line_number":362,"context_line":"    first \u003d True"},{"line_number":363,"context_line":"    for rc_id, amount in rg_ctx.resources.items():"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_dfc43662","side":"PARENT","line":360,"range":{"start_line":355,"start_character":0,"end_line":360,"end_character":27},"in_reply_to":"9fb8cfa7_ada60953","updated":"2019-06-17 22:10:51.000000000","message":"https://review.opendev.org/#/c/665691","commit_id":"143a671bb576ab1cf6c271d580830852894f5214"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8f4cf15a477584e3ba9862e652ecc2919459e9c3","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    # purposes of rough debugging of a single allocation candidates request) as"},{"line_number":353,"context_line":"    # well as reduce the necessary knowledge of SQL in order to understand the"},{"line_number":354,"context_line":"    # queries being executed here."},{"line_number":355,"context_line":"    #"},{"line_number":356,"context_line":"    # NOTE(jaypipes): The efficiency of this operation may be improved by"},{"line_number":357,"context_line":"    # passing the trait_rps and/or forbidden_ip_ids iterables to the"},{"line_number":358,"context_line":"    # get_providers_with_resource() function so that we don\u0027t have to process"},{"line_number":359,"context_line":"    # as many records inside the loop below to remove providers from the"},{"line_number":360,"context_line":"    # eventual results list"},{"line_number":361,"context_line":"    provs_with_resource \u003d set()"},{"line_number":362,"context_line":"    first \u003d True"},{"line_number":363,"context_line":"    for rc_id, amount in rg_ctx.resources.items():"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_ada60953","side":"PARENT","line":360,"range":{"start_line":355,"start_character":0,"end_line":360,"end_character":27},"in_reply_to":"9fb8cfa7_dbfbf875","updated":"2019-06-17 08:43:47.000000000","message":"+1","commit_id":"143a671bb576ab1cf6c271d580830852894f5214"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9f29e46849711b8eeb9fea37a74e8e182bcef94f","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        if request.in_tree:"},{"line_number":106,"context_line":"            tree_ids \u003d provider_ids_from_uuid(context, request.in_tree)"},{"line_number":107,"context_line":"            if tree_ids is None:"},{"line_number":108,"context_line":"                LOG.debug(\"No provider found for in_tree%s\u003d%s\","},{"line_number":109,"context_line":"                          suffix, request.in_tree)"},{"line_number":110,"context_line":"                raise exception.ResourceProviderNotFound()"},{"line_number":111,"context_line":"            self.tree_root_id \u003d tree_ids.root_id"},{"line_number":112,"context_line":"            LOG.debug(\"Group %s getting allocation candidates in the same \""},{"line_number":113,"context_line":"                      \"tree with the root provider %s\","},{"line_number":114,"context_line":"                      self.suffix, tree_ids.root_uuid)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        self._rps_with_resource \u003d {}"},{"line_number":117,"context_line":"        for rc_id, amount in self.resources.items():"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_9bf10098","line":114,"range":{"start_line":108,"start_character":0,"end_line":114,"end_character":54},"updated":"2019-06-16 21:22:13.000000000","message":"unrelated fixup","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8f4cf15a477584e3ba9862e652ecc2919459e9c3","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        if request.in_tree:"},{"line_number":106,"context_line":"            tree_ids \u003d provider_ids_from_uuid(context, request.in_tree)"},{"line_number":107,"context_line":"            if tree_ids is None:"},{"line_number":108,"context_line":"                LOG.debug(\"No provider found for in_tree%s\u003d%s\","},{"line_number":109,"context_line":"                          suffix, request.in_tree)"},{"line_number":110,"context_line":"                raise exception.ResourceProviderNotFound()"},{"line_number":111,"context_line":"            self.tree_root_id \u003d tree_ids.root_id"},{"line_number":112,"context_line":"            LOG.debug(\"Group %s getting allocation candidates in the same \""},{"line_number":113,"context_line":"                      \"tree with the root provider %s\","},{"line_number":114,"context_line":"                      self.suffix, tree_ids.root_uuid)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        self._rps_with_resource \u003d {}"},{"line_number":117,"context_line":"        for rc_id, amount in self.resources.items():"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_d648aa2f","line":114,"range":{"start_line":108,"start_character":0,"end_line":114,"end_character":54},"in_reply_to":"9fb8cfa7_9bf10098","updated":"2019-06-17 08:43:47.000000000","message":"yes, let\u0027s separate them","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        if request.in_tree:"},{"line_number":106,"context_line":"            tree_ids \u003d provider_ids_from_uuid(context, request.in_tree)"},{"line_number":107,"context_line":"            if tree_ids is None:"},{"line_number":108,"context_line":"                LOG.debug(\"No provider found for in_tree%s\u003d%s\","},{"line_number":109,"context_line":"                          suffix, request.in_tree)"},{"line_number":110,"context_line":"                raise exception.ResourceProviderNotFound()"},{"line_number":111,"context_line":"            self.tree_root_id \u003d tree_ids.root_id"},{"line_number":112,"context_line":"            LOG.debug(\"Group %s getting allocation candidates in the same \""},{"line_number":113,"context_line":"                      \"tree with the root provider %s\","},{"line_number":114,"context_line":"                      self.suffix, tree_ids.root_uuid)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        self._rps_with_resource \u003d {}"},{"line_number":117,"context_line":"        for rc_id, amount in self.resources.items():"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_ffcd7a86","line":114,"range":{"start_line":108,"start_character":0,"end_line":114,"end_character":54},"in_reply_to":"9fb8cfa7_d648aa2f","updated":"2019-06-17 22:10:51.000000000","message":"https://review.opendev.org/#/c/665691","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9f29e46849711b8eeb9fea37a74e8e182bcef94f","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    #  AND inv.min_unit \u003c\u003d $AMOUNT"},{"line_number":301,"context_line":"    #  AND inv.max_unit \u003e\u003d $AMOUNT"},{"line_number":302,"context_line":"    #  AND $AMOUNT % inv.step_size \u003d\u003d 0"},{"line_number":303,"context_line":"    #  # If tree_root_id specified:"},{"line_number":304,"context_line":"    #  AND rp.root_provider_id \u003d\u003d $tree_root_id"},{"line_number":305,"context_line":"    rpt \u003d sa.alias(_RP_TBL, name\u003d\"rp\")"},{"line_number":306,"context_line":"    inv \u003d sa.alias(_INV_TBL, name\u003d\"inv\")"},{"line_number":307,"context_line":"    usage \u003d _usage_select([rc_id])"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_fbf6fc8e","line":304,"range":{"start_line":303,"start_character":0,"end_line":304,"end_character":47},"updated":"2019-06-16 21:22:13.000000000","message":"unrelated fixup","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":300,"context_line":"    #  AND inv.min_unit \u003c\u003d $AMOUNT"},{"line_number":301,"context_line":"    #  AND inv.max_unit \u003e\u003d $AMOUNT"},{"line_number":302,"context_line":"    #  AND $AMOUNT % inv.step_size \u003d\u003d 0"},{"line_number":303,"context_line":"    #  # If tree_root_id specified:"},{"line_number":304,"context_line":"    #  AND rp.root_provider_id \u003d\u003d $tree_root_id"},{"line_number":305,"context_line":"    rpt \u003d sa.alias(_RP_TBL, name\u003d\"rp\")"},{"line_number":306,"context_line":"    inv \u003d sa.alias(_INV_TBL, name\u003d\"inv\")"},{"line_number":307,"context_line":"    usage \u003d _usage_select([rc_id])"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_bfc70265","line":304,"range":{"start_line":303,"start_character":0,"end_line":304,"end_character":47},"in_reply_to":"9fb8cfa7_fbf6fc8e","updated":"2019-06-17 22:10:51.000000000","message":"https://review.opendev.org/#/c/665691","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9f29e46849711b8eeb9fea37a74e8e182bcef94f","unresolved":false,"context_lines":[{"line_number":907,"context_line":""},{"line_number":908,"context_line":"@db_api.placement_context_manager.reader"},{"line_number":909,"context_line":"def get_sharing_providers(ctx, rp_ids\u003dNone):"},{"line_number":910,"context_line":"    \"\"\"Returns a set of resource provider IDs (internal IDs, not UUIDs)"},{"line_number":911,"context_line":"    that indicate that they share resource via an aggregate association."},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"    Shared resource providers are marked with a standard trait called"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_bbec04bb","line":910,"range":{"start_line":910,"start_character":17,"end_line":910,"end_character":20},"updated":"2019-06-16 21:22:13.000000000","message":"unrelated","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":907,"context_line":""},{"line_number":908,"context_line":"@db_api.placement_context_manager.reader"},{"line_number":909,"context_line":"def get_sharing_providers(ctx, rp_ids\u003dNone):"},{"line_number":910,"context_line":"    \"\"\"Returns a set of resource provider IDs (internal IDs, not UUIDs)"},{"line_number":911,"context_line":"    that indicate that they share resource via an aggregate association."},{"line_number":912,"context_line":""},{"line_number":913,"context_line":"    Shared resource providers are marked with a standard trait called"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_9fa47ebb","line":910,"range":{"start_line":910,"start_character":17,"end_line":910,"end_character":20},"in_reply_to":"9fb8cfa7_bbec04bb","updated":"2019-06-17 22:10:51.000000000","message":"https://review.opendev.org/#/c/665691","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"7df5c7f7229fc22c7a65015449dba9e28a7b7816","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        we don\u0027t have filtered anchors, that implicitly means \"all possible"},{"line_number":217,"context_line":"        anchors\", so we return True.)"},{"line_number":218,"context_line":"        \"\"\""},{"line_number":219,"context_line":"        if self.anchor_root_ids is None:"},{"line_number":220,"context_line":"            # Not filtering anchors"},{"line_number":221,"context_line":"            return True"},{"line_number":222,"context_line":"        return anchor_root_id in self.anchor_root_ids"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_8244221d","line":219,"updated":"2019-06-17 20:51:54.000000000","message":"I guess it\u0027s impossible for in_filter_anchors to be called before _process_anchor_traits, so there\u0027s no race on None here meaning two different things (unitialized v \"really, None\")","commit_id":"b4066967a4e6efcc5e52e975a0aa121dcf83b867"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        we don\u0027t have filtered anchors, that implicitly means \"all possible"},{"line_number":217,"context_line":"        anchors\", so we return True.)"},{"line_number":218,"context_line":"        \"\"\""},{"line_number":219,"context_line":"        if self.anchor_root_ids is None:"},{"line_number":220,"context_line":"            # Not filtering anchors"},{"line_number":221,"context_line":"            return True"},{"line_number":222,"context_line":"        return anchor_root_id in self.anchor_root_ids"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fb8cfa7_edee2fb3","line":219,"in_reply_to":"9fb8cfa7_8244221d","updated":"2019-06-17 22:10:51.000000000","message":"Correct, _process_anchor_traits is called (only) at __init__ time. I could have inlined it there, but given the TODO at L59 I thought that might be frowned upon :)","commit_id":"b4066967a4e6efcc5e52e975a0aa121dcf83b867"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0882d67076f1e993780511e98bc092c06448c50c","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        anchor_required \u003d set(trait_obj.ids_from_names("},{"line_number":205,"context_line":"            self._ctx,"},{"line_number":206,"context_line":"            anchor_required).values()) if anchor_required else None"},{"line_number":207,"context_line":"        anchor_forbidden \u003d set(trait_obj.ids_from_names("},{"line_number":208,"context_line":"            self._ctx,"},{"line_number":209,"context_line":"            anchor_forbidden).values()) if anchor_forbidden else None"}],"source_content_type":"text/x-python","patch_set":12,"id":"9fb8cfa7_7ec88773","line":206,"range":{"start_line":206,"start_character":39,"end_line":206,"end_character":67},"updated":"2019-06-19 10:15:28.000000000","message":"why we handle the empty anchor_required set differently? Why we need the special None value instead of simply passing the empty set forward?","commit_id":"924e7fcd0e4898d48b19f25990c67c323a28202f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2dceefa6a9efe3d46c82797486284b7ba4cfa0bc","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        anchor_required \u003d set(trait_obj.ids_from_names("},{"line_number":205,"context_line":"            self._ctx,"},{"line_number":206,"context_line":"            anchor_required).values()) if anchor_required else None"},{"line_number":207,"context_line":"        anchor_forbidden \u003d set(trait_obj.ids_from_names("},{"line_number":208,"context_line":"            self._ctx,"},{"line_number":209,"context_line":"            anchor_forbidden).values()) if anchor_forbidden else None"}],"source_content_type":"text/x-python","patch_set":12,"id":"9fb8cfa7_6356a209","line":206,"range":{"start_line":206,"start_character":39,"end_line":206,"end_character":67},"in_reply_to":"9fb8cfa7_7ec88773","updated":"2019-06-19 23:26:46.000000000","message":"Because ids_from_names explodes if you pass it the empty set.","commit_id":"924e7fcd0e4898d48b19f25990c67c323a28202f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0882d67076f1e993780511e98bc092c06448c50c","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            anchor_required).values()) if anchor_required else None"},{"line_number":207,"context_line":"        anchor_forbidden \u003d set(trait_obj.ids_from_names("},{"line_number":208,"context_line":"            self._ctx,"},{"line_number":209,"context_line":"            anchor_forbidden).values()) if anchor_forbidden else None"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        self.anchor_root_ids \u003d _get_roots_with_traits("},{"line_number":212,"context_line":"            self._ctx, anchor_required, anchor_forbidden)"}],"source_content_type":"text/x-python","patch_set":12,"id":"9fb8cfa7_3ea0cfa5","line":209,"range":{"start_line":209,"start_character":41,"end_line":209,"end_character":69},"updated":"2019-06-19 10:15:28.000000000","message":"ditto","commit_id":"924e7fcd0e4898d48b19f25990c67c323a28202f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3b2e06902981d0f8f697891c7b79597f9f28dd32","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        self.group_policy \u003d rqparams.group_policy"},{"line_number":179,"context_line":"        self._nested_aware \u003d nested_aware"},{"line_number":180,"context_line":"        self.has_trees \u003d _has_provider_trees(context)"},{"line_number":181,"context_line":"        self.anchor_root_ids \u003d None"},{"line_number":182,"context_line":"        self._process_anchor_traits("},{"line_number":183,"context_line":"            rqparams.anchor_required, rqparams.anchor_forbidden)"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9fb8cfa7_8a2dd9fe","line":181,"updated":"2019-06-20 17:45:47.000000000","message":"empty set?\n\nI need to look elsewhere to see if there is a guard that requires None","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"93bd07daff795f9638e456c984d0da298e4e7f2c","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        self.group_policy \u003d rqparams.group_policy"},{"line_number":179,"context_line":"        self._nested_aware \u003d nested_aware"},{"line_number":180,"context_line":"        self.has_trees \u003d _has_provider_trees(context)"},{"line_number":181,"context_line":"        self.anchor_root_ids \u003d None"},{"line_number":182,"context_line":"        self._process_anchor_traits("},{"line_number":183,"context_line":"            rqparams.anchor_required, rqparams.anchor_forbidden)"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9fb8cfa7_9babe973","line":181,"in_reply_to":"9fb8cfa7_8a2dd9fe","updated":"2019-06-20 22:00:14.000000000","message":"Doc\u0027d with a comment as suggested.","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3b2e06902981d0f8f697891c7b79597f9f28dd32","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        \"\"\"Set or filter self.anchor_root_ids according to anchor"},{"line_number":187,"context_line":"        required/forbidden traits."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        :param anchor_required: Set of trait names which the anchor root of"},{"line_number":190,"context_line":"                each returned allocation candidate must possess, regardless of"},{"line_number":191,"context_line":"                any RequestGroup filters."},{"line_number":192,"context_line":"        :param anchor_forbidden: Set of trait names which the anchor root of"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fb8cfa7_aa769d3d","line":189,"range":{"start_line":189,"start_character":61,"end_line":189,"end_character":72},"updated":"2019-06-20 17:45:47.000000000","message":"Feel redundant to me.\n\nAn anchor is a root. You could say either of:\n\n* which the anchor of each returned ...\n* which the root of each returned ...\n\nand mean mostly the same thing.\n\nIn this context it seems like you just want anchor?\n\nOr am I missing something?","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"93bd07daff795f9638e456c984d0da298e4e7f2c","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        \"\"\"Set or filter self.anchor_root_ids according to anchor"},{"line_number":187,"context_line":"        required/forbidden traits."},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        :param anchor_required: Set of trait names which the anchor root of"},{"line_number":190,"context_line":"                each returned allocation candidate must possess, regardless of"},{"line_number":191,"context_line":"                any RequestGroup filters."},{"line_number":192,"context_line":"        :param anchor_forbidden: Set of trait names which the anchor root of"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fb8cfa7_bb8cadd7","line":189,"range":{"start_line":189,"start_character":61,"end_line":189,"end_character":72},"in_reply_to":"9fb8cfa7_aa769d3d","updated":"2019-06-20 22:00:14.000000000","message":"Done (in the RequestWideParams docstring, which is the only place these are doc\u0027d now)","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3b2e06902981d0f8f697891c7b79597f9f28dd32","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        we don\u0027t have filtered anchors, that implicitly means \"all possible"},{"line_number":220,"context_line":"        anchors\", so we return True.)"},{"line_number":221,"context_line":"        \"\"\""},{"line_number":222,"context_line":"        if self.anchor_root_ids is None:"},{"line_number":223,"context_line":"            # Not filtering anchors"},{"line_number":224,"context_line":"            return True"},{"line_number":225,"context_line":"        return anchor_root_id in self.anchor_root_ids"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fb8cfa7_6ac66519","line":222,"updated":"2019-06-20 17:45:47.000000000","message":"Ah, I see, anchor_root_ids as None does have significant meaning because if you had empty set and you skipped this line, it would be False.\n\nAs a nit: you might comment as such up in __init__ lest someone do this little mental dance of mine again.","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"93bd07daff795f9638e456c984d0da298e4e7f2c","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        we don\u0027t have filtered anchors, that implicitly means \"all possible"},{"line_number":220,"context_line":"        anchors\", so we return True.)"},{"line_number":221,"context_line":"        \"\"\""},{"line_number":222,"context_line":"        if self.anchor_root_ids is None:"},{"line_number":223,"context_line":"            # Not filtering anchors"},{"line_number":224,"context_line":"            return True"},{"line_number":225,"context_line":"        return anchor_root_id in self.anchor_root_ids"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fb8cfa7_7bc075e1","line":222,"in_reply_to":"9fb8cfa7_6ac66519","updated":"2019-06-20 22:00:14.000000000","message":"Done","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"}],"placement/rest_api_version_history.rst":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3b2e06902981d0f8f697891c7b79597f9f28dd32","unresolved":false,"context_lines":[{"line_number":649,"context_line":"each optionally prefixed with ``!`` to indicate a forbidden trait, in the same"},{"line_number":650,"context_line":"format as the ``required`` query parameter. This restricts allocation requests"},{"line_number":651,"context_line":"in the response to only those whose (non-sharing) tree\u0027s root resource provider"},{"line_number":652,"context_line":"satisfies the specified trait requirements."}],"source_content_type":"text/x-rst","patch_set":14,"id":"9fb8cfa7_0a8329ab","line":652,"updated":"2019-06-20 17:45:47.000000000","message":"Is it worth mentioning something like \"this matters when you are using nested resource providers but not otherwise\" or something along those lines?\n\nIn this document in particular I think we need to be concerned with signalling who needs to care about something.","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"93bd07daff795f9638e456c984d0da298e4e7f2c","unresolved":false,"context_lines":[{"line_number":649,"context_line":"each optionally prefixed with ``!`` to indicate a forbidden trait, in the same"},{"line_number":650,"context_line":"format as the ``required`` query parameter. This restricts allocation requests"},{"line_number":651,"context_line":"in the response to only those whose (non-sharing) tree\u0027s root resource provider"},{"line_number":652,"context_line":"satisfies the specified trait requirements."}],"source_content_type":"text/x-rst","patch_set":14,"id":"9fb8cfa7_f621dcfd","line":652,"in_reply_to":"9fb8cfa7_0a8329ab","updated":"2019-06-20 22:00:14.000000000","message":"Mm, I don\u0027t think we should.\n\nIMO the API consumer should use root_required *any time* she\u0027s dealing with a \"provider trait\". This lets her not have to worry about whether (part of) the provider environment is set up with trees or not, or will be made so in the future, by whoever did/does that, which may not be her.\n\nPut another way: It doesn\u0027t hurt anything to use root_required instead of required[$S] (beyond performance issues, which are as yet hypothetical, but should in any case be transient). Whereas it *could* hurt something to do the opposite.\n\nAll of this could be explained, of course, but it would be more involved than \"only use this with trees\".\n\nIn fact, it *is* explained - in the usage doc. We don\u0027t seem to have a precedent in rest_api_version_history, but how would you feel about having a link to that doc from here?","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"becab51f277cf5a4c6421a463570c4a74e6c9ea6","unresolved":false,"context_lines":[{"line_number":649,"context_line":"each optionally prefixed with ``!`` to indicate a forbidden trait, in the same"},{"line_number":650,"context_line":"format as the ``required`` query parameter. This restricts allocation requests"},{"line_number":651,"context_line":"in the response to only those whose (non-sharing) tree\u0027s root resource provider"},{"line_number":652,"context_line":"satisfies the specified trait requirements."}],"source_content_type":"text/x-rst","patch_set":14,"id":"9fb8cfa7_c0b72d3a","line":652,"in_reply_to":"9fb8cfa7_0df9fe7e","updated":"2019-06-20 22:55:32.000000000","message":"As mentioned in irc[1] I sometimes think we should, but we may as well not. I\u0027m on the hook to make a docs story that describes ways in which we can make the simple path for non-nested situations a little more obvious, so people who don\u0027t care about it know that they can ignore a whole pile of stuff.\n\n[1] near http://eavesdrop.openstack.org/irclogs/%23openstack-placement/%23openstack-placement.2019-06-20.log.html#t2019-06-20T22:22:08","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a3db77db1bf0e46a67db0e4bd33cc6285cb56d1f","unresolved":false,"context_lines":[{"line_number":649,"context_line":"each optionally prefixed with ``!`` to indicate a forbidden trait, in the same"},{"line_number":650,"context_line":"format as the ``required`` query parameter. This restricts allocation requests"},{"line_number":651,"context_line":"in the response to only those whose (non-sharing) tree\u0027s root resource provider"},{"line_number":652,"context_line":"satisfies the specified trait requirements."}],"source_content_type":"text/x-rst","patch_set":14,"id":"9fb8cfa7_0df9fe7e","line":652,"in_reply_to":"9fb8cfa7_8d896e27","updated":"2019-06-20 22:17:16.000000000","message":"Should we go back and add \"you probably don\u0027t care about this unless you\u0027re nesting\" to the sections for 1.25 (granular), 1.29 (nested GET /a_c), 1.33 (arbitrary suffixes), and 1.34 (mappings) as well?","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"f27426964668ea07ebd535e198fc967cb53cd800","unresolved":false,"context_lines":[{"line_number":649,"context_line":"each optionally prefixed with ``!`` to indicate a forbidden trait, in the same"},{"line_number":650,"context_line":"format as the ``required`` query parameter. This restricts allocation requests"},{"line_number":651,"context_line":"in the response to only those whose (non-sharing) tree\u0027s root resource provider"},{"line_number":652,"context_line":"satisfies the specified trait requirements."}],"source_content_type":"text/x-rst","patch_set":14,"id":"9fb8cfa7_8d896e27","line":652,"in_reply_to":"9fb8cfa7_f621dcfd","updated":"2019-06-20 22:10:48.000000000","message":"I think what I\u0027m trying to say here is that for people who are already using required and are not using nested, root_required is something they can completely ignore and that is safe to do. It is also safe for them to be ignorant of the difference between provider traits and resource traits (because they aren\u0027t using nested).\n\nNot using nested is going to be a thing for many people for quite some time and for some people for a very long time. We don\u0027t need to shock them into thinking they have to do something differently when they, in fact, do not have to do something differently.\n\nI agree with you that the API consumer (in its form as code inside something like nova) should do the right and best thing for its context, but humans read rest api version histories, not code inside nova, and humans need some contextualizing and clear boundaries on what they have to care about versus what they might care about if they are motivated.","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"}],"placement/tests/functional/gabbits/allocation-candidates-root-required.yaml":[{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8f4cf15a477584e3ba9862e652ecc2919459e9c3","unresolved":false,"context_lines":[{"line_number":25,"context_line":"  status: 400"},{"line_number":26,"context_line":"  response_strings:"},{"line_number":27,"context_line":"    - \"Conflicting required and forbidden traits found in root_required: HW_CPU_X86_AVX2\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"- name: no hits for a required trait that is on children in one tree and absent from the other"},{"line_number":30,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1\u0026root_required\u003dHW_NUMA_ROOT"},{"line_number":31,"context_line":"  status: 200"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fb8cfa7_16dba24f","line":28,"updated":"2019-06-17 08:43:47.000000000","message":"Let\u0027s add a request with non-existing trait with \"root_required\" param.\nThat is now 404 NotFound with this patch, but I think 400 is better since in master it is 400 BadRequest with existing \"required\" (non-root) param.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":25,"context_line":"  status: 400"},{"line_number":26,"context_line":"  response_strings:"},{"line_number":27,"context_line":"    - \"Conflicting required and forbidden traits found in root_required: HW_CPU_X86_AVX2\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"- name: no hits for a required trait that is on children in one tree and absent from the other"},{"line_number":30,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1\u0026root_required\u003dHW_NUMA_ROOT"},{"line_number":31,"context_line":"  status: 200"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fb8cfa7_d9e4513f","line":28,"in_reply_to":"9fb8cfa7_16dba24f","updated":"2019-06-17 22:10:51.000000000","message":"Good find, Tetsuro. I added a couple of tests for that, and in the latest refactor (PS9), TraitNotFound is raised from a place that gets trapped and converted appropriately.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3965aedc624312331d2c17f6d3ba4d1023d26e75","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    # always provided by the sharing provider."},{"line_number":111,"context_line":"    $.allocation_requests.`len`: 2"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"# TODO(efried): forbidden-ish and combo cases for the above"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fb8cfa7_732c6b4a","line":113,"updated":"2019-06-17 12:45:03.000000000","message":"Is duplicating a trait in root_requried, required and required$S (and combinations) a thing we should exercise (and presumably decide what the right thing is)","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7b989cbb61e19437ea698ffc13dd2737a42bbd44","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    # always provided by the sharing provider."},{"line_number":111,"context_line":"    $.allocation_requests.`len`: 2"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"# TODO(efried): forbidden-ish and combo cases for the above"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"9fb8cfa7_ed45cf44","line":113,"in_reply_to":"9fb8cfa7_732c6b4a","updated":"2019-06-17 22:10:51.000000000","message":"Yes, good idea.\n\nI\u0027m working on it; but might be PS11 or so before I have it complete.","commit_id":"4b0e8eca777b656deb6de3a051844f30ef9fbbd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7fca28ef4d97c23caef4e1c1283813e68507adac","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    $.allocation_requests..allocations[\"$ENVIRON[\u0027SS1_UUID\u0027]\"].resources.DISK_GB: 100"},{"line_number":174,"context_line":"    $.allocation_requests..allocations[\"$ENVIRON[\u0027CN2_UUID\u0027]\"].resources.DISK_GB: 100"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"# TODO(efried): forbidden-ish and combo cases for the above"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9fb8cfa7_623797e5","line":176,"range":{"start_line":176,"start_character":0,"end_line":176,"end_character":59},"updated":"2019-06-18 20:32:55.000000000","message":"done","commit_id":"864648ab2e7f918747d44c4b608cbd16980d8abc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0882d67076f1e993780511e98bc092c06448c50c","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    $.allocation_requests.`len`: 0"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"- name: root_required trait on children"},{"line_number":64,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1,MEMORY_MB:1024,DISK_GB:100\u0026root_required\u003dHW_NUMA_ROOT"},{"line_number":65,"context_line":"  status: 200"},{"line_number":66,"context_line":"  response_json_paths:"},{"line_number":67,"context_line":"    # HW_NUMA_ROOT is on child providers, not on any root"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"9fb8cfa7_c9c1bf82","line":64,"updated":"2019-06-19 10:15:28.000000000","message":"how does this different from L50?","commit_id":"924e7fcd0e4898d48b19f25990c67c323a28202f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2dceefa6a9efe3d46c82797486284b7ba4cfa0bc","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    $.allocation_requests.`len`: 0"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"- name: root_required trait on children"},{"line_number":64,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1,MEMORY_MB:1024,DISK_GB:100\u0026root_required\u003dHW_NUMA_ROOT"},{"line_number":65,"context_line":"  status: 200"},{"line_number":66,"context_line":"  response_json_paths:"},{"line_number":67,"context_line":"    # HW_NUMA_ROOT is on child providers, not on any root"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"9fb8cfa7_a3833a56","line":64,"in_reply_to":"9fb8cfa7_c9c1bf82","updated":"2019-06-19 23:26:46.000000000","message":"The other resources bring in other providers, including the root, so here we\u0027re proving that that doesn\u0027t f up the result.","commit_id":"924e7fcd0e4898d48b19f25990c67c323a28202f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0882d67076f1e993780511e98bc092c06448c50c","unresolved":false,"context_lines":[{"line_number":71,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1,MEMORY_MB:1024,DISK_GB:100\u0026root_required\u003dHW_CPU_X86_AVX2"},{"line_number":72,"context_line":"  status: 200"},{"line_number":73,"context_line":"  response_json_paths:"},{"line_number":74,"context_line":"    # MISC_SHARES is on the sharing root, but not on any of the anchor roots"},{"line_number":75,"context_line":"    $.allocation_requests.`len`: 0"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"- name: limit to multiattach-capable unsuffixed no sharing"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"9fb8cfa7_295f3be6","line":74,"range":{"start_line":74,"start_character":6,"end_line":74,"end_character":17},"updated":"2019-06-19 10:15:28.000000000","message":"How MISC_SHARES relevant here? root_required is asking for HW_CPU_X86_AVX2","commit_id":"924e7fcd0e4898d48b19f25990c67c323a28202f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2dceefa6a9efe3d46c82797486284b7ba4cfa0bc","unresolved":false,"context_lines":[{"line_number":71,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1,MEMORY_MB:1024,DISK_GB:100\u0026root_required\u003dHW_CPU_X86_AVX2"},{"line_number":72,"context_line":"  status: 200"},{"line_number":73,"context_line":"  response_json_paths:"},{"line_number":74,"context_line":"    # MISC_SHARES is on the sharing root, but not on any of the anchor roots"},{"line_number":75,"context_line":"    $.allocation_requests.`len`: 0"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"- name: limit to multiattach-capable unsuffixed no sharing"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"9fb8cfa7_c3866e66","line":74,"range":{"start_line":74,"start_character":6,"end_line":74,"end_character":17},"in_reply_to":"9fb8cfa7_295f3be6","updated":"2019-06-19 23:26:46.000000000","message":"copy pasta, fixed.","commit_id":"924e7fcd0e4898d48b19f25990c67c323a28202f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3b2e06902981d0f8f697891c7b79597f9f28dd32","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"9fb8cfa7_35ce8eb4","updated":"2019-06-20 17:45:47.000000000","message":"Fron ps6: \"Is duplicating a trait in root_requried, required and required$S (and combinations) a thing we should exercise (and presumably decide what the right thing is)\"\n\nThat doesn\u0027t look like it is in here yet. I think we need that.","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"93bd07daff795f9638e456c984d0da298e4e7f2c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"9fb8cfa7_d654d856","in_reply_to":"9fb8cfa7_35ce8eb4","updated":"2019-06-20 22:00:14.000000000","message":"I thought I added that...\n\n...oh, I misread. I heard \"cases for [root_]required for a trait that\u0027s duplicated on root and non-root\". Which is what L133-182 are about.\n\nI get it now. Will do.","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3b2e06902981d0f8f697891c7b79597f9f28dd32","unresolved":false,"context_lines":[{"line_number":44,"context_line":"  response_strings:"},{"line_number":45,"context_line":"    - Query parameter \u0027root_required\u0027 may be specified only once."},{"line_number":46,"context_line":"  response_json_paths:"},{"line_number":47,"context_line":"    errors[0].code: placement.query.duplicate_key"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"- name: no hits for a required trait that is on children in one tree and absent from the other"},{"line_number":50,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1\u0026root_required\u003dHW_NUMA_ROOT"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"9fb8cfa7_4a3da1db","line":47,"updated":"2019-06-20 17:45:47.000000000","message":"✔","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3b2e06902981d0f8f697891c7b79597f9f28dd32","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    # MISC_SHARES is on the sharing root, but not on any of the anchor roots"},{"line_number":61,"context_line":"    $.allocation_requests.`len`: 0"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"- name: root_required trait on children"},{"line_number":64,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1,MEMORY_MB:1024,DISK_GB:100\u0026root_required\u003dHW_NUMA_ROOT"},{"line_number":65,"context_line":"  status: 200"},{"line_number":66,"context_line":"  response_json_paths:"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"9fb8cfa7_4a160158","line":63,"updated":"2019-06-20 17:45:47.000000000","message":"how different is this from 49?\n\nI suppose it is different if you don\u0027t know the implementation, so fair enough. More tests is good (to me).","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3b2e06902981d0f8f697891c7b79597f9f28dd32","unresolved":false,"context_lines":[{"line_number":79,"context_line":"  status: 200"},{"line_number":80,"context_line":"  verbose: true"},{"line_number":81,"context_line":"  response_json_paths:"},{"line_number":82,"context_line":"    # We only get results from cn1 because only it has MULTI_ATTACH"},{"line_number":83,"context_line":"    # We get candidates where VCPU and MEMORY_MB are provided by the same or"},{"line_number":84,"context_line":"    # alternate NUMA roots."},{"line_number":85,"context_line":"    $.allocation_requests.`len`: 4"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"9fb8cfa7_d5113255","line":82,"updated":"2019-06-20 17:45:47.000000000","message":"you could verify this in provider summaries if you felt so inclined, that was we have some real insight into the  \"we only\" statement and not solely relying on the length of allocation requests for our source of truth\n\nthis applies to several tests below","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"93bd07daff795f9638e456c984d0da298e4e7f2c","unresolved":false,"context_lines":[{"line_number":79,"context_line":"  status: 200"},{"line_number":80,"context_line":"  verbose: true"},{"line_number":81,"context_line":"  response_json_paths:"},{"line_number":82,"context_line":"    # We only get results from cn1 because only it has MULTI_ATTACH"},{"line_number":83,"context_line":"    # We get candidates where VCPU and MEMORY_MB are provided by the same or"},{"line_number":84,"context_line":"    # alternate NUMA roots."},{"line_number":85,"context_line":"    $.allocation_requests.`len`: 4"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"9fb8cfa7_4d561609","line":82,"in_reply_to":"9fb8cfa7_d5113255","updated":"2019-06-20 22:00:14.000000000","message":"Seems like there are a lot of ways I could add to the verification blocks. Kind of wanted to keep it short though. Other tests cover the base functionality of GET /a_c; here I just want to do the minimum possible* to be sure I got the results I wanted.\n\nHere I can tell that the four results came from where I wanted because the length of each list under NUMA0 and NUMA1 is 2.\n\nIn the cases where I skip verification other than the length, I\u0027m kind of relying on \"obviously this is the same as a prior one\" - but I can be explicit if you think that\u0027s important.\n\n(* Read: the easiest thing I know how to do)","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"becab51f277cf5a4c6421a463570c4a74e6c9ea6","unresolved":false,"context_lines":[{"line_number":115,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1,MEMORY_MB:1024,DISK_GB:100\u0026root_required\u003dCOMPUTE_VOLUME_MULTI_ATTACH"},{"line_number":116,"context_line":"  status: 200"},{"line_number":117,"context_line":"  response_json_paths:"},{"line_number":118,"context_line":"    # We only get results from cn1 because only it has MULTI_ATTACH"},{"line_number":119,"context_line":"    # We get candidates where VCPU and MEMORY_MB are provided by the same or"},{"line_number":120,"context_line":"    # alternate NUMA roots. DISK_GB is always provided by the sharing provider."},{"line_number":121,"context_line":"    $.allocation_requests.`len`: 4"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"9fb8cfa7_c0496d60","line":118,"updated":"2019-06-20 22:55:32.000000000","message":"Let me try to be a bit more clear.\n\nThis comment says \"We only get results from cn1\" but nowhere do I see a \u0027$.provider_summaries[\"ENVIRON[\u0027CN1_UUID\u0027]...something\u0027, which at least in my head is the obvious thing to do when making that comment.\n\nIn order for me, the reader, to confirm that I need to go back to the NUMANetworkFixture to dig around and do a \"ah, sure, yeah, NUMA0 is a child of cn1, gotchya.\n\nIf you add\n\n$.provider_summaries[\"$ENVIRON[\u0027CN1_UUID\u0027].traits:\n   - COMPUTE_VOLUME_MULTI_ATTACH \n\nright after one of the places you say \"# We only get ...\" your test is nicely literate.\n\nAnother option would be to check the parent provider uuid is one of the numa nodes.","commit_id":"b733786a0a5bca5b56b9ace5b75e23365f10d9ce"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da520c1d0389d65b343244c695e77d634bb93a58","unresolved":false,"context_lines":[{"line_number":115,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1,MEMORY_MB:1024,DISK_GB:100\u0026root_required\u003dCOMPUTE_VOLUME_MULTI_ATTACH"},{"line_number":116,"context_line":"  status: 200"},{"line_number":117,"context_line":"  response_json_paths:"},{"line_number":118,"context_line":"    # We only get results from cn1 because only it has MULTI_ATTACH"},{"line_number":119,"context_line":"    # We get candidates where VCPU and MEMORY_MB are provided by the same or"},{"line_number":120,"context_line":"    # alternate NUMA roots. DISK_GB is always provided by the sharing provider."},{"line_number":121,"context_line":"    $.allocation_requests.`len`: 4"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"9fb8cfa7_00730582","line":118,"in_reply_to":"9fb8cfa7_c0496d60","updated":"2019-06-20 22:57:33.000000000","message":"ahh, I understand now. Yeah, I can fup with that","commit_id":"b733786a0a5bca5b56b9ace5b75e23365f10d9ce"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"becab51f277cf5a4c6421a463570c4a74e6c9ea6","unresolved":false,"context_lines":[{"line_number":289,"context_line":"  response_json_paths:"},{"line_number":290,"context_line":"    # The only provider of VCPU that doesn\u0027t have FOO is numa0. But numa0 is on"},{"line_number":291,"context_line":"    # cn1, which doesn\u0027t have the required FOO on the root."},{"line_number":292,"context_line":"    $.allocation_requests.`len`: 0"}],"source_content_type":"text/x-yaml","patch_set":16,"id":"9fb8cfa7_a078f98e","line":292,"updated":"2019-06-20 22:55:32.000000000","message":"thanks for these","commit_id":"b733786a0a5bca5b56b9ace5b75e23365f10d9ce"}],"placement/tests/functional/gabbits/allocation-candidates-root_required.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8af91710273f5d2f58e134e81a641d3384fe5979","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9fb8cfa7_e7798cc4","line":28,"updated":"2019-06-14 22:58:33.000000000","message":"moar tests go here","commit_id":"6f2c8cdb35910f9c96f72bfdc38f98b61742acd8"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"ffa6123422f9ca2fc2b1d364b2c4e48c8dfe4290","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    $.allocation_requests.`len`: 4"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"- name: limit to multiattach-capable granular sharing"},{"line_number":83,"context_line":"  # TODO(efried): root_required is filtering out the sharing provider here!"},{"line_number":84,"context_line":"  GET: /allocation_candidates?resources1\u003dVCPU:1,MEMORY_MB:512\u0026resources2\u003dDISK_GB:100\u0026\u0026group_policy\u003dnone\u0026root_required\u003dCOMPUTE_VOLUME_MULTI_ATTACH"},{"line_number":85,"context_line":"  status: 200"},{"line_number":86,"context_line":"  verbose: true"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_003921d5","line":83,"range":{"start_line":83,"start_character":2,"end_line":83,"end_character":75},"updated":"2019-06-16 09:10:28.000000000","message":"Why have you defined \"root_required\" as a request-wide param. If this is request-group-specific param like \"in_tree\", this is more easy to go, isn\u0027t it?","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cd305fdc351d170d2939f2f92e19c3cb32f44602","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    $.allocation_requests.`len`: 4"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"- name: limit to multiattach-capable granular sharing"},{"line_number":83,"context_line":"  # TODO(efried): root_required is filtering out the sharing provider here!"},{"line_number":84,"context_line":"  GET: /allocation_candidates?resources1\u003dVCPU:1,MEMORY_MB:512\u0026resources2\u003dDISK_GB:100\u0026\u0026group_policy\u003dnone\u0026root_required\u003dCOMPUTE_VOLUME_MULTI_ATTACH"},{"line_number":85,"context_line":"  status: 200"},{"line_number":86,"context_line":"  verbose: true"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_5b78688e","line":83,"range":{"start_line":83,"start_character":2,"end_line":83,"end_character":75},"in_reply_to":"9fb8cfa7_003921d5","updated":"2019-06-16 16:41:39.000000000","message":"I tried to answer this in the spec review. To reiterate/rephrase:\n\nYes, it would be easier to implement if it were group-specific. But it would also be harder to understand and use IMO. Because then for the use case I care about (\"land me on a host that can MULTI_ATTACH\") I need to be sure to attach it to one (or more) request group(s) whose resources I know come from the host rather than a sharing provider. In this case, that would have to be group 1. But if anything, I think of MULTI_ATTACH as a disk thing, so I would intuitively think to attach it to group 2 with my DISK_GB.\n\nSo to me, making the \"host has traits\" a separate, request-wide query parameter is the cleanest thing.","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"8f4cf15a477584e3ba9862e652ecc2919459e9c3","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    $.allocation_requests.`len`: 4"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"- name: limit to multiattach-capable granular sharing"},{"line_number":83,"context_line":"  # TODO(efried): root_required is filtering out the sharing provider here!"},{"line_number":84,"context_line":"  GET: /allocation_candidates?resources1\u003dVCPU:1,MEMORY_MB:512\u0026resources2\u003dDISK_GB:100\u0026\u0026group_policy\u003dnone\u0026root_required\u003dCOMPUTE_VOLUME_MULTI_ATTACH"},{"line_number":85,"context_line":"  status: 200"},{"line_number":86,"context_line":"  verbose: true"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_2107821b","line":83,"range":{"start_line":83,"start_character":2,"end_line":83,"end_character":75},"in_reply_to":"9fb8cfa7_5b78688e","updated":"2019-06-17 08:43:47.000000000","message":"\u003e So to me, making the \"host has traits\" a separate, request-wide query parameter is the cleanest thing.\n\nOkay, cool.","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"ffa6123422f9ca2fc2b1d364b2c4e48c8dfe4290","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"- name: limit to multiattach-capable granular sharing"},{"line_number":83,"context_line":"  # TODO(efried): root_required is filtering out the sharing provider here!"},{"line_number":84,"context_line":"  GET: /allocation_candidates?resources1\u003dVCPU:1,MEMORY_MB:512\u0026resources2\u003dDISK_GB:100\u0026\u0026group_policy\u003dnone\u0026root_required\u003dCOMPUTE_VOLUME_MULTI_ATTACH"},{"line_number":85,"context_line":"  status: 200"},{"line_number":86,"context_line":"  verbose: true"},{"line_number":87,"context_line":"  response_json_paths:"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"9fb8cfa7_c02ea98a","line":84,"updated":"2019-06-16 09:10:28.000000000","message":"...so this request looks to me;\n\"unsuffixed resourceless request with root_required\u003dMULTI_ATTACH\"\n+ \"resourceful grouped requests without trait/agg constraints\",\nthat work properly not filtering sharing providers since we don\u0027t have to pass the \"root_required\" to the request of group 2.\n\nWith the new group-specific definition, the test above, \"limit to multiattach-capable unsuffixed sharing\" doesn\u0027t return sharing providers, but it is natural to me because the root of the provider which provides DISK_GB does not have MULTI_ATTACH capability. At least, in_tree is designed that way to exclude sharing providers in unsuffixed request groups. This is intentional and by design; see the alternative 1 in the spec[1].\n\n[1] https://specs.openstack.org/openstack/nova-specs/specs/stein/implemented/alloc-candidates-in-tree.html#alternatives","commit_id":"f3c88f9ff61bfa9beb4df59bb03c1af97e4d80a5"}],"releasenotes/notes/allocation-candidates-root_required-bfe4f96f96a2a5db.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3b2e06902981d0f8f697891c7b79597f9f28dd32","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    forbidden trait, in the same format as the ``required`` query parameter."},{"line_number":8,"context_line":"    This restricts allocation requests in the response to only those whose"},{"line_number":9,"context_line":"    (non-sharing) tree\u0027s root resource provider satisfies the specified trait"},{"line_number":10,"context_line":"    requirements."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    .. _1.35: https://docs.openstack.org/placement/latest/placement-api-microversion-history.html#support-root_required-queryparam-on-get-allocation_candidates"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"9fb8cfa7_8a339913","line":10,"updated":"2019-06-20 17:45:47.000000000","message":"Similar comment as in the api version history.\n\nI\u0027m not sure which place is more important for the reason I gave there, but at least one of them is.","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"93bd07daff795f9638e456c984d0da298e4e7f2c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    forbidden trait, in the same format as the ``required`` query parameter."},{"line_number":8,"context_line":"    This restricts allocation requests in the response to only those whose"},{"line_number":9,"context_line":"    (non-sharing) tree\u0027s root resource provider satisfies the specified trait"},{"line_number":10,"context_line":"    requirements."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    .. _1.35: https://docs.openstack.org/placement/latest/placement-api-microversion-history.html#support-root_required-queryparam-on-get-allocation_candidates"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"9fb8cfa7_cd53e6e1","line":10,"in_reply_to":"9fb8cfa7_8a339913","updated":"2019-06-20 22:00:14.000000000","message":"here I can definitely link the doc","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4b0df06e6ff70c7df3ab1782708c1f5c49f96539","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    forbidden trait, in the same format as the ``required`` query parameter."},{"line_number":8,"context_line":"    This restricts allocation requests in the response to only those whose"},{"line_number":9,"context_line":"    (non-sharing) tree\u0027s root resource provider satisfies the specified trait"},{"line_number":10,"context_line":"    requirements."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    .. _1.35: https://docs.openstack.org/placement/latest/placement-api-microversion-history.html#support-root_required-queryparam-on-get-allocation_candidates"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"9fb8cfa7_0d27be14","line":10,"in_reply_to":"9fb8cfa7_cd53e6e1","updated":"2019-06-20 22:24:39.000000000","message":"This already links to the microversion history, which (now) links to the doc, so redundant to add here.","commit_id":"777e25b11f6ea2ffde2da7d52ee085c4ee5e5156"}]}
