)]}'
{"api-ref/source/parameters.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"22e88361bc33f697055b570af6831cd3e9c96bf2","unresolved":false,"context_lines":[{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        member_of\u003dAGGA_UUID\u0026member_of\u003din:AGGB_UUID,AGGC_UUID"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    **Starting from microversion 1.32** specifying forbidden aggregate is"},{"line_number":107,"context_line":"    supported in the ``member_of`` query string parameter. Forbidden aggregates"},{"line_number":108,"context_line":"    are prefixed with a ``!``. This negative expression can also be used in"},{"line_number":109,"context_line":"    multiple ``member_of`` parameters::"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"5fc1f717_ff1ebe6e","line":106,"range":{"start_line":106,"start_character":51,"end_line":106,"end_character":70},"updated":"2019-03-07 11:34:19.000000000","message":"either\n\na forbidden aggregate\n\nor\n\nforbidden aggregates","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"22e88361bc33f697055b570af6831cd3e9c96bf2","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        member_of\u003dAGGA_UUID\u0026member_of\u003din:AGGB_UUID,AGGC_UUID"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    **Starting from microversion 1.32** specifying forbidden aggregate is"},{"line_number":146,"context_line":"    supported in the ``member_of`` query string parameter. Forbidden aggregates"},{"line_number":147,"context_line":"    are prefixed with a ``!``. This negative expression can also be used in"},{"line_number":148,"context_line":"    multiple ``member_of`` parameters::"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"5fc1f717_1f070a1f","line":145,"range":{"start_line":145,"start_character":51,"end_line":145,"end_character":70},"updated":"2019-03-07 11:34:19.000000000","message":"ditto","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        member_of\u003dAGGA_UUID\u0026member_of\u003d!AGGB_UUID"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    would translate logically to \"Candidate resource providers must be in aggA"},{"line_number":114,"context_line":"    and *not* in agg4."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    We do NOT support ``!`` in the ``in:`` prefix, but we support ``!in:``"},{"line_number":117,"context_line":"    prefix. Both of the following two example queries return candidate resource"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_03ed2b24","line":114,"range":{"start_line":114,"start_character":17,"end_line":114,"end_character":21},"updated":"2019-03-11 22:59:34.000000000","message":"AGGB","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        member_of\u003dAGGA_UUID\u0026member_of\u003d!AGGB_UUID"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    would translate logically to \"Candidate resource providers must be in aggA"},{"line_number":114,"context_line":"    and *not* in agg4."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    We do NOT support ``!`` in the ``in:`` prefix, but we support ``!in:``"},{"line_number":117,"context_line":"    prefix. Both of the following two example queries return candidate resource"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_43e25331","line":114,"range":{"start_line":113,"start_character":74,"end_line":114,"end_character":22},"updated":"2019-03-11 22:59:34.000000000","message":"be consistent with below and use caps for AGG$x","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        member_of\u003dAGGA_UUID\u0026member_of\u003d!AGGB_UUID"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    would translate logically to \"Candidate resource providers must be in aggA"},{"line_number":114,"context_line":"    and *not* in agg4."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    We do NOT support ``!`` in the ``in:`` prefix, but we support ``!in:``"},{"line_number":117,"context_line":"    prefix. Both of the following two example queries return candidate resource"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_d997e244","line":114,"range":{"start_line":113,"start_character":74,"end_line":114,"end_character":22},"in_reply_to":"5fc1f717_43e25331","updated":"2019-03-26 07:57:51.000000000","message":"Done","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    would translate logically to \"Candidate resource providers must be in aggA"},{"line_number":114,"context_line":"    and *not* in agg4."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    We do NOT support ``!`` in the ``in:`` prefix, but we support ``!in:``"},{"line_number":117,"context_line":"    prefix. Both of the following two example queries return candidate resource"},{"line_number":118,"context_line":"    providers that are NOT in AGGA, AGGB, or AGGC::"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        member_of\u003d!in:AGGA_UUID,AGGB_UUID,AGGC_UUID"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_83d83b7f","line":117,"range":{"start_line":116,"start_character":4,"end_line":117,"end_character":11},"updated":"2019-03-11 22:59:34.000000000","message":"This is a bit confusing. Suggest:\n\nWe do NOT support ``!`` on the values within ``in:``, but we support ``!in:``.","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    would translate logically to \"Candidate resource providers must be in aggA"},{"line_number":114,"context_line":"    and *not* in agg4."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    We do NOT support ``!`` in the ``in:`` prefix, but we support ``!in:``"},{"line_number":117,"context_line":"    prefix. Both of the following two example queries return candidate resource"},{"line_number":118,"context_line":"    providers that are NOT in AGGA, AGGB, or AGGC::"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        member_of\u003d!in:AGGA_UUID,AGGB_UUID,AGGC_UUID"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_798a6e1b","line":117,"range":{"start_line":116,"start_character":4,"end_line":117,"end_character":11},"in_reply_to":"5fc1f717_83d83b7f","updated":"2019-03-26 07:57:51.000000000","message":"Done","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        member_of\u003d!in:AGGA_UUID,AGGB_UUID,AGGC_UUID"},{"line_number":121,"context_line":"        member_of\u003d!AGGA_UUID\u0026member_of\u003d!AGGB_UUID\u0026member_of\u003d!AGGC_UUID"},{"line_number":122,"context_line":"  min_version: 1.3"},{"line_number":123,"context_line":"member_of_1_21:"},{"line_number":124,"context_line":"  \u003c\u003c: *member_of"},{"line_number":125,"context_line":"  description: \u003e"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_236e2795","line":122,"updated":"2019-03-11 22:59:34.000000000","message":"What happens when positive and negative member_ofZ conflict?","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        member_of\u003d!in:AGGA_UUID,AGGB_UUID,AGGC_UUID"},{"line_number":121,"context_line":"        member_of\u003d!AGGA_UUID\u0026member_of\u003d!AGGB_UUID\u0026member_of\u003d!AGGC_UUID"},{"line_number":122,"context_line":"  min_version: 1.3"},{"line_number":123,"context_line":"member_of_1_21:"},{"line_number":124,"context_line":"  \u003c\u003c: *member_of"},{"line_number":125,"context_line":"  description: \u003e"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_998f1a29","line":122,"in_reply_to":"5fc1f717_236e2795","updated":"2019-03-26 07:57:51.000000000","message":"I\u0027ve added some words provisionally. Let\u0027s discuss it in the spec.","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    could issue the following query::"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        member_of\u003dAGGA_UUID\u0026member_of\u003din:AGGB_UUID,AGGC_UUID"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    **Starting from microversion 1.32** specifying forbidden aggregates is"},{"line_number":146,"context_line":"    supported in the ``member_of`` query string parameter. Forbidden aggregates"},{"line_number":147,"context_line":"    are prefixed with a ``!``. This negative expression can also be used in"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_03644bb8","line":144,"updated":"2019-03-11 22:59:34.000000000","message":"as above","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":164,"context_line":"  in: query"},{"line_number":165,"context_line":"  required: false"},{"line_number":166,"context_line":"  description: \u003e"},{"line_number":167,"context_line":"    A string representing an aggregate uuid; or the prefix ``in:`` followed by"},{"line_number":168,"context_line":"    a comma-separated list of strings representing aggregate uuids. The"},{"line_number":169,"context_line":"    returned resource providers must directly be associated with at least one"},{"line_number":170,"context_line":"    of the aggregates identified by uuid. The parameter key is ``member_ofN``,"},{"line_number":171,"context_line":"    where ``N`` represents a positive integer suffix corresponding with a"},{"line_number":172,"context_line":"    ``resourcesN`` parameter.  The value format is the same as for the"},{"line_number":173,"context_line":"    (unnumbered) ``member_of`` parameter; but all of the resources and traits"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_836fdb90","line":170,"range":{"start_line":167,"start_character":0,"end_line":170,"end_character":41},"updated":"2019-03-11 22:59:34.000000000","message":"something about ``!`` should be mentioned here.","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6f7fdbbb8194e3e274f2ed9dab0526f925ab9e51","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        member_of\u003dAGGA_UUID\u0026member_of\u003d!AGGB_UUID"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    would translate logically to \"Candidate resource providers must be in aggA"},{"line_number":114,"context_line":"    and *not* in agg4."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    We do NOT support ``!`` on the values within ``in:``, but we support"},{"line_number":117,"context_line":"    ``!in:``. Both of the following two example queries return candidate"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5fc1f717_25d80b51","line":114,"range":{"start_line":113,"start_character":74,"end_line":114,"end_character":21},"updated":"2019-03-27 20:55:29.000000000","message":"AGGA and *not* in AGGB","commit_id":"d40bac9fad8ba2166aff91aef960417547ad2acf"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"90c22d7c54c384c451c80db7fe2a2fb2d254e588","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        member_of\u003dAGGA_UUID\u0026member_of\u003d!AGGB_UUID"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    would translate logically to \"Candidate resource providers must be in aggA"},{"line_number":114,"context_line":"    and *not* in agg4."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    We do NOT support ``!`` on the values within ``in:``, but we support"},{"line_number":117,"context_line":"    ``!in:``. Both of the following two example queries return candidate"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5fc1f717_b1c99dac","line":114,"range":{"start_line":113,"start_character":74,"end_line":114,"end_character":21},"in_reply_to":"5fc1f717_25d80b51","updated":"2019-03-28 08:10:29.000000000","message":"Oops, thanks! Let me fix it in this patch. Done.","commit_id":"d40bac9fad8ba2166aff91aef960417547ad2acf"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5dba5fc3d64f405bbe943879aae3052d5eea27d8","unresolved":false,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        member_of\u003dAGGA_UUID\u0026member_of\u003d!AGGB_UUID"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    would translate logically to \"Candidate resource providers must be in aggA"},{"line_number":114,"context_line":"    and *not* in AGGB."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    We do NOT support ``!`` on the values within ``in:``, but we support"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5fc1f717_8880ebc0","line":113,"range":{"start_line":113,"start_character":74,"end_line":113,"end_character":78},"updated":"2019-03-28 10:35:02.000000000","message":"This should still be capitalized","commit_id":"554aac029da1a40ced058775b416060f89c7dbcc"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"6d61451cfaf937f2947e4d95dc40bccfc47e0f6e","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        member_of\u003dAGGA_UUID\u0026member_of\u003d!AGGA_UUID"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    would return empty ``allocation_requests`` and ``provider_summaries``,"},{"line_number":130,"context_line":"    while::"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        member_of\u003din:AGGA_UUID,AGGB_UUID\u0026member_of\u003d!AGGA_UUID"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5fc1f717_31783fc2","line":129,"updated":"2019-03-28 16:19:25.000000000","message":"Since the description string of \u0027member_of\u0027 is only used when describing listing resource providers, mentioning allocation requests and provider summaries here is out of place. Would be better to to talk about rp here, and ac in member_of_1_21.","commit_id":"554aac029da1a40ced058775b416060f89c7dbcc"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"6d61451cfaf937f2947e4d95dc40bccfc47e0f6e","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        member_of\u003din:AGGA_UUID,AGGB_UUID\u0026member_of\u003d!AGGA_UUID"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    would return resource providers that are NOT in AGGA but in AGGB."},{"line_number":186,"context_line":"  min_version: 1.21"},{"line_number":187,"context_line":"member_of_granular:"},{"line_number":188,"context_line":"  type: string"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"5fc1f717_31611f06","line":185,"updated":"2019-03-28 16:19:25.000000000","message":"See above comment.\n\nFeel free to fix this in a fup (assuming nothing else is wrong with this change).","commit_id":"554aac029da1a40ced058775b416060f89c7dbcc"}],"placement/lib.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4feffd6c2aa4bff2b17e7547fa8f451ee5145d13","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                \u0027Found the following orphaned traits keys: %s\u0027)"},{"line_number":121,"context_line":"            raise webob.exc.HTTPBadRequest(msg % \u0027, \u0027.join(orphans))"},{"line_number":122,"context_line":"        orphans \u003d [(\u0027member_of%s\u0027 % suff) for suff, group in by_suffix.items()"},{"line_number":123,"context_line":"                   if not group.resources and ("},{"line_number":124,"context_line":"                       group.member_of or group.forbidden_aggs)]"},{"line_number":125,"context_line":"        if orphans:"},{"line_number":126,"context_line":"            msg \u003d (\u0027All member_of parameters must be associated with \u0027"},{"line_number":127,"context_line":"                   \u0027resources. Found the following orphaned member_of \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_73e4463d","line":124,"range":{"start_line":123,"start_character":19,"end_line":124,"end_character":64},"updated":"2019-04-02 13:21:07.000000000","message":"nit, looks like we don\u0027t unittest cover those changes.","commit_id":"0a3dcadb0a4c82d5cfdee646ca6acd03dae3208f"}],"placement/rest_api_version_history.rst":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"d4f4314096e9c6d86c25fd5fc4d9834ee31e31ec","unresolved":false,"context_lines":[{"line_number":553,"context_line":"This negative expression can also be used in multiple ``member_of``"},{"line_number":554,"context_line":"parameters::"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"    ``\u0026member_of\u003din:\u003cagg1\u003e,\u003cagg2\u003e\u0026member_of\u003d\u003cagg3\u003e\u0026member_of\u003d!\u003cagg4\u003e``"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"would translate logically to"},{"line_number":559,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5fc1f717_5f035243","line":556,"range":{"start_line":556,"start_character":4,"end_line":556,"end_character":6},"updated":"2019-03-07 11:17:16.000000000","message":"It is not necessary. Remove it.","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"d4f4314096e9c6d86c25fd5fc4d9834ee31e31ec","unresolved":false,"context_lines":[{"line_number":553,"context_line":"This negative expression can also be used in multiple ``member_of``"},{"line_number":554,"context_line":"parameters::"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"    ``\u0026member_of\u003din:\u003cagg1\u003e,\u003cagg2\u003e\u0026member_of\u003d\u003cagg3\u003e\u0026member_of\u003d!\u003cagg4\u003e``"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"would translate logically to"},{"line_number":559,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5fc1f717_3ffa0642","line":556,"range":{"start_line":556,"start_character":68,"end_line":556,"end_character":70},"updated":"2019-03-07 11:17:16.000000000","message":"ditto","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"d4f4314096e9c6d86c25fd5fc4d9834ee31e31ec","unresolved":false,"context_lines":[{"line_number":562,"context_line":""},{"line_number":563,"context_line":"We do NOT support ``!`` in the ``in:`` prefix::"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"    ``\u0026member_of\u003din:\u003cagg1\u003e,\u003cagg2\u003e,!\u003cagg3\u003e``"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"but we support ``!in:`` prefix::"},{"line_number":568,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5fc1f717_df9422eb","line":565,"range":{"start_line":565,"start_character":4,"end_line":565,"end_character":6},"updated":"2019-03-07 11:17:16.000000000","message":"ditto","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"d4f4314096e9c6d86c25fd5fc4d9834ee31e31ec","unresolved":false,"context_lines":[{"line_number":562,"context_line":""},{"line_number":563,"context_line":"We do NOT support ``!`` in the ``in:`` prefix::"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"    ``\u0026member_of\u003din:\u003cagg1\u003e,\u003cagg2\u003e,!\u003cagg3\u003e``"},{"line_number":566,"context_line":""},{"line_number":567,"context_line":"but we support ``!in:`` prefix::"},{"line_number":568,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5fc1f717_ff99de1e","line":565,"range":{"start_line":565,"start_character":41,"end_line":565,"end_character":43},"updated":"2019-03-07 11:17:16.000000000","message":"ditto","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"d4f4314096e9c6d86c25fd5fc4d9834ee31e31ec","unresolved":false,"context_lines":[{"line_number":566,"context_line":""},{"line_number":567,"context_line":"but we support ``!in:`` prefix::"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":"    ``\u0026member_of\u003d!in:\u003cagg1\u003e,\u003cagg2\u003e,\u003cagg3\u003e``"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"which is equivalent to::"},{"line_number":572,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5fc1f717_5f8832c5","line":569,"range":{"start_line":569,"start_character":41,"end_line":569,"end_character":43},"updated":"2019-03-07 11:17:16.000000000","message":"ditto","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"d4f4314096e9c6d86c25fd5fc4d9834ee31e31ec","unresolved":false,"context_lines":[{"line_number":566,"context_line":""},{"line_number":567,"context_line":"but we support ``!in:`` prefix::"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":"    ``\u0026member_of\u003d!in:\u003cagg1\u003e,\u003cagg2\u003e,\u003cagg3\u003e``"},{"line_number":570,"context_line":""},{"line_number":571,"context_line":"which is equivalent to::"},{"line_number":572,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5fc1f717_bfa3564f","line":569,"range":{"start_line":569,"start_character":4,"end_line":569,"end_character":6},"updated":"2019-03-07 11:17:16.000000000","message":"ditto","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"d4f4314096e9c6d86c25fd5fc4d9834ee31e31ec","unresolved":false,"context_lines":[{"line_number":570,"context_line":""},{"line_number":571,"context_line":"which is equivalent to::"},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"    ``member_of\u003d!\u003cagg1\u003e\u0026member_of\u003d!\u003cagg2\u003e\u0026member_of\u003d!\u003cagg3\u003e``"},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"where candidate resource providers must not be in agg1, agg2, or agg3."}],"source_content_type":"text/x-rst","patch_set":1,"id":"5fc1f717_1f92aaf7","line":573,"range":{"start_line":573,"start_character":4,"end_line":573,"end_character":6},"updated":"2019-03-07 11:17:16.000000000","message":"ditto","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"d4f4314096e9c6d86c25fd5fc4d9834ee31e31ec","unresolved":false,"context_lines":[{"line_number":570,"context_line":""},{"line_number":571,"context_line":"which is equivalent to::"},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"    ``member_of\u003d!\u003cagg1\u003e\u0026member_of\u003d!\u003cagg2\u003e\u0026member_of\u003d!\u003cagg3\u003e``"},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"where candidate resource providers must not be in agg1, agg2, or agg3."}],"source_content_type":"text/x-rst","patch_set":1,"id":"5fc1f717_dfbd0269","line":573,"range":{"start_line":573,"start_character":59,"end_line":573,"end_character":61},"updated":"2019-03-07 11:17:16.000000000","message":"ditto","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":560,"context_line":"\"Candidate resource providers must be at least one of agg1 or agg2,"},{"line_number":561,"context_line":"definitely in agg3 and definitely *not* in agg4.\""},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"We do NOT support ``!`` in the ``in:`` prefix::"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"    ?member_of\u003din:\u003cagg1\u003e,\u003cagg2\u003e,!\u003cagg3\u003e"},{"line_number":566,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"5fc1f717_c32ba32d","line":563,"range":{"start_line":563,"start_character":24,"end_line":563,"end_character":45},"updated":"2019-03-11 22:59:34.000000000","message":"within the ``in:`` list ?","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6f7fdbbb8194e3e274f2ed9dab0526f925ab9e51","unresolved":false,"context_lines":[{"line_number":540,"context_line":"Stein"},{"line_number":541,"context_line":"-----"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"1.31 - Add \u0027in_tree\u0027 queryparam on \u0027GET /allocation_candidates\u0027"},{"line_number":544,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":".. versionadded:: Stein"}],"source_content_type":"text/x-rst","patch_set":4,"id":"5fc1f717_05a38fb3","line":543,"updated":"2019-03-27 20:55:29.000000000","message":"(Maximum in Stein) should have been added at some point...","commit_id":"d40bac9fad8ba2166aff91aef960417547ad2acf"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"90c22d7c54c384c451c80db7fe2a2fb2d254e588","unresolved":false,"context_lines":[{"line_number":540,"context_line":"Stein"},{"line_number":541,"context_line":"-----"},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"1.31 - Add \u0027in_tree\u0027 queryparam on \u0027GET /allocation_candidates\u0027"},{"line_number":544,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":".. versionadded:: Stein"}],"source_content_type":"text/x-rst","patch_set":4,"id":"5fc1f717_116511b5","line":543,"in_reply_to":"5fc1f717_05a38fb3","updated":"2019-03-28 08:10:29.000000000","message":"Not sure that is necessary. (At least that thing is not added in Rocky or Queens or...)","commit_id":"d40bac9fad8ba2166aff91aef960417547ad2acf"}],"placement/tests/functional/fixtures/gabbits.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":361,"context_line":""},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"class NonSharedStorageFixture(APIFixture):"},{"line_number":364,"context_line":"    \"\"\"An APIFixture that has two compute nodes with local storage that do not"},{"line_number":365,"context_line":"    use shared storage."},{"line_number":366,"context_line":"    \"\"\""},{"line_number":367,"context_line":"    def start_fixture(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_831d9b10","line":364,"range":{"start_line":364,"start_character":30,"end_line":364,"end_character":33},"updated":"2019-03-11 22:59:34.000000000","message":"three","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"}],"placement/tests/functional/gabbits/allocation-candidates-bug-1792503.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":106,"context_line":"      $.allocation_requests..allocations[\"$ENVIRON[\u0027SS2_UUID\u0027]\"].resources.DISK_GB: 1000"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"# Tests for negative aggregate membership from microversion 1.32."},{"line_number":109,"context_line":"# The negative aggregate feature had not yet been implemented when bug17924503"},{"line_number":110,"context_line":"# was reported, but we include the tests here to make sure that it is"},{"line_number":111,"context_line":"# consistent with the positive aggregate strategy with nested providers above."},{"line_number":112,"context_line":"- name: get allocation candidates with shared storage without aggregate A"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_43ec93f2","line":109,"range":{"start_line":109,"start_character":70,"end_line":109,"end_character":78},"updated":"2019-03-11 22:59:34.000000000","message":"1792503","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":106,"context_line":"      $.allocation_requests..allocations[\"$ENVIRON[\u0027SS2_UUID\u0027]\"].resources.DISK_GB: 1000"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"# Tests for negative aggregate membership from microversion 1.32."},{"line_number":109,"context_line":"# The negative aggregate feature had not yet been implemented when bug17924503"},{"line_number":110,"context_line":"# was reported, but we include the tests here to make sure that it is"},{"line_number":111,"context_line":"# consistent with the positive aggregate strategy with nested providers above."},{"line_number":112,"context_line":"- name: get allocation candidates with shared storage without aggregate A"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_7906ee88","line":109,"range":{"start_line":109,"start_character":70,"end_line":109,"end_character":78},"in_reply_to":"5fc1f717_43ec93f2","updated":"2019-03-26 07:57:51.000000000","message":"Done","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"}],"placement/tests/functional/gabbits/allocation-candidates-member-of.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"22e88361bc33f697055b570af6831cd3e9c96bf2","unresolved":false,"context_lines":[{"line_number":164,"context_line":"      - \"All member_of parameters must be associated with resources\""},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"- name: negative agg error on invalid agg"},{"line_number":167,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1\u0026member_of\u003d!(^o^)"},{"line_number":168,"context_line":"  status: 400"},{"line_number":169,"context_line":"  request_headers:"},{"line_number":170,"context_line":"    openstack-api-version: placement 1.32"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"5fc1f717_bf3b55cf","line":167,"range":{"start_line":167,"start_character":58,"end_line":167,"end_character":63},"updated":"2019-03-07 11:34:19.000000000","message":"\\o/","commit_id":"03fb634f15b1f8472586accb0c76d7fa916f683f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":148,"context_line":"#  CN3: []"},{"line_number":149,"context_line":"# }"},{"line_number":150,"context_line":"- name: negative agg error on old microversion"},{"line_number":151,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1\u0026member_of\u003d!$ENVIRON[\u0027AGGA_UUID\u0027]"},{"line_number":152,"context_line":"  status: 400"},{"line_number":153,"context_line":"  request_headers:"},{"line_number":154,"context_line":"    openstack-api-version: placement 1.31"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_a30e978a","line":151,"range":{"start_line":151,"start_character":57,"end_line":151,"end_character":79},"updated":"2019-03-11 22:59:34.000000000","message":"do a test like this with !in: as well\n\n[Later] I see you have this in the unit test, but I would prefer to see it here. (I don\u0027t mind if there\u0027s both.)","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":148,"context_line":"#  CN3: []"},{"line_number":149,"context_line":"# }"},{"line_number":150,"context_line":"- name: negative agg error on old microversion"},{"line_number":151,"context_line":"  GET: /allocation_candidates?resources\u003dVCPU:1\u0026member_of\u003d!$ENVIRON[\u0027AGGA_UUID\u0027]"},{"line_number":152,"context_line":"  status: 400"},{"line_number":153,"context_line":"  request_headers:"},{"line_number":154,"context_line":"    openstack-api-version: placement 1.31"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_990b9a8c","line":151,"range":{"start_line":151,"start_character":57,"end_line":151,"end_character":79},"in_reply_to":"5fc1f717_a30e978a","updated":"2019-03-26 07:57:51.000000000","message":"Not done. will do.","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":153,"context_line":"  request_headers:"},{"line_number":154,"context_line":"    openstack-api-version: placement 1.31"},{"line_number":155,"context_line":"  response_strings:"},{"line_number":156,"context_line":"      - \"Forbidden member_of parameters are not supported in the specified microversion\""},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"- name: negative agg error on orphaned queryparam"},{"line_number":159,"context_line":"  GET: /allocation_candidates?member_of\u003d!$ENVIRON[\u0027AGGA_UUID\u0027]"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_83903b50","line":156,"range":{"start_line":156,"start_character":8,"end_line":156,"end_character":88},"updated":"2019-03-11 22:59:34.000000000","message":"Hm, it would be nice if we could do this with schema. But I get that might be hard.\n\n[Later] I see we\u0027re not doing any of the member_of parsing with schema. So disregard.","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"5fc1f717_037d2be6","line":215,"updated":"2019-03-11 22:59:34.000000000","message":"- Test case with overlapping positive and negative agg lists\n- Test case with a more complex positive/negative combinations","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"5fc1f717_19f7aa8d","line":215,"in_reply_to":"5fc1f717_037d2be6","updated":"2019-03-26 07:57:51.000000000","message":"Not done. Ack, will do.","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"}],"placement/tests/functional/gabbits/resource-provider-aggregates.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":186,"context_line":"      # Only rp2 returned since it\u0027s the only one associated with the duplicated agg"},{"line_number":187,"context_line":"      $.resource_providers.`len`: 1"},{"line_number":188,"context_line":"      $.resource_providers[0].uuid: /893337e9-1e55-49f0-bcfe-6a2f16fbf2f7/"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"# Tests for negative aggregate membership from microversion 1.32"},{"line_number":191,"context_line":"# Now the aggregation map is as below"},{"line_number":192,"context_line":"# {"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_03668b52","line":189,"updated":"2019-03-11 22:59:34.000000000","message":"same comments as allocation-candidates-member-of.yaml","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"}],"placement/util.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":347,"context_line":"    :return: A tuple of"},{"line_number":348,"context_line":"        required_aggs: A list containing sets of UUIDs of required"},{"line_number":349,"context_line":"                       aggregates to filter on"},{"line_number":350,"context_line":"        forbidden_aggs: A list containing sets of UUIDs of forbidden"},{"line_number":351,"context_line":"                        aggregates to filter on"},{"line_number":352,"context_line":"    :raises `webob.exc.HTTPBadRequest` if the microversion requested is \u003c1.24"},{"line_number":353,"context_line":"            and the request contains multiple member_of querystring params"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_a3ea1772","line":350,"range":{"start_line":350,"start_character":26,"end_line":350,"end_character":49},"updated":"2019-03-11 22:59:34.000000000","message":"set of","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":347,"context_line":"    :return: A tuple of"},{"line_number":348,"context_line":"        required_aggs: A list containing sets of UUIDs of required"},{"line_number":349,"context_line":"                       aggregates to filter on"},{"line_number":350,"context_line":"        forbidden_aggs: A list containing sets of UUIDs of forbidden"},{"line_number":351,"context_line":"                        aggregates to filter on"},{"line_number":352,"context_line":"    :raises `webob.exc.HTTPBadRequest` if the microversion requested is \u003c1.24"},{"line_number":353,"context_line":"            and the request contains multiple member_of querystring params"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_b9721611","line":350,"range":{"start_line":350,"start_character":26,"end_line":350,"end_character":49},"in_reply_to":"5fc1f717_a3ea1772","updated":"2019-03-26 07:57:51.000000000","message":"Done","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":382,"context_line":"    \"\"\"Parse a member_of query string parameter value."},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    Valid values are one of either a single UUID, the prefix \u0027!\u0027 followed by"},{"line_number":385,"context_line":"    a single UUID, and the prefix \u0027in:\u0027 or \u0027!in:\u0027 followed by two or more"},{"line_number":386,"context_line":"    comma-separated UUIDs."},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    :param value: A member_of query parameter"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_e3957fe5","line":385,"range":{"start_line":385,"start_character":19,"end_line":385,"end_character":22},"updated":"2019-03-11 22:59:34.000000000","message":"or?\n\nThis sentence could probably stand to be split into a bullet list at this point.","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":382,"context_line":"    \"\"\"Parse a member_of query string parameter value."},{"line_number":383,"context_line":""},{"line_number":384,"context_line":"    Valid values are one of either a single UUID, the prefix \u0027!\u0027 followed by"},{"line_number":385,"context_line":"    a single UUID, and the prefix \u0027in:\u0027 or \u0027!in:\u0027 followed by two or more"},{"line_number":386,"context_line":"    comma-separated UUIDs."},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    :param value: A member_of query parameter"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_99ccfa35","line":385,"range":{"start_line":385,"start_character":19,"end_line":385,"end_character":22},"in_reply_to":"5fc1f717_e3957fe5","updated":"2019-03-26 07:57:51.000000000","message":"Done","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    :param value: A member_of query parameter"},{"line_number":389,"context_line":"    :return: A tuple of:"},{"line_number":390,"context_line":"        required: A set of aggregate UUIDs one of which is required"},{"line_number":391,"context_line":"        forbidden: A set of aggregate UUIDs all of which is forbidden"},{"line_number":392,"context_line":"    :raises `webob.exc.HTTPBadRequest` if the value parameter is not in the"},{"line_number":393,"context_line":"            expected format."}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_8384bbb2","line":390,"range":{"start_line":390,"start_character":43,"end_line":390,"end_character":46},"updated":"2019-03-11 22:59:34.000000000","message":"at least one","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    :param value: A member_of query parameter"},{"line_number":389,"context_line":"    :return: A tuple of:"},{"line_number":390,"context_line":"        required: A set of aggregate UUIDs one of which is required"},{"line_number":391,"context_line":"        forbidden: A set of aggregate UUIDs all of which is forbidden"},{"line_number":392,"context_line":"    :raises `webob.exc.HTTPBadRequest` if the value parameter is not in the"},{"line_number":393,"context_line":"            expected format."}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_39cdc62f","line":390,"range":{"start_line":390,"start_character":43,"end_line":390,"end_character":46},"in_reply_to":"5fc1f717_8384bbb2","updated":"2019-03-26 07:57:51.000000000","message":"Done","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":388,"context_line":"    :param value: A member_of query parameter"},{"line_number":389,"context_line":"    :return: A tuple of:"},{"line_number":390,"context_line":"        required: A set of aggregate UUIDs one of which is required"},{"line_number":391,"context_line":"        forbidden: A set of aggregate UUIDs all of which is forbidden"},{"line_number":392,"context_line":"    :raises `webob.exc.HTTPBadRequest` if the value parameter is not in the"},{"line_number":393,"context_line":"            expected format."},{"line_number":394,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_0399ab1d","line":391,"range":{"start_line":391,"start_character":57,"end_line":391,"end_character":59},"updated":"2019-03-11 22:59:34.000000000","message":"are","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":388,"context_line":"    :param value: A member_of query parameter"},{"line_number":389,"context_line":"    :return: A tuple of:"},{"line_number":390,"context_line":"        required: A set of aggregate UUIDs one of which is required"},{"line_number":391,"context_line":"        forbidden: A set of aggregate UUIDs all of which is forbidden"},{"line_number":392,"context_line":"    :raises `webob.exc.HTTPBadRequest` if the value parameter is not in the"},{"line_number":393,"context_line":"            expected format."},{"line_number":394,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_59d212d3","line":391,"range":{"start_line":391,"start_character":57,"end_line":391,"end_character":59},"in_reply_to":"5fc1f717_0399ab1d","updated":"2019-03-26 07:57:51.000000000","message":"Done","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":395,"context_line":"    if \",\" in value and not ("},{"line_number":396,"context_line":"            value.startswith(\"in:\") or value.startswith(\"!in:\")):"},{"line_number":397,"context_line":"        msg \u003d _(\"Multiple values for \u0027member_of\u0027 must be prefixed with the \""},{"line_number":398,"context_line":"                \"\u0027in:\u0027 keyword or \u0027!in:\u0027. Got: %s\") % value"},{"line_number":399,"context_line":"        raise webob.exc.HTTPBadRequest(msg)"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"    required \u003d forbidden \u003d set()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_438ed3d0","line":398,"range":{"start_line":398,"start_character":30,"end_line":398,"end_character":40},"updated":"2019-03-11 22:59:34.000000000","message":"we\u0027ll see this even at microversion \u003c1.32 :(","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":395,"context_line":"    if \",\" in value and not ("},{"line_number":396,"context_line":"            value.startswith(\"in:\") or value.startswith(\"!in:\")):"},{"line_number":397,"context_line":"        msg \u003d _(\"Multiple values for \u0027member_of\u0027 must be prefixed with the \""},{"line_number":398,"context_line":"                \"\u0027in:\u0027 keyword or \u0027!in:\u0027. Got: %s\") % value"},{"line_number":399,"context_line":"        raise webob.exc.HTTPBadRequest(msg)"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"    required \u003d forbidden \u003d set()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_399b8617","line":398,"range":{"start_line":398,"start_character":30,"end_line":398,"end_character":40},"in_reply_to":"5fc1f717_438ed3d0","updated":"2019-03-26 07:57:51.000000000","message":"Good point, but I don\u0027t want to change messages depending on microversion, so I\u0027ve modified the message a bit.","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":398,"context_line":"                \"\u0027in:\u0027 keyword or \u0027!in:\u0027. Got: %s\") % value"},{"line_number":399,"context_line":"        raise webob.exc.HTTPBadRequest(msg)"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"    required \u003d forbidden \u003d set()"},{"line_number":402,"context_line":"    if value.startswith(\u0027!in:\u0027):"},{"line_number":403,"context_line":"        forbidden \u003d set(value[4:].split(\u0027,\u0027))"},{"line_number":404,"context_line":"    elif value.startswith(\u0027!\u0027):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_03676b27","line":401,"range":{"start_line":401,"start_character":4,"end_line":401,"end_character":32},"updated":"2019-03-11 22:59:34.000000000","message":"This assigns both of these to the same actual set.\n\nWhich works, because you\u0027re overwriting one of them in the branches below.\n\nBut it\u0027s still confusing and future-brittle. Please sacrifice the extra LOC and initialize them separately.","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":25625,"name":"Tetsuro Nakamura","email":"tetsuro.nakamura.bc@hco.ntt.co.jp","username":"tetsuro0907"},"change_message_id":"1a9ea994ee6bdc81d27db5d0c3d52b61eacad186","unresolved":false,"context_lines":[{"line_number":398,"context_line":"                \"\u0027in:\u0027 keyword or \u0027!in:\u0027. Got: %s\") % value"},{"line_number":399,"context_line":"        raise webob.exc.HTTPBadRequest(msg)"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"    required \u003d forbidden \u003d set()"},{"line_number":402,"context_line":"    if value.startswith(\u0027!in:\u0027):"},{"line_number":403,"context_line":"        forbidden \u003d set(value[4:].split(\u0027,\u0027))"},{"line_number":404,"context_line":"    elif value.startswith(\u0027!\u0027):"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_19afaa2a","line":401,"range":{"start_line":401,"start_character":4,"end_line":401,"end_character":32},"in_reply_to":"5fc1f717_03676b27","updated":"2019-03-26 07:57:51.000000000","message":"Good catch. Done.","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4feffd6c2aa4bff2b17e7547fa8f451ee5145d13","unresolved":false,"context_lines":[{"line_number":361,"context_line":"    if not multi_member_of and len(req.GET.getall(\u0027member_of\u0027 + suffix)) \u003e 1:"},{"line_number":362,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":363,"context_line":"            \u0027Multiple member_of%s parameters are not supported\u0027 % suffix)"},{"line_number":364,"context_line":"    required_aggs \u003d []"},{"line_number":365,"context_line":"    forbidden_aggs \u003d set()"},{"line_number":366,"context_line":"    for value in req.GET.getall(\u0027member_of\u0027 + suffix):"},{"line_number":367,"context_line":"        required, forbidden \u003d normalize_member_of_qs_param(value)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_288649dd","line":364,"range":{"start_line":364,"start_character":4,"end_line":364,"end_character":22},"updated":"2019-04-02 13:21:07.000000000","message":"Emm....why we didn\u0027t use set() for this?","commit_id":"0a3dcadb0a4c82d5cfdee646ca6acd03dae3208f"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"f64c71895d1acf5b88f01647da22c6e344421568","unresolved":false,"context_lines":[{"line_number":361,"context_line":"    if not multi_member_of and len(req.GET.getall(\u0027member_of\u0027 + suffix)) \u003e 1:"},{"line_number":362,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":363,"context_line":"            \u0027Multiple member_of%s parameters are not supported\u0027 % suffix)"},{"line_number":364,"context_line":"    required_aggs \u003d []"},{"line_number":365,"context_line":"    forbidden_aggs \u003d set()"},{"line_number":366,"context_line":"    for value in req.GET.getall(\u0027member_of\u0027 + suffix):"},{"line_number":367,"context_line":"        required, forbidden \u003d normalize_member_of_qs_param(value)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5fc1f717_937bf2bc","line":364,"range":{"start_line":364,"start_character":4,"end_line":364,"end_character":22},"in_reply_to":"5fc1f717_288649dd","updated":"2019-04-02 13:38:46.000000000","message":"nvm, I figure out that...","commit_id":"0a3dcadb0a4c82d5cfdee646ca6acd03dae3208f"}],"releasenotes/notes/negative-aggregate-membership-1dde3cbe27c69279.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"da7d9eea96c357530e98714444d359d2ac342e46","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Add support for forbidden aggregates in ``member_of`` queryparam"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5fc1f717_63774fd6","line":1,"updated":"2019-03-11 22:59:34.000000000","message":"ditto rest_api_version_history","commit_id":"224b25319603bc1f3b90425a71d74667f9bdf91d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"6d61451cfaf937f2947e4d95dc40bccfc47e0f6e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"5fc1f717_cc7a7e86","updated":"2019-03-28 16:19:25.000000000","message":"Is it worth mentioning in here that the ! feature works on numbered member_of too, or should we take that for granted?","commit_id":"554aac029da1a40ced058775b416060f89c7dbcc"}]}
