)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3befe680738850c73423f3599a2d7de3066de029","unresolved":false,"context_lines":[{"line_number":30,"context_line":"for usage queries."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Part of blueprint placement-project-user"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Change-Id: I8b948a4dfe6a50bea053b5dcae8f039229e2e364"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"7f231b9d_169363a5","line":33,"updated":"2017-06-13 13:34:35.000000000","message":"Shouldn\u0027t we provide an API document for that new REST endpoint ?\n\nWe already merged some of them, would be nice to have this one too in the same change.","commit_id":"390c12a1b10b779c77182c796d63a8e4ce3b431c"}],"nova/api/openstack/placement/handlers/resource_provider.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bfa368b3c9973ea49e996df32de4901be7083fdc","unresolved":false,"context_lines":[{"line_number":267,"context_line":"    if want_version \u003e\u003d (1, 4):"},{"line_number":268,"context_line":"        schema \u003d GET_RPS_SCHEMA_1_4"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    util.validate_query_params(req, schema)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    filters \u003d {}"},{"line_number":273,"context_line":"    for attr in [\u0027uuid\u0027, \u0027name\u0027, \u0027member_of\u0027]:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7f231b9d_30d0f850","line":270,"updated":"2017-06-09 20:03:19.000000000","message":"yay!","commit_id":"c798107c2ecbd6a4cc762608112d4b3c29e704b4"}],"nova/api/openstack/placement/handlers/usage.py":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"eed2a22ee8af7978638e32393b8e2da87836354c","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    On success return a 200 an application/json body representing the sum/total"},{"line_number":75,"context_line":"    of usages."},{"line_number":76,"context_line":"    Return 405 Method Not Allowed if the wanted microversion does not match."},{"line_number":77,"context_line":"    \"\"\""},{"line_number":78,"context_line":"    microversion.raise_http_status_code_if_not_version(req, 405, (1, 8))"},{"line_number":79,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_832a868d","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":33},"updated":"2017-05-31 22:04:34.000000000","message":"Not sure if this is correct. If they don\u0027t request a version that supports this, typically a 404 is returned. Before 1.8 the \u0027usages\u0027 resource did not exist.","commit_id":"fe65173e10414d9e9c07ea1f3b0ea34bc142acff"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"17f03ac90e05c69e0888a50bbe1d0f503ad01f59","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    On success return a 200 an application/json body representing the sum/total"},{"line_number":75,"context_line":"    of usages."},{"line_number":76,"context_line":"    Return 405 Method Not Allowed if the wanted microversion does not match."},{"line_number":77,"context_line":"    \"\"\""},{"line_number":78,"context_line":"    microversion.raise_http_status_code_if_not_version(req, 405, (1, 8))"},{"line_number":79,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_c6d88c80","line":76,"range":{"start_line":76,"start_character":4,"end_line":76,"end_character":33},"in_reply_to":"df140735_832a868d","updated":"2017-05-31 22:18:28.000000000","message":"Okay. I took the example from the inventory handler [1] where delete_inventories was added in microversion 1.5. Happy to change it to what is correct for this case.\n\n[1] https://github.com/openstack/nova/blob/0b2d7c4/nova/api/openstack/placement/handlers/inventory.py#L394","commit_id":"fe65173e10414d9e9c07ea1f3b0ea34bc142acff"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"eed2a22ee8af7978638e32393b8e2da87836354c","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    allocations \u003d objects.AllocationList.get_all_by_project_user("},{"line_number":85,"context_line":"        context, project_id, user_id\u003duser_id)"},{"line_number":86,"context_line":"    for allocation in allocations:"},{"line_number":87,"context_line":"        usages[allocation.resource_class] +\u003d allocation.used"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    response \u003d req.response"},{"line_number":90,"context_line":"    response.body \u003d encodeutils.to_utf8(jsonutils.dumps({\u0027usages\u0027: usages}))"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_060d6436","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":41},"updated":"2017-05-31 22:04:34.000000000","message":"This will fail unless the resource class exists as a key, and has a numeric value. Instead, add this import:\n\n  from collections import defaultdict\n\nat the top, and then define the empty \u0027usages\u0027 dict as:\n\n  usages \u003d defaultdict(int)","commit_id":"fe65173e10414d9e9c07ea1f3b0ea34bc142acff"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"17f03ac90e05c69e0888a50bbe1d0f503ad01f59","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    allocations \u003d objects.AllocationList.get_all_by_project_user("},{"line_number":85,"context_line":"        context, project_id, user_id\u003duser_id)"},{"line_number":86,"context_line":"    for allocation in allocations:"},{"line_number":87,"context_line":"        usages[allocation.resource_class] +\u003d allocation.used"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    response \u003d req.response"},{"line_number":90,"context_line":"    response.body \u003d encodeutils.to_utf8(jsonutils.dumps({\u0027usages\u0027: usages}))"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_2642a811","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":41},"in_reply_to":"df140735_060d6436","updated":"2017-05-31 22:18:28.000000000","message":"This will insert the allocation.resource_class key if it doesn\u0027t already exist. Are you saying we can\u0027t rely on Allocation having a \u0027resource_class\u0027 and \u0027used\u0027 field populated?","commit_id":"fe65173e10414d9e9c07ea1f3b0ea34bc142acff"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b5416d539e6b923970d33309956c89ec2bce1a66","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    allocations \u003d objects.AllocationList.get_all_by_project_user("},{"line_number":85,"context_line":"        context, project_id, user_id\u003duser_id)"},{"line_number":86,"context_line":"    for allocation in allocations:"},{"line_number":87,"context_line":"        usages[allocation.resource_class] +\u003d allocation.used"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    response \u003d req.response"},{"line_number":90,"context_line":"    response.body \u003d encodeutils.to_utf8(jsonutils.dumps({\u0027usages\u0027: usages}))"}],"source_content_type":"text/x-python","patch_set":1,"id":"df140735_0947b07a","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":41},"in_reply_to":"df140735_2642a811","updated":"2017-06-01 04:17:17.000000000","message":"Sigh, just ran into the problem because of the +\u003d. Please disregard my earlier comment.","commit_id":"fe65173e10414d9e9c07ea1f3b0ea34bc142acff"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"22b6b22f0c77f664a9a26697a14bc531a2641667","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    try:"},{"line_number":102,"context_line":"        jsonschema.validate(dict(req.GET), schema,"},{"line_number":103,"context_line":"                            format_checker\u003djsonschema.FormatChecker())"},{"line_number":104,"context_line":"    except jsonschema.ValidationError as exc:"},{"line_number":105,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":106,"context_line":"            _(\u0027Invalid query string parameters: %(exc)s\u0027) %"},{"line_number":107,"context_line":"            {\u0027exc\u0027: exc})"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_3a9b9966","line":104,"updated":"2017-06-02 17:46:03.000000000","message":"something very similar to this block is being used in resource_provider.list_resource_providers, so it might be time to extract to a utility method now that we are doing it more than once.\n\nOr maybe in a followup or something.","commit_id":"151d9e18c1117d8726ce27181983a5c5f53553e7"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"eaa6adf80bcadf2b581f26ca8f67bbb716748058","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            _(\u0027Invalid query string parameters: %(exc)s\u0027) %"},{"line_number":107,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    project_id \u003d req.GET.get(\u0027project_id\u0027)"},{"line_number":110,"context_line":"    user_id \u003d req.GET.get(\u0027user_id\u0027)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    usages \u003d objects.UsageList.get_all_by_project_user(context, project_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_1a057546","line":109,"range":{"start_line":109,"start_character":4,"end_line":109,"end_character":42},"updated":"2017-06-02 17:40:42.000000000","message":"How about using context.project_id if not specifying project_id in a query?\n\nI guess it is hassle to specify project_id in query every time when they just want to know their own usage.","commit_id":"151d9e18c1117d8726ce27181983a5c5f53553e7"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"22b6b22f0c77f664a9a26697a14bc531a2641667","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            _(\u0027Invalid query string parameters: %(exc)s\u0027) %"},{"line_number":107,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    project_id \u003d req.GET.get(\u0027project_id\u0027)"},{"line_number":110,"context_line":"    user_id \u003d req.GET.get(\u0027user_id\u0027)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    usages \u003d objects.UsageList.get_all_by_project_user(context, project_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_ba532939","line":109,"in_reply_to":"df140735_1a057546","updated":"2017-06-02 17:46:03.000000000","message":"currently this is an admin only interface","commit_id":"151d9e18c1117d8726ce27181983a5c5f53553e7"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"8635ad3879c6d73fedb3bf9f6f8a1db63b769c6e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            _(\u0027Invalid query string parameters: %(exc)s\u0027) %"},{"line_number":107,"context_line":"            {\u0027exc\u0027: exc})"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    project_id \u003d req.GET.get(\u0027project_id\u0027)"},{"line_number":110,"context_line":"    user_id \u003d req.GET.get(\u0027user_id\u0027)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    usages \u003d objects.UsageList.get_all_by_project_user(context, project_id,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df140735_2ea23afd","line":109,"in_reply_to":"df140735_ba532939","updated":"2017-06-02 17:50:58.000000000","message":"ah, I got it. It is necessary to specify project_id clearly like current implementation.","commit_id":"151d9e18c1117d8726ce27181983a5c5f53553e7"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bfa368b3c9973ea49e996df32de4901be7083fdc","unresolved":false,"context_lines":[{"line_number":89,"context_line":"def get_total_usages(req):"},{"line_number":90,"context_line":"    \"\"\"GET the sum of usages for a project or a project/user."},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    On success return a 200 an application/json body representing the sum/total"},{"line_number":93,"context_line":"    of usages."},{"line_number":94,"context_line":"    Return 405 Method Not Allowed if the wanted microversion does not match."},{"line_number":95,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"7f231b9d_d0be64fe","line":92,"updated":"2017-06-09 20:03:19.000000000","message":"and an?","commit_id":"c798107c2ecbd6a4cc762608112d4b3c29e704b4"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bfa368b3c9973ea49e996df32de4901be7083fdc","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    On success return a 200 an application/json body representing the sum/total"},{"line_number":93,"context_line":"    of usages."},{"line_number":94,"context_line":"    Return 405 Method Not Allowed if the wanted microversion does not match."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    microversion.raise_http_status_code_if_not_version(req, 405, (1, 9))"},{"line_number":97,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"7f231b9d_30459818","line":94,"updated":"2017-06-09 20:03:19.000000000","message":"It should be a 404 response, not a 405 because there is no method by which /usages will respond, if using an earlier microversion.","commit_id":"c798107c2ecbd6a4cc762608112d4b3c29e704b4"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bfa368b3c9973ea49e996df32de4901be7083fdc","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    of usages."},{"line_number":94,"context_line":"    Return 405 Method Not Allowed if the wanted microversion does not match."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    microversion.raise_http_status_code_if_not_version(req, 405, (1, 9))"},{"line_number":97,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    schema \u003d GET_USAGES_SCHEMA_1_9"}],"source_content_type":"text/x-python","patch_set":12,"id":"7f231b9d_104a9c26","line":96,"updated":"2017-06-09 20:03:19.000000000","message":"404","commit_id":"c798107c2ecbd6a4cc762608112d4b3c29e704b4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3befe680738850c73423f3599a2d7de3066de029","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    \"type\": \"object\","},{"line_number":29,"context_line":"    \"properties\": {"},{"line_number":30,"context_line":"        \"project_id\": {"},{"line_number":31,"context_line":"            \"type\": \"string\""},{"line_number":32,"context_line":"        },"},{"line_number":33,"context_line":"        \"user_id\": {"},{"line_number":34,"context_line":"            \"type\": \"string\""}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_13adb530","line":31,"updated":"2017-06-13 13:34:35.000000000","message":"maybe we should verify the minimum and maximum lenghts too ?","commit_id":"390c12a1b10b779c77182c796d63a8e4ce3b431c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"fdf755ccc17069dd4265cbdf3cddd41f00718c4f","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    \"type\": \"object\","},{"line_number":29,"context_line":"    \"properties\": {"},{"line_number":30,"context_line":"        \"project_id\": {"},{"line_number":31,"context_line":"            \"type\": \"string\""},{"line_number":32,"context_line":"        },"},{"line_number":33,"context_line":"        \"user_id\": {"},{"line_number":34,"context_line":"            \"type\": \"string\""}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_c0da9249","line":31,"in_reply_to":"7f231b9d_13adb530","updated":"2017-06-14 16:31:55.000000000","message":"Done","commit_id":"390c12a1b10b779c77182c796d63a8e4ce3b431c"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3befe680738850c73423f3599a2d7de3066de029","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    sum/total of usages."},{"line_number":94,"context_line":"    Return 404 Not Found if the wanted microversion does not match."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    microversion.raise_http_status_code_if_not_version(req, 404, (1, 9))"},{"line_number":97,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    schema \u003d GET_USAGES_SCHEMA_1_9"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_53ed6d89","line":96,"updated":"2017-06-13 13:34:35.000000000","message":"as I said in the dependent change, you can also use the version_handler() method instead, which provides a HTTP404 in case the related handler method is not existing.","commit_id":"390c12a1b10b779c77182c796d63a8e4ce3b431c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"fdf755ccc17069dd4265cbdf3cddd41f00718c4f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    sum/total of usages."},{"line_number":94,"context_line":"    Return 404 Not Found if the wanted microversion does not match."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    microversion.raise_http_status_code_if_not_version(req, 404, (1, 9))"},{"line_number":97,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    schema \u003d GET_USAGES_SCHEMA_1_9"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_a0df9638","line":96,"in_reply_to":"7f231b9d_53ed6d89","updated":"2017-06-14 16:31:55.000000000","message":"Done","commit_id":"390c12a1b10b779c77182c796d63a8e4ce3b431c"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"617979540c85f048c29717630b0386e3ffce9cbc","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    sum/total of usages."},{"line_number":94,"context_line":"    Return 404 Not Found if the wanted microversion does not match."},{"line_number":95,"context_line":"    \"\"\""},{"line_number":96,"context_line":"    microversion.raise_http_status_code_if_not_version(req, 404, (1, 9))"},{"line_number":97,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    schema \u003d GET_USAGES_SCHEMA_1_9"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_0b7798a2","line":96,"in_reply_to":"7f231b9d_53ed6d89","updated":"2017-06-14 11:28:15.000000000","message":"It\u0027s not clear if it is a pattern yet, but version_hander() has tended to be used when there are two or more handlers for the same request method on the same URL. When there is just one method, this way can work just as well.","commit_id":"390c12a1b10b779c77182c796d63a8e4ce3b431c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f84d60fc9079d9425fbc413005e31603b80b8976","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    },"},{"line_number":41,"context_line":"    \"required\": ["},{"line_number":42,"context_line":"        \"project_id\""},{"line_number":43,"context_line":"     ],"},{"line_number":44,"context_line":"    \"additionalProperties\": False,"},{"line_number":45,"context_line":"}"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_07eaeb0d","line":43,"range":{"start_line":43,"start_character":4,"end_line":43,"end_character":6},"updated":"2017-06-23 23:37:38.000000000","message":"alignment","commit_id":"77224c1feb350245b9fbba1d8b31d6e5904714b6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f84d60fc9079d9425fbc413005e31603b80b8976","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    \"\"\""},{"line_number":101,"context_line":"    context \u003d req.environ[\u0027placement.context\u0027]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    schema \u003d GET_USAGES_SCHEMA_1_9"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    util.validate_query_params(req, schema)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_e7ec8f2a","line":103,"range":{"start_line":103,"start_character":4,"end_line":103,"end_character":10},"updated":"2017-06-23 23:37:38.000000000","message":"not sure why an extra variable is necessary, smells like copy pasta","commit_id":"77224c1feb350245b9fbba1d8b31d6e5904714b6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f84d60fc9079d9425fbc413005e31603b80b8976","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    util.validate_query_params(req, schema)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    project_id \u003d req.GET.get(\u0027project_id\u0027)"},{"line_number":108,"context_line":"    user_id \u003d req.GET.get(\u0027user_id\u0027)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    usages \u003d objects.UsageList.get_all_by_project_user(context, project_id,"},{"line_number":111,"context_line":"                                                       user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_67d87f7e","line":108,"range":{"start_line":108,"start_character":22,"end_line":108,"end_character":25},"updated":"2017-06-23 23:37:38.000000000","message":"Default to None? Why doesn\u0027t this blow up if \u0027user_id\u0027 isn\u0027t passed in?","commit_id":"77224c1feb350245b9fbba1d8b31d6e5904714b6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e8a47b5bb09384113ad99a84be203c5350981a45","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    util.validate_query_params(req, schema)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    project_id \u003d req.GET.get(\u0027project_id\u0027)"},{"line_number":108,"context_line":"    user_id \u003d req.GET.get(\u0027user_id\u0027)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    usages \u003d objects.UsageList.get_all_by_project_user(context, project_id,"},{"line_number":111,"context_line":"                                                       user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"5f201791_e72ecff8","line":108,"range":{"start_line":108,"start_character":22,"end_line":108,"end_character":25},"in_reply_to":"5f201791_67d87f7e","updated":"2017-06-23 23:56:54.000000000","message":"Duh, I don\u0027t know what I was thinking here.","commit_id":"77224c1feb350245b9fbba1d8b31d6e5904714b6"}],"nova/api/openstack/placement/microversion.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"91d29eb8b96fffb5f9b38bf1daf76d018cfb5f89","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    \u00271.7\u0027,  # PUT /resource_classes/{name} is bodiless create or update"},{"line_number":47,"context_line":"    \u00271.8\u0027,  # Adds \u0027project_id\u0027 and \u0027user_id\u0027 required request parameters to"},{"line_number":48,"context_line":"            # PUT /allocations"},{"line_number":49,"context_line":"    \u00271.9\u0027,  # Adds GET /usages"},{"line_number":50,"context_line":"]"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7f231b9d_abbfcff9","line":49,"updated":"2017-06-12 14:13:07.000000000","message":"Release note for this? How about API reference?","commit_id":"c798107c2ecbd6a4cc762608112d4b3c29e704b4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b271125b719da5a4cde54eb4e0cba89219430d6c","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    \u00271.7\u0027,  # PUT /resource_classes/{name} is bodiless create or update"},{"line_number":47,"context_line":"    \u00271.8\u0027,  # Adds \u0027project_id\u0027 and \u0027user_id\u0027 required request parameters to"},{"line_number":48,"context_line":"            # PUT /allocations"},{"line_number":49,"context_line":"    \u00271.9\u0027,  # Adds GET /usages"},{"line_number":50,"context_line":"]"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7f231b9d_9eec452a","line":49,"in_reply_to":"7f231b9d_abbfcff9","updated":"2017-06-12 21:25:29.000000000","message":"Jay said that there\u0027s no base usages api-ref yet right? I don\u0027t see it.\n\nAlso, since placement is purely internal at this point, do we need to be release-noting each change like this?","commit_id":"c798107c2ecbd6a4cc762608112d4b3c29e704b4"}],"nova/objects/resource_provider.py":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3befe680738850c73423f3599a2d7de3066de029","unresolved":false,"context_lines":[{"line_number":1929,"context_line":"            query \u003d query.filter(models.User.external_id \u003d\u003d user_id)"},{"line_number":1930,"context_line":"        query \u003d query.group_by(models.Allocation.resource_class_id)"},{"line_number":1931,"context_line":"        result \u003d [dict(resource_class_id\u003ditem[0], usage\u003ditem[1])"},{"line_number":1932,"context_line":"                  for item in query.all()]"},{"line_number":1933,"context_line":"        return result"},{"line_number":1934,"context_line":""},{"line_number":1935,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_7314e94e","line":1932,"updated":"2017-06-13 13:34:35.000000000","message":"the SQL query looks good to me.","commit_id":"390c12a1b10b779c77182c796d63a8e4ce3b431c"}],"nova/tests/functional/api/openstack/placement/gabbits/allocations-1-8.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"22b6b22f0c77f664a9a26697a14bc531a2641667","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"df140735_daf01d94","updated":"2017-06-02 17:46:03.000000000","message":"Did you want this file in the parent?","commit_id":"151d9e18c1117d8726ce27181983a5c5f53553e7"}],"nova/tests/functional/api/openstack/placement/gabbits/with-allocations.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"22b6b22f0c77f664a9a26697a14bc531a2641667","unresolved":false,"context_lines":[{"line_number":69,"context_line":"      openstack-api-version: placement 1.9"},{"line_number":70,"context_line":"  status: 200"},{"line_number":71,"context_line":"  response_json_paths:"},{"line_number":72,"context_line":"      $.usages.DISK_GB: 1000"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"df140735_5a43ed6c","line":72,"updated":"2017-06-02 17:46:03.000000000","message":"If the intention here is that when narrowed by user_id, we don\u0027t have VCPU we can test that in a few different ways, one of which is:\n\n $.usage.`len`: 1","commit_id":"151d9e18c1117d8726ce27181983a5c5f53553e7"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"35a5a745163079a48250568e716181d13971bec3","unresolved":false,"context_lines":[{"line_number":43,"context_line":"      - Unable to delete inventory for resource provider $ENVIRON[\u0027RP_UUID\u0027] because the inventory is in use."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"- name: get total usages earlier version"},{"line_number":46,"context_line":"  GET: /usages"},{"line_number":47,"context_line":"  request_headers:"},{"line_number":48,"context_line":"      openstack-api-version: placement 1.8"},{"line_number":49,"context_line":"  status: 405"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"7f231b9d_4a406308","line":46,"range":{"start_line":46,"start_character":7,"end_line":46,"end_character":14},"updated":"2017-06-09 18:09:36.000000000","message":"This URL is not valid one as the same as line 51 test. So this test contains two negative factors. We just want to verify the version is wrong and it returns HTTP405. So it would be better to set this URL as\n\n /usages?project_id\u003d$ENVIRON[\u0027PROJECT_ID\u0027]","commit_id":"c798107c2ecbd6a4cc762608112d4b3c29e704b4"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bfa368b3c9973ea49e996df32de4901be7083fdc","unresolved":false,"context_lines":[{"line_number":46,"context_line":"  GET: /usages"},{"line_number":47,"context_line":"  request_headers:"},{"line_number":48,"context_line":"      openstack-api-version: placement 1.8"},{"line_number":49,"context_line":"  status: 405"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"- name: get total usages no project or user"},{"line_number":52,"context_line":"  GET: /usages"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"7f231b9d_30e11800","line":49,"updated":"2017-06-09 20:03:19.000000000","message":"Is this gets fixed as described elsewhere, this\u0027ll be 404","commit_id":"c798107c2ecbd6a4cc762608112d4b3c29e704b4"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3befe680738850c73423f3599a2d7de3066de029","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"7f231b9d_d6304beb","line":83,"updated":"2017-06-13 13:34:35.000000000","message":"++","commit_id":"390c12a1b10b779c77182c796d63a8e4ce3b431c"}]}
