)]}'
{"nova/api/openstack/placement/handlers/resource_provider.py":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"024310e044ca525aa627ed5ecbf728ece5c078de","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    filters \u003d {}"},{"line_number":185,"context_line":"    for attr in objects.ResourceProviderList.allowed_filters:"},{"line_number":186,"context_line":"        if attr in req.GET:"},{"line_number":187,"context_line":"            # If the filter value starts with \u0027in:\u0027 turn it into a"},{"line_number":188,"context_line":"            # list of values, split on \u0027,\u0027."},{"line_number":189,"context_line":"            # TODO(cdent): If this becomes an idiom, we should move"},{"line_number":190,"context_line":"            # this processing to the util package."},{"line_number":191,"context_line":"            value \u003d req.GET[attr]"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_dc493ab9","line":188,"range":{"start_line":187,"start_character":0,"end_line":188,"end_character":43},"updated":"2016-12-08 18:37:41.000000000","message":"Is there a need for handling anti-affinity for aggregates? We might also need to work with `nin:` in that case.","commit_id":"36deda128a45fb8f8a103e9e33e8dd070e0f666a"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"4aa82352e968ce82d99634a56479b51bd5193d8f","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    filters \u003d {}"},{"line_number":185,"context_line":"    for attr in objects.ResourceProviderList.allowed_filters:"},{"line_number":186,"context_line":"        if attr in req.GET:"},{"line_number":187,"context_line":"            # If the filter value starts with \u0027in:\u0027 turn it into a"},{"line_number":188,"context_line":"            # list of values, split on \u0027,\u0027."},{"line_number":189,"context_line":"            # TODO(cdent): If this becomes an idiom, we should move"},{"line_number":190,"context_line":"            # this processing to the util package."},{"line_number":191,"context_line":"            value \u003d req.GET[attr]"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a6eadb0_915b0687","line":188,"range":{"start_line":187,"start_character":0,"end_line":188,"end_character":43},"updated":"2016-12-14 14:20:13.000000000","message":"(repeating from PS 5)\n\nIs there a need for handling anti-affinity for aggregates? We might also need to work with `nin:` in that case.","commit_id":"d87dfbeb342b6d807e4eb3cb4f206f441062a666"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"58ccd7b2cad2ceb2f47e5c19a2029340b0690322","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            # this processing to the util package."},{"line_number":191,"context_line":"            value \u003d req.GET[attr]"},{"line_number":192,"context_line":"            if value.startswith(\u0027in:\u0027):"},{"line_number":193,"context_line":"                value \u003d value.split(\u0027in:\u0027, 1)[1].split(\u0027,\u0027)"},{"line_number":194,"context_line":"            filters[attr] \u003d value"},{"line_number":195,"context_line":"    resource_providers \u003d objects.ResourceProviderList.get_all_by_filters("},{"line_number":196,"context_line":"        context, filters)"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba5201f7_0db322ea","line":193,"updated":"2017-01-05 17:48:13.000000000","message":"sure, this works. this also works:\n\n value \u003d value[3:].split(\u0027,\u0027)","commit_id":"fef25dd738be1a74343ba6839a37d1acc1d48728"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0125cea345d6ec5ae6499313758ef0b9f8756acb","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            # TODO(cdent): If this becomes an idiom, we should move"},{"line_number":190,"context_line":"            # this processing to the util package."},{"line_number":191,"context_line":"            value \u003d req.GET[attr]"},{"line_number":192,"context_line":"            if value.startswith(\u0027in:\u0027):"},{"line_number":193,"context_line":"                value \u003d value[3:].split(\u0027,\u0027)"},{"line_number":194,"context_line":"            filters[attr] \u003d value"},{"line_number":195,"context_line":"    resource_providers \u003d objects.ResourceProviderList.get_all_by_filters("}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b4da5ae6","line":192,"updated":"2017-01-05 19:56:28.000000000","message":"If filtering resource providers on \u0027name\u0027 this is potentially fall into a trap if the RPs have commas in the name, as noted in Sylvain\u0027s patch which was doing something similar:\n\nhttps://review.openstack.org/#/c/407630/6/nova/api/openstack/placement/handlers/resource_provider.py@179\n\nDo we want to make the RP name regex rules more strict before allowing in: on \u0027name\u0027?","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0b156e41a3b7781c8fb9147d97c066062885a601","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            # TODO(cdent): If this becomes an idiom, we should move"},{"line_number":190,"context_line":"            # this processing to the util package."},{"line_number":191,"context_line":"            value \u003d req.GET[attr]"},{"line_number":192,"context_line":"            if value.startswith(\u0027in:\u0027):"},{"line_number":193,"context_line":"                value \u003d value[3:].split(\u0027,\u0027)"},{"line_number":194,"context_line":"            filters[attr] \u003d value"},{"line_number":195,"context_line":"    resource_providers \u003d objects.ResourceProviderList.get_all_by_filters("}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b73edc25","line":192,"in_reply_to":"ba5201f7_b4da5ae6","updated":"2017-01-05 20:22:51.000000000","message":"I\u0027m going to change this so it special cases on member_of","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0125cea345d6ec5ae6499313758ef0b9f8756acb","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            # this processing to the util package."},{"line_number":191,"context_line":"            value \u003d req.GET[attr]"},{"line_number":192,"context_line":"            if value.startswith(\u0027in:\u0027):"},{"line_number":193,"context_line":"                value \u003d value[3:].split(\u0027,\u0027)"},{"line_number":194,"context_line":"            filters[attr] \u003d value"},{"line_number":195,"context_line":"    resource_providers \u003d objects.ResourceProviderList.get_all_by_filters("},{"line_number":196,"context_line":"        context, filters)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b4afba28","line":193,"range":{"start_line":193,"start_character":24,"end_line":193,"end_character":44},"updated":"2017-01-05 19:56:28.000000000","message":"The split here produces a list, but when not using in: we\u0027re passing the filters dict with attr mapped to a str (not a list), is that going to cause issues in how get_all_by_filters deals with things?\n\nI guess the in_ here must handle a list or a str?\n\nhttps://github.com/openstack/nova/blob/966446553bc8aea79692d0bc0bacae81d6a201df/nova/objects/resource_provider.py#L588","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4556bc0135d3ce82e954820b144f884bf632eddd","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            # this processing to the util package."},{"line_number":191,"context_line":"            value \u003d req.GET[attr]"},{"line_number":192,"context_line":"            if value.startswith(\u0027in:\u0027):"},{"line_number":193,"context_line":"                value \u003d value[3:].split(\u0027,\u0027)"},{"line_number":194,"context_line":"            filters[attr] \u003d value"},{"line_number":195,"context_line":"    resource_providers \u003d objects.ResourceProviderList.get_all_by_filters("},{"line_number":196,"context_line":"        context, filters)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_9722b850","line":193,"range":{"start_line":193,"start_character":24,"end_line":193,"end_character":44},"in_reply_to":"ba5201f7_b4afba28","updated":"2017-01-05 20:01:30.000000000","message":"http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.operators.ColumnOperators.in_ - so I wonder if the str is just treated as a tuple? That would be wrong in our case I think. We wouldn\u0027t get a result, but it would be hard to figure out why. Maybe we need to handle member_of in the object code and if it\u0027s a six.string_types we cast to a list.","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0125cea345d6ec5ae6499313758ef0b9f8756acb","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            if value.startswith(\u0027in:\u0027):"},{"line_number":193,"context_line":"                value \u003d value[3:].split(\u0027,\u0027)"},{"line_number":194,"context_line":"            filters[attr] \u003d value"},{"line_number":195,"context_line":"    resource_providers \u003d objects.ResourceProviderList.get_all_by_filters("},{"line_number":196,"context_line":"        context, filters)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    response \u003d req.response"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_b7aedce3","line":195,"range":{"start_line":195,"start_character":54,"end_line":195,"end_character":72},"updated":"2017-01-05 19:56:28.000000000","message":"I guess we should update this docstring at some point:\n\nhttps://github.com/openstack/nova/blob/966446553bc8aea79692d0bc0bacae81d6a201df/nova/objects/resource_provider.py#L688","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0b156e41a3b7781c8fb9147d97c066062885a601","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            if value.startswith(\u0027in:\u0027):"},{"line_number":193,"context_line":"                value \u003d value[3:].split(\u0027,\u0027)"},{"line_number":194,"context_line":"            filters[attr] \u003d value"},{"line_number":195,"context_line":"    resource_providers \u003d objects.ResourceProviderList.get_all_by_filters("},{"line_number":196,"context_line":"        context, filters)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    response \u003d req.response"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_f7f78456","line":195,"in_reply_to":"ba5201f7_b7aedce3","updated":"2017-01-05 20:22:51.000000000","message":"Done","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"82d25a707ec3765cd451363ceb433cc703afc105","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            # JSONSchema validation of query params."},{"line_number":193,"context_line":"            if attr \u003d\u003d \u0027member_of\u0027:"},{"line_number":194,"context_line":"                if value.startswith(\u0027in:\u0027):"},{"line_number":195,"context_line":"                    value \u003d value[3:].split(\u0027,\u0027)"},{"line_number":196,"context_line":"                else:"},{"line_number":197,"context_line":"                    value \u003d [value]"},{"line_number":198,"context_line":"            filters[attr] \u003d value"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba5201f7_f3f058cb","line":195,"range":{"start_line":195,"start_character":33,"end_line":195,"end_character":36},"updated":"2017-01-06 16:18:27.000000000","message":"Still not crazy about hardcoding this, but meh...","commit_id":"ea5d0576cce5574272c7d8d3acb2b6dbeaa8be50"}],"nova/api/openstack/placement/microversion.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"68590d46349a5c5e520d7c3a1d71794e671a9f9d","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    \u00271.1\u0027,  # initial support for aggregate.get_aggregates and set_aggregates"},{"line_number":39,"context_line":"    \u00271.2\u0027,  # Adds /resource_classes resource endpoint"},{"line_number":40,"context_line":"    \u00271.3\u0027,  # Adds \u0027member_of\u0027 query parameter to get resource providers"},{"line_number":41,"context_line":"            # that are members of the listed aggregates"},{"line_number":42,"context_line":"]"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"ba5201f7_c853c815","line":41,"updated":"2017-01-05 17:58:31.000000000","message":"any of the listed aggregates...\n\nif you respin.","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"}],"nova/api/openstack/placement/rest_api_version_history.rst":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7a177c7bf253249ca3c7e36d5c39a6647d4ebb37","unresolved":false,"context_lines":[{"line_number":48,"context_line":"1.3"},{"line_number":49,"context_line":"---"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Version 1.2 adds support for listing resource providers that are"},{"line_number":52,"context_line":"associated with a provided list of aggregates using an"},{"line_number":53,"context_line":"``assoc_with_aggregate`` query parameter:"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a71b18c_b04e68bf","line":51,"updated":"2016-12-08 16:27:51.000000000","message":"s/1.2/1.3 :) we\u0027re in rebase hell competing for this microversion mutex ;)","commit_id":"2726d34c1d783a0fc54ff449cfa10d709d3a9139"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7a177c7bf253249ca3c7e36d5c39a6647d4ebb37","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Version 1.2 adds support for listing resource providers that are"},{"line_number":52,"context_line":"associated with a provided list of aggregates using an"},{"line_number":53,"context_line":"``assoc_with_aggregate`` query parameter:"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"* /resource_providers?assoc_with_aggregate\u003din:{agg1_uuid},{agg2_uuid},{add3_uuid}"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3a71b18c_50d434bc","line":53,"updated":"2016-12-08 16:27:51.000000000","message":"s/assoc_with_aggregate/member_of/g","commit_id":"2726d34c1d783a0fc54ff449cfa10d709d3a9139"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"58ccd7b2cad2ceb2f47e5c19a2029340b0690322","unresolved":false,"context_lines":[{"line_number":48,"context_line":"1.3 member_of query parameter"},{"line_number":49,"context_line":"-----------------------------"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Version 1.3 adds support for listing resource providers that are members of"},{"line_number":52,"context_line":"the provided list of aggregates using a ``member_of`` query parameter:"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"* /resource_providers?member_of\u003din:{agg1_uuid},{agg2_uuid},{add3_uuid}"}],"source_content_type":"text/x-rst","patch_set":11,"id":"ba5201f7_8dd632ef","line":52,"range":{"start_line":51,"start_character":65,"end_line":52,"end_character":17},"updated":"2017-01-05 17:48:13.000000000","message":"The wording here makes it sound like the resulting resource providers will be members of *ALL* aggregates listed in the member_of list. Please update this to say \"resource providers that are members of any of the aggregates in the provided list\"","commit_id":"fef25dd738be1a74343ba6839a37d1acc1d48728"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0125cea345d6ec5ae6499313758ef0b9f8756acb","unresolved":false,"context_lines":[{"line_number":51,"context_line":"Version 1.3 adds support for listing resource providers that are members of"},{"line_number":52,"context_line":"any of the list of aggregates provided using a ``member_of`` query parameter:"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"* /resource_providers?member_of\u003din:{agg1_uuid},{agg2_uuid},{add3_uuid}"}],"source_content_type":"text/x-rst","patch_set":12,"id":"ba5201f7_34510a37","line":54,"range":{"start_line":54,"start_character":60,"end_line":54,"end_character":63},"updated":"2017-01-05 19:56:28.000000000","message":"agg?","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0b156e41a3b7781c8fb9147d97c066062885a601","unresolved":false,"context_lines":[{"line_number":51,"context_line":"Version 1.3 adds support for listing resource providers that are members of"},{"line_number":52,"context_line":"any of the list of aggregates provided using a ``member_of`` query parameter:"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"* /resource_providers?member_of\u003din:{agg1_uuid},{agg2_uuid},{add3_uuid}"}],"source_content_type":"text/x-rst","patch_set":12,"id":"ba5201f7_b7017c3a","line":54,"in_reply_to":"ba5201f7_34510a37","updated":"2017-01-05 20:22:51.000000000","message":"Done","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"}],"nova/tests/functional/api/openstack/placement/gabbits/resource-provider-aggregates.yaml":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"7a177c7bf253249ca3c7e36d5c39a6647d4ebb37","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"- name: get by aggregates two result"},{"line_number":52,"context_line":"  GET: \u0027/resource_providers?member_of\u003din:83a3d69d-8920-48e2-8914-cadfd8fa2f91\u0027"},{"line_number":53,"context_line":"  response_json_paths:"},{"line_number":54,"context_line":"      $.resource_providers[0].uuid: /5202c48f-c960-4eec-bde3-89c4f22a17b9|893337e9-1e55-49f0-bcfe-6a2f16fbf2f7/"},{"line_number":55,"context_line":"      $.resource_providers[1].uuid: /5202c48f-c960-4eec-bde3-89c4f22a17b9|893337e9-1e55-49f0-bcfe-6a2f16fbf2f7/"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3a71b18c_707770d4","line":53,"updated":"2016-12-08 16:27:51.000000000","message":"might be good to put:\n\n   $.resource_provider.`len`: 2","commit_id":"2726d34c1d783a0fc54ff449cfa10d709d3a9139"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"3f5570b8be97a278dc4c20a3ad02994095ec8cfe","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"- name: get by aggregates two result"},{"line_number":52,"context_line":"  GET: \u0027/resource_providers?member_of\u003din:83a3d69d-8920-48e2-8914-cadfd8fa2f91\u0027"},{"line_number":53,"context_line":"  response_json_paths:"},{"line_number":54,"context_line":"      $.resource_providers[0].uuid: /5202c48f-c960-4eec-bde3-89c4f22a17b9|893337e9-1e55-49f0-bcfe-6a2f16fbf2f7/"},{"line_number":55,"context_line":"      $.resource_providers[1].uuid: /5202c48f-c960-4eec-bde3-89c4f22a17b9|893337e9-1e55-49f0-bcfe-6a2f16fbf2f7/"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3a71b18c_eb5f1573","line":53,"in_reply_to":"3a71b18c_707770d4","updated":"2016-12-08 16:37:28.000000000","message":"good idea","commit_id":"2726d34c1d783a0fc54ff449cfa10d709d3a9139"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"960334ce6e2a98c11104d69d23e3b05accb4f85a","unresolved":false,"context_lines":[{"line_number":65,"context_line":"  data: []"},{"line_number":66,"context_line":"  status: 200"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"- name: get by both aggregates"},{"line_number":69,"context_line":"  GET: \u0027/resource_providers?member_of\u003din:83a3d69d-8920-48e2-8914-cadfd8fa2f91,99652f11-9f77-46b9-80b7-4b1989be9f8c\u0027"},{"line_number":70,"context_line":"  response_json_paths:"},{"line_number":71,"context_line":"      $.resource_providers[0].uuid: 5202c48f-c960-4eec-bde3-89c4f22a17b9"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"3a71b18c_39ab208b","line":68,"updated":"2016-12-08 18:13:19.000000000","message":"erm, in: is supposed to be for OR\u0027ing the UUIDs together, not AND\u0027ing the UUIDs together. So, this should be returning any resource provider that as associated with EITHER aggregate 83a3d69d-8920-48e2-8914-cadfd8fa2f91 OR aggregate 99652f11-9f77-46b9-80b7-4b1989be9f8c, thus this should be returning 2 rows, since both providers are members of aggregate 83a3d69d-8920-48e2-8914-cadfd8fa2f91.","commit_id":"64e80a8268404d2ac23cbb4367887a5d5ad0527a"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"592410934b4c686cf116a12fdcb1da10a50ee724","unresolved":false,"context_lines":[{"line_number":65,"context_line":"  data: []"},{"line_number":66,"context_line":"  status: 200"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"- name: get by both aggregates"},{"line_number":69,"context_line":"  GET: \u0027/resource_providers?member_of\u003din:83a3d69d-8920-48e2-8914-cadfd8fa2f91,99652f11-9f77-46b9-80b7-4b1989be9f8c\u0027"},{"line_number":70,"context_line":"  response_json_paths:"},{"line_number":71,"context_line":"      $.resource_providers[0].uuid: 5202c48f-c960-4eec-bde3-89c4f22a17b9"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"3a71b18c_390c0094","line":68,"in_reply_to":"3a71b18c_39ab208b","updated":"2016-12-08 18:17:32.000000000","message":"No, the previous row cleared all the aggregates associated with rp1.\n\nThis does, however, remind me that I forgot to do one of your suggestions and add a len on one of the test above (around line 51).\n\nAnd it also points out that we need a multi-value in test with multiple results in here somewhere.\n\nI\u0027ll do both of those things now.","commit_id":"64e80a8268404d2ac23cbb4367887a5d5ad0527a"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"4e5467a5631933d265c89f317b75ebccd671ba32","unresolved":false,"context_lines":[{"line_number":52,"context_line":"  GET: \u0027/resource_providers?member_of\u003din:83a3d69d-8920-48e2-8914-cadfd8fa2f91\u0027"},{"line_number":53,"context_line":"  response_json_paths:"},{"line_number":54,"context_line":"      $.resource_providers.`len`: 2"},{"line_number":55,"context_line":"      $.resource_providers[0].uuid: /5202c48f-c960-4eec-bde3-89c4f22a17b9|893337e9-1e55-49f0-bcfe-6a2f16fbf2f7/"},{"line_number":56,"context_line":"      $.resource_providers[1].uuid: /5202c48f-c960-4eec-bde3-89c4f22a17b9|893337e9-1e55-49f0-bcfe-6a2f16fbf2f7/"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"- name: associate another aggregate with rp2"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"ba5201f7_c24bb285","line":55,"range":{"start_line":55,"start_character":36,"end_line":55,"end_character":111},"updated":"2017-01-05 14:07:42.000000000","message":"Sorry, I am being dumb, what does this mean? Read the docs, but that seemed not to clear things up. Is this basically an OR, so that  we are order agnostic here?","commit_id":"fef25dd738be1a74343ba6839a37d1acc1d48728"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"132f4eacc1ba92b28657cb1d2aa81ac1dfca277d","unresolved":false,"context_lines":[{"line_number":52,"context_line":"  GET: \u0027/resource_providers?member_of\u003din:83a3d69d-8920-48e2-8914-cadfd8fa2f91\u0027"},{"line_number":53,"context_line":"  response_json_paths:"},{"line_number":54,"context_line":"      $.resource_providers.`len`: 2"},{"line_number":55,"context_line":"      $.resource_providers[0].uuid: /5202c48f-c960-4eec-bde3-89c4f22a17b9|893337e9-1e55-49f0-bcfe-6a2f16fbf2f7/"},{"line_number":56,"context_line":"      $.resource_providers[1].uuid: /5202c48f-c960-4eec-bde3-89c4f22a17b9|893337e9-1e55-49f0-bcfe-6a2f16fbf2f7/"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"- name: associate another aggregate with rp2"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"ba5201f7_30ea04ad","line":55,"in_reply_to":"ba5201f7_c24bb285","updated":"2017-01-05 14:33:43.000000000","message":"Yeah, use of enclosing slashes says \"this is a regex\".\n\nAnd in this case it is for the reason you surmise: to overcome ordering ambiguity.\n\nIt\u0027s sort of documented in https://gabbi.readthedocs.io/en/latest/format.html#response-expectations but could probably be better.\n\nI can add an explanatory comment in here if you think that would help?","commit_id":"fef25dd738be1a74343ba6839a37d1acc1d48728"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0125cea345d6ec5ae6499313758ef0b9f8756acb","unresolved":false,"context_lines":[{"line_number":38,"context_line":"  status: 200"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"- name: get by aggregates one result"},{"line_number":41,"context_line":"  GET: \u0027/resource_providers?member_of\u003din:83a3d69d-8920-48e2-8914-cadfd8fa2f91\u0027"},{"line_number":42,"context_line":"  response_json_paths:"},{"line_number":43,"context_line":"      $.resource_providers[0].uuid: 893337e9-1e55-49f0-bcfe-6a2f16fbf2f7"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":12,"id":"ba5201f7_37d74c4c","line":41,"range":{"start_line":41,"start_character":38,"end_line":41,"end_character":41},"updated":"2017-01-05 19:56:28.000000000","message":"How about a test where we have this same GET request but without the \"in:\"?","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0b156e41a3b7781c8fb9147d97c066062885a601","unresolved":false,"context_lines":[{"line_number":38,"context_line":"  status: 200"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"- name: get by aggregates one result"},{"line_number":41,"context_line":"  GET: \u0027/resource_providers?member_of\u003din:83a3d69d-8920-48e2-8914-cadfd8fa2f91\u0027"},{"line_number":42,"context_line":"  response_json_paths:"},{"line_number":43,"context_line":"      $.resource_providers[0].uuid: 893337e9-1e55-49f0-bcfe-6a2f16fbf2f7"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":12,"id":"ba5201f7_37c3ccee","line":41,"in_reply_to":"ba5201f7_37d74c4c","updated":"2017-01-05 20:22:51.000000000","message":"Done","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"}],"releasenotes/notes/placement-api-member-of-d8a08d0d0c5700d7.yaml":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"58ccd7b2cad2ceb2f47e5c19a2029340b0690322","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - A new Placement API microversion 1.3 is added with support for filtering"},{"line_number":4,"context_line":"    the list of resource providers to include only those resource providers"},{"line_number":5,"context_line":"    which are members of the aggregates listed by uuid in the `member_of`"},{"line_number":6,"context_line":"    query parameter. The parameter is used when making a"},{"line_number":7,"context_line":"    `GET /resource_providers` request. The value of the parameter uses the"},{"line_number":8,"context_line":"    `in:` syntax to provide a list of aggregate uuids as follows"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"ba5201f7_2d41c6a9","line":5,"range":{"start_line":4,"start_character":46,"end_line":5,"end_character":46},"updated":"2017-01-05 17:48:13.000000000","message":"Similar comment about the wording here. It should stress that the resource providers in the results may be belong to *any* of the aggregates in the member_of list.","commit_id":"fef25dd738be1a74343ba6839a37d1acc1d48728"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0125cea345d6ec5ae6499313758ef0b9f8756acb","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    which are members of any of the aggregates listed by uuid in the `member_of`"},{"line_number":6,"context_line":"    query parameter. The parameter is used when making a"},{"line_number":7,"context_line":"    `GET /resource_providers` request. The value of the parameter uses the"},{"line_number":8,"context_line":"    `in:` syntax to provide a list of aggregate uuids as follows"},{"line_number":9,"context_line":"    `/resource_providers?member_of\u003din:09c931b0-c0d7-4e80-8e01-9e6511db8259,f8ab4fa2-804f-402e-b675-7918bd04b173`."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    If other filtering query parameters are present, the results are a boolean"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"ba5201f7_775ab42b","line":8,"range":{"start_line":8,"start_character":57,"end_line":8,"end_character":64},"updated":"2017-01-05 19:56:28.000000000","message":"Let\u0027s make the following a code block by using ::\n\nTo do that, you\u0027ll need to change to this above:\n\nfeatures:\n  - |\n    A new Placement API...","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0b156e41a3b7781c8fb9147d97c066062885a601","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    which are members of any of the aggregates listed by uuid in the `member_of`"},{"line_number":6,"context_line":"    query parameter. The parameter is used when making a"},{"line_number":7,"context_line":"    `GET /resource_providers` request. The value of the parameter uses the"},{"line_number":8,"context_line":"    `in:` syntax to provide a list of aggregate uuids as follows"},{"line_number":9,"context_line":"    `/resource_providers?member_of\u003din:09c931b0-c0d7-4e80-8e01-9e6511db8259,f8ab4fa2-804f-402e-b675-7918bd04b173`."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    If other filtering query parameters are present, the results are a boolean"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"ba5201f7_17332815","line":8,"in_reply_to":"ba5201f7_775ab42b","updated":"2017-01-05 20:22:51.000000000","message":"Done","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0125cea345d6ec5ae6499313758ef0b9f8756acb","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    query parameter. The parameter is used when making a"},{"line_number":7,"context_line":"    `GET /resource_providers` request. The value of the parameter uses the"},{"line_number":8,"context_line":"    `in:` syntax to provide a list of aggregate uuids as follows"},{"line_number":9,"context_line":"    `/resource_providers?member_of\u003din:09c931b0-c0d7-4e80-8e01-9e6511db8259,f8ab4fa2-804f-402e-b675-7918bd04b173`."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    If other filtering query parameters are present, the results are a boolean"},{"line_number":12,"context_line":"    AND of all the filters."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"ba5201f7_f746a44d","line":9,"range":{"start_line":9,"start_character":4,"end_line":9,"end_character":112},"updated":"2017-01-05 19:56:28.000000000","message":"Won\u0027t need the ` or period when you put this in a code block.","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"0b156e41a3b7781c8fb9147d97c066062885a601","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    query parameter. The parameter is used when making a"},{"line_number":7,"context_line":"    `GET /resource_providers` request. The value of the parameter uses the"},{"line_number":8,"context_line":"    `in:` syntax to provide a list of aggregate uuids as follows"},{"line_number":9,"context_line":"    `/resource_providers?member_of\u003din:09c931b0-c0d7-4e80-8e01-9e6511db8259,f8ab4fa2-804f-402e-b675-7918bd04b173`."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    If other filtering query parameters are present, the results are a boolean"},{"line_number":12,"context_line":"    AND of all the filters."}],"source_content_type":"text/x-yaml","patch_set":12,"id":"ba5201f7_37382cef","line":9,"in_reply_to":"ba5201f7_f746a44d","updated":"2017-01-05 20:22:51.000000000","message":"Done","commit_id":"2f3ae89a578577dfdd602978a35834fc0674c2d9"}]}
