)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"29d77a3f1268228f0c952efec4240762ce079b6c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"need to be able to query allocation candidates that fulfill at least"},{"line_number":15,"context_line":"one trait from a list of traits specified in the query. This is"},{"line_number":16,"context_line":"required for the case when a Neutron network maps to more than one"},{"line_number":17,"context_line":"physnet but theport\u0027s bandwidth request can be fulfilled from any"},{"line_number":18,"context_line":"physnet the port\u0027s network maps to."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"bp any-traits-in-allocation-candidates-query"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_eb151c3e","line":17,"range":{"start_line":17,"start_character":12,"end_line":17,"end_character":19},"updated":"2018-08-24 12:44:45.000000000","message":"the port\u0027s","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e48dd9019870b36fa597cff4f62d460cad6f9caf","unresolved":false,"context_lines":[{"line_number":14,"context_line":"need to be able to query allocation candidates that fulfill at least"},{"line_number":15,"context_line":"one trait from a list of traits specified in the query. This is"},{"line_number":16,"context_line":"required for the case when a Neutron network maps to more than one"},{"line_number":17,"context_line":"physnet but theport\u0027s bandwidth request can be fulfilled from any"},{"line_number":18,"context_line":"physnet the port\u0027s network maps to."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"bp any-traits-in-allocation-candidates-query"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_edd4f849","line":17,"range":{"start_line":17,"start_character":12,"end_line":17,"end_character":19},"in_reply_to":"3f79a3b5_eb151c3e","updated":"2018-08-29 10:46:58.000000000","message":"Done","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"}],"specs/rocky/approved/placement-any-traits-in-allocation_candidates-query.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c835aa1cbc136c23e6c4f6cd8f7fcf8899c4e9b9","unresolved":false,"context_lines":[{"line_number":40,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Extend the ``GET /allocation_candidates`` and ``GET /resource_providers/``"},{"line_number":43,"context_line":"requests with a new ``required\u003dany:TRAIT1,TRAIT2`` query parameter syntax and"},{"line_number":44,"context_line":"change the placement implementation to support such query."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f7c97a3_b5a74050","line":43,"range":{"start_line":43,"start_character":31,"end_line":43,"end_character":35},"updated":"2018-05-02 22:37:02.000000000","message":"I don\u0027t have a problem with \u0027any:\u0027 for its own sake, but let\u0027s go with the precedent already set by member_of and call it \u0027in:\u0027.","commit_id":"27a5c47d53abd7b568d3c54de81b762fa6827c79"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cead2fc28fd6fd53ccdf99cda7d1a59818121f1b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Extend the ``GET /allocation_candidates`` and ``GET /resource_providers/``"},{"line_number":43,"context_line":"requests with a new ``required\u003dany:TRAIT1,TRAIT2`` query parameter syntax and"},{"line_number":44,"context_line":"change the placement implementation to support such query."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Alternatives"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f7c97a3_16bcdf03","line":43,"range":{"start_line":43,"start_character":31,"end_line":43,"end_character":35},"in_reply_to":"5f7c97a3_b5a74050","updated":"2018-05-04 11:50:10.000000000","message":"It feels awkward to read: \u0027required in (TRAIT1, TRAIT2)\u0027 while \u0027required any (TRAIT1, TRAIT2)\u0027 feels natural to me. \n\nAnyhow I don\u0027t want to get blocked by naming. So let\u0027s do \u0027in:\u0027","commit_id":"27a5c47d53abd7b568d3c54de81b762fa6827c79"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c835aa1cbc136c23e6c4f6cd8f7fcf8899c4e9b9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"Extend the ``GET /allocation_candidates`` and ``GET /resource_providers/``"},{"line_number":43,"context_line":"requests with a new ``required\u003dany:TRAIT1,TRAIT2`` query parameter syntax and"},{"line_number":44,"context_line":"change the placement implementation to support such query."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Alternatives"},{"line_number":47,"context_line":"------------"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f7c97a3_d5751cce","line":45,"updated":"2018-05-02 22:37:02.000000000","message":"Should mention how this plays in with granular.  I assume the new syntax will be valid for `requiredN` qparams as well.","commit_id":"27a5c47d53abd7b568d3c54de81b762fa6827c79"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cead2fc28fd6fd53ccdf99cda7d1a59818121f1b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"Extend the ``GET /allocation_candidates`` and ``GET /resource_providers/``"},{"line_number":43,"context_line":"requests with a new ``required\u003dany:TRAIT1,TRAIT2`` query parameter syntax and"},{"line_number":44,"context_line":"change the placement implementation to support such query."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Alternatives"},{"line_number":47,"context_line":"------------"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f7c97a3_36cf9b80","line":45,"in_reply_to":"5f7c97a3_d5751cce","updated":"2018-05-04 11:50:10.000000000","message":"Yes, it will. I\u0027ve clarified that in the new PS.","commit_id":"27a5c47d53abd7b568d3c54de81b762fa6827c79"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"6a5b37ad068c4a1d444488feb1aa9696449f7d25","unresolved":false,"context_lines":[{"line_number":17,"context_line":"support minimum bandwidth guarantees in Neutron + Nova we need to be able to"},{"line_number":18,"context_line":"query allocation candidates that fulfill *at least one* trait from a list of"},{"line_number":19,"context_line":"traits specified in the query. This is required for the case when a Neutron"},{"line_number":20,"context_line":"network maps to more than one physnet but the port\u0027s bandwidth request can be"},{"line_number":21,"context_line":"fulfilled from any physnet the port\u0027s network maps to."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":2,"id":"5f7c97a3_b9a1c0fa","line":20,"range":{"start_line":20,"start_character":30,"end_line":20,"end_character":37},"updated":"2018-05-14 07:55:21.000000000","message":"nit: physnets","commit_id":"63d21d548f9c29245132704b7829c0636c0e217a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"191818290f464e87258757707467646b60a477f6","unresolved":false,"context_lines":[{"line_number":17,"context_line":"support minimum bandwidth guarantees in Neutron + Nova we need to be able to"},{"line_number":18,"context_line":"query allocation candidates that fulfill *at least one* trait from a list of"},{"line_number":19,"context_line":"traits specified in the query. This is required for the case when a Neutron"},{"line_number":20,"context_line":"network maps to more than one physnet but the port\u0027s bandwidth request can be"},{"line_number":21,"context_line":"fulfilled from any physnet the port\u0027s network maps to."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_4d964c97","line":20,"range":{"start_line":20,"start_character":30,"end_line":20,"end_character":37},"in_reply_to":"5f7c97a3_b9a1c0fa","updated":"2018-08-17 09:05:46.000000000","message":"Done","commit_id":"63d21d548f9c29245132704b7829c0636c0e217a"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"047d11152cf022b3b3259729d9a653c630fe2e63","unresolved":false,"context_lines":[{"line_number":49,"context_line":"the ``required\u003cN\u003e`` query params as well."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"..  _`granular-resource-requests`: https://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/granular-resource-requests.html"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Alternatives"},{"line_number":54,"context_line":"------------"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"5f7c97a3_0897054a","line":52,"updated":"2018-05-16 08:32:44.000000000","message":"This might be a nit, but I feel better if it is clarified in the spec how or whether we support trait constraits with \"any\" and \"all\". For example, is it going to be something like the following format?\n\u0026required\u003din:TRAIT1,TRAIT2\u0026required\u003dTRAIT3, TRAIT4, !TRAIT5","commit_id":"63d21d548f9c29245132704b7829c0636c0e217a"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"inactive contributor"},"change_message_id":"14a352c6e995bf86c7a7687fe8a3c6642cf98f2b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"the ``required\u003cN\u003e`` query params as well."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"..  _`granular-resource-requests`: https://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/granular-resource-requests.html"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Alternatives"},{"line_number":54,"context_line":"------------"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"5f7c97a3_33f11602","line":52,"in_reply_to":"5f7c97a3_0897054a","updated":"2018-05-16 09:07:49.000000000","message":"You may want to look at the next change in the same change series.","commit_id":"63d21d548f9c29245132704b7829c0636c0e217a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d312e670db4c7d5c5069f87f47843eb0a9f5836c","unresolved":false,"context_lines":[{"line_number":49,"context_line":"the ``required\u003cN\u003e`` query params as well."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"..  _`granular-resource-requests`: https://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/granular-resource-requests.html"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Alternatives"},{"line_number":54,"context_line":"------------"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"5f7c97a3_7ec3ceed","line":52,"in_reply_to":"5f7c97a3_33f11602","updated":"2018-05-16 14:32:45.000000000","message":"I did ask a question there for clarification: https://review.openstack.org/#/c/565741/4/specs/rocky/approved/placement-mixing-required-traits-with-any-traits.rst@82","commit_id":"63d21d548f9c29245132704b7829c0636c0e217a"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"c1ccc64c88ffb76165ed5b6923958a9e544f16a6","unresolved":false,"context_lines":[{"line_number":49,"context_line":"the ``required\u003cN\u003e`` query params as well."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"..  _`granular-resource-requests`: https://specs.openstack.org/openstack/nova-specs/specs/rocky/approved/granular-resource-requests.html"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Alternatives"},{"line_number":54,"context_line":"------------"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"5f7c97a3_ea538b6b","line":52,"in_reply_to":"5f7c97a3_7ec3ceed","updated":"2018-05-17 02:24:34.000000000","message":"Oops, I missed the next change, thanks! \n\nI\u0027m not sure these changes should be worked separately... but if it should (or if we want to), then it would be nice if it is clarified here in this spec that the support is out of this spec and relies on another change.","commit_id":"63d21d548f9c29245132704b7829c0636c0e217a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5a5cb22b672e7bc02a7bcaa9dbda6d1b24f14e98","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"Each resource provider returned from a request having"},{"line_number":72,"context_line":"``required\u003din:TRAIT1,TRAIT2`` should have *at least* one matching trait from"},{"line_number":73,"context_line":"TRAIT1 and TRAIT2."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Each allocation candidate returned from a request having"},{"line_number":76,"context_line":"``required\u003din:TRAIT1,TRAIT2`` query param should have *at least one* matching"}],"source_content_type":"text/x-rst","patch_set":2,"id":"5f7c97a3_27751533","line":73,"updated":"2018-06-05 17:36:17.000000000","message":"Not necessary to make clear here (since it makes no logical sense), but in the implementation we need to make sure that ``required\u003din:TRAIT1,!TRAIT2`` is a 400.","commit_id":"63d21d548f9c29245132704b7829c0636c0e217a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"191818290f464e87258757707467646b60a477f6","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"Each resource provider returned from a request having"},{"line_number":72,"context_line":"``required\u003din:TRAIT1,TRAIT2`` should have *at least* one matching trait from"},{"line_number":73,"context_line":"TRAIT1 and TRAIT2."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Each allocation candidate returned from a request having"},{"line_number":76,"context_line":"``required\u003din:TRAIT1,TRAIT2`` query param should have *at least one* matching"}],"source_content_type":"text/x-rst","patch_set":2,"id":"3f79a3b5_0db7f43c","line":73,"in_reply_to":"5f7c97a3_27751533","updated":"2018-08-17 09:05:46.000000000","message":"I\u0027ve added a note about that it will not be supported as somebody could very well attach a meaning to your example. Like ``required\u003din:SPINNING_DISK,!SSD`` might mean give me an RPs which either tagged with SPINNING_DISK or at least not tagged with SSD.","commit_id":"63d21d548f9c29245132704b7829c0636c0e217a"}],"specs/stein/approved/placement-any-traits-in-allocation_candidates-query.rst":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"29d77a3f1268228f0c952efec4240762ce079b6c","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Extend the ``GET /allocation_candidates`` and ``GET /resource_providers``"},{"line_number":43,"context_line":"requests with a new ``required\u003din:TRAIT1,TRAIT2`` query parameter syntax and"},{"line_number":44,"context_line":"change the placement implementation to support such query."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"The `granular-resource-requests`_ spec proposes support for multiple request"},{"line_number":47,"context_line":"groups in the Placement query identified by a positive integer postfix in the"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_ab7ba489","line":44,"range":{"start_line":44,"start_character":52,"end_line":44,"end_character":57},"updated":"2018-08-24 12:44:45.000000000","message":"to support this new syntax","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e48dd9019870b36fa597cff4f62d460cad6f9caf","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Extend the ``GET /allocation_candidates`` and ``GET /resource_providers``"},{"line_number":43,"context_line":"requests with a new ``required\u003din:TRAIT1,TRAIT2`` query parameter syntax and"},{"line_number":44,"context_line":"change the placement implementation to support such query."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"The `granular-resource-requests`_ spec proposes support for multiple request"},{"line_number":47,"context_line":"groups in the Placement query identified by a positive integer postfix in the"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_4d396cd6","line":44,"range":{"start_line":44,"start_character":52,"end_line":44,"end_character":57},"in_reply_to":"3f79a3b5_ab7ba489","updated":"2018-08-29 10:46:58.000000000","message":"Done","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"29d77a3f1268228f0c952efec4240762ce079b6c","unresolved":false,"context_lines":[{"line_number":65,"context_line":"Today the ``GET /allocation_candidates`` and ``GET /resource_providers`` query"},{"line_number":66,"context_line":"support the ``required`` query param in the form of"},{"line_number":67,"context_line":"``required\u003dTRAIT1,TRAIT2,!TRAIT3``. This spec proposes to implement a new"},{"line_number":68,"context_line":"microversion to allow the format of ``required\u003din:TRAIT1,TRAIT2`` as well"},{"line_number":69,"context_line":"along with the old format."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"Each resource provider returned from a request having"},{"line_number":72,"context_line":"``required\u003din:TRAIT1,TRAIT2`` should have *at least* one matching trait from"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_8b9b48c7","line":69,"range":{"start_line":68,"start_character":66,"end_line":69,"end_character":11},"updated":"2018-08-24 12:44:45.000000000","message":"s/as well along with/as well as/","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e48dd9019870b36fa597cff4f62d460cad6f9caf","unresolved":false,"context_lines":[{"line_number":65,"context_line":"Today the ``GET /allocation_candidates`` and ``GET /resource_providers`` query"},{"line_number":66,"context_line":"support the ``required`` query param in the form of"},{"line_number":67,"context_line":"``required\u003dTRAIT1,TRAIT2,!TRAIT3``. This spec proposes to implement a new"},{"line_number":68,"context_line":"microversion to allow the format of ``required\u003din:TRAIT1,TRAIT2`` as well"},{"line_number":69,"context_line":"along with the old format."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"Each resource provider returned from a request having"},{"line_number":72,"context_line":"``required\u003din:TRAIT1,TRAIT2`` should have *at least* one matching trait from"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_0d3374f8","line":69,"range":{"start_line":68,"start_character":66,"end_line":69,"end_character":11},"in_reply_to":"3f79a3b5_8b9b48c7","updated":"2018-08-29 10:46:58.000000000","message":"Done","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"29d77a3f1268228f0c952efec4240762ce079b6c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"``required\u003din:TRAIT1,TRAIT2`` should have *at least* one matching trait from"},{"line_number":73,"context_line":"TRAIT1 and TRAIT2."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Each allocation candidate returned from a request having"},{"line_number":76,"context_line":"``required\u003din:TRAIT1,TRAIT2`` query param should have *at least one* matching"},{"line_number":77,"context_line":"trait from TRAIT1 and TRAIT2."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"The response body of the ``GET /allocation_candidates`` and"},{"line_number":80,"context_line":"``GET /resource_providers`` query are unchanged."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_0b4bb82a","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":29},"updated":"2018-08-24 12:44:45.000000000","message":"This gets tricky because of granular request groups. Perhaps it is more accurate to say this instead?\n\nFor allocation candidates, the interpretation of the ``required\u003din:TRAIT1,TRAIT2`` constraint depends on whether the granular request group in which the constraint appears has the ``group_policy`` rule applied to it. When ``group_policy\u003disolate`` appears in the granular request group, this means that the single provider that will provide the requested resources in this group must also have *at least one of* ``TRAIT1`` or ``TRAIT2``. When ``group_policy\u003dnone`` appears in the granular request group, this means that *any of the providers* which satisfy resources for the request group must have *at least one of* ``TRAIT1`` or ``TRAIT2``.\n\nVerify the above with Señor Granular, of course (Mr. Fried).","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"92a84bada85f5c2b8a6e1bd763c118c80acad2d7","unresolved":false,"context_lines":[{"line_number":72,"context_line":"``required\u003din:TRAIT1,TRAIT2`` should have *at least* one matching trait from"},{"line_number":73,"context_line":"TRAIT1 and TRAIT2."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Each allocation candidate returned from a request having"},{"line_number":76,"context_line":"``required\u003din:TRAIT1,TRAIT2`` query param should have *at least one* matching"},{"line_number":77,"context_line":"trait from TRAIT1 and TRAIT2."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"The response body of the ``GET /allocation_candidates`` and"},{"line_number":80,"context_line":"``GET /resource_providers`` query are unchanged."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_ef09a52a","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":29},"in_reply_to":"3f79a3b5_0b4bb82a","updated":"2018-08-24 14:36:06.000000000","message":"\u003e For allocation candidates, the interpretation of the\n \u003e ``required\u003din:TRAIT1,TRAIT2`` constraint depends on whether the\n \u003e granular request group in which the constraint appears has the\n \u003e ``group_policy`` rule applied to it.\n\ngroup_policy affects how the groups interact with *each other*; and I don\u0027t think it has any impact here. More...\n\n \u003e When ``group_policy\u003disolate``\n \u003e appears in the granular request group, this means that the single\n\ns/in the granular request group/in the request/ (group_policy is global)\n\n \u003e provider that will provide the requested resources in this group\n \u003e must also have *at least one of* ``TRAIT1`` or ``TRAIT2``.\n\nTrue regardless of group_policy. More...\n\n \u003e When\n \u003e ``group_policy\u003dnone`` appears in the granular request group, this\n \u003e means that *any of the providers* which satisfy resources for the\n \u003e request group must have *at least one of* ``TRAIT1`` or ``TRAIT2``.\n\nIt\u0027s possible we\u0027re conflating the meaning of group_policy\u003dnone with that of the non-granular group.\n\nThe non-granular group yields results across one or more providers, so required\u003din:T1,T2 means that the union of all the traits across all those providers must contain at least one of T1, T2.\n\nA granular group yields results from a single provider, so required$N\u003din:T1,T2 means that that one provider must contain at least one of T1, T2.","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e48dd9019870b36fa597cff4f62d460cad6f9caf","unresolved":false,"context_lines":[{"line_number":72,"context_line":"``required\u003din:TRAIT1,TRAIT2`` should have *at least* one matching trait from"},{"line_number":73,"context_line":"TRAIT1 and TRAIT2."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Each allocation candidate returned from a request having"},{"line_number":76,"context_line":"``required\u003din:TRAIT1,TRAIT2`` query param should have *at least one* matching"},{"line_number":77,"context_line":"trait from TRAIT1 and TRAIT2."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"The response body of the ``GET /allocation_candidates`` and"},{"line_number":80,"context_line":"``GET /resource_providers`` query are unchanged."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_4d95ec87","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":29},"in_reply_to":"3f79a3b5_56cdb05a","updated":"2018-08-29 10:46:58.000000000","message":"Done","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6f8363ea41ffc9bb35030d154b9fb5909985c75a","unresolved":false,"context_lines":[{"line_number":72,"context_line":"``required\u003din:TRAIT1,TRAIT2`` should have *at least* one matching trait from"},{"line_number":73,"context_line":"TRAIT1 and TRAIT2."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Each allocation candidate returned from a request having"},{"line_number":76,"context_line":"``required\u003din:TRAIT1,TRAIT2`` query param should have *at least one* matching"},{"line_number":77,"context_line":"trait from TRAIT1 and TRAIT2."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"The response body of the ``GET /allocation_candidates`` and"},{"line_number":80,"context_line":"``GET /resource_providers`` query are unchanged."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_56cdb05a","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":29},"in_reply_to":"3f79a3b5_ef09a52a","updated":"2018-08-27 12:28:57.000000000","message":"OK, thank you Señor for clarifying (my clearly incorrect) assumptions around group_policy with granular request groups.\n\nGibi if/when you respin this, please add a summary of Señor Granular\u0027s excellent description/response above. Gracias!","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"29d77a3f1268228f0c952efec4240762ce079b6c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"A separate subsequent spec will propose to support repeating the ``required``"},{"line_number":83,"context_line":"query param more than once to allow mixing the two formats."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_2b71d476","line":85,"range":{"start_line":85,"start_character":17,"end_line":85,"end_character":39},"updated":"2018-08-24 12:44:45.000000000","message":"required and forbidden","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"29d77a3f1268228f0c952efec4240762ce079b6c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"A separate subsequent spec will propose to support repeating the ``required``"},{"line_number":83,"context_line":"query param more than once to allow mixing the two formats."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_6b5b4cf5","line":85,"range":{"start_line":85,"start_character":61,"end_line":85,"end_character":66},"updated":"2018-08-24 12:44:45.000000000","message":"the same","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e48dd9019870b36fa597cff4f62d460cad6f9caf","unresolved":false,"context_lines":[{"line_number":82,"context_line":"A separate subsequent spec will propose to support repeating the ``required``"},{"line_number":83,"context_line":"query param more than once to allow mixing the two formats."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_cde6dc4b","line":85,"range":{"start_line":85,"start_character":17,"end_line":85,"end_character":39},"in_reply_to":"3f79a3b5_2b71d476","updated":"2018-08-29 10:46:58.000000000","message":"Done","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e48dd9019870b36fa597cff4f62d460cad6f9caf","unresolved":false,"context_lines":[{"line_number":82,"context_line":"A separate subsequent spec will propose to support repeating the ``required``"},{"line_number":83,"context_line":"query param more than once to allow mixing the two formats."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_edeb980f","line":85,"range":{"start_line":85,"start_character":61,"end_line":85,"end_character":66},"in_reply_to":"3f79a3b5_6b5b4cf5","updated":"2018-08-29 10:46:58.000000000","message":"Done","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"fc9d77443d8a44fab1a8514be2b6fe25ae14458c","unresolved":false,"context_lines":[{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Security impact"},{"line_number":90,"context_line":"---------------"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_c4dd9c41","line":88,"updated":"2018-08-25 08:17:37.000000000","message":"For the second spec https://review.openstack.org/#/c/565741/6, what would you expect to the response, HTTP 400 also?\n\nActually, I\u0027m a little not sure why we separate this into two specs.","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e48dd9019870b36fa597cff4f62d460cad6f9caf","unresolved":false,"context_lines":[{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Security impact"},{"line_number":90,"context_line":"---------------"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_db56952b","line":88,"in_reply_to":"3f79a3b5_3bb6e63f","updated":"2018-08-29 10:46:58.000000000","message":"\u003e FYI, as long as I can see, the following query for example,\n \u003e \n \u003e ?required\u003dTrait1\u0026required\u003dTrait2\n \u003e \n \u003e is currently converted to required_traits\u003d[Trait2] ignoring the\n \u003e first required traits. I don\u0027t think we should change this to 400\n \u003e within this spec. A possible alternative is to implement the\n \u003e \"multiple required query\" spec first and make this \"any trait spec\"\n \u003e depend on the \"multiple required query\" spec. That said, the way to\n \u003e implement this \"any trait\" spec could be different between the\n \u003e cases whether we have multiple required query or not. In this\n \u003e point, \"any trait\" on \"multiple query\" dependency is clearer and\n \u003e easier to review, IMO.\n \u003e \n\nWe are not change to 400 the case you described. We only return 400 if the value of a required key contains both normal and negated traits like ``required\u003din:TRAIT1,!TRAIT2`` . After this spec your example will still behave as is, means the repeated key\u0027s value will override the original key\u0027s value. The subsequent spec introduces the support for repeating the required keys.\n\n \u003e I\u0027m not -1\u0027ing this point, though. This is a suggestion.","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"9b2fd33a7aa74cc1819d62091a8448c5df8acaf2","unresolved":false,"context_lines":[{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Security impact"},{"line_number":90,"context_line":"---------------"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_79a466a6","line":88,"in_reply_to":"3f79a3b5_3bb6e63f","updated":"2018-08-27 06:56:31.000000000","message":"Tetsuro, thanks for point that out. I surprised we don\u0027t support multiple required query params yet, really not sure why we don\u0027t support that from the beginning. so return 400 isn\u0027t my propose. Yea, maybe support the mulitple required params first is easier, but yes, I also not force on that.","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e48dd9019870b36fa597cff4f62d460cad6f9caf","unresolved":false,"context_lines":[{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Security impact"},{"line_number":90,"context_line":"---------------"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_7b3d01dc","line":88,"in_reply_to":"3f79a3b5_7680ecbf","updated":"2018-08-29 10:46:58.000000000","message":"\u003e \u003e Tetsuro, thanks for point that out. I surprised we don\u0027t support\n \u003e \u003e multiple required query params yet, really not sure why we don\u0027t\n \u003e \u003e support that from the beginning. so return 400 isn\u0027t my propose.\n \u003e \u003e Yea, maybe support the mulitple required params first is easier,\n \u003e \u003e but yes, I also not force on that.\n \u003e \n \u003e Yes, I agree with Alex on this. We support specifying multiple\n \u003e member_of query params:\n \u003e \n \u003e https://github.com/openstack/nova/blob/a417db21bb23f4e7db335650569c21b9c1faa8a6/nova/api/openstack/placement/util.py#L374\n \u003e \n \u003e We should do the same for other parameters since it\u0027s the natural\n \u003e way to express multiple HTTP query parameter values for the same\n \u003e key.\n\nYes, and allowing to repeat the required key is proposed in the subsequent spec.","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6f8363ea41ffc9bb35030d154b9fb5909985c75a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Security impact"},{"line_number":90,"context_line":"---------------"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_7680ecbf","line":88,"in_reply_to":"3f79a3b5_79a466a6","updated":"2018-08-27 12:28:57.000000000","message":"\u003e Tetsuro, thanks for point that out. I surprised we don\u0027t support\n \u003e multiple required query params yet, really not sure why we don\u0027t\n \u003e support that from the beginning. so return 400 isn\u0027t my propose.\n \u003e Yea, maybe support the mulitple required params first is easier,\n \u003e but yes, I also not force on that.\n\nYes, I agree with Alex on this. We support specifying multiple member_of query params:\n\nhttps://github.com/openstack/nova/blob/a417db21bb23f4e7db335650569c21b9c1faa8a6/nova/api/openstack/placement/util.py#L374\n\nWe should do the same for other parameters since it\u0027s the natural way to express multiple HTTP query parameter values for the same key.","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e48dd9019870b36fa597cff4f62d460cad6f9caf","unresolved":false,"context_lines":[{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Security impact"},{"line_number":90,"context_line":"---------------"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_dbbc5508","line":88,"in_reply_to":"3f79a3b5_c4dd9c41","updated":"2018-08-29 10:46:58.000000000","message":"\u003e For the second spec https://review.openstack.org/#/c/565741/6, what\n \u003e would you expect to the response, HTTP 400 also?\n \u003e \n \u003e Actually, I\u0027m a little not sure why we separate this into two\n \u003e specs.\n\nyes, it should be 400 after the second spec as well. That spec only adds the possibility to repeat required keywords for the same group. If any of that required keys have the value that is invalid by the currently discussed rule then it is an invalid request.\n\nI got an explicit request (I don\u0027t remember from who) to propose these as two spec. The first to define the required:in syntaxt and the second to support possibility repeating the required key.","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"d0b27d4479c975c09240d12ca8c0bbc72a8c5784","unresolved":false,"context_lines":[{"line_number":85,"context_line":"Note that mixing positive and negative trait requirements in a same"},{"line_number":86,"context_line":"``required\u003din:`` query param, like ``required\u003din:TRAIT1,!TRAIT2`` will not be"},{"line_number":87,"context_line":"supported and will result a HTTP 400 response."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Security impact"},{"line_number":90,"context_line":"---------------"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_3bb6e63f","line":88,"in_reply_to":"3f79a3b5_c4dd9c41","updated":"2018-08-27 02:58:31.000000000","message":"FYI, as long as I can see, the following query for example, \n\n  ?required\u003dTrait1\u0026required\u003dTrait2\n\nis currently converted to required_traits\u003d[Trait2] ignoring the first required traits. I don\u0027t think we should change this to 400 within this spec. A possible alternative is to implement the \"multiple required query\" spec first and make this \"any trait spec\" depend on the \"multiple required query\" spec. That said, the way to implement this \"any trait\" spec could be different between the cases whether we have multiple required query or not. In this point, \"any trait\" on \"multiple query\" dependency is clearer and easier to review, IMO.\n\nI\u0027m not -1\u0027ing this point, though. This is a suggestion.","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"d0b27d4479c975c09240d12ca8c0bbc72a8c5784","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"The osc-placement client plugin needs to be updated to support the new"},{"line_number":103,"context_line":"Placement API microversion. The client first needs to support querying traits"},{"line_number":104,"context_line":"as defined in Placement microversion 1.7. The support for that is under"},{"line_number":105,"context_line":"`review`_. That patch currently proposes a new --required CLI parameter"},{"line_number":106,"context_line":"accepting a list of traits. So this patch propose to extend that parameter to"},{"line_number":107,"context_line":"accept in:TRAIT1,TRAIT2 format."},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_7b145e44","line":105,"range":{"start_line":104,"start_character":42,"end_line":105,"end_character":9},"updated":"2018-08-27 02:58:31.000000000","message":"Seems this is already merged in rocky cycle.","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e48dd9019870b36fa597cff4f62d460cad6f9caf","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"The osc-placement client plugin needs to be updated to support the new"},{"line_number":103,"context_line":"Placement API microversion. The client first needs to support querying traits"},{"line_number":104,"context_line":"as defined in Placement microversion 1.7. The support for that is under"},{"line_number":105,"context_line":"`review`_. That patch currently proposes a new --required CLI parameter"},{"line_number":106,"context_line":"accepting a list of traits. So this patch propose to extend that parameter to"},{"line_number":107,"context_line":"accept in:TRAIT1,TRAIT2 format."},{"line_number":108,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3f79a3b5_0de4d43b","line":105,"range":{"start_line":104,"start_character":42,"end_line":105,"end_character":9},"in_reply_to":"3f79a3b5_7b145e44","updated":"2018-08-29 10:46:58.000000000","message":"Done","commit_id":"22542201ab4007da6c2557c55ddce31bbe1944dd"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8cec7a2590c4caa18843880562f97be0db8239ce","unresolved":false,"context_lines":[{"line_number":73,"context_line":"TRAIT1 and TRAIT2."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"``required\u003din:TRAIT1,TRAIT2`` used in a ``GET /allocation_candidates`` query"},{"line_number":76,"context_line":"means that the union of all the traits across all the providers in every"},{"line_number":77,"context_line":"allocation candidate must contain at least one of T1, T2."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"``requiredX\u003din:TRAIT1,TRAIT2`` used in a ``GET /allocation_candidates`` query"}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_b688ddc5","line":76,"range":{"start_line":76,"start_character":67,"end_line":76,"end_character":72},"updated":"2018-09-19 18:07:41.000000000","message":"each","commit_id":"983b2c3ea4f800f6bd60174c76235f5e8fb0548c"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8cec7a2590c4caa18843880562f97be0db8239ce","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"``requiredX\u003din:TRAIT1,TRAIT2`` used in a ``GET /allocation_candidates`` query"},{"line_number":80,"context_line":"means that the resource provider that satisfies the requirement of the granular"},{"line_number":81,"context_line":"request group ``X`` must also has at least one of T1, T2."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"The response body of the ``GET /allocation_candidates`` and"},{"line_number":84,"context_line":"``GET /resource_providers`` query are unchanged."}],"source_content_type":"text/x-rst","patch_set":4,"id":"3f79a3b5_56986919","line":81,"range":{"start_line":81,"start_character":30,"end_line":81,"end_character":33},"updated":"2018-09-19 18:07:41.000000000","message":"have","commit_id":"983b2c3ea4f800f6bd60174c76235f5e8fb0548c"}]}
