)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"623e20d1962f457a9f369b3165b1e448ce7a516c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ed Leafe \u003ced@leafe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-03-19 22:07:57 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Address issues raised in adding member_of to GET /a-c"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In an earlier patch [0], there were some valid criticisms noted. They"},{"line_number":10,"context_line":"were not critical enough to require holding off on that patch, so they"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"df7087c5_7ba88076","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":53},"updated":"2018-03-20 11:36:14.000000000","message":"nit: I see this as a bunch of refactoring. IMO it\u0027s good to mentioned what actually was changed.\n\nlike:\n- move member_of validation logic to separate function\n- add gabbi functional test (reason)\n- remove aggregates join while loading resource_providers\n- ...","commit_id":"395ffca5c27e8f7134ebf8a137ad87ccfea63951"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"79e8f56eec861a42e1dedddf3537b539613ffa41","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Ed Leafe \u003ced@leafe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-03-19 22:07:57 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Address issues raised in adding member_of to GET /a-c"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In an earlier patch [0], there were some valid criticisms noted. They"},{"line_number":10,"context_line":"were not critical enough to require holding off on that patch, so they"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"df7087c5_d1b40df5","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":53},"in_reply_to":"df7087c5_7ba88076","updated":"2018-03-20 12:52:43.000000000","message":"The reasons were all noted in the patch linked below. This follows directly from the issues raised on PS8 of that code.","commit_id":"395ffca5c27e8f7134ebf8a137ad87ccfea63951"}],"nova/api/openstack/placement/handlers/resource_provider.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9d908dd4ad1b8777a8073dacd94a71bcd09deedd","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    qpkeys \u003d (\u0027uuid\u0027, \u0027name\u0027, \u0027member_of\u0027, \u0027in_tree\u0027, \u0027resources\u0027, \u0027required\u0027)"},{"line_number":198,"context_line":"    for attr in qpkeys:"},{"line_number":199,"context_line":"        if attr in req.GET:"},{"line_number":200,"context_line":"            value \u003d req.GET[attr]"},{"line_number":201,"context_line":"            # special case member_of to always make its value a"},{"line_number":202,"context_line":"            # list, either by accepting the single value, or if it"},{"line_number":203,"context_line":"            # starts with \u0027in:\u0027 splitting on \u0027,\u0027."},{"line_number":204,"context_line":"            # NOTE(cdent): This will all change when we start using"},{"line_number":205,"context_line":"            # JSONSchema validation of query params."},{"line_number":206,"context_line":"            if attr \u003d\u003d \u0027member_of\u0027:"},{"line_number":207,"context_line":"                if value.startswith(\u0027in:\u0027):"},{"line_number":208,"context_line":"                    value \u003d value[3:].split(\u0027,\u0027)"},{"line_number":209,"context_line":"                else:"},{"line_number":210,"context_line":"                    value \u003d [value]"},{"line_number":211,"context_line":"                # Make sure the values are actually UUIDs."},{"line_number":212,"context_line":"                for aggr_uuid in value:"},{"line_number":213,"context_line":"                    if not uuidutils.is_uuid_like(aggr_uuid):"},{"line_number":214,"context_line":"                        raise webob.exc.HTTPBadRequest("},{"line_number":215,"context_line":"                            _(\u0027Invalid uuid value: %(uuid)s\u0027) %"},{"line_number":216,"context_line":"                            {\u0027uuid\u0027: aggr_uuid})"},{"line_number":217,"context_line":"            elif attr \u003d\u003d \u0027resources\u0027:"},{"line_number":218,"context_line":"                value \u003d util.normalize_resources_qs_param(value)"},{"line_number":219,"context_line":"            elif attr \u003d\u003d \u0027required\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_ed2ce44b","line":216,"range":{"start_line":200,"start_character":0,"end_line":216,"end_character":48},"updated":"2018-03-19 21:18:55.000000000","message":"https://review.openstack.org/#/c/552098/8/nova/api/openstack/placement/util.py@336 not done -- make this call normalize_member_of_qs_param","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"302879f8a89fb02946de2b8b1d1e5042a1d78584","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    qpkeys \u003d (\u0027uuid\u0027, \u0027name\u0027, \u0027member_of\u0027, \u0027in_tree\u0027, \u0027resources\u0027, \u0027required\u0027)"},{"line_number":198,"context_line":"    for attr in qpkeys:"},{"line_number":199,"context_line":"        if attr in req.GET:"},{"line_number":200,"context_line":"            value \u003d req.GET[attr]"},{"line_number":201,"context_line":"            # special case member_of to always make its value a"},{"line_number":202,"context_line":"            # list, either by accepting the single value, or if it"},{"line_number":203,"context_line":"            # starts with \u0027in:\u0027 splitting on \u0027,\u0027."},{"line_number":204,"context_line":"            # NOTE(cdent): This will all change when we start using"},{"line_number":205,"context_line":"            # JSONSchema validation of query params."},{"line_number":206,"context_line":"            if attr \u003d\u003d \u0027member_of\u0027:"},{"line_number":207,"context_line":"                if value.startswith(\u0027in:\u0027):"},{"line_number":208,"context_line":"                    value \u003d value[3:].split(\u0027,\u0027)"},{"line_number":209,"context_line":"                else:"},{"line_number":210,"context_line":"                    value \u003d [value]"},{"line_number":211,"context_line":"                # Make sure the values are actually UUIDs."},{"line_number":212,"context_line":"                for aggr_uuid in value:"},{"line_number":213,"context_line":"                    if not uuidutils.is_uuid_like(aggr_uuid):"},{"line_number":214,"context_line":"                        raise webob.exc.HTTPBadRequest("},{"line_number":215,"context_line":"                            _(\u0027Invalid uuid value: %(uuid)s\u0027) %"},{"line_number":216,"context_line":"                            {\u0027uuid\u0027: aggr_uuid})"},{"line_number":217,"context_line":"            elif attr \u003d\u003d \u0027resources\u0027:"},{"line_number":218,"context_line":"                value \u003d util.normalize_resources_qs_param(value)"},{"line_number":219,"context_line":"            elif attr \u003d\u003d \u0027required\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_ed4aa481","line":216,"range":{"start_line":200,"start_character":0,"end_line":216,"end_character":48},"in_reply_to":"df7087c5_ed2ce44b","updated":"2018-03-19 21:55:51.000000000","message":"Ugh - rebased incorrectly. Fixed.","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"}],"nova/api/openstack/placement/lib.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9d908dd4ad1b8777a8073dacd94a71bcd09deedd","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.use_same_provider \u003d use_same_provider"},{"line_number":34,"context_line":"        self.resources \u003d resources or {}"},{"line_number":35,"context_line":"        self.required_traits \u003d required_traits or set()"},{"line_number":36,"context_line":"        self.member_of \u003d member_of or []"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_6d93f45d","line":36,"range":{"start_line":36,"start_character":38,"end_line":36,"end_character":40},"updated":"2018-03-19 21:18:55.000000000","message":"https://review.openstack.org/#/c/552098/8/nova/api/openstack/placement/lib.py@36","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"302879f8a89fb02946de2b8b1d1e5042a1d78584","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.use_same_provider \u003d use_same_provider"},{"line_number":34,"context_line":"        self.resources \u003d resources or {}"},{"line_number":35,"context_line":"        self.required_traits \u003d required_traits or set()"},{"line_number":36,"context_line":"        self.member_of \u003d member_of or []"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_e8d05256","line":36,"range":{"start_line":36,"start_character":38,"end_line":36,"end_character":40},"in_reply_to":"df7087c5_6d93f45d","updated":"2018-03-19 21:55:51.000000000","message":"Done","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"}],"nova/api/openstack/placement/microversion.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9d908dd4ad1b8777a8073dacd94a71bcd09deedd","unresolved":false,"context_lines":[{"line_number":65,"context_line":"             # APIs"},{"line_number":66,"context_line":"    \u00271.20\u0027,  # Return 200 with provider payload from POST /resource_providers"},{"line_number":67,"context_line":"    \u00271.21\u0027,  # Support ?member_of\u003d\u003cagg UUIDs\u003e queryparam on"},{"line_number":68,"context_line":"             # GET /allocation_candidates"},{"line_number":69,"context_line":"]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_0da598b5","line":68,"updated":"2018-03-19 21:18:55.000000000","message":"https://review.openstack.org/#/c/552098/8/nova/api/openstack/placement/microversion.py@67","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"302879f8a89fb02946de2b8b1d1e5042a1d78584","unresolved":false,"context_lines":[{"line_number":65,"context_line":"             # APIs"},{"line_number":66,"context_line":"    \u00271.20\u0027,  # Return 200 with provider payload from POST /resource_providers"},{"line_number":67,"context_line":"    \u00271.21\u0027,  # Support ?member_of\u003d\u003cagg UUIDs\u003e queryparam on"},{"line_number":68,"context_line":"             # GET /allocation_candidates"},{"line_number":69,"context_line":"]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_08d6e650","line":68,"in_reply_to":"df7087c5_0da598b5","updated":"2018-03-19 21:55:51.000000000","message":"Done","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"}],"nova/api/openstack/placement/objects/resource_provider.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f5d3c9f67c409f3ad5c537ff4a34e282a574efb9","unresolved":false,"context_lines":[{"line_number":1390,"context_line":""},{"line_number":1391,"context_line":"    # If \u0027member_of\u0027 has values join with the PlacementAggregates to"},{"line_number":1392,"context_line":"    # get those resource providers that are associated with any of the"},{"line_number":1393,"context_line":"    # list of aggregate uuids provided with \u0027member_of\u0027. There is no need to"},{"line_number":1394,"context_line":"    # also join to the Aggregates table, as we do not need anything from it."},{"line_number":1395,"context_line":"    if member_of:"},{"line_number":1396,"context_line":"        member_join \u003d sa.join(join_chain, _RP_AGG_TBL, sa.and_("},{"line_number":1397,"context_line":"                _RP_AGG_TBL.c.resource_provider_id \u003d\u003d rpt.c.id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_adf824c4","line":1394,"range":{"start_line":1393,"start_character":57,"end_line":1394,"end_character":76},"updated":"2018-03-26 18:44:43.000000000","message":"This is not true. resource_provider_aggregates.aggregate_id is the internal integer ID, not the aggregate UUID. That\u0027s why the join to _AGG_TBL was needed...\n\nSo, either the member_of parameter is not a list of aggregate UUIDs (as the comment on line 1939 indicates) or I don\u0027t see how this join possibly works.","commit_id":"7da6d9494cbf2dc6e716aa4b18fa847819004d3c"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"c32f322562f7c407cfb45e8e57c29b5d06a3c165","unresolved":false,"context_lines":[{"line_number":1390,"context_line":""},{"line_number":1391,"context_line":"    # If \u0027member_of\u0027 has values join with the PlacementAggregates to"},{"line_number":1392,"context_line":"    # get those resource providers that are associated with any of the"},{"line_number":1393,"context_line":"    # list of aggregate uuids provided with \u0027member_of\u0027. There is no need to"},{"line_number":1394,"context_line":"    # also join to the Aggregates table, as we do not need anything from it."},{"line_number":1395,"context_line":"    if member_of:"},{"line_number":1396,"context_line":"        member_join \u003d sa.join(join_chain, _RP_AGG_TBL, sa.and_("},{"line_number":1397,"context_line":"                _RP_AGG_TBL.c.resource_provider_id \u003d\u003d rpt.c.id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"bf659307_49033810","line":1394,"range":{"start_line":1393,"start_character":57,"end_line":1394,"end_character":76},"in_reply_to":"bf659307_adf824c4","updated":"2018-03-28 16:51:35.000000000","message":"Done","commit_id":"7da6d9494cbf2dc6e716aa4b18fa847819004d3c"}],"nova/api/openstack/placement/rest_api_version_history.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9d908dd4ad1b8777a8073dacd94a71bcd09deedd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"df7087c5_0d8ef82d","line":264,"updated":"2018-03-19 21:18:55.000000000","message":"https://review.openstack.org/#/c/552098/8/nova/api/openstack/placement/rest_api_version_history.rst@264","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"302879f8a89fb02946de2b8b1d1e5042a1d78584","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"df7087c5_a8ca5a9e","line":264,"in_reply_to":"df7087c5_0d8ef82d","updated":"2018-03-19 21:55:51.000000000","message":"Done","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"}],"nova/api/openstack/placement/util.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9d908dd4ad1b8777a8073dacd94a71bcd09deedd","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"def normalize_member_of_qs_param(value):"},{"line_number":321,"context_line":"    \"\"\"We need to handle member_of as a special caseto always make its value a"},{"line_number":322,"context_line":"    list, either by accepting the single value, or if it starts with \u0027in:\u0027"},{"line_number":323,"context_line":"    splitting on \u0027,\u0027."},{"line_number":324,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_6d969497","line":321,"range":{"start_line":321,"start_character":48,"end_line":321,"end_character":54},"updated":"2018-03-19 21:18:55.000000000","message":"case to","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"302879f8a89fb02946de2b8b1d1e5042a1d78584","unresolved":false,"context_lines":[{"line_number":318,"context_line":""},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"def normalize_member_of_qs_param(value):"},{"line_number":321,"context_line":"    \"\"\"We need to handle member_of as a special caseto always make its value a"},{"line_number":322,"context_line":"    list, either by accepting the single value, or if it starts with \u0027in:\u0027"},{"line_number":323,"context_line":"    splitting on \u0027,\u0027."},{"line_number":324,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_883c36c0","line":321,"range":{"start_line":321,"start_character":48,"end_line":321,"end_character":54},"in_reply_to":"df7087c5_6d969497","updated":"2018-03-19 21:55:51.000000000","message":"Done","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9d908dd4ad1b8777a8073dacd94a71bcd09deedd","unresolved":false,"context_lines":[{"line_number":326,"context_line":"    JSONSchema validation of query params."},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    :param value: A member_of query parameter of either a single UUID, or a"},{"line_number":329,"context_line":"                  comma-separated string of one or more UUIDs, prefixed with"},{"line_number":330,"context_line":"                  the \"in:\" operator."},{"line_number":331,"context_line":"    :return: A set of UUIDs"},{"line_number":332,"context_line":"    :raises `webob.exc.HTTPBadRequest` if the value parameter is not in the"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_cdb560cf","line":329,"range":{"start_line":329,"start_character":44,"end_line":329,"end_character":47},"updated":"2018-03-19 21:18:55.000000000","message":"Still contend this can be zero","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"55bf32a9ae9f1660769c162054ec9fbe81e2a9f4","unresolved":false,"context_lines":[{"line_number":326,"context_line":"    JSONSchema validation of query params."},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    :param value: A member_of query parameter of either a single UUID, or a"},{"line_number":329,"context_line":"                  comma-separated string of one or more UUIDs, prefixed with"},{"line_number":330,"context_line":"                  the \"in:\" operator."},{"line_number":331,"context_line":"    :return: A set of UUIDs"},{"line_number":332,"context_line":"    :raises `webob.exc.HTTPBadRequest` if the value parameter is not in the"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_08934651","line":329,"range":{"start_line":329,"start_character":44,"end_line":329,"end_character":47},"in_reply_to":"df7087c5_8893d6a3","updated":"2018-03-19 22:13:40.000000000","message":"Ah, because \u0027\u0027.split(\u0027,\u0027) is [\u0027\u0027], not [].  But it\u0027s still not a schema failure :P","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"302879f8a89fb02946de2b8b1d1e5042a1d78584","unresolved":false,"context_lines":[{"line_number":326,"context_line":"    JSONSchema validation of query params."},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    :param value: A member_of query parameter of either a single UUID, or a"},{"line_number":329,"context_line":"                  comma-separated string of one or more UUIDs, prefixed with"},{"line_number":330,"context_line":"                  the \"in:\" operator."},{"line_number":331,"context_line":"    :return: A set of UUIDs"},{"line_number":332,"context_line":"    :raises `webob.exc.HTTPBadRequest` if the value parameter is not in the"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_8893d6a3","line":329,"range":{"start_line":329,"start_character":44,"end_line":329,"end_character":47},"in_reply_to":"df7087c5_cdb560cf","updated":"2018-03-19 21:55:51.000000000","message":"OK, I\u0027ve added a test to demonstrate that in: with no agg UUIDs returns 400.","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9d908dd4ad1b8777a8073dacd94a71bcd09deedd","unresolved":false,"context_lines":[{"line_number":357,"context_line":"    ?resources\u003d$RESOURCE_CLASS_NAME:$AMOUNT,$RESOURCE_CLASS_NAME:$AMOUNT"},{"line_number":358,"context_line":"    \u0026required\u003d$TRAIT_NAME,$TRAIT_NAME\u0026member_of\u003d$AGG_UUID"},{"line_number":359,"context_line":"    \u0026resources1\u003d$RESOURCE_CLASS_NAME:$AMOUNT,RESOURCE_CLASS_NAME:$AMOUNT"},{"line_number":360,"context_line":"    \u0026required1\u003d$TRAIT_NAME,$TRAIT_NAME\u0026member_of1\u003d$AGG_UUID"},{"line_number":361,"context_line":"    \u0026resources2\u003d$RESOURCE_CLASS_NAME:$AMOUNT,RESOURCE_CLASS_NAME:$AMOUNT"},{"line_number":362,"context_line":"    \u0026required2\u003d$TRAIT_NAME,$TRAIT_NAME\u0026member_of2\u003d$AGG_UUID"},{"line_number":363,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_0dd7d825","line":360,"range":{"start_line":360,"start_character":4,"end_line":360,"end_character":59},"updated":"2018-03-19 21:18:55.000000000","message":"https://review.openstack.org/#/c/552098/8/nova/api/openstack/placement/util.py@358 not done","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"302879f8a89fb02946de2b8b1d1e5042a1d78584","unresolved":false,"context_lines":[{"line_number":357,"context_line":"    ?resources\u003d$RESOURCE_CLASS_NAME:$AMOUNT,$RESOURCE_CLASS_NAME:$AMOUNT"},{"line_number":358,"context_line":"    \u0026required\u003d$TRAIT_NAME,$TRAIT_NAME\u0026member_of\u003d$AGG_UUID"},{"line_number":359,"context_line":"    \u0026resources1\u003d$RESOURCE_CLASS_NAME:$AMOUNT,RESOURCE_CLASS_NAME:$AMOUNT"},{"line_number":360,"context_line":"    \u0026required1\u003d$TRAIT_NAME,$TRAIT_NAME\u0026member_of1\u003d$AGG_UUID"},{"line_number":361,"context_line":"    \u0026resources2\u003d$RESOURCE_CLASS_NAME:$AMOUNT,RESOURCE_CLASS_NAME:$AMOUNT"},{"line_number":362,"context_line":"    \u0026required2\u003d$TRAIT_NAME,$TRAIT_NAME\u0026member_of2\u003d$AGG_UUID"},{"line_number":363,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_28e5ea38","line":360,"range":{"start_line":360,"start_character":4,"end_line":360,"end_character":59},"in_reply_to":"df7087c5_0dd7d825","updated":"2018-03-19 21:55:51.000000000","message":"Done","commit_id":"bb94f4cff92ba836cd26387d92c0b186f656b031"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"623e20d1962f457a9f369b3165b1e448ce7a516c","unresolved":false,"context_lines":[{"line_number":344,"context_line":"    for aggr_uuid in value:"},{"line_number":345,"context_line":"        if not uuidutils.is_uuid_like(aggr_uuid):"},{"line_number":346,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":347,"context_line":"                _(\u0027Invalid uuid value: %(uuid)s\u0027) % {\u0027uuid\u0027: aggr_uuid})"},{"line_number":348,"context_line":"    return value"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_9b49d433","line":347,"range":{"start_line":347,"start_character":16,"end_line":347,"end_character":72},"updated":"2018-03-20 11:36:14.000000000","message":"With that message we do not know what parameter is a culprit.","commit_id":"395ffca5c27e8f7134ebf8a137ad87ccfea63951"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"79e8f56eec861a42e1dedddf3537b539613ffa41","unresolved":false,"context_lines":[{"line_number":344,"context_line":"    for aggr_uuid in value:"},{"line_number":345,"context_line":"        if not uuidutils.is_uuid_like(aggr_uuid):"},{"line_number":346,"context_line":"            raise webob.exc.HTTPBadRequest("},{"line_number":347,"context_line":"                _(\u0027Invalid uuid value: %(uuid)s\u0027) % {\u0027uuid\u0027: aggr_uuid})"},{"line_number":348,"context_line":"    return value"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_719ae16e","line":347,"range":{"start_line":347,"start_character":16,"end_line":347,"end_character":72},"in_reply_to":"df7087c5_9b49d433","updated":"2018-03-20 12:52:43.000000000","message":"Good point, but this is the existing code that was refactored to cover both checks for member_of:\n\nhttps://github.com/openstack/nova/blob/7cbb5764d499dfdc90ef4a963daf217d58c840d4/nova/api/openstack/placement/handlers/resource_provider.py#L198-L208\n\nI am a big fan of good error messages, and I definitely prefer the older one, so I\u0027ll make that change.","commit_id":"395ffca5c27e8f7134ebf8a137ad87ccfea63951"}],"placement-api-ref/source/allocation_candidates.inc":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"557f5816a0298100ec62eaf5728d6bf660a26c68","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Error response codes: badRequest(400)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Request (microversions 1.21 - )"},{"line_number":28,"context_line":"-------------------------------"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":".. rest_parameters:: parameters.yaml"}],"source_content_type":"text/x-c++src","patch_set":6,"id":"bf659307_75c7cd65","line":27,"updated":"2018-03-29 17:14:47.000000000","message":"This renders weird [1] - the \u0027limit\u0027, \u0027required\u0027, and \u0027member_of\u0027 fields all say \"New in version \u003csomething less than 1.21\u003e\" which doesn\u0027t make sense in light of the header.\n\nI had to do some less-than-pretty munging recently to make a similar thing come out right [2] (note in particular [3]).\n\n[1] http://logs.openstack.org/57/554357/6/check/build-placement-api-ref/70876a4/html/#list-allocation-candidates\n[2] https://review.openstack.org/#/c/548934\n[3] https://review.openstack.org/#/c/548934/2/placement-api-ref/source/parameters.yaml@332","commit_id":"4ab53174971c4d33d7b11c4515ca8d78c408bb93"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"c0173824d9452a6b07cc3656f711eb98f6db646a","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Error response codes: badRequest(400)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Request (microversions 1.21 - )"},{"line_number":28,"context_line":"-------------------------------"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":".. rest_parameters:: parameters.yaml"}],"source_content_type":"text/x-c++src","patch_set":6,"id":"9f6a8fd7_15065a21","line":27,"in_reply_to":"bf659307_0c02d20a","updated":"2018-04-24 17:02:42.000000000","message":"Ok, I\u0027ll try that approach.","commit_id":"4ab53174971c4d33d7b11c4515ca8d78c408bb93"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"157a7a4b2766e1bc842ec59c4200312df3d0c6d6","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Error response codes: badRequest(400)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Request (microversions 1.21 - )"},{"line_number":28,"context_line":"-------------------------------"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":".. rest_parameters:: parameters.yaml"}],"source_content_type":"text/x-c++src","patch_set":6,"id":"bf659307_0c02d20a","line":27,"in_reply_to":"bf659307_75c7cd65","updated":"2018-04-03 08:36:47.000000000","message":"IMO, it is not necessary that it is divided into \"microversions 1.21 -\" and \"microversions 1.10 - 1.20\".\n\nJust replace \u0027member_of\u0027 parameter with one that has \"New in version 1.21\" like https://review.openstack.org/#/c/558142/1/placement-api-ref/source/allocation_candidates.inc .","commit_id":"4ab53174971c4d33d7b11c4515ca8d78c408bb93"}]}
